agent-afk 5.130.6 → 5.131.0
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 +6 -4
- package/dist/improve/schemas.d.ts +3 -3
- package/dist/index.mjs +190 -188
- package/dist/telegram/bot.d.ts +1 -0
- package/dist/telegram/handlers/document.d.ts +3 -0
- package/dist/telegram/handlers/message.d.ts +2 -0
- package/dist/telegram.mjs +257 -255
- 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 $de,Ox=y(()=>{"use strict";$de=new Set(["script","style","noscript","template","svg"])});function Nde(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 AB(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function Bde(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 CB(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??Nde,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(!Lde.has(d.status)||u===o)return d;let p=Bde(d,s)??AB(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=AB(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var Lde,_B=y(()=>{"use strict";fe();Lde=new Set([429,502,503,504])});import{BlockList as Ude,isIP as $x}from"node:net";import{lookup as jde}from"node:dns/promises";import{Agent as Hde}from"undici";function PB(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function qde(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function Dx(e){let t=$x(e);return t===0?!1:Gde.check(e,t===4?"ipv4":"ipv6")}async function MB(e){return jde(e,{all:!0,verbatim:!0})}async function Fx(e,t={}){if(t.allowPrivateHosts??PB())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=qde(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($x(r)!==0)return Dx(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??MB,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(Dx(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function Ep(e,t={}){let n=await Fx(e,t);if(!n.allowed)throw new ir(n.reason)}async function sy(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<=IB;s++){await Ep(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??PB())?{dispatcher:zde}:{}},l=await CB(e,i,a,r.retry??{});if(!Vde.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 ir(`too many redirects (>${IB}) starting from ${t}`)}var Wde,Kde,Gde,ir,zde,IB,Vde,Lx=y(()=>{"use strict";N();_B();Wde=[["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]],Kde=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Gde=(()=>{let e=new Ude;for(let[t,n]of Wde)e.addSubnet(t,n,"ipv4");for(let[t,n]of Kde)e.addSubnet(t,n,"ipv6");return e})(),ir=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};zde=new Hde({connect:{lookup(e,t,n){MB(e).then(r=>{let o=r.find(s=>Dx(s.address));if(o!==void 0){n(new ir(`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,$x(i.address))},r=>n(r,"",0))}}});IB=20,Vde=new Set([301,302,303,307,308])});import{readFileSync as Yde}from"node:fs";import{join as Jde}from"path";function Xde(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function OB(e,t){return Xde(t).test(e)}function epe(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(Qde.has(t))return!0;if(Zde.has(t))return!1}return!1}function DB(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function tpe(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 $B(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Rd(t),t}function npe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function rpe(e){try{return Yde(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function ope(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=$B(t.defaultProfile)),n}function FB(e){let t=e?.env??v,n=e?.readFileSync??rpe,r=e?.surface??t.AGENT_SURFACE,o=epe(t.AFK_BROWSER_HEADLESS,r),i=DB(t.AFK_BROWSER_ALLOWED_DOMAINS),s=DB(t.AFK_BROWSER_BLOCKED_DOMAINS),a=npe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=tpe(t.AFK_BROWSER_BACKEND),c=$B(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():Jde(Qn(),"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=ope(u,g);return h.configPath=p,h}function ay(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(OB(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>OB(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Qde,Zde,ly=y(()=>{"use strict";N();H();Qde=new Set(["daemon","subagent","telegram","afk"]),Zde=new Set(["repl","interactive","cli"])});import{existsSync as ipe,readFileSync as spe}from"node:fs";import{createRequire as ape}from"node:module";import{dirname as lpe,join as cpe}from"node:path";function BB(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<dpe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function an(e){let t=BB(e);return NB.some(n=>t.includes(n))}function ppe(){try{let t=ape(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(spe(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=cpe(lpe(t),o);return ipe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Rp(){return LB??=ppe()??upe,LB}function Nx(e){return e.includes("install chromium")}function Nn(e,t){let n=BB(e),r=t?.latched===!0?` ${mpe}`:"";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: ${Rp()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Rp()}). Or pick a different tool.${r}`}function xp(e,t,n=!1){if(!an(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
318
318
|
|
|
319
|
-
${Nn(e,{headless:t,latched:n})}`,{cause:e})}var NB,upe,dpe,LB,mpe,cy=y(()=>{"use strict";NB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],upe="pnpm exec playwright install chromium",dpe=4;mpe="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 Hs from"node:fs";import uy from"node:path";import{randomBytes as fpe}from"node:crypto";import{chromium as gpe}from"playwright";function hpe(){try{return"5.130.6"}catch{}try{let e=uy.resolve(import.meta.dirname,"../../../package.json"),t=Hs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ype,dy,UB=y(()=>{"use strict";cy();H();fe();ype=hpe(),dy=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=gpe.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=xp(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/${ype}`}}loadStorageState(t){let n=xd(t);try{if(!Hs.existsSync(n))return;let r=JSON.parse(Hs.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=xd(t);if(!Hs.existsSync(r))return;let o=await n.storageState(),i=uy.join(uy.dirname(r),`.${uy.basename(r)}.${process.pid}.${fpe(4).toString("hex")}.tmp`);Hs.writeFileSync(i,JSON.stringify(o),{mode:384}),Hs.chmodSync(i,384),Hs.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as bpe}from"crypto";function jB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Spe.test(e.label))}function HB(e){return bpe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function WB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Spe,py=y(()=>{"use strict";Spe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as wpe}from"node:crypto";function vpe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function kpe(e,t,n){return`el_${wpe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Tpe(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 qB(e,t){let n=e.role??"",r=e.name??"";GB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])qB(i,t)}async function Epe(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},zB).catch(()=>[])}async function Rpe(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},zB).catch(()=>[])}function xpe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function my(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=xpe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Epe(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=[],qB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Rpe(e)).filter(D=>GB.has(D.role??"")));let w=new Map;for(let P of p){let D=KB(P.name),j=w.get(D);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(KB(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let j=P.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(j!==F)return j-F;let X=P.dom?.bbox.x??0,U=D.dom?.bbox.x??0;return X-U}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let j=P.ax.role??"generic",F=P.ax.name??"",X=kpe(j,F,D),U=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,K=null;P.ax.value!==void 0&&P.ax.value!==null&&(K=String(P.ax.value)),P.ax.checked!==void 0&&(K=String(P.ax.checked)),jB({role:j,kind:W})&&(K="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let $={id:X,role:j,label:vpe(F),kind:W,value:K,state:M,bbox:U};return z!==void 0&&($.selector=z),$}),_="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?_="loading":P==="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=Tpe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var GB,zB,VB=y(()=>{"use strict";py();GB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);zB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function YB(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 Bx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>YB(e,i)))).filter(o=>o!==null)}async function Ape(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 Ux(e,t,n){switch(t.kind){case"element_id":return Cpe(e,t,n);case"selector":return _pe(e,t);case"semantic":return Ipe(e,t)}}async function Cpe(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 Bx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function _pe(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 Bx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Ipe(e,t){return t.role!==void 0?Ppe(e,t.text,t.role):Mpe(e,t.text,t)}async function Ppe(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 Bx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Mpe(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 Ape(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 YB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var JB=y(()=>{"use strict"});async function jx(e,t,n,r){let o=e.url();if(o===n)return null;let i=ay(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 XB=y(()=>{"use strict";ly()});import{randomBytes as Ope}from"crypto";import{mkdir as Dpe,stat as $pe,writeFile as Fpe}from"fs/promises";import{join as Hx}from"path";import{gzip as Lpe}from"zlib";import{promisify as Npe}from"util";function Bpe(e){return Hx(yn(e),"browser")}function Upe(e){return Hx(Bpe(e),"screenshots")}function jpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Hpe(){return Ope(3).toString("hex")}async function Wx(e,t,n){if(t.length>QB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${QB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Upe(e);await Dpe(r,{recursive:!0});let o=`${jpe()}-${Hpe()}-${n}.png`,i=Hx(r,o);await Fpe(i,t);let{size:s}=await $pe(i);return{path:i,bytes:s}}var aXe,QB,ZB=y(()=>{"use strict";H();py();aXe=Npe(Lpe);QB=5*1024*1024});var tU={};ro(tU,{PlaywrightProvider:()=>Kx});function eU(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 Kx,nU=y(()=>{"use strict";UB();VB();JB();ly();XB();ZB();Kx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dy(t)}async open(t){let n=ay(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 jx(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 my(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 my(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 Ux(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${eU(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 jx(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 my(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 Ux(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${eU(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 Wx(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 Wx(n,o,r);return i}catch{return null}}}});var Ks={};ro(Ks,{__resetBrowserRegistryForTests:()=>zpe,browserProviderActive:()=>Gpe,closeBrowserProvider:()=>Gx,getBrowserProvider:()=>Kpe,peekBrowserProvider:()=>qpe});function rU(){Promise.resolve(Gx()).then(()=>{process.exit(130)})}function oU(){Promise.resolve(Gx()).then(()=>{process.exit(143)})}function iU(){Dr=null}function Wpe(){fy||(process.on("SIGINT",rU),process.on("SIGTERM",oU),process.on("exit",iU),fy=!0)}function sU(){fy&&(process.removeListener("SIGINT",rU),process.removeListener("SIGTERM",oU),process.removeListener("exit",iU),fy=!1)}async function Kpe(e){return Dr!==null?Dr:(Ws!==null||(Ws=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(nU(),tU)),n=FB(e),r=new t(n);return Wpe(),Dr=r,Ws=null,r})()),Ws)}async function Gx(){if(Dr===null)return;let e=Dr;Dr=null,Ws=null,sU(),await e.shutdown()}function Gpe(){return Dr!==null}function qpe(){return Dr}function zpe(){Dr=null,Ws=null,sU()}var Dr,Ws,fy,Gs=y(()=>{"use strict";ly();Dr=null,Ws=null,fy=!1});async function aU(e,t){try{return await EB(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Zpe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Gs(),Ks));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function lU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Zpe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await sy(n,e,{headers:Qpe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Xpe.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(Jpe.test(p)&&!Ype.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await aU(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof ir||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=Mx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Ep(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Ep(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Ep(d.finalUrl,o);let p=await aU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=Mx({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 ir)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 Ype,Jpe,Xpe,Qpe,cU=y(()=>{"use strict";RB();Ox();Lx();fe();Ype=/(text\/html|application\/xhtml\+xml)/i,Jpe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Xpe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Qpe={"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 nme(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(eme,{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),tme),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function uU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?nme({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 dU(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
319
|
+
${Nn(e,{headless:t,latched:n})}`,{cause:e})}var NB,upe,dpe,LB,mpe,cy=y(()=>{"use strict";NB=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],upe="pnpm exec playwright install chromium",dpe=4;mpe="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 Hs from"node:fs";import uy from"node:path";import{randomBytes as fpe}from"node:crypto";import{chromium as gpe}from"playwright";function hpe(){try{return"5.131.0"}catch{}try{let e=uy.resolve(import.meta.dirname,"../../../package.json"),t=Hs.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var ype,dy,UB=y(()=>{"use strict";cy();H();fe();ype=hpe(),dy=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=gpe.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=xp(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/${ype}`}}loadStorageState(t){let n=xd(t);try{if(!Hs.existsSync(n))return;let r=JSON.parse(Hs.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=xd(t);if(!Hs.existsSync(r))return;let o=await n.storageState(),i=uy.join(uy.dirname(r),`.${uy.basename(r)}.${process.pid}.${fpe(4).toString("hex")}.tmp`);Hs.writeFileSync(i,JSON.stringify(o),{mode:384}),Hs.chmodSync(i,384),Hs.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as bpe}from"crypto";function jB(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Spe.test(e.label))}function HB(e){return bpe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function WB(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Spe,py=y(()=>{"use strict";Spe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as wpe}from"node:crypto";function vpe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function kpe(e,t,n){return`el_${wpe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Tpe(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 qB(e,t){let n=e.role??"",r=e.name??"";GB.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])qB(i,t)}async function Epe(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},zB).catch(()=>[])}async function Rpe(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},zB).catch(()=>[])}function xpe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function my(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=xpe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=Epe(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=[],qB(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Rpe(e)).filter(D=>GB.has(D.role??"")));let w=new Map;for(let P of p){let D=KB(P.name),j=w.get(D);(!j||j.bbox.w===0&&P.bbox.w>0)&&w.set(D,P)}let k=b.map(P=>({ax:P,dom:w.get(KB(P.name??""))})),T=r?k:k.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);T.sort((P,D)=>{let j=P.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(j!==F)return j-F;let X=P.dom?.bbox.x??0,U=D.dom?.bbox.x??0;return X-U}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=T.slice(0,n).map((P,D)=>{let j=P.ax.role??"generic",F=P.ax.name??"",X=kpe(j,F,D),U=P.dom?.bbox??{x:0,y:0,w:0,h:0},W=P.dom?.type??null,K=null;P.ax.value!==void 0&&P.ax.value!==null&&(K=String(P.ax.value)),P.ax.checked!==void 0&&(K=String(P.ax.checked)),jB({role:j,kind:W})&&(K="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let z;P.dom?.testId?z=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(z=`#${P.dom.id}`);let $={id:X,role:j,label:vpe(F),kind:W,value:K,state:M,bbox:U};return z!==void 0&&($.selector=z),$}),_="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?_="loading":P==="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=Tpe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var GB,zB,VB=y(()=>{"use strict";py();GB=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);zB="a[href], button, input, select, textarea, [role], [tabindex], label"});async function YB(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 Bx(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>YB(e,i)))).filter(o=>o!==null)}async function Ape(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 Ux(e,t,n){switch(t.kind){case"element_id":return Cpe(e,t,n);case"selector":return _pe(e,t);case"semantic":return Ipe(e,t)}}async function Cpe(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 Bx(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function _pe(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 Bx(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Ipe(e,t){return t.role!==void 0?Ppe(e,t.text,t.role):Mpe(e,t.text,t)}async function Ppe(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 Bx(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function Mpe(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 Ape(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 YB(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let T=0;T<w.length;T++)k=k*31+w.charCodeAt(T)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var JB=y(()=>{"use strict"});async function jx(e,t,n,r){let o=e.url();if(o===n)return null;let i=ay(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 XB=y(()=>{"use strict";ly()});import{randomBytes as Ope}from"crypto";import{mkdir as Dpe,stat as $pe,writeFile as Fpe}from"fs/promises";import{join as Hx}from"path";import{gzip as Lpe}from"zlib";import{promisify as Npe}from"util";function Bpe(e){return Hx(yn(e),"browser")}function Upe(e){return Hx(Bpe(e),"screenshots")}function jpe(){return new Date().toISOString().replace(/[:.]/g,"-")}function Hpe(){return Ope(3).toString("hex")}async function Wx(e,t,n){if(t.length>QB)throw new Error(`writeScreenshotSidecar: buffer exceeds ${QB} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=Upe(e);await Dpe(r,{recursive:!0});let o=`${jpe()}-${Hpe()}-${n}.png`,i=Hx(r,o);await Fpe(i,t);let{size:s}=await $pe(i);return{path:i,bytes:s}}var aXe,QB,ZB=y(()=>{"use strict";H();py();aXe=Npe(Lpe);QB=5*1024*1024});var tU={};ro(tU,{PlaywrightProvider:()=>Kx});function eU(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 Kx,nU=y(()=>{"use strict";UB();VB();JB();ly();XB();ZB();Kx=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new dy(t)}async open(t){let n=ay(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 jx(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 my(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 my(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 Ux(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${eU(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 jx(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 my(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 Ux(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${eU(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 Wx(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 Wx(n,o,r);return i}catch{return null}}}});var Ks={};ro(Ks,{__resetBrowserRegistryForTests:()=>zpe,browserProviderActive:()=>Gpe,closeBrowserProvider:()=>Gx,getBrowserProvider:()=>Kpe,peekBrowserProvider:()=>qpe});function rU(){Promise.resolve(Gx()).then(()=>{process.exit(130)})}function oU(){Promise.resolve(Gx()).then(()=>{process.exit(143)})}function iU(){Dr=null}function Wpe(){fy||(process.on("SIGINT",rU),process.on("SIGTERM",oU),process.on("exit",iU),fy=!0)}function sU(){fy&&(process.removeListener("SIGINT",rU),process.removeListener("SIGTERM",oU),process.removeListener("exit",iU),fy=!1)}async function Kpe(e){return Dr!==null?Dr:(Ws!==null||(Ws=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(nU(),tU)),n=FB(e),r=new t(n);return Wpe(),Dr=r,Ws=null,r})()),Ws)}async function Gx(){if(Dr===null)return;let e=Dr;Dr=null,Ws=null,sU(),await e.shutdown()}function Gpe(){return Dr!==null}function qpe(){return Dr}function zpe(){Dr=null,Ws=null,sU()}var Dr,Ws,fy,Gs=y(()=>{"use strict";ly();Dr=null,Ws=null,fy=!1});async function aU(e,t){try{return await EB(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Zpe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Gs(),Ks));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function lU(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Zpe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await sy(n,e,{headers:Qpe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Xpe.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(Jpe.test(p)&&!Ype.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await aU(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof ir||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=Mx({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await Ep(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>Ep(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await Ep(d.finalUrl,o);let p=await aU(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=Mx({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 ir)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 Ype,Jpe,Xpe,Qpe,cU=y(()=>{"use strict";RB();Ox();Lx();fe();Ype=/(text\/html|application\/xhtml\+xml)/i,Jpe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Xpe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Qpe={"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 nme(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(eme,{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),tme),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function uU(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?nme({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 dU(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 eme,tme,pU=y(()=>{"use strict";ot();eme="https://api.exa.ai/search",tme=10});function gy(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 qs=y(()=>{"use strict";cy()});function lme(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=rme;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,ome)}let a=ime;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,sme)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function qx(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:lo(e,t),truncated:!0}}function cme(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=lme(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 Fx(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 sy(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof ir?{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=qx(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await lU(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=qx(xB(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 ir)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=an(p)&&!Nx(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Rp()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=uU({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:ame,timeoutMs:s.timeoutMs,signal:a.signal}),f=qx(dU(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 rme,ome,ime,sme,ame,mU,fU=y(()=>{"use strict";cU();pU();Lx();oi();Ox();qs();rme=3e4,ome=12e4,ime=1e5,sme=1e6,ame=10;mU=cme()});import{existsSync as hU,mkdirSync as ume,readFileSync as dme,renameSync as pme,unlinkSync as mme,writeFileSync as fme}from"node:fs";import{dirname as gU,join as gme}from"node:path";import{randomBytes as hme}from"node:crypto";function Tn(e){let t=e??ME();if(!hU(t))return[];try{let n=dme(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 ui(e,t){let n=t??ME();ume(gU(n),{recursive:!0});let r=gme(gU(n),`.schedules.json.${process.pid}.${hme(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{fme(r,o,"utf-8"),pme(r,n)}catch(i){try{hU(r)&&mme(r)}catch{}throw i}}function hy(e,t){let n=Tn(t),r=n.map(l=>l.id),o=yme(e.name),i=bme(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),ui(n,t),a}function yy(e,t){let n=Tn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(ui(o,t),!0)}function Ap(e,t){return Tn(t).find(n=>n.id===e)}function yme(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function bme(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function by(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 Sy=y(()=>{"use strict";H()});import{existsSync as Sme,readFileSync as wme}from"node:fs";import{join as vme}from"node:path";async function Bn(e,t,n){let r,o;try{let i=vme(xg("default"),"port");if(!Sme(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=wme(i,"utf-8").trim(),a=kme(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function kme(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var di,zx=y(()=>{"use strict";H();di="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 Tme}from"node:fs";import{readFile as Eme}from"node:fs/promises";var yU,bU,SU,wU,vU=y(()=>{"use strict";Sy();H();zx();yU=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=hy({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await Bn("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 Bn("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:di}})}},bU=async(e,t)=>{let n=Tn();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})))}},SU=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=wr();if(!Tme(i))return{content:JSON.stringify([])};let s;try{let c=await Eme(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1042,10 +1042,12 @@ On your first turn, decide whether to call memory_search based on the request:
|
|
|
1042
1042
|
Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`});function Up(e,t){let n=(d,p)=>{if(!(d==null&&p==null))return(d??0)+(p??0)},r=(d,p)=>p!==void 0?p:d,o={stopReason:t.stopReason??e.stopReason??null,...t.raw!==void 0?{raw:t.raw}:e.raw!==void 0?{raw:e.raw}:{}},i=n(e.inputTokens,t.inputTokens);i!==void 0&&(o.inputTokens=i);let s=n(e.outputTokens,t.outputTokens);s!==void 0&&(o.outputTokens=s);let a=r(e.cachedInputTokens,t.cachedInputTokens);a!==void 0&&(o.cachedInputTokens=a);let l=r(e.cacheCreationTokens,t.cacheCreationTokens);l!==void 0&&(o.cacheCreationTokens=l);let c=n(e.totalTokens,t.totalTokens);c!==void 0&&(o.totalTokens=c);let u=n(e.totalCostUsd,t.totalCostUsd);return u!==void 0&&(o.totalCostUsd=u),o}var jA=y(()=>{"use strict"});function pb(){try{let e=Qs();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),t.source&&(n.source=t.source),n}))}catch{return Promise.resolve([])}}var HA=y(()=>{"use strict";lr()});function Nr(e){return e!=null&&uhe.includes(e)}function dhe(e){switch(e){case"max_tokens":return'stop_reason "max_tokens"';case"length":return'finish_reason "length"';case"max_output_tokens":return'incomplete_details.reason "max_output_tokens"';default:return"the provider output-token cap"}}function mb(e,t,n={}){let r=`\u26A0 This turn was cut off at the output-token limit (${dhe(t)}) before the model finished \u2014 anything above is partial, not a complete answer.`;if(e.length>0){let o=[...new Set(e)].join(", "),i=n.canIncreaseOutputLimit===!1?"Continue in a follow-up turn or retry so the model can finish the action.":"Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS, then retry.";return`${r} A tool call was truncated mid-request and was NOT dispatched (${o}); that action did not run. ${i}`}return n.canIncreaseOutputLimit===!1?`${r} Continue in a follow-up turn or retry the request.`:`${r} Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS to allow a longer reply.`}var uhe,jp=y(()=>{"use strict";uhe=["max_tokens","length","max_output_tokens"]});var sc,WA=y(()=>{"use strict";de();sc=class{constructor(t,n,r){this.signal=t;this.traceWriter=n;this.provider=r;re(n,{phase:"loop_start"}),this.interruptedAt=t.aborted?Date.now():null,n&&!t.aborted&&t.addEventListener("abort",this.onInterrupt,{once:!0})}signal;traceWriter;provider;interruptedAt;onInterrupt=()=>{this.interruptedAt===null&&(this.interruptedAt=Date.now())};finish(t){this.signal.removeEventListener("abort",this.onInterrupt),this.interruptedAt!==null&&this.signal.reason==="interrupted"&&re(this.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-this.interruptedAt,metadata:{provider:this.provider}}),re(this.traceWriter,{phase:"loop_end",durationMs:t})}}});import{readFileSync as phe}from"node:fs";import{homedir as mhe}from"node:os";import{join as D1}from"node:path";function fhe(e){try{return phe(e,"utf-8")}catch{return null}}function Br(e,t={},n=!1){let r=t.readEnv??(u=>process.env[u]),o=(t.homedir??mhe)(),i=t.readFile??fhe;if(n){let u=D1(o,".codex","auth.json"),d=i(u);if(d!==null){let p=$1(d);if(p.kind==="chatgpt"&&p.accessToken){let f={apiKey:p.accessToken,source:"chatgpt-oauth",last4:ac(p.accessToken)};return p.accountId!==void 0&&(f.accountId=p.accountId),p.expiresAt!==void 0&&(f.expiresAt=p.expiresAt),f}}return{apiKey:null,source:"no-usable-auth-forced-chatgpt-oauth"}}if(e&&e.length>0)return{apiKey:e,source:"config",last4:ac(e)};let s=r("OPENAI_API_KEY");if(s&&s.length>0)return{apiKey:s,source:"env",last4:ac(s),envVar:"OPENAI_API_KEY"};let a=r("CODEX_API_KEY");if(a&&a.length>0)return{apiKey:a,source:"env",last4:ac(a),envVar:"CODEX_API_KEY"};let l=D1(o,".codex","auth.json"),c=i(l);if(c!==null){let u=$1(c);if(u.kind==="apikey")return{apiKey:u.apiKey,source:"codex-cli",last4:ac(u.apiKey)};if(u.kind==="chatgpt"){if(ghe(r)&&u.accessToken){let d={apiKey:u.accessToken,source:"chatgpt-oauth",last4:ac(u.accessToken)};return u.accountId!==void 0&&(d.accountId=u.accountId),u.expiresAt!==void 0&&(d.expiresAt=u.expiresAt),d}return{apiKey:null,source:"no-usable-auth-codex-oauth"}}}return{apiKey:null,source:"no-usable-auth"}}function $1(e){let t;try{t=JSON.parse(e)}catch{return{kind:"invalid"}}if(typeof t!="object"||t===null)return{kind:"invalid"};let n=t,r=n.OPENAI_API_KEY;if(typeof r=="string"&&r.length>0)return{kind:"apikey",apiKey:r};let o=n.tokens,i=typeof o=="object"&&o!==null?o:null,s=i&&typeof i.access_token=="string"?i.access_token:void 0;if(n.auth_mode==="chatgpt"||s){let a={kind:"chatgpt"};if(s&&(a.accessToken=s),i){let l=hhe(i);l!==void 0&&(a.accountId=l);let c=yhe(i);c!==void 0&&(a.expiresAt=c)}return a}return{kind:"no-key"}}function ac(e){return e.length<=4?e:e.slice(-4)}function ghe(e){let t=e("AFK_OPENAI_CHATGPT_OAUTH");if(!t)return!1;let n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}function F1(e){let t=e.split(".");if(t.length<2||!t[1])return null;try{let n=Buffer.from(t[1],"base64url").toString("utf-8"),r=JSON.parse(n);return typeof r=="object"&&r!==null?r:null}catch{return null}}function hhe(e){let t=e.account_id;if(typeof t=="string"&&t.length>0)return t;for(let n of["access_token","id_token"]){let r=e[n];if(typeof r!="string")continue;let o=F1(r);if(!o)continue;let i=o["https://api.openai.com/auth"];if(typeof i=="object"&&i!==null){let a=i.chatgpt_account_id;if(typeof a=="string"&&a.length>0)return a}let s=o.chatgpt_account_id;if(typeof s=="string"&&s.length>0)return s}}function yhe(e){let t=e.access_token;if(typeof t!="string")return;let n=F1(t)?.exp;return typeof n=="number"?n:void 0}function bhe(e){if(typeof e!="number")return"";let t=e-Math.floor(Date.now()/1e3);if(t<=0)return", EXPIRED \u2014 re-run `codex` to refresh";let n=Math.floor(t/3600),r=Math.floor(t%3600/60);return`, expires in ${n>0?`${n}h `:""}${r}m`}function Hp(e){switch(e.source){case"config":return`using explicit AFK config API key (\u2026${e.last4??"????"})`;case"env":return`using ${e.envVar??"OPENAI_API_KEY"} env var (\u2026${e.last4??"????"})`;case"codex-cli":return`using Codex CLI API key from ~/.codex/auth.json (\u2026${e.last4??"????"})`;case"chatgpt-oauth":{let t=e.accountId?`\u2026${e.accountId.slice(-4)}`:"unknown",n=bhe(e.expiresAt);return`using ChatGPT subscription OAuth from ~/.codex/auth.json (account ${t}${n})`}case"no-usable-auth-codex-oauth":return"Found ChatGPT/OAuth credentials in ~/.codex/auth.json but the OpenAI provider is in API-key mode. To use your ChatGPT subscription, set AFK_OPENAI_CHATGPT_OAUTH=1 (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires). Otherwise run `codex login --api-key` or set OPENAI_API_KEY.";case"no-usable-auth-forced-chatgpt-oauth":return"This model's slot is configured provider: 'chatgpt-oauth' but no ChatGPT-subscription token was found in ~/.codex/auth.json. Sign in with `codex` using ChatGPT (not API-key mode), or change the slot to provider: 'openai' with a key. (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires).";default:return"No OpenAI auth found. Set OPENAI_API_KEY, pass an explicit apiKey in AFK config, or run `codex login --api-key`."}}var lc=y(()=>{"use strict"});function fb(e,t,n){let r=e.lastIndexOf(L1);if(r===-1)return e;let o=e.indexOf(`
|
|
1043
1043
|
`,r+L1.length);if(o===-1)return e;let i=o+1;if(!e.startsWith(KA,i))return e;let s=e.indexOf(`
|
|
1044
1044
|
`,i),a=s===-1?e.length:s,l=e.slice(i+KA.length,a),c=Rh(t??new Date,n);return l===c?e:e.slice(0,i+KA.length)+c+e.slice(a)}var L1,KA,GA=y(()=>{"use strict";jt();L1=`# Environment
|
|
1045
|
-
- Working directory: `,KA="- Date: "});function She(e,t){let n=t===1?"An image was":`${t} images were`,r=t===1?"an image":"images",o=t===1?"it":"them",i=e&&e.trim().length>0?`the current model ("${e.trim()}")`:"the current model";return`[${n} attached to this message, but ${i} cannot view images. Acknowledge to the user that you received ${r} but are unable to see ${o}, and suggest switching to a vision-capable model (e.g. gpt-4o or a Claude model).]`}function whe(e){let t=e.source;return t.type==="base64"?`data:${t.media_type};base64,${t.data}`:t.type==="url"?t.url:null}function N1(e,t){if(typeof e=="string")return e;let n=[],r=0;for(let s of e)typeof s=="object"&&s&&"type"in s
|
|
1045
|
+
- Working directory: `,KA="- Date: "});function She(e,t){let n=t===1?"An image was":`${t} images were`,r=t===1?"an image":"images",o=t===1?"it":"them",i=e&&e.trim().length>0?`the current model ("${e.trim()}")`:"the current model";return`[${n} attached to this message, but ${i} cannot view images. Acknowledge to the user that you received ${r} but are unable to see ${o}, and suggest switching to a vision-capable model (e.g. gpt-4o or a Claude model).]`}function whe(e){let t=e.source;return t.type==="base64"?`data:${t.media_type};base64,${t.data}`:t.type==="url"?t.url:null}function N1(e,t){if(typeof e=="string")return e;let n=[],r=0;for(let s of e)if(typeof s=="object"&&s&&"type"in s){if(s.type==="text")n.push(s.text);else if(s.type==="image")r+=1;else if(s.type==="document"){let a=s,l=a.title??"document",c=a.source;if(c&&c.type==="text")n.push(`[Document: ${l}]
|
|
1046
|
+
${c.data}`);else{let u=c&&"media_type"in c?String(c.media_type):"unknown";n.push(`[Document: ${l}, type: ${u} \u2014 content not available for this provider]`)}}}let o=n.join(`
|
|
1046
1047
|
`);if(r===0)return o;let i=She(t,r);return o.length>0?`${o}
|
|
1047
1048
|
|
|
1048
|
-
${i}`:i}function B1(e,t){if(typeof e=="string")return e;if(!t.vision)return N1(e,t.model);let n=[],r=!1;for(let o of e)if(typeof o=="object"&&o&&"type"in o){if(o.type==="text")n.push({type:"text",text:o.text});else if(o.type==="image"){let i=whe(o);i!==null&&(n.push({type:"image_url",image_url:{url:i}}),r=!0)}
|
|
1049
|
+
${i}`:i}function B1(e,t){if(typeof e=="string")return e;if(!t.vision)return N1(e,t.model);let n=[],r=!1;for(let o of e)if(typeof o=="object"&&o&&"type"in o){if(o.type==="text")n.push({type:"text",text:o.text});else if(o.type==="image"){let i=whe(o);i!==null&&(n.push({type:"image_url",image_url:{url:i}}),r=!0)}else if(o.type==="document"){let i=o,s=i.title??"document",a=i.source;if(a&&a.type==="text")n.push({type:"text",text:`[Document: ${s}]
|
|
1050
|
+
${a.data}`});else{let l=a&&"media_type"in a?String(a.media_type):"unknown";n.push({type:"text",text:`[Document: ${s}, type: ${l} \u2014 content not available for this provider]`})}}}return r?n:N1(e,t.model)}function vhe(e){if(typeof e=="string")return e;let t=[],n=0;for(let i of e)i.type==="text"?t.push(i.text):n+=1;let r=t.join(`
|
|
1049
1051
|
`);if(n===0)return r;let o="[image not shown \u2014 the current model cannot view images]";return r.length>0?`${r}
|
|
1050
1052
|
|
|
1051
1053
|
${o}`:o}function khe(e){let t=e.systemPrompt;if(t!==void 0){if(typeof t=="string")return t.length>0?t:void 0;if(typeof t=="object"&&t!==null&&"append"in t){let n=t.append;return n&&n.length>0?n:void 0}}}function U1(e){let t=[],n=khe(e.config);if(n!==void 0&&t.push({role:"system",content:fb(n)}),e.resumeHistory)for(let r of e.resumeHistory)r.user&&t.push({role:"user",content:r.user}),r.assistant&&t.push({role:"assistant",content:r.assistant});if(e.priorTurns)for(let r of e.priorTurns)t.push(r);return e.currentUserText!==void 0&&t.push({role:"user",content:e.currentUserText}),e.vision===!1?t.map(r=>Array.isArray(r.content)?{...r,content:vhe(r.content)}:r):t}var j1=y(()=>{"use strict";GA()});function Qt(e){return Number.isFinite(e)&&e>=0?e:0}function cc(e,t,n){let r=t.get(e);if(r)return r;let o=e.replace(n,"");return o===e?void 0:t.get(o)}var gb=y(()=>{"use strict"});function Ehe(e){let t=e.trim().toLowerCase();return cc(t,H1,The)}function qA(e){let t=e.trim().toLowerCase();return t==="grok"||t.startsWith("grok-")||t.startsWith("grok_")}function zA(e,t,n,r=0){let o=Ehe(e);if(!o)return;let i=1e6,s=Qt(t),a=Qt(n),l=Math.min(Qt(r),s),c=s-l,u=o.cachedInputPerMTok??o.inputPerMTok;return c/i*o.inputPerMTok+l/i*u+a/i*o.outputPerMTok}var H1,The,hb=y(()=>{"use strict";gb();H1=new Map([["grok-4.6",{inputPerMTok:2,outputPerMTok:6,cachedInputPerMTok:.5}],["grok-4.5",{inputPerMTok:2,outputPerMTok:6,cachedInputPerMTok:.3}],["grok-4.3",{inputPerMTok:1.25,outputPerMTok:2.5,cachedInputPerMTok:.2}],["grok-4.20-0309-reasoning",{inputPerMTok:1.25,outputPerMTok:2.5,cachedInputPerMTok:.2}],["grok-4.20-0309-non-reasoning",{inputPerMTok:1.25,outputPerMTok:2.5,cachedInputPerMTok:.2}],["grok-4.20-multi-agent-0309",{inputPerMTok:1.25,outputPerMTok:2.5,cachedInputPerMTok:.2}],["grok-build-0.1",{inputPerMTok:1,outputPerMTok:2,cachedInputPerMTok:.2}]]),The=/-\d{4}-\d{2}-\d{2}$/});function Ahe(e){let t=e.trim().toLowerCase();return cc(t,Rhe,xhe)}function W1(e,t,n,r=0){let o=Ahe(e);if(!o)return zA(e,t,n,r);let i=1e6,s=Qt(t),a=Qt(n),l=Math.min(Qt(r),s),c=s-l,u=o.cachedInputPerMTok??o.inputPerMTok,d=c/i*o.inputPerMTok,p=l/i*u,f=a/i*o.outputPerMTok;return d+p+f}var Rhe,xhe,K1=y(()=>{"use strict";hb();gb();Rhe=new Map([["gpt-4o",{inputPerMTok:2.5,outputPerMTok:10,cachedInputPerMTok:1.25}],["gpt-4o-mini",{inputPerMTok:.15,outputPerMTok:.6,cachedInputPerMTok:.075}],["gpt-4.1",{inputPerMTok:2,outputPerMTok:8,cachedInputPerMTok:.5}],["gpt-4.1-mini",{inputPerMTok:.4,outputPerMTok:1.6,cachedInputPerMTok:.1}],["gpt-4.1-nano",{inputPerMTok:.1,outputPerMTok:.4,cachedInputPerMTok:.025}],["o1",{inputPerMTok:15,outputPerMTok:60,cachedInputPerMTok:7.5}],["o1-preview",{inputPerMTok:15,outputPerMTok:60,cachedInputPerMTok:7.5}],["o1-pro",{inputPerMTok:150,outputPerMTok:600}],["o1-mini",{inputPerMTok:3,outputPerMTok:12,cachedInputPerMTok:1.5}],["o3",{inputPerMTok:2,outputPerMTok:8,cachedInputPerMTok:.5}],["o3-mini",{inputPerMTok:1.1,outputPerMTok:4.4,cachedInputPerMTok:.55}],["o4-mini",{inputPerMTok:1.1,outputPerMTok:4.4,cachedInputPerMTok:.275}]]),xhe=/-\d{4}-\d{2}-\d{2}$/});function yb(){return{assistantText:"",reasoningText:"",toolCallsByIndex:new Map,finishReason:null,usage:null,model:null,id:null}}function*G1(e,t,n){e.id&&!t.id&&(t.id=e.id),e.model&&!t.model&&(t.model=e.model),e.usage&&(t.usage=e.usage);let r=e.choices?.[0];if(!r)return;r.finish_reason&&(t.finishReason=r.finish_reason);let o=r.delta;if(!o)return;let i=o.reasoning_content??o.reasoning;if(typeof i=="string"&&i.length>0&&(t.reasoningText+=i,yield{type:"delta.reasoning",text:i,sessionId:n}),typeof o.content=="string"&&o.content.length>0&&(t.assistantText+=o.content,yield{type:"delta.text",text:o.content,sessionId:n}),o.tool_calls&&o.tool_calls.length>0)for(let s of o.tool_calls){let a=t.toolCallsByIndex.get(s.index)??{index:s.index,id:"",name:"",argumentsRaw:"",startEmitted:!1};s.id&&(a.id=s.id),s.function?.name&&(a.name=s.function.name),s.function?.arguments&&(a.argumentsRaw+=s.function.arguments),t.toolCallsByIndex.set(s.index,a)}}function q1(e,t){let n=e.usage;if(!n)return{stopReason:e.finishReason??null,resultSubtype:"success",isError:!1};let r=n.prompt_tokens_details?.cached_tokens??0,o=n.prompt_tokens??0,i=n.completion_tokens??0,s={inputTokens:o,outputTokens:i,cachedInputTokens:r,totalTokens:n.total_tokens??o+i,stopReason:e.finishReason??null,resultSubtype:"success",isError:!1,raw:{...n}};if(t){let a=W1(t,o,i,r);a!==void 0&&(s.totalCostUsd=a)}return s}function Wp(e){return[...e.toolCallsByIndex.values()].sort((t,n)=>t.index-n.index)}function z1(e){return e.finishReason==="tool_calls"||e.finishReason==="function_call"?!0:e.finishReason!==null||e.toolCallsByIndex.size===0?!1:[...e.toolCallsByIndex.values()].every(t=>t.id.length>0&&t.name.length>0)}var Kp=y(()=>{"use strict";K1()});function V1(e){return e.map(t=>{let n={name:t.name,parameters:t.input_schema};return t.description!==void 0&&(n.description=t.description),{type:"function",function:n}})}function Y1(e,t){let n=[],r=new Map;for(let o of e){let i={};if(o.argumentsRaw.length>0)try{i=JSON.parse(o.argumentsRaw)}catch(s){let a=s instanceof Error?s.message:String(s);r.set(o.id,`Failed to parse tool arguments as JSON: ${a}`),i={}}n.push({id:o.id,name:o.name,input:i,signal:t})}return{calls:n,parseErrors:r}}function J1(e,t,n=""){let r={role:"assistant",content:e.length>0?e:null,tool_calls:t.map(o=>({id:o.id,type:"function",function:{name:o.name,arguments:o.argumentsRaw}}))};return n.length>0&&(r.reasoning_content=n),r}function X1(e){return e.map(({call:t,result:n})=>({role:"tool",tool_call_id:t.id,content:n.isError?`[error] ${n.content}`:n.content}))}function Q1(e,t){if(!t.vision)return;let n=[],r=[];for(let{call:i,result:s}of e)s.image&&(n.push({type:"image_url",image_url:{url:`data:${s.image.mediaType};base64,${s.image.data}`}}),r.push(i.name));return n.length===0?void 0:{role:"user",content:[{type:"text",text:r.length===1?`Image output from the \`${r[0]}\` tool call (referenced above):`:`Image output from ${r.length} tool calls (${r.join(", ")}):`},...n]}}var VA=y(()=>{"use strict"});function*bb(e,t,n){switch(e.type){case"response.output_text.delta":{typeof e.delta=="string"&&e.delta.length>0&&(t.assistantText+=e.delta,yield{type:"delta.text",text:e.delta,sessionId:n});return}case"response.reasoning_text.delta":case"response.reasoning_summary_text.delta":{typeof e.delta=="string"&&e.delta.length>0&&(t.reasoningText+=e.delta,yield{type:"delta.reasoning",text:e.delta,sessionId:n});return}case"response.output_item.added":{let r=e.item;if(r?.type==="function_call"&&typeof e.output_index=="number"){let o=t.toolCallsByIndex.get(e.output_index),i=o?.argumentsRaw??"";t.toolCallsByIndex.set(e.output_index,{index:e.output_index,id:r.call_id??o?.id??"",name:r.name??o?.name??"",argumentsRaw:i.length>0?i:r.arguments??"",startEmitted:o?.startEmitted??!1})}return}case"response.function_call_arguments.delta":{if(typeof e.output_index=="number"&&typeof e.delta=="string"){let r=t.toolCallsByIndex.get(e.output_index)??{index:e.output_index,id:"",name:"",argumentsRaw:"",startEmitted:!1};r.argumentsRaw+=e.delta,t.toolCallsByIndex.set(e.output_index,r)}return}case"response.completed":{YA(t,e),t.finishReason=t.toolCallsByIndex.size>0?"tool_calls":"stop";return}case"response.incomplete":{YA(t,e),t.finishReason=e.response?.incomplete_details?.reason??"incomplete";return}case"response.failed":{YA(t,e),t.finishReason="failed";return}default:return}}function YA(e,t){let n=t.response?.usage;if(!n)return;let r=n.input_tokens??0,o=n.output_tokens??0;e.usage={prompt_tokens:r,completion_tokens:o,total_tokens:n.total_tokens??r+o,prompt_tokens_details:{cached_tokens:n.input_tokens_details?.cached_tokens??0}}}var JA=y(()=>{"use strict"});function Sb(e){let t=(e??"").trim().toLowerCase();return t?t.startsWith("claude-")||t.startsWith("claude_")||t==="claude"||t.startsWith("local-")||t.startsWith("local_")?!0:/^(opus|sonnet|haiku)(?:[._-].*)?$/.test(t):!1}function eH(e){if(!e)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function _he(e){let t={"OpenAI-Beta":"responses=experimental",originator:"agent-afk"};return e&&(t["chatgpt-account-id"]=e),t}function tH(e,t=!1){return e.source==="chatgpt-oauth"?{mode:"responses",baseURL:Che,headers:_he(e.accountId)}:t?{mode:"responses"}:{mode:"chat-completions"}}var Che,Z1,wb=y(()=>{"use strict";Che="https://chatgpt.com/backend-api/codex",Z1="You are a helpful assistant."});var XA,uc,QA=y(()=>{"use strict";XA="__closed__",uc=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(t=>{this.closeResolve=()=>t(XA)})}begin(){let t=new AbortController;return this.current=t,this.pendingReason!==null&&!t.signal.aborted&&(t.abort(this.pendingReason),this.pendingReason=null),t}clear(t){this.current===t&&(this.current=null)}requestAbort(t){let n=this.current;if(n&&!n.signal.aborted){n.abort(t);return}this.pendingReason=t}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}}});function Vp(e){return`Summarize the following conversation transcript. Follow the system instructions exactly.
|
|
@@ -1874,7 +1876,7 @@ ${T}
|
|
|
1874
1876
|
${E}`})}return{fileBlocks:l,warnings:c}}function I7(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function P7(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}N();L();function M7(e){return{startedAt:e,received:!1}}function O7(e){return e.received?{}:{turnStartedAt:e.startedAt}}function D7(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function $7(e){Ve()&&(e??{fn:console.log}).fn(m.dim(" \u25E6 waiting for response\u2026"))}jv();async function F7(e,t,n,r,o="summary",i,s){let a=RX(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=M7(l);$7(i),fu(process.stdout,Jm(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,k=!1,T={abort:null},E=0,R=3e3,_=[],C=new Map,x=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,I=()=>{let U=r.subagentControl;U?.hasPromotableForeground()&&P7(U,P,r.onQueuedUserMessage).then(({jobs:W,flushedText:K,flushedPreview:M})=>{let z=(i??{fn:console.log}).fn;for(let $ of W)z(m.dim(` \u2192 subagent backgrounded as ${$.jobId}: ${$.label}`));K!==void 0&&z(m.dim(` \u2192 queued message sent to this turn: ${I7(M??K)}`))}).catch(()=>{})},P=r.getCompositor?r.getCompositor():null,D=()=>new Uu({out:ju(i),thinkingMode:o,...x?{activeSkillName:x}:{},onCancel:()=>{t.interrupt().catch(U=>{We()&&console.error(" "+m.error("session.interrupt() failed:"),U)})},...r.subagentControl?{onBackground:I}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...P?{compositor:P}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...O7(c)}),j=D(),F=async()=>{if(!h){h=!0;try{await j.dispose()}catch{}}},X=async()=>{await j.arm();let U=j.getCompositor();if(i&&U){let W=U;i.fn=K=>W.commitAbove(K),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(U),r.setInterruptNotifier?.(W=>j.setInterrupting(W)),r.rearmStatus?.()};try{P?P.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{w=!0,j.setSoftStopping(!0),t.interrupt().catch(te=>{We()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),te)});let $=r.subagentControl;$?.hasActiveForeground()&&$.cancelActiveForeground().catch(te=>{We()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),te)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch($=>{We()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),$)})}),await X(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(I);let{fileBlocks:U,warnings:W}=_7(e.text,{rootDir:process.cwd()});for(let $ of W)(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 K=U.length>0||e.attachments.length>0?await C7(e.text,e.attachments,void 0,U,t.sessionId):e.text,M=t.sendMessageStream(K);if(await oc(($,te)=>{j.process($,te)},async()=>{for await(let $ of M){if(w||k)break;let te=D7(c,$,f);if($.type==="chunk"&&$.chunk.type==="content"?(u=p?T7(u,$.chunk.content):u+$.chunk.content,p=!1,f=!0):$.type==="message"&&!f&&(u=$.message.content),$.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),$.type==="chunk"&&$.chunk.type==="tool_use_detail"){let Q=$.chunk,pe={toolName:Q.toolName,toolUseId:Q.toolUseId,input:Q.toolInput,...Q.toolInputRaw!==void 0&&{inputRaw:Q.toolInputRaw}};C.set(Q.toolUseId,pe),_.push(pe)}else if($.type==="chunk"&&$.chunk.type==="tool_result"){let Q=$.chunk;d=u.length,p=!0;let pe=C.get(Q.toolUseId);if(pe&&(pe.result=Q.content,pe.isError=Q.isError,C.delete(Q.toolUseId)),r.onContextProgress){let Z=Date.now();if(Z-E>=R){E=Z;try{let Se=r.onContextProgress();Se instanceof Promise&&await Se}catch(Se){We()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),Se)}}}}if($.type==="paused"){if(r.setPausedState?.(!0),await F(),P&&$.autoResume===!0){let Q=new AbortController;T.abort=Q;let pe=$.resetsAt?$.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,Z=pe?`Keep waiting \u2014 auto-resumes at ${pe}`:"Keep waiting \u2014 auto-resume in progress",Se="Switch model / provider (type /model after)",Oe="Stop waiting",Vt=[m.warning(" \u23F3 Usage limit reached.")+(pe?m.dim(` Auto-resumes at ${pe}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];fn(P,{header:Vt,options:[Z,Se,Oe],signal:Q.signal,initialIndex:0}).then(ge=>{if(T.abort=null,!ge)return;let ce=ge[0];ce===void 0||ce===Z||(k=!0,ce===Se&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Qe=>{We()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),Qe)}))}).catch(ge=>{We()&&console.error(" "+m.error("picker promise rejected:"),ge)})}else(i??{fn:console.log}).fn(_$({reason:$.reason,...$.resetsAt!==void 0?{resetsAt:$.resetsAt}:{},...$.accountId!==void 0?{accountId:$.accountId}:{},...$.autoResume!==void 0?{autoResume:$.autoResume}:{}}));continue}if($.type==="resumed"){r.setPausedState?.(!1),T.abort?.abort(),T.abort=null;let Q=$.hotSwapped&&$.accountId?`\u25B6 Resumed on ${$.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,_.length=0,C.clear(),b=!1,S=void 0,g=!1,j=D(),h=!1,await X(),(i??{fn:console.log}).fn(m.success(Q));continue}if($.type==="error"){await F(),wl(ml($.error)),g=!0;continue}j.process($),te&&j.notifyFirstContent(),$.type==="done"&&(b=!0,S=$.metadata)}}),await F(),w){let $=i?i.fn:console.log,te=P?P.getPendingCount():0,Q=te>0?` \xB7 ${te} queued`:"";$(m.warning(`\u23F8 Stopped${Q} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),$("")}if(k){let $=i?i.fn:console.log;$(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),$("")}if(b&&!w&&!k){Sa(n,a,u,S,_),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),mu(process.stdout),O4(process.stdout,"afk: turn complete");let $=Q=>{i?i.fn(Q):console.log(Q)},te=AT(u);if(te){$(E7(te)),$("");let Q=j8(_);if(r.onTerminalState)try{r.onTerminalState(te,{doneHasCorroboratingEvidence:Q})}catch{}if(n.permissionMode==="autonomous"){let pe=te.kind==="done"&&kp().verifyDone===!0&&!Q;W8(te,void 0,{unverified:pe})}}if(nO(S,n,$),r.onAfterTurn){let Q=r.onAfterTurn();Q instanceof Promise&&await Q.catch(()=>{})}}}catch(U){await F(),g||wl(ml(U))}finally{await F(),fu(process.stdout,Jm(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),T.abort?.abort(),T.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Hi();var i$e=5e3,s$e=3,a$e="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function l$e(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function L7(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async I=>{We()&&(h=Fk(I)),await Rf(e.session.current),We()&&(b=xM())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,k=!1,T=!1,E,R,_,C=(()=>{let I=parseInt(e.options.maxTurns,10);return I>0?I:void 0})(),x=0;for(g.onInjectable=()=>{x>=s$e||!o.isAwaitingInput()||!o.bufferIsEmpty()||(x++,mu(process.stdout),S={text:a$e,attachments:[]},o.abortPendingRead())};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let M of b)e.replRenderer.writeLine(M);e.replRenderer.writeLine(""),b=[]}let I=f.drainNotifications();for(let{job:M,result:z}of I){let $=z.errorReason===void 0?"\u2713":"\u2717",te=z.errorReason==="abort"?"killed":z.errorReason==="timeout"?"timed out":z.errorReason==="signal-killed"?"killed by signal":`exit ${z.exitCode??0}`,Q=Math.max(0,Math.round(z.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${$} [${M.id}] ${te} \xB7 ${Q}s \xB7 `)+M.command)}let P=g.drainNotifications();for(let{job:M}of P){let z=M.status==="completed"?"\u2713":M.status==="failed"?"\u2717":"\u2298",$=M.endedAt!==void 0?Math.max(0,Math.round((M.endedAt-M.startedAt)/100)/10):0,te=ie(M.label,60);e.replRenderer.writeLine(m.dim(` ${z} [${M.jobId}] subagent ${M.status} \xB7 ${$}s \xB7 `)+te)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let M of D)e.replRenderer.writeLine(M);e.replRenderer.writeLine("")}let j,F;if(S===void 0){let M=await e.session.current.takePendingPlanExitSeed();M!==void 0&&(e.stats.permissionMode=M.mode,S={text:M.message,attachments:[]})}if(S!==void 0){let M=S;S=void 0;let z=Ju(e.stats.permissionMode),$=Ea({buffer:M.text,promptText:z,isTTY:!!process.stdout.isTTY,attachmentSummary:xu([...M.attachments])});e.replRenderer.writeLine($),j=M.text.trim(),F=M.attachments}else{let M=w;w=void 0;let z=await o.readLine({promptFn:()=>Ju(e.stats.permissionMode),...M!==void 0?{initialBuffer:M}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{vT(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});j=z.text.trim(),F=z.attachments}if(!j&&F.length===0)continue;if(j.startsWith("!")){let M=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!M&&(k||(k=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(j))){e.statusLine.rearm();continue}}let X=!1;if(j.startsWith("/")){let M=await F4(j,e.slashCtx,F);if(M.handled){if(M.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((j==="/clear"||j.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),E=void 0),M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="submit"){S={text:M.result.message,attachments:F??[]},e.statusLine.rearm();continue}if(M.result!==null&&typeof M.result=="object"&&"kind"in M.result&&M.result.kind==="prefill"){w=M.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}X=!0}a.push(j),await l$e(e,j);let U=j;if(X){let M=rP(j);if(M){let z=M.name.replace(/^\//,"").split(":").pop()??"";if(z&&vM(z)){let $={skillName:z,rawArgs:M.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},te=e.session.current.sessionId,Q=La(te),pe=Date.now();B(`[afk trace] preflight.start commandName=${z}`);let Z=!1,Se=await Fa($,{cwd:e.stats.cwd??process.cwd(),artifactDir:Q},Oe=>{We()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${z}) failed: `)+(Oe instanceof Error?Oe.message:String(Oe)))});Z=Se!==null,B(`[afk trace] preflight.end commandName=${z} durationMs=${Date.now()-pe} success=${Z}`),U=EM(Se?.manifestBlock,j)}}}let W=f.drainInjections();W.length>0&&(U=W+U);let K=g.drainInjections();if(K.length>0&&(U=K+U),E!==void 0&&(U=E+`
|
|
1875
1877
|
|
|
1876
1878
|
`+U,E=void 0),e.hookRegistry)try{let M={event:"UserPromptSubmit",prompt:U,sessionId:e.stats.sessionId},z=await e.hookRegistry.dispatch(M);z.injectContext&&(U=z.injectContext+U)}catch(M){if(M instanceof Ae){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(M.reason?m.dim(`: ${ae(M.reason)}`):"")),e.statusLine.rearm();continue}if(M instanceof Cr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${M.timeoutMs}ms`)),e.statusLine.rearm();continue}throw M}if(R=void 0,_=void 0,await F7({text:U,attachments:F},e.session.current,e.stats,{setInFlight(M){n.turnInFlight=M},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(M){await t.appendUser(M)},async onQueuedUserMessage(M){await t.appendQueuedUser(M)},async onTurnComplete(M,z){if(await t.appendTurn(M,z),e.stats.sessionId)try{ji(e.stats)}catch($){T||(T=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+($ instanceof Error?$.message:String($))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(M,z)=>{p?.push(M),R=M.kind,_=z?.doneHasCorroboratingEvidence},setActiveCompositor:M=>{n.activeCompositor=M,M===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:M=>{n.notifyInterrupting=M},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:M=>o.setBackgroundHandler(M),setSoftStopHandler:i,setPausedState:M=>o.setPausedState(M),setPauseInterruptHandler:M=>o.setPauseInterruptHandler(M),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(M,z)=>{c.repaint(M),u?.onStage(M,z)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ju(e.stats.permissionMode))),e.hookRegistry)try{let M=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},..._!==void 0?{doneHasCorroboratingEvidence:_}:{}},void 0,i$e);M.injectContext&&M.injectContext.trim().length>0&&(E=M.injectContext)}catch(M){if(M instanceof Ct)throw M;M instanceof Cr?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):M instanceof Ae?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(M.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(M))}}}function c$e(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function N7(e,t,n,r){let o=await BQ(),i=new wT({rl:e.rl,history:o,statusLine:e.statusLine}),s=c$e(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await i7(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=k7(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start()},await L7(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}fp();zl();import{execFile as u$e}from"node:child_process";import{dirname as d$e,isAbsolute as p$e,resolve as m$e}from"node:path";import{promisify as f$e}from"node:util";var B7=f$e(u$e),g$e=3e3,h$e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function y$e(){let t=(await B7("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=p$e(t)?t:m$e(process.cwd(),t);return d$e(n)}async function U7(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await y$e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),g$e)});try{let o=jn({execFile:B7,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=>h$e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Zg();fp();import{promises as b$e}from"node:fs";import{dirname as S$e,join as W7}from"node:path";import{randomBytes as w$e}from"node:crypto";var v$e=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
1877
|
-
`),j7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,oO=30,k$e=1024,T$e=8e3,E$e="haiku";async function R$e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=_$e(n,k$e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??T$e),s=t.signal?I$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rl({token:t.token,model:t.model??E$e,system:v$e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=x$e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=S$e(t.worktreePath);return await A$e(l,c)}function x$e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(j7.test(t)&&t.length<=oO)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>oO)break;o=s}return j7.test(o)?o:null}async function A$e(e,t){if(!await C$e(W7(t,e)))return e;let n=w$e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,oO-5)}-${n}`}async function C$e(e){try{return await b$e.access(e),!0}catch{return!1}}function _$e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function I$e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function K7(e){let t,n,r=W7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await R$e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Qh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return H7(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 H7(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 H7(e,t){e&&e.setCwd(t),P$e(t)}function P$e(e){try{process.chdir(e)}catch{}}ft();Tt();dl();Jr();H();import{spawn as q7}from"child_process";import{existsSync as z7,mkdirSync as F$e,readFileSync as V7,unlinkSync as G7,writeFileSync as Y7}from"fs";import{get as L$e}from"https";import{join as J7}from"path";import{readFileSync as M$e}from"fs";import{dirname as O$e,join as D$e}from"path";import{fileURLToPath as $$e}from"url";function Zr(){try{return"5.
|
|
1879
|
+
`),j7=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,oO=30,k$e=1024,T$e=8e3,E$e="haiku";async function R$e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=_$e(n,k$e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??T$e),s=t.signal?I$e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rl({token:t.token,model:t.model??E$e,system:v$e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=x$e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=S$e(t.worktreePath);return await A$e(l,c)}function x$e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(j7.test(t)&&t.length<=oO)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>oO)break;o=s}return j7.test(o)?o:null}async function A$e(e,t){if(!await C$e(W7(t,e)))return e;let n=w$e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,oO-5)}-${n}`}async function C$e(e){try{return await b$e.access(e),!0}catch{return!1}}function _$e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function I$e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function K7(e){let t,n,r=W7(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await R$e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Qh(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return H7(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 H7(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 H7(e,t){e&&e.setCwd(t),P$e(t)}function P$e(e){try{process.chdir(e)}catch{}}ft();Tt();dl();Jr();H();import{spawn as q7}from"child_process";import{existsSync as z7,mkdirSync as F$e,readFileSync as V7,unlinkSync as G7,writeFileSync as Y7}from"fs";import{get as L$e}from"https";import{join as J7}from"path";import{readFileSync as M$e}from"fs";import{dirname as O$e,join as D$e}from"path";import{fileURLToPath as $$e}from"url";function Zr(){try{return"5.131.0"}catch{}try{let e=O$e($$e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(M$e(D$e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();N();var N$e=64*1024,B$e=10800*1e3,U$e=800,j$e=3600*1e3,H$e="update-check.json",W$e="pending-update.json";function iO(){return J7(ll(),H$e)}function Hf(){return J7(ll(),W$e)}function sO(){let e=ll();z7(e)||F$e(e,{recursive:!0})}function X7(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 Q7(){try{let e=V7(iO(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Z7(){try{sO();let e=`
|
|
1878
1880
|
const https = require('https');
|
|
1879
1881
|
const fs = require('fs');
|
|
1880
1882
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|
|
@@ -420,9 +420,9 @@ export declare const EvalRunEvidenceRefSchema: z.ZodObject<{
|
|
|
420
420
|
export type EvalRunEvidenceRef = z.infer<typeof EvalRunEvidenceRefSchema>;
|
|
421
421
|
export declare const EvalRunStatusSchema: z.ZodEnum<{
|
|
422
422
|
error: "error";
|
|
423
|
+
unsupported: "unsupported";
|
|
423
424
|
pass: "pass";
|
|
424
425
|
fail: "fail";
|
|
425
|
-
unsupported: "unsupported";
|
|
426
426
|
}>;
|
|
427
427
|
export type EvalRunStatus = z.infer<typeof EvalRunStatusSchema>;
|
|
428
428
|
export declare const EvalRunSchema: z.ZodObject<{
|
|
@@ -440,9 +440,9 @@ export declare const EvalRunSchema: z.ZodObject<{
|
|
|
440
440
|
contract: z.ZodNullable<z.ZodString>;
|
|
441
441
|
status: z.ZodEnum<{
|
|
442
442
|
error: "error";
|
|
443
|
+
unsupported: "unsupported";
|
|
443
444
|
pass: "pass";
|
|
444
445
|
fail: "fail";
|
|
445
|
-
unsupported: "unsupported";
|
|
446
446
|
}>;
|
|
447
447
|
createdAt: z.ZodString;
|
|
448
448
|
durationMs: z.ZodNumber;
|
|
@@ -493,9 +493,9 @@ export declare const EvalRunIndexEventSchema: z.ZodObject<{
|
|
|
493
493
|
contract: z.ZodNullable<z.ZodString>;
|
|
494
494
|
status: z.ZodEnum<{
|
|
495
495
|
error: "error";
|
|
496
|
+
unsupported: "unsupported";
|
|
496
497
|
pass: "pass";
|
|
497
498
|
fail: "fail";
|
|
498
|
-
unsupported: "unsupported";
|
|
499
499
|
}>;
|
|
500
500
|
}, z.core.$strip>;
|
|
501
501
|
export type EvalRunIndexEvent = z.infer<typeof EvalRunIndexEventSchema>;
|