agent-afk 5.165.0 → 5.165.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/telegram.mjs CHANGED
@@ -281,7 +281,7 @@ ${o}`,paths:[e,n]}:o!==null?s={content:o,paths:[n]}:r!==null?s={content:r,paths:
281
281
 
282
282
  ${e}`}var fG,kg=g(()=>{"use strict";fG=new Set(["script","style","noscript","template","svg"])});function hG(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function sE(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function yG(t,e){let n=t.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,e)}async function iE(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??hG,c=n.signal??void 0,l;for(let d=0;d<=o;d++){if(c?.aborted)throw c.reason??new Error("aborted");try{let u=await t(e,n);if(!gG.has(u.status)||d===o)return u;let p=yG(u,i)??sE(d,s,i);O("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,c)}catch(u){if(c?.aborted||(l=u,d===o))throw u;let p=sE(d,s,i);O("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,c)}}throw l??new Error("retryFetch: exhausted without a result")}var gG,aE=g(()=>{"use strict";se();gG=new Set([429,502,503,504])});import{BlockList as bG,isIP as Ag}from"node:net";import{lookup as wG}from"node:dns/promises";import{Agent as SG}from"undici";function lE(){let t=S.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function AG(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function _g(t){let e=Ag(t);return e===0?!1:_G.check(t,e===4?"ipv4":"ipv6")}async function dE(t){return wG(t,{all:!0,verbatim:!0})}async function Eg(t,e={}){if(e.allowPrivateHosts??lE())return{allowed:!0};let n;try{n=new URL(t)}catch{return{allowed:!1,reason:`"${t}" 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=AG(n.hostname),o=(a,c)=>`refusing to fetch ${c} \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(Ag(r)!==0)return _g(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??dE,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(_g(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function yi(t,e={}){let n=await Eg(t,e);if(!n.allowed)throw new kt(n.reason)}async function Fl(t,e,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},s=e;for(let i=0;i<=cE;i++){await yi(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??lE())?{dispatcher:EG}:{}},c=await iE(t,s,a,r.retry??{});if(!TG.has(c.status))return c;let l=c.headers.get("location");if(l===null||l.trim()==="")return c;let d;try{d=new URL(l,c.url||s).toString()}catch{return c}await c.body?.cancel().catch(()=>{}),s=d}throw new kt(`too many redirects (>${cE}) starting from ${e}`)}var vG,kG,_G,kt,EG,cE,TG,Tg=g(()=>{"use strict";L();aE();vG=[["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]],kG=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],_G=(()=>{let t=new bG;for(let[e,n]of vG)t.addSubnet(e,n,"ipv4");for(let[e,n]of kG)t.addSubnet(e,n,"ipv6");return t})(),kt=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};EG=new SG({connect:{lookup(t,e,n){dE(t).then(r=>{let o=r.find(i=>_g(i.address));if(o!==void 0){n(new kt(`refusing to connect to ${t} (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 s=r[0];if(s===void 0){n(new Error(`DNS lookup returned no addresses for ${t}`),"",0);return}n(null,s.address,Ag(s.address))},r=>n(r,"",0))}}});cE=20,TG=new Set([301,302,303,307,308])});import{readFileSync as xG}from"node:fs";import{join as RG}from"path";function IG(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function uE(t,e){return IG(e).test(t)}function MG(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(CG.has(e))return!0;if(PG.has(e))return!1}return!1}function pE(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function OG(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function fE(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Tf(e),e}function DG(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function FG(t){try{return xG(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function LG(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=fE(e.defaultProfile)),n}function mE(t){let e=t?.env??S,n=t?.readFileSync??FG,r=t?.surface??e.AGENT_SURFACE,o=MG(e.AFK_BROWSER_HEADLESS,r),s=pE(e.AFK_BROWSER_ALLOWED_DOMAINS),i=pE(e.AFK_BROWSER_BLOCKED_DOMAINS),a=DG(e.AFK_BROWSER_DOM_SNAPSHOTS),c=OG(e.AFK_BROWSER_BACKEND),l=fE(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:c,configPath:null,defaultProfile:l},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():RG(zt(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let h=LG(d,m);return h.configPath=p,h}function Ll(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if(uE(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>uE(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var CG,PG,Nl=g(()=>{"use strict";L();j();CG=new Set(["daemon","subagent","telegram","afk"]),PG=new Set(["repl","interactive","cli"])});import{existsSync as NG,readFileSync as UG}from"node:fs";import{createRequire as $G}from"node:module";import{dirname as BG,join as jG}from"node:path";function yE(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<WG&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function He(t){let e=yE(t);return hE.some(n=>e.includes(n))}function KG(){try{let e=$G(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(UG(e,"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 s=jG(BG(e),o);return NG(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function bi(){return gE??=KG()??HG,gE}function xg(t){return t.includes("install chromium")}function ct(t,e){let n=yE(t),r=e?.latched===!0?` ${GG}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.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: ${bi()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${bi()}). Or pick a different tool.${r}`}function Rg(t,e,n=!1){if(!He(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
283
283
 
284
- ${ct(t,{headless:e,latched:n})}`,{cause:t})}var hE,HG,WG,gE,GG,Ig=g(()=>{"use strict";hE=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],HG="pnpm exec playwright install chromium",WG=4;GG="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 ur from"node:fs";import Ul from"node:path";import{randomBytes as qG}from"node:crypto";import{chromium as XG}from"playwright";function zG(){try{return"5.165.0"}catch{}try{let t=Ul.resolve(import.meta.dirname,"../../../package.json"),e=ur.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var VG,$l,bE=g(()=>{"use strict";Ig();j();se();VG=zG(),$l=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}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=XG.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Rg(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{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",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);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(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),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 e=[...this.sessions.keys()];if(await Promise.all(e.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/${VG}`}}loadStorageState(e){let n=xf(e);try{if(!ur.existsSync(n))return;let r=JSON.parse(ur.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=xf(e);if(!ur.existsSync(r))return;let o=await n.storageState(),s=Ul.join(Ul.dirname(r),`.${Ul.basename(r)}.${process.pid}.${qG(4).toString("hex")}.tmp`);ur.writeFileSync(s,JSON.stringify(o),{mode:384}),ur.chmodSync(s,384),ur.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as JG}from"crypto";function wE(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&YG.test(t.label))}function SE(t){return JG("sha256").update(t,"utf8").digest("hex").slice(0,8)}function vE(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var YG,Bl=g(()=>{"use strict";YG=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as QG}from"node:crypto";function ZG(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function eq(t,e,n){return`el_${QG("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function tq(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function kE(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AE(t,e){let n=t.role??"",r=t.name??"";_E.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])AE(s,e)}async function nq(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},EE).catch(()=>[])}async function rq(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},EE).catch(()=>[])}function oq(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function jl(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=oq(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=nq(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,h]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],AE(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await rq(t)).filter(M=>_E.has(M.role??"")));let k=new Map;for(let C of p){let M=kE(C.name),q=k.get(M);(!q||q.bbox.w===0&&C.bbox.w>0)&&k.set(M,C)}let _=y.map(C=>({ax:C,dom:k.get(kE(C.name??""))})),E=r?_:_.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);E.sort((C,M)=>{let q=C.dom?.bbox.y??0,P=M.dom?.bbox.y??0;if(q!==P)return q-P;let $=C.dom?.bbox.x??0,D=M.dom?.bbox.x??0;return $-D}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=E.slice(0,n).map((C,M)=>{let q=C.ax.role??"generic",P=C.ax.name??"",$=eq(q,P,M),D=C.dom?.bbox??{x:0,y:0,w:0,h:0},N=C.dom?.type??null,B=null;C.ax.value!==void 0&&C.ax.value!==null&&(B=String(C.ax.value)),C.ax.checked!==void 0&&(B=String(C.ax.checked)),wE({role:q,kind:N})&&(B="[redacted]");let K={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(K.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(K.selected=C.ax.selected),C.ax.expanded!==void 0&&(K.expanded=C.ax.expanded);let Q;C.dom?.testId?Q=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(Q=`#${C.dom.id}`);let Ne={id:$,role:q,label:ZG(P),kind:N,value:B,state:K,bbox:D};return Q!==void 0&&(Ne.selector=Q),Ne}),I="idle";try{let C=await t.evaluate(()=>document.readyState);C==="loading"?I="loading":C==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=tq(f),v=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:v,url:m,title:h,textSummary:R,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var _E,EE,TE=g(()=>{"use strict";Bl();_E=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);EE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function xE(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>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 Cg(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>xE(t,s)))).filter(o=>o!==null)}async function sq(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Pg(t,e,n){switch(e.kind){case"element_id":return iq(t,e,n);case"selector":return aq(t,e);case"semantic":return cq(t,e)}}async function iq(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Cg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function aq(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Cg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function cq(t,e){return e.role!==void 0?lq(t,e.text,e.role):dq(t,e.text,e)}async function lq(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Cg(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function dq(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await sq(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await xE(y.locator,y.index);if(b!==null){let k=`${b.role}:${b.label}:${h}`,_=0;for(let E=0;E<k.length;E++)_=_*31+k.charCodeAt(E)>>>0;f.push({...b,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var RE=g(()=>{"use strict"});async function Mg(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ll(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var IE=g(()=>{"use strict";Nl()});import{randomBytes as uq}from"crypto";import{mkdir as pq,stat as fq,writeFile as mq}from"fs/promises";import{join as Og}from"path";import{gzip as gq}from"zlib";import{promisify as hq}from"util";function yq(t){return Og(It(t),"browser")}function bq(t){return Og(yq(t),"screenshots")}function wq(){return new Date().toISOString().replace(/[:.]/g,"-")}function Sq(){return uq(3).toString("hex")}async function Dg(t,e,n){if(e.length>CE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${CE} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=bq(t);await pq(r,{recursive:!0});let o=`${wq()}-${Sq()}-${n}.png`,s=Og(r,o);await mq(s,e);let{size:i}=await fq(s);return{path:s,bytes:i}}var $le,CE,PE=g(()=>{"use strict";j();Bl();$le=hq(gq);CE=5*1024*1024});var OE={};hf(OE,{PlaywrightProvider:()=>Fg});function ME(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Fg,DE=g(()=>{"use strict";bE();TE();RE();Nl();IE();PE();Fg=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new $l(e)}async open(e){let n=Ll(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await Mg(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await jl(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,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),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await jl(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,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),s=r.url(),i=e.timeoutMs??3e4,a=await Pg(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ME(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await Mg(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await jl(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,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),s;if(e.target!==void 0){let d=await Pg(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ME(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);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(e){let n=this.sessions.get(e);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(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var fr={};hf(fr,{__resetBrowserRegistryForTests:()=>Eq,browserProviderActive:()=>_q,closeBrowserProvider:()=>Lg,getBrowserProvider:()=>kq,peekBrowserProvider:()=>Aq});function FE(){Promise.resolve(Lg()).then(()=>{process.exit(130)})}function LE(){Promise.resolve(Lg()).then(()=>{process.exit(143)})}function NE(){Bt=null}function vq(){Hl||(process.on("SIGINT",FE),process.on("SIGTERM",LE),process.on("exit",NE),Hl=!0)}function UE(){Hl&&(process.removeListener("SIGINT",FE),process.removeListener("SIGTERM",LE),process.removeListener("exit",NE),Hl=!1)}async function kq(t){return Bt!==null?Bt:(pr!==null||(pr=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(DE(),OE)),n=mE(t),r=new e(n);return vq(),Bt=r,pr=null,r})()),pr)}async function Lg(){if(Bt===null)return;let t=Bt;Bt=null,pr=null,UE(),await t.shutdown()}function _q(){return Bt!==null}function Aq(){return Bt}function Eq(){Bt=null,pr=null,UE()}var Bt,pr,Hl,mr=g(()=>{"use strict";Nl();Bt=null,pr=null,Hl=!1});async function $E(t,e){try{return await nE(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Pq(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(mr(),fr));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function BE(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??Pq,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Fl(n,t,{headers:Cq,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(Iq.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 u.text();if(Rq.test(p)&&!xq.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await $E(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof kt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=vg({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await yi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>yi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await yi(u.finalUrl,o);let p=await $E(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=vg({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof kt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var xq,Rq,Iq,Cq,jE=g(()=>{"use strict";rE();kg();Tg();se();xq=/(text\/html|application\/xhtml\+xml)/i,Rq=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Iq=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Cq={"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 Dq(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(Mq,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Oq),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Z(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function HE(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?Dq({apiKey:t.exaApiKey,fetchFn:t.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 WE(t,e){if(e.length===0)return`# Search results for "${t}"
284
+ ${ct(t,{headless:e,latched:n})}`,{cause:t})}var hE,HG,WG,gE,GG,Ig=g(()=>{"use strict";hE=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],HG="pnpm exec playwright install chromium",WG=4;GG="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 ur from"node:fs";import Ul from"node:path";import{randomBytes as qG}from"node:crypto";import{chromium as XG}from"playwright";function zG(){try{return"5.165.2"}catch{}try{let t=Ul.resolve(import.meta.dirname,"../../../package.json"),e=ur.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var VG,$l,bE=g(()=>{"use strict";Ig();j();se();VG=zG(),$l=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}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=XG.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Rg(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(c){s=c,await a.abort("blockedbyclient")}});let i=()=>{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",i,{once:!0});try{let a=await o.newPage(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);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(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),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 e=[...this.sessions.keys()];if(await Promise.all(e.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/${VG}`}}loadStorageState(e){let n=xf(e);try{if(!ur.existsSync(n))return;let r=JSON.parse(ur.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=xf(e);if(!ur.existsSync(r))return;let o=await n.storageState(),s=Ul.join(Ul.dirname(r),`.${Ul.basename(r)}.${process.pid}.${qG(4).toString("hex")}.tmp`);ur.writeFileSync(s,JSON.stringify(o),{mode:384}),ur.chmodSync(s,384),ur.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as JG}from"crypto";function wE(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&YG.test(t.label))}function SE(t){return JG("sha256").update(t,"utf8").digest("hex").slice(0,8)}function vE(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var YG,Bl=g(()=>{"use strict";YG=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as QG}from"node:crypto";function ZG(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function eq(t,e,n){return`el_${QG("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function tq(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function kE(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function AE(t,e){let n=t.role??"",r=t.name??"";_E.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])AE(s,e)}async function nq(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},EE).catch(()=>[])}async function rq(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="search"?l="searchbox":l="textbox"}if(!l)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},EE).catch(()=>[])}function oq(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function jl(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=oq(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=nq(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,h]=await Promise.all([i,a,c,l,d]),y,b=!1;u!==null?(y=[],AE(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await rq(t)).filter(M=>_E.has(M.role??"")));let k=new Map;for(let C of p){let M=kE(C.name),q=k.get(M);(!q||q.bbox.w===0&&C.bbox.w>0)&&k.set(M,C)}let _=y.map(C=>({ax:C,dom:k.get(kE(C.name??""))})),E=r?_:_.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);E.sort((C,M)=>{let q=C.dom?.bbox.y??0,P=M.dom?.bbox.y??0;if(q!==P)return q-P;let $=C.dom?.bbox.x??0,D=M.dom?.bbox.x??0;return $-D}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=E.slice(0,n).map((C,M)=>{let q=C.ax.role??"generic",P=C.ax.name??"",$=eq(q,P,M),D=C.dom?.bbox??{x:0,y:0,w:0,h:0},N=C.dom?.type??null,B=null;C.ax.value!==void 0&&C.ax.value!==null&&(B=String(C.ax.value)),C.ax.checked!==void 0&&(B=String(C.ax.checked)),wE({role:q,kind:N})&&(B="[redacted]");let K={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(K.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(K.selected=C.ax.selected),C.ax.expanded!==void 0&&(K.expanded=C.ax.expanded);let Q;C.dom?.testId?Q=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(Q=`#${C.dom.id}`);let Ne={id:$,role:q,label:ZG(P),kind:N,value:B,state:K,bbox:D};return Q!==void 0&&(Ne.selector=Q),Ne}),I="idle";try{let C=await t.evaluate(()=>document.readyState);C==="loading"?I="loading":C==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=tq(f),v=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:v,url:m,title:h,textSummary:R,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var _E,EE,TE=g(()=>{"use strict";Bl();_E=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);EE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function xE(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>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 Cg(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>xE(t,s)))).filter(o=>o!==null)}async function sq(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Pg(t,e,n){switch(e.kind){case"element_id":return iq(t,e,n);case"selector":return aq(t,e);case"semantic":return cq(t,e)}}async function iq(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Cg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function aq(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Cg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function cq(t,e){return e.role!==void 0?lq(t,e.text,e.role):dq(t,e.text,e)}async function lq(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Cg(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function dq(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),c>0&&d.push({loc:s,count:c});let u=await sq(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await xE(y.locator,y.index);if(b!==null){let k=`${b.role}:${b.label}:${h}`,_=0;for(let E=0;E<k.length;E++)_=_*31+k.charCodeAt(E)>>>0;f.push({...b,id:`el_${_.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var RE=g(()=>{"use strict"});async function Mg(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ll(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var IE=g(()=>{"use strict";Nl()});import{randomBytes as uq}from"crypto";import{mkdir as pq,stat as fq,writeFile as mq}from"fs/promises";import{join as Og}from"path";import{gzip as gq}from"zlib";import{promisify as hq}from"util";function yq(t){return Og(It(t),"browser")}function bq(t){return Og(yq(t),"screenshots")}function wq(){return new Date().toISOString().replace(/[:.]/g,"-")}function Sq(){return uq(3).toString("hex")}async function Dg(t,e,n){if(e.length>CE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${CE} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=bq(t);await pq(r,{recursive:!0});let o=`${wq()}-${Sq()}-${n}.png`,s=Og(r,o);await mq(s,e);let{size:i}=await fq(s);return{path:s,bytes:i}}var $le,CE,PE=g(()=>{"use strict";j();Bl();$le=hq(gq);CE=5*1024*1024});var OE={};hf(OE,{PlaywrightProvider:()=>Fg});function ME(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Fg,DE=g(()=>{"use strict";bE();TE();RE();Nl();IE();PE();Fg=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new $l(e)}async open(e){let n=Ll(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await Mg(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await jl(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,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),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await jl(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,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),s=r.url(),i=e.timeoutMs??3e4,a=await Pg(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${ME(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await Mg(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await jl(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),l!==null)throw l;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,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),s;if(e.target!==void 0){let d=await Pg(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${ME(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);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(e){let n=this.sessions.get(e);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(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var fr={};hf(fr,{__resetBrowserRegistryForTests:()=>Eq,browserProviderActive:()=>_q,closeBrowserProvider:()=>Lg,getBrowserProvider:()=>kq,peekBrowserProvider:()=>Aq});function FE(){Promise.resolve(Lg()).then(()=>{process.exit(130)})}function LE(){Promise.resolve(Lg()).then(()=>{process.exit(143)})}function NE(){Bt=null}function vq(){Hl||(process.on("SIGINT",FE),process.on("SIGTERM",LE),process.on("exit",NE),Hl=!0)}function UE(){Hl&&(process.removeListener("SIGINT",FE),process.removeListener("SIGTERM",LE),process.removeListener("exit",NE),Hl=!1)}async function kq(t){return Bt!==null?Bt:(pr!==null||(pr=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(DE(),OE)),n=mE(t),r=new e(n);return vq(),Bt=r,pr=null,r})()),pr)}async function Lg(){if(Bt===null)return;let t=Bt;Bt=null,pr=null,UE(),await t.shutdown()}function _q(){return Bt!==null}function Aq(){return Bt}function Eq(){Bt=null,pr=null,UE()}var Bt,pr,Hl,mr=g(()=>{"use strict";Nl();Bt=null,pr=null,Hl=!1});async function $E(t,e){try{return await nE(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Pq(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(mr(),fr));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function BE(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??Pq,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await Fl(n,t,{headers:Cq,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(Iq.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 u.text();if(Rq.test(p)&&!xq.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await $E(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof kt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=vg({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await yi(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>yi(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await yi(u.finalUrl,o);let p=await $E(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=vg({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof kt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var xq,Rq,Iq,Cq,jE=g(()=>{"use strict";rE();kg();Tg();se();xq=/(text\/html|application\/xhtml\+xml)/i,Rq=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Iq=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Cq={"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 Dq(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(Mq,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Oq),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=Z(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function HE(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?Dq({apiKey:t.exaApiKey,fetchFn:t.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 WE(t,e){if(e.length===0)return`# Search results for "${t}"
285
285
 
286
286
  (no results)`;let n=[`# Search results for "${t}"`,""];return e.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(`
287
287
  `).trimEnd()}var Mq,Oq,KE=g(()=>{"use strict";ht();Mq="https://api.exa.ai/search",Oq=10});function Wl(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var gr=g(()=>{"use strict";Ig()});function Bq(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.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,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=Fq;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,Lq)}let a=Nq;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,Uq)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Ng(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:er(t,e),truncated:!0}}function jq(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env,r=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{};return async(o,s)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=Bq(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let u=s.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,c=()=>{a.abort(s.reason)},l,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",c,{once:!0}),l=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await Eg(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Fl(e,i.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:h instanceof kt?{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 ${i.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 m=Ng(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await BE(i.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:i.timeoutMs,signal:a.signal,...t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let f=Ng(oE(p.markdown,p.advisory),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof kt)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=He(p)&&!xg(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${bi()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=HE({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(i.query,{limit:$q,timeoutMs:i.timeoutMs,signal:a.signal}),f=Ng(WE(i.query,p),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),s.removeEventListener("abort",c)}}}var Fq,Lq,Nq,Uq,$q,GE,qE=g(()=>{"use strict";jE();KE();Tg();bn();kg();gr();Fq=3e4,Lq=12e4,Nq=1e5,Uq=1e6,$q=10;GE=jq()});import{existsSync as zE,mkdirSync as Hq,readFileSync as Wq,renameSync as Kq,unlinkSync as Gq,writeFileSync as qq}from"node:fs";import{dirname as XE,join as Xq}from"node:path";import{randomBytes as zq}from"node:crypto";function hr(t){let e=t??Sf();if(!zE(e))return[];try{let n=Wq(e,"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 ${e}: ${r}`),[]}}function wi(t,e){let n=e??Sf();Hq(XE(n),{recursive:!0});let r=Xq(XE(n),`.schedules.json.${process.pid}.${zq(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{qq(r,o,"utf-8"),Kq(r,n)}catch(s){try{zE(r)&&Gq(r)}catch{}throw s}}function VE(t,e){let n=hr(e),r=n.map(c=>c.id),o=Vq(t.name),s=Jq(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),wi(n,e),a}function JE(t,e){let n=hr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(wi(o,e),!0)}function YE(t,e){return hr(e).find(n=>n.id===t)}function Vq(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Jq(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}function QE(t){return{taskId:t.id,command:t.command,trigger:t.trigger??"cron",...t.cron!==void 0?{cronExpression:t.cron}:{},...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{},...t.notifyChat!==void 0?{notifyChat:t.notifyChat}:{}}}var ZE=g(()=>{"use strict";j()});import{existsSync as Yq,readFileSync as Qq}from"node:fs";import{join as Zq}from"node:path";async function yo(t,e,n){let r,o;try{let s=Zq(uS("default"),"port");if(!Yq(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=Qq(s,"utf-8").trim(),a=e2(i);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 s=r.includes(":")?`[${r}]`:r,i=await fetch(`http://${s}:${o}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return i.ok?{synced:!0,detail:"synced"}:t==="POST"&&i.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&i.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${i.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function e2(t){let e=parseInt(t,10);if(String(e)===t&&!Number.isNaN(e))return e<1||e>65535?null:{host:"localhost",port:e};let n=t.lastIndexOf(":");if(n<1)return null;let r=t.slice(0,n),o=t.slice(n+1);if(!/^\d+$/.test(o))return null;let s=parseInt(o,10);return Number.isNaN(s)||s<1||s>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:s}}var Ug,eT=g(()=>{"use strict";j();Ug="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 t2}from"node:fs";import{readFile as n2}from"node:fs/promises";var tT,nT,rT,oT,sT=g(()=>{"use strict";ZE();j();eT();tT=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;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 s=VE({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}),i=s.enabled?await yo("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await yo("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:Ug}})}},nT=async(t,e)=>{let n=hr();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})))}},rT=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;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,s=Ja();if(!t2(s))return{content:JSON.stringify([])};let i;try{let l=await n2(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
@@ -1123,7 +1123,7 @@ Reply compactly: the answer first, then evidence as file:line citations, then op
1123
1123
  `);return{...Ye,description:(Ye.description??"")+`
1124
1124
 
1125
1125
  Available agent types (pass via \`agent_type\`):
1126
- `+e+"\nWhen `agent_type` is omitted, a general child agent with the default tool surface is dispatched.",input_schema:{...Ye.input_schema,properties:{...Ye.input_schema.properties,agent_type:{type:"string",description:"Named agent type to dispatch \u2014 one of the \"Available agent types\" listed in this tool's description. The type supplies the child's system prompt, tool allowlist (mechanically enforced), and default model/turn budget. Explicit `model`/`max_turns` on this call override the type's defaults. Unknown types fail with the available list. Alias: `subagent_type`."}}}}}var OP=g(()=>{"use strict";st()});var Pu=g(()=>{"use strict";Zi();IP();Ly();By();OP()});import Hy from"path";function Wy(){try{return Hy.resolve(ne())}catch(t){Nt(t);return}}function DP(t){return ir.flatMap(e=>{if(!e.startsWith(".afk/"))return[];let n=Hy.join(t,e.slice(5));return at(n).denied?[]:[n,`$AFK_HOME/${e.slice(5)}`]})}function Ky(){let t=Wy();return t===void 0?[]:[Hy.join(t,"config")]}var FP=g(()=>{"use strict";wn();j();ri()});import{homedir as LP}from"os";import pt from"path";function NP(t){return e=>{if(e.event!=="PreToolUse")return{};if(e.toolName!=="bash")return{};let n=e.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=e.grantManager??t.getGrantManager(),s=o!==void 0,i=LP(),a=Wy(),c=aY(rY(r,i,a),i,a),l=o?Gy(o.getGrants()):[];if(!t.disableInterpreterGuard&&(s||t.forceInterpreterGuard===!0)&&tY.test(r)&&cY(c,l))return{decision:"block",reason:"Interpreter one-liner (python -c, node -e, sh -c, ...) referencing a sensitive path (SSH keys, cloud credentials, GPG, /etc/shadow, ...) is blocked by the path-approval policy \u2014 an interpreter can assemble a path the shell-substring check cannot see. Use the typed file tools (read_file, write_file, edit_file), which support per-call user approval, or ask the user to run the script themselves. To lift this block \u2014 e.g. headless automation that legitimately reads such paths \u2014 set AFK_DISABLE_BASH_INTERPRETER_GUARD=1, or disable all of path-approval with AFK_DISABLE_PATH_APPROVAL=1."};if(!o)return{};if(l.length===0)return{};for(let u of l)if(fl(c,u))return{decision:"block",reason:`Bash command references a restricted path (${u}). For sensitive paths, use read_file / write_file / edit_file \u2014 those tools support per-call user approval via an inline prompt. If you genuinely need a shell command for this path, ask the user to grant it via \`/allow-dir <path>\` first.`};return{}}}function rY(t,e,n){return(n===void 0?t:t.replace(/\$\{AFK_HOME\}|\$AFK_HOME\b/g,n)).replace(/\$\{HOME\}|\$HOME\b/g,e).replace(/(^|[\s/=:])~(?=$|[/\s])/g,`$1${e}`).replace(oY,o=>pt.posix.normalize(o))}function iY(t,e){let n=ir.flatMap(o=>at(pt.join(t,o)).denied?[]:[pt.join(t,o),`~/${o}`,`$HOME/${o}`]);if(e===void 0)return n;let r=DP(e);return[...new Set([...n,...r])]}function aY(t,e,n){let r=t;for(let o of iY(e,n)){let s=new RegExp(`${We(o)}(?![\\w./\\\\*?\\[\\]{}-])(?!['"\`][\\w./\\\\*?\\[\\]{}-])`,"g");r=r.replace(s,sY)}return r}function cY(t,e){return e.some(n=>fl(t,n))||nY.test(t)?!0:Ky().some(n=>fl(t,n))}function lY(){let t=LP();return uY([pt.join(t,"Library","Application Support"),pt.join(t,".password-store"),pt.join(t,".config","gh"),pt.join(t,"Library","LaunchAgents"),pt.join(t,"Library","LaunchDaemons"),"/Library/LaunchAgents","/Library/LaunchDaemons",pt.join(t,".config","systemd"),pt.join(t,".config","systemd","user"),...Km])}function dY(){return Gm(S.AFK_READ_DENYLIST)}function uY(t){let e=[];for(let n of t)e.push(n),n.startsWith("/etc/")?e.push(`/private${n}`):n.startsWith("/private/etc/")&&e.push(n.slice(8));return e}function Gy(t){let e=[...new Set([...lY(),...qm(),...dY(),...Ky()])],n=new Set([...t.resolveBase!==void 0?[t.resolveBase]:[],...t.readRoots,...t.writeRoots]);return e.filter(r=>{for(let o of n){let s=pt.relative(o,r);if(s===""||!s.startsWith("..")&&!pt.isAbsolute(s))return!1}return!0})}var tY,nY,oY,sY,qy=g(()=>{"use strict";wn();L();ml();FP();wo();tY=/\b(python|python3|node|ruby|perl|osascript|sh|bash|zsh|fish|lua)\s+-[cCeE](\s|$)/,nY=/\.ssh\b|\bid_rsa\b|\bid_ed25519\b|\.gnupg\b|\.aws\b|\.config\/gh\b|\.config\/gcloud\b|\.netrc\b|\.password-store\b|\.afk\/config\b|\.npmrc\b|\.docker\/config\.json\b|\.git-credentials\b|\.kube\/config\b|Library\/Application Support\b|\/etc\/shadow\b|\/etc\/sudoers\b|master\.passwd\b|Library\/LaunchAgents\b|Library\/LaunchDaemons\b|\.config\/systemd\b/i;oY=/\/[^\s'"`;|&()<>]*/g,sY="<allowlisted-file>"});import{isAbsolute as $P,parse as pY,relative as BP}from"node:path";import{homedir as UP}from"node:os";function mY(){let t=[];for(let e of[ne,ae])try{let n=e();t.push(n,Fe(n))}catch(n){Nt(n)}return t}function Kt(t){return t===pY(t).root?!0:[...fY,...mY()].some(e=>{let n=BP(t,e);return n===""||!n.startsWith("..")&&!$P(n)})}function gY(){return Gy({resolveBase:void 0,readRoots:[],writeRoots:[]})}function Rr(t){let e=[...new Set([t,Fe(t)])];for(let n of gY())for(let r of e){let o=BP(r,n);if(o===""||!o.startsWith("..")&&!$P(o))return n}}var fY,Xy=g(()=>{"use strict";Be();j();ri();qy();fY=[...new Set([UP(),Fe(UP())])]});function hY(t){return t==null?!0:typeof t=="string"&&t.trim().length===0}function nn(t,...e){for(let n of e){let r=t[n];if(!hY(r))return r}}function Mu(t,e,n=e){let r=nn(t,e);if(r!==void 0){if(typeof r!="string")throw new Error(`Agent tool ${n} must be a string, got: ${JSON.stringify(r)}`);return r}}function jP(t,e,n){let r=nn(t,...e);if(r!==void 0){if(typeof r!="string")throw new Error(`Agent tool ${n} must be a string, got: ${JSON.stringify(r)}`);return r}}function zy(t,e,n=e){let r=nn(t,e);if(r!==void 0){if(typeof r!="number")throw new Error(`Agent tool ${n} must be a number, got: ${JSON.stringify(r)}`);return r}}var HP=g(()=>{"use strict"});import{isAbsolute as Ou,resolve as Vy}from"node:path";function Jy(t){if(typeof t!="object"||t===null)throw new Error("Agent tool input must be an object");let e=t,n=e.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=nn(e,"attachments");if(o!==void 0){if(!Array.isArray(o))throw new Error("Agent tool attachments must be an array of absolute image paths");let R=[];for(let v of o){if(typeof v!="string")throw new Error(`Agent tool attachments entries must be strings, got: ${JSON.stringify(v)}`);if(v.trim().length===0)throw new Error("Agent tool attachments entries must not be empty strings");if(!Ou(v)&&!/^img_[0-9a-f]{6,64}(?:_[1-9][0-9]*)?$/.test(v))throw new Error(`Agent tool attachments entries must be absolute image paths or inbound image ids, got: ${JSON.stringify(v)}`);R.push(v)}R.length>0&&(r=R)}let s=Mu(e,"model"),i=zy(e,"max_turns"),a=i!==void 0,c=i===void 0?0:Math.max(0,Math.floor(i)),l=zy(e,"max_tool_use_iterations"),d=l!==void 0,u=l===void 0?0:Math.max(0,Math.floor(l)),p=jP(e,["agent_type","subagent_type"],"agent_type")?.trim(),f=Mu(e,"id_prefix")??"agent-tool",m="foreground",h=nn(e,"mode");if(h!==void 0){if(h!=="foreground"&&h!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(h)}`);m=h}if(m==="background"&&r!==void 0)throw new Error('Agent tool attachments are not supported with mode:"background"; use mode:"foreground"');let y,b=Mu(e,"cwd");if(b!==void 0){if(!Ou(b))throw new Error(`Agent tool cwd must be an absolute path, got: ${JSON.stringify(b)}`);if(b.split(/[/\\]/).includes(".."))throw new Error(`Agent tool cwd must not contain '..' segments, got: ${JSON.stringify(b)}`);let v=Vy(b),A=Fe(v);if(Kt(v)||Kt(A))throw new Error(`Agent tool cwd must not be a filesystem root, your home directory, or an ancestor of it (checked after resolving symlinks) \u2014 pass a specific subdirectory instead. If the child only needs to READ files outside its tree (dotfiles, ~/.config), do NOT move cwd there: leave cwd alone and grant those paths via readRoots. Got: ${JSON.stringify(b)}`);let C=Rr(v);if(C!==void 0)throw new Error(`Agent tool cwd must not be at or above a credential root the bash restriction protects (${C}) \u2014 anchoring the child there would silently drop that whole tree out of its bash gate. Pass a directory outside it. Got: ${JSON.stringify(b)}`);y=b}let k,_=nn(e,"writeRoots");if(_!==void 0){if(!Array.isArray(_))throw new Error(`Agent tool writeRoots must be an array of absolute paths, got: ${JSON.stringify(_)}`);let R=[];for(let v of _){if(typeof v!="string"||v.length===0)throw new Error(`Agent tool writeRoots entries must be non-empty strings, got: ${JSON.stringify(v)}`);if(!Ou(v))throw new Error(`Agent tool writeRoots entries must be absolute paths, got: ${JSON.stringify(v)}`);if(v.split(/[/\\]/).includes(".."))throw new Error(`Agent tool writeRoots entries must not contain '..' segments, got: ${JSON.stringify(v)}`);let A=Vy(v),C=Fe(A);if(Kt(A)||Kt(C))throw new Error(`Agent tool writeRoots entries must not be a filesystem root, your home directory, or an ancestor of it (checked after resolving symlinks) \u2014 grant a specific subdirectory instead, got: ${JSON.stringify(v)}`);let M=Rr(A);if(M!==void 0)throw new Error(`Agent tool writeRoots entries must not be at or above a credential root the bash restriction protects (${M}) \u2014 granting it would silently drop that whole tree out of the child's bash gate. Grant a narrower subdirectory instead. Got: ${JSON.stringify(v)}`);R.push(v)}R.length>0&&(k=R)}let E,x=nn(e,"readRoots");if(x!==void 0){if(!Array.isArray(x))throw new Error(`Agent tool readRoots must be an array of absolute paths, got: ${JSON.stringify(x)}`);let R=[];for(let v of x){if(typeof v!="string"||v.length===0)throw new Error(`Agent tool readRoots entries must be non-empty strings, got: ${JSON.stringify(v)}`);if(!Ou(v))throw new Error(`Agent tool readRoots entries must be absolute paths, got: ${JSON.stringify(v)}`);if(v.split(/[/\\]/).includes(".."))throw new Error(`Agent tool readRoots entries must not contain '..' segments, got: ${JSON.stringify(v)}`);let A=Vy(v),C=Fe(A);if(Kt(A)||Kt(C))throw new Error(`Agent tool readRoots entries must not be a filesystem root, your home directory, or an ancestor of it (checked after resolving symlinks) \u2014 grant specific subdirectories, or the individual FILES you need: a single file is a valid read root and grants exactly that file, which is how to reach home-root dotfiles (e.g. "<home>/.zshrc", "<home>/.gitconfig") without granting the home directory. Got: ${JSON.stringify(v)}`);let M=at(A);if(M.denied)throw new Error(`Agent tool readRoots entries must not target a protected/credential path (matches ${io} ${M.matched}), got: ${JSON.stringify(v)}`);let q=Rr(A);if(q!==void 0)throw new Error(`Agent tool readRoots entries must not be at or above a credential root the bash restriction protects (${q}) \u2014 granting it would silently drop that whole tree out of the child's bash gate. Grant a narrower subdirectory, or the individual FILES you need: a single file is a valid read root and grants exactly that file. Got: ${JSON.stringify(v)}`);R.push(v)}R.length>0&&(E=R)}let T,I=nn(e,"isolation");if(I!==void 0&&I!=="none"){if(I!=="worktree")throw new Error(`Agent tool isolation must be "none" or "worktree", got: ${JSON.stringify(I)}`);if(y!==void 0)throw new Error("Agent tool cwd and isolation are mutually exclusive \u2014 pass one or the other. To isolate, OMIT cwd entirely (the runtime creates and owns the worktree). To run in a specific directory, omit isolation instead.");if(k!==void 0)throw new Error("Agent tool writeRoots and isolation are mutually exclusive \u2014 a worktree-isolated child is fully confined by design. Omit writeRoots to isolate, or omit isolation to keep the extra write grants.");T="worktree"}return{prompt:n,...r!==void 0?{attachments:r}:{},model:s,max_turns:c,max_turns_explicit:a,max_tool_use_iterations:u,max_tool_use_iterations_explicit:d,id_prefix:f,mode:m,...p!==void 0?{agent_type:p}:{},...y!==void 0?{cwd:y}:{},...k!==void 0?{writeRoots:k}:{},...E!==void 0?{readRoots:E}:{},...T!==void 0?{isolation:T}:{}}}var WP=g(()=>{"use strict";wn();Be();Xy();HP()});function Wo(t){try{return te(t).catch(()=>{})}catch{return Promise.resolve()}}function rn(t,e=240){return t.length<=e?t:t.slice(0,e)+"\u2026"}function on(t){return t!==void 0?rn(t,yY):void 0}function Yy(t){if(t!=null){if(typeof t=="string")return t.length;try{return JSON.stringify(t).length}catch{return}}}function wY(t){if(t==null)return;let e=Yy(t);return e!==void 0&&e>bY?{truncated:!0,chars:e}:t}function GP(t){let e={status:t.status,error:rn(t.errorMessage,KP),subagent_id:t.subagentId};t.schemaErrorMessage&&(e.schemaError=rn(t.schemaErrorMessage,KP));let n=wY(t.partialOutput);return n!==void 0&&(e.partialOutput=n),e}var yY,bY,KP,Du=g(()=>{"use strict";vt();yY=64;bY=4096,KP=1024});function vY(t){if(t===void 0)return!1;let{allowedTools:e,bashReadOnly:n,nestedAgentTypes:r}=t;return e===void 0||e.includes(XP)&&(r===void 0||r.length>0)?!1:e.every(o=>qP.has(o)||o===SY&&n)}function zP(t){let{effectiveAllowedTools:e,nestedAgentTypes:n,resolveNestedAgent:r}=t;return e===void 0||!e.every(o=>qP.has(o))?!1:e.includes(XP)?n===void 0?!1:r===void 0?n.length===0:n.every(o=>vY(r(o))):!0}var qP,XP,SY,VP=g(()=>{"use strict";Vi();qP=new Set(ZC),XP="agent",SY="bash"});function JP(t){let{parsed:e,namedAgent:n,depth:r,maxDepth:o,currentCwd:s,signal:i,defaultConfig:a,createChildExecutor:c}=t,l;if(n!==void 0){let v=n.definition.model;l=v==="inherit"?t.parentModel:v}let d=e.model??l??t.defaultSubagentModel??"sonnet",u=G(d)==="openai-compatible",p=n!==void 0?Ru(n,Ko):void 0,f=t.allowedTools;if(p?.allowedTools!==void 0){let v=t.allowedTools;f=v!==void 0?p.allowedTools.filter(A=>v.includes(A)):p.allowedTools}let m=t.readOnlyBash===!0||p?.bashReadOnly===!0,h=f===void 0||f.includes("write_file")||f.includes("edit_file"),y=(f===void 0||f.includes("bash"))&&m!==!0,b=h||y,k=zP({effectiveAllowedTools:f,nestedAgentTypes:p?.nestedAgentTypes,...t.agentRegistry!==void 0?{resolveNestedAgent:v=>{let A=t.agentRegistry?.get(v);if(A===void 0)return;let C=Ru(A,Ko);return{allowedTools:C.allowedTools,bashReadOnly:C.bashReadOnly,nestedAgentTypes:C.nestedAgentTypes}}}:{}});p!==void 0&&p.droppedTokens.length>0&&process.stderr.write(`[afk] agents: agent_type ${JSON.stringify(n?.name)}: unknown tool token(s) dropped fail-closed: ${p.droppedTokens.join(", ")}
1126
+ `+e+"\nWhen `agent_type` is omitted, a general child agent with the default tool surface is dispatched.",input_schema:{...Ye.input_schema,properties:{...Ye.input_schema.properties,agent_type:{type:"string",description:"Named agent type to dispatch \u2014 one of the \"Available agent types\" listed in this tool's description. The type supplies the child's system prompt, tool allowlist (mechanically enforced), and default model/turn budget. Explicit `model`/`max_turns` on this call override the type's defaults. Unknown types fail with the available list. Alias: `subagent_type`."}}}}}var OP=g(()=>{"use strict";st()});var Pu=g(()=>{"use strict";Zi();IP();Ly();By();OP()});import Hy from"path";function Wy(){try{return Hy.resolve(ne())}catch(t){Nt(t);return}}function DP(t){return ir.flatMap(e=>{if(!e.startsWith(".afk/"))return[];let n=Hy.join(t,e.slice(5));return at(n).denied?[]:[n,`$AFK_HOME/${e.slice(5)}`]})}function Ky(){let t=Wy();return t===void 0?[]:[Hy.join(t,"config")]}var FP=g(()=>{"use strict";wn();j();ri()});import{homedir as LP}from"os";import pt from"path";function NP(t){return e=>{if(e.event!=="PreToolUse")return{};if(e.toolName!=="bash")return{};let n=e.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=e.grantManager??t.getGrantManager?.(),s=o!==void 0,i=LP(),a=Wy(),c=aY(rY(r,i,a),i,a),l=o?Gy(o.getGrants()):[];if(!t.disableInterpreterGuard&&(s||t.forceInterpreterGuard===!0)&&tY.test(r)&&cY(c,l))return{decision:"block",reason:"Interpreter one-liner (python -c, node -e, sh -c, ...) referencing a sensitive path (SSH keys, cloud credentials, GPG, /etc/shadow, ...) is blocked by the path-approval policy \u2014 an interpreter can assemble a path the shell-substring check cannot see. Use the typed file tools (read_file, write_file, edit_file), which support per-call user approval, or ask the user to run the script themselves. To lift this block \u2014 e.g. headless automation that legitimately reads such paths \u2014 set AFK_DISABLE_BASH_INTERPRETER_GUARD=1, or disable all of path-approval with AFK_DISABLE_PATH_APPROVAL=1."};if(!o)return{};if(l.length===0)return{};for(let u of l)if(fl(c,u))return{decision:"block",reason:`Bash command references a restricted path (${u}). For sensitive paths, use read_file / write_file / edit_file \u2014 those tools support per-call user approval via an inline prompt. If you genuinely need a shell command for this path, ask the user to grant it via \`/allow-dir <path>\` first.`};return{}}}function rY(t,e,n){return(n===void 0?t:t.replace(/\$\{AFK_HOME\}|\$AFK_HOME\b/g,n)).replace(/\$\{HOME\}|\$HOME\b/g,e).replace(/(^|[\s/=:])~(?=$|[/\s])/g,`$1${e}`).replace(oY,o=>pt.posix.normalize(o))}function iY(t,e){let n=ir.flatMap(o=>at(pt.join(t,o)).denied?[]:[pt.join(t,o),`~/${o}`,`$HOME/${o}`]);if(e===void 0)return n;let r=DP(e);return[...new Set([...n,...r])]}function aY(t,e,n){let r=t;for(let o of iY(e,n)){let s=new RegExp(`${We(o)}(?![\\w./\\\\*?\\[\\]{}-])(?!['"\`][\\w./\\\\*?\\[\\]{}-])`,"g");r=r.replace(s,sY)}return r}function cY(t,e){return e.some(n=>fl(t,n))||nY.test(t)?!0:Ky().some(n=>fl(t,n))}function lY(){let t=LP();return uY([pt.join(t,"Library","Application Support"),pt.join(t,".password-store"),pt.join(t,".config","gh"),pt.join(t,"Library","LaunchAgents"),pt.join(t,"Library","LaunchDaemons"),"/Library/LaunchAgents","/Library/LaunchDaemons",pt.join(t,".config","systemd"),pt.join(t,".config","systemd","user"),...Km])}function dY(){return Gm(S.AFK_READ_DENYLIST)}function uY(t){let e=[];for(let n of t)e.push(n),n.startsWith("/etc/")?e.push(`/private${n}`):n.startsWith("/private/etc/")&&e.push(n.slice(8));return e}function Gy(t){let e=[...new Set([...lY(),...qm(),...dY(),...Ky()])],n=new Set([...t.resolveBase!==void 0?[t.resolveBase]:[],...t.readRoots,...t.writeRoots]);return e.filter(r=>{for(let o of n){let s=pt.relative(o,r);if(s===""||!s.startsWith("..")&&!pt.isAbsolute(s))return!1}return!0})}var tY,nY,oY,sY,qy=g(()=>{"use strict";wn();L();ml();FP();wo();tY=/\b(python|python3|node|ruby|perl|osascript|sh|bash|zsh|fish|lua)\s+-[cCeE](\s|$)/,nY=/\.ssh\b|\bid_rsa\b|\bid_ed25519\b|\.gnupg\b|\.aws\b|\.config\/gh\b|\.config\/gcloud\b|\.netrc\b|\.password-store\b|\.afk\/config\b|\.npmrc\b|\.docker\/config\.json\b|\.git-credentials\b|\.kube\/config\b|Library\/Application Support\b|\/etc\/shadow\b|\/etc\/sudoers\b|master\.passwd\b|Library\/LaunchAgents\b|Library\/LaunchDaemons\b|\.config\/systemd\b/i;oY=/\/[^\s'"`;|&()<>]*/g,sY="<allowlisted-file>"});import{isAbsolute as $P,parse as pY,relative as BP}from"node:path";import{homedir as UP}from"node:os";function mY(){let t=[];for(let e of[ne,ae])try{let n=e();t.push(n,Fe(n))}catch(n){Nt(n)}return t}function Kt(t){return t===pY(t).root?!0:[...fY,...mY()].some(e=>{let n=BP(t,e);return n===""||!n.startsWith("..")&&!$P(n)})}function gY(){return Gy({resolveBase:void 0,readRoots:[],writeRoots:[]})}function Rr(t){let e=[...new Set([t,Fe(t)])];for(let n of gY())for(let r of e){let o=BP(r,n);if(o===""||!o.startsWith("..")&&!$P(o))return n}}var fY,Xy=g(()=>{"use strict";Be();j();ri();qy();fY=[...new Set([UP(),Fe(UP())])]});function hY(t){return t==null?!0:typeof t=="string"&&t.trim().length===0}function nn(t,...e){for(let n of e){let r=t[n];if(!hY(r))return r}}function Mu(t,e,n=e){let r=nn(t,e);if(r!==void 0){if(typeof r!="string")throw new Error(`Agent tool ${n} must be a string, got: ${JSON.stringify(r)}`);return r}}function jP(t,e,n){let r=nn(t,...e);if(r!==void 0){if(typeof r!="string")throw new Error(`Agent tool ${n} must be a string, got: ${JSON.stringify(r)}`);return r}}function zy(t,e,n=e){let r=nn(t,e);if(r!==void 0){if(typeof r!="number")throw new Error(`Agent tool ${n} must be a number, got: ${JSON.stringify(r)}`);return r}}var HP=g(()=>{"use strict"});import{isAbsolute as Ou,resolve as Vy}from"node:path";function Jy(t){if(typeof t!="object"||t===null)throw new Error("Agent tool input must be an object");let e=t,n=e.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=nn(e,"attachments");if(o!==void 0){if(!Array.isArray(o))throw new Error("Agent tool attachments must be an array of absolute image paths");let R=[];for(let v of o){if(typeof v!="string")throw new Error(`Agent tool attachments entries must be strings, got: ${JSON.stringify(v)}`);if(v.trim().length===0)throw new Error("Agent tool attachments entries must not be empty strings");if(!Ou(v)&&!/^img_[0-9a-f]{6,64}(?:_[1-9][0-9]*)?$/.test(v))throw new Error(`Agent tool attachments entries must be absolute image paths or inbound image ids, got: ${JSON.stringify(v)}`);R.push(v)}R.length>0&&(r=R)}let s=Mu(e,"model"),i=zy(e,"max_turns"),a=i!==void 0,c=i===void 0?0:Math.max(0,Math.floor(i)),l=zy(e,"max_tool_use_iterations"),d=l!==void 0,u=l===void 0?0:Math.max(0,Math.floor(l)),p=jP(e,["agent_type","subagent_type"],"agent_type")?.trim(),f=Mu(e,"id_prefix")??"agent-tool",m="foreground",h=nn(e,"mode");if(h!==void 0){if(h!=="foreground"&&h!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(h)}`);m=h}if(m==="background"&&r!==void 0)throw new Error('Agent tool attachments are not supported with mode:"background"; use mode:"foreground"');let y,b=Mu(e,"cwd");if(b!==void 0){if(!Ou(b))throw new Error(`Agent tool cwd must be an absolute path, got: ${JSON.stringify(b)}`);if(b.split(/[/\\]/).includes(".."))throw new Error(`Agent tool cwd must not contain '..' segments, got: ${JSON.stringify(b)}`);let v=Vy(b),A=Fe(v);if(Kt(v)||Kt(A))throw new Error(`Agent tool cwd must not be a filesystem root, your home directory, or an ancestor of it (checked after resolving symlinks) \u2014 pass a specific subdirectory instead. If the child only needs to READ files outside its tree (dotfiles, ~/.config), do NOT move cwd there: leave cwd alone and grant those paths via readRoots. Got: ${JSON.stringify(b)}`);let C=Rr(v);if(C!==void 0)throw new Error(`Agent tool cwd must not be at or above a credential root the bash restriction protects (${C}) \u2014 anchoring the child there would silently drop that whole tree out of its bash gate. Pass a directory outside it. Got: ${JSON.stringify(b)}`);y=b}let k,_=nn(e,"writeRoots");if(_!==void 0){if(!Array.isArray(_))throw new Error(`Agent tool writeRoots must be an array of absolute paths, got: ${JSON.stringify(_)}`);let R=[];for(let v of _){if(typeof v!="string"||v.length===0)throw new Error(`Agent tool writeRoots entries must be non-empty strings, got: ${JSON.stringify(v)}`);if(!Ou(v))throw new Error(`Agent tool writeRoots entries must be absolute paths, got: ${JSON.stringify(v)}`);if(v.split(/[/\\]/).includes(".."))throw new Error(`Agent tool writeRoots entries must not contain '..' segments, got: ${JSON.stringify(v)}`);let A=Vy(v),C=Fe(A);if(Kt(A)||Kt(C))throw new Error(`Agent tool writeRoots entries must not be a filesystem root, your home directory, or an ancestor of it (checked after resolving symlinks) \u2014 grant a specific subdirectory instead, got: ${JSON.stringify(v)}`);let M=Rr(A);if(M!==void 0)throw new Error(`Agent tool writeRoots entries must not be at or above a credential root the bash restriction protects (${M}) \u2014 granting it would silently drop that whole tree out of the child's bash gate. Grant a narrower subdirectory instead. Got: ${JSON.stringify(v)}`);R.push(v)}R.length>0&&(k=R)}let E,x=nn(e,"readRoots");if(x!==void 0){if(!Array.isArray(x))throw new Error(`Agent tool readRoots must be an array of absolute paths, got: ${JSON.stringify(x)}`);let R=[];for(let v of x){if(typeof v!="string"||v.length===0)throw new Error(`Agent tool readRoots entries must be non-empty strings, got: ${JSON.stringify(v)}`);if(!Ou(v))throw new Error(`Agent tool readRoots entries must be absolute paths, got: ${JSON.stringify(v)}`);if(v.split(/[/\\]/).includes(".."))throw new Error(`Agent tool readRoots entries must not contain '..' segments, got: ${JSON.stringify(v)}`);let A=Vy(v),C=Fe(A);if(Kt(A)||Kt(C))throw new Error(`Agent tool readRoots entries must not be a filesystem root, your home directory, or an ancestor of it (checked after resolving symlinks) \u2014 grant specific subdirectories, or the individual FILES you need: a single file is a valid read root and grants exactly that file, which is how to reach home-root dotfiles (e.g. "<home>/.zshrc", "<home>/.gitconfig") without granting the home directory. Got: ${JSON.stringify(v)}`);let M=at(A);if(M.denied)throw new Error(`Agent tool readRoots entries must not target a protected/credential path (matches ${io} ${M.matched}), got: ${JSON.stringify(v)}`);let q=Rr(A);if(q!==void 0)throw new Error(`Agent tool readRoots entries must not be at or above a credential root the bash restriction protects (${q}) \u2014 granting it would silently drop that whole tree out of the child's bash gate. Grant a narrower subdirectory, or the individual FILES you need: a single file is a valid read root and grants exactly that file. Got: ${JSON.stringify(v)}`);R.push(v)}R.length>0&&(E=R)}let T,I=nn(e,"isolation");if(I!==void 0&&I!=="none"){if(I!=="worktree")throw new Error(`Agent tool isolation must be "none" or "worktree", got: ${JSON.stringify(I)}`);if(y!==void 0)throw new Error("Agent tool cwd and isolation are mutually exclusive \u2014 pass one or the other. To isolate, OMIT cwd entirely (the runtime creates and owns the worktree). To run in a specific directory, omit isolation instead.");if(k!==void 0)throw new Error("Agent tool writeRoots and isolation are mutually exclusive \u2014 a worktree-isolated child is fully confined by design. Omit writeRoots to isolate, or omit isolation to keep the extra write grants.");T="worktree"}return{prompt:n,...r!==void 0?{attachments:r}:{},model:s,max_turns:c,max_turns_explicit:a,max_tool_use_iterations:u,max_tool_use_iterations_explicit:d,id_prefix:f,mode:m,...p!==void 0?{agent_type:p}:{},...y!==void 0?{cwd:y}:{},...k!==void 0?{writeRoots:k}:{},...E!==void 0?{readRoots:E}:{},...T!==void 0?{isolation:T}:{}}}var WP=g(()=>{"use strict";wn();Be();Xy();HP()});function Wo(t){try{return te(t).catch(()=>{})}catch{return Promise.resolve()}}function rn(t,e=240){return t.length<=e?t:t.slice(0,e)+"\u2026"}function on(t){return t!==void 0?rn(t,yY):void 0}function Yy(t){if(t!=null){if(typeof t=="string")return t.length;try{return JSON.stringify(t).length}catch{return}}}function wY(t){if(t==null)return;let e=Yy(t);return e!==void 0&&e>bY?{truncated:!0,chars:e}:t}function GP(t){let e={status:t.status,error:rn(t.errorMessage,KP),subagent_id:t.subagentId};t.schemaErrorMessage&&(e.schemaError=rn(t.schemaErrorMessage,KP));let n=wY(t.partialOutput);return n!==void 0&&(e.partialOutput=n),e}var yY,bY,KP,Du=g(()=>{"use strict";vt();yY=64;bY=4096,KP=1024});function vY(t){if(t===void 0)return!1;let{allowedTools:e,bashReadOnly:n,nestedAgentTypes:r}=t;return e===void 0||e.includes(XP)&&(r===void 0||r.length>0)?!1:e.every(o=>qP.has(o)||o===SY&&n)}function zP(t){let{effectiveAllowedTools:e,nestedAgentTypes:n,resolveNestedAgent:r}=t;return e===void 0||!e.every(o=>qP.has(o))?!1:e.includes(XP)?n===void 0?!1:r===void 0?n.length===0:n.every(o=>vY(r(o))):!0}var qP,XP,SY,VP=g(()=>{"use strict";Vi();qP=new Set(ZC),XP="agent",SY="bash"});function JP(t){let{parsed:e,namedAgent:n,depth:r,maxDepth:o,currentCwd:s,signal:i,defaultConfig:a,createChildExecutor:c}=t,l;if(n!==void 0){let v=n.definition.model;l=v==="inherit"?t.parentModel:v}let d=e.model??l??t.defaultSubagentModel??"sonnet",u=G(d)==="openai-compatible",p=n!==void 0?Ru(n,Ko):void 0,f=t.allowedTools;if(p?.allowedTools!==void 0){let v=t.allowedTools;f=v!==void 0?p.allowedTools.filter(A=>v.includes(A)):p.allowedTools}let m=t.readOnlyBash===!0||p?.bashReadOnly===!0,h=f===void 0||f.includes("write_file")||f.includes("edit_file"),y=(f===void 0||f.includes("bash"))&&m!==!0,b=h||y,k=zP({effectiveAllowedTools:f,nestedAgentTypes:p?.nestedAgentTypes,...t.agentRegistry!==void 0?{resolveNestedAgent:v=>{let A=t.agentRegistry?.get(v);if(A===void 0)return;let C=Ru(A,Ko);return{allowedTools:C.allowedTools,bashReadOnly:C.bashReadOnly,nestedAgentTypes:C.nestedAgentTypes}}}:{}});p!==void 0&&p.droppedTokens.length>0&&process.stderr.write(`[afk] agents: agent_type ${JSON.stringify(n?.name)}: unknown tool token(s) dropped fail-closed: ${p.droppedTokens.join(", ")}
1127
1127
  `);let _=!e.max_turns_explicit&&n?.definition.maxTurns!==void 0?Math.max(1,Math.floor(n.definition.maxTurns)):e.max_turns,E=!e.max_tool_use_iterations_explicit&&n?.definition.maxToolUseIterations!==void 0?Math.max(1,Math.floor(n.definition.maxToolUseIterations)):e.max_tool_use_iterations??0,x=Ji({childModel:d,resolved:t.resolveApiKeyForModel?t.resolveApiKeyForModel(d):oe(d),parentApiKey:a.apiKey}),T={model:d,apiKey:u?void 0:x,systemPrompt:n!==void 0?n.definition.prompt:a.systemPrompt?`${a.systemPrompt}
1128
1128
 
1129
1129
  ${ea}`:ea,baseUrl:u?void 0:a.baseUrl,...a.xaiBaseUrl!==void 0?{xaiBaseUrl:a.xaiBaseUrl}:{},maxTurns:_,maxToolUseIterations:E,depth:r+1,maxDepth:o,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.writeRoots!==void 0?{writeRoots:e.writeRoots}:{},...e.readRoots!==void 0?{extraReadRoots:e.readRoots}:{},...n===void 0&&a.skillDispatchName!==void 0?{skillDispatchName:a.skillDispatchName}:{}},I,R;if(t.childProviderFactory&&r<o){R=new J({parentAbortSignal:i,...s!==void 0?{cwd:s}:{},...t.childInheritedReadRoots!==void 0?{parentReadRoots:t.childInheritedReadRoots}:{},...t.traceWriter!==void 0?{traceWriter:t.traceWriter}:{},...t.surface!==void 0?{surface:t.surface}:{},...t.workspaceStore!==void 0?{workspaceStore:t.workspaceStore}:{}}),I=ta(i);let v=c({subagentManager:R,parentSession:I,defaultConfig:a,...t.surface!==void 0?{surface:t.surface}:{},defaultSubagentModel:t.defaultSubagentModel,childProviderFactory:t.childProviderFactory,childSkillExecutorFactory:t.childSkillExecutorFactory,...t.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:t.resolveApiKeyForModel}:{},depth:r+1,maxDepth:o,...s!==void 0?{cwd:s}:{},...t.traceWriter!==void 0?{traceWriter:t.traceWriter}:{},...t.workspaceStore!==void 0?{workspaceStore:t.workspaceStore}:{},...t.allowedTools!==void 0?{allowedTools:t.allowedTools}:{},...t.readOnlyBash?{readOnlyBash:!0}:{},...t.agentRegistry!==void 0?{agentRegistry:t.agentRegistry}:{},...p?.nestedAgentTypes!==void 0?{nestedAgentAllowlist:p.nestedAgentTypes}:{},parentModel:d}),A={parentReadRoots:t.childInheritedReadRoots,parentCwd:s},C=t.childSkillExecutorFactory?t.childSkillExecutorFactory(r+1,o,i,s,A,n===void 0?a.skillDispatchName:void 0):void 0;T.provider=t.childProviderFactory({childExecutor:v,...C!==void 0?{childSkillExecutor:C}:{},...T.model!==void 0?{model:T.model}:{},...f!==void 0?{allowedTools:f}:{},...m?{readOnlyBash:!0}:{}})}else(f!==void 0||m)&&(T.provider=Fu(f??[...Ko],T.model,m,a.openaiBaseUrl));return{childConfig:T,childParentSession:I,childManager:R,childWriteCapable:b,childSideEffectFree:k}}var YP=g(()=>{"use strict";he();Oy();ue();Su();ve();Tt();Pu();VP()});import{z as On}from"zod";function EY(t){let e=/```(?:json)?\s*([\s\S]*?)```/gi,n;for(;(n=e.exec(t))!==null;){let r=n[1];if(r===void 0)continue;let o=QP(r.trim());if(ZP(o))return o}for(let r=0;r<t.length;r++){if(t[r]!=="{"||TY(t,r))continue;let o=xY(t,r);if(o===-1)continue;let s=t.slice(r,o+1),i=QP(s);if(ZP(i))return i;r=o}}function TY(t,e){for(let n=e-1;n>=0;n--){let r=t[n];if(!(r===" "||r===" "||r===`
@@ -1638,7 +1638,7 @@ Skip when: the findings are purely exploratory, the sub-agent ran inside an alre
1638
1638
 
1639
1639
  Input: ${n}`:""),mode:"form",title:"AFK high-risk approval",requestedSchema:{type:"object",properties:{choice:{type:"string",title:"Approve this high-risk operation?",enum:["approve","deny"],description:"'approve' runs this single call. 'deny' refuses it (the model gets an error and should push an Asking summary or take a safe path)."}},required:["choice"]}}}function BZ(t){let e;try{e=typeof t=="string"?t:JSON.stringify(t)}catch{e=String(t)}return e?(e=Sr(e),e.length>MU?`${e.slice(0,MU)}\u2026 [truncated]`:e):""}function za(t,e){return{decision:"block",reason:`AFK mode: ${t} is refused \u2014 this op is high-risk or irreversible, and ${e}. Push an Asking summary to Telegram (send_telegram) and stop, or have the operator run /afk off and take over.`}}function jZ(t,e){let n=ys.resolve(t),r=ys.resolve(e);if(n===r)return r;let o=ys.relative(r,n);if(o!==""&&!o.startsWith("..")&&!ys.isAbsolute(o))return To(n)??n;let s=To(r),i=To(n);if(s!==void 0&&i!==void 0&&ys.dirname(s)===ys.dirname(i))return i}j();L();ac();import{mkdir as HZ,readFile as WZ,writeFile as DU}from"fs/promises";import{basename as KZ,dirname as GZ,join as FU}from"path";var qZ=1,XZ=["permission-denied","hook-block","policy-refusal"];function zZ(t){return Bn(t,{guard:VZ})}function VZ(t){if(typeof t!="object"||t===null)return!1;let e=t;return typeof e.kind=="string"&&typeof e.ts=="string"&&"payload"in e}function JZ(t){let e=KZ(GZ(t)),n=vf();return{label:e,jsonPath:FU(n,`${e}.json`),mdPath:FU(n,`${e}.md`)}}function YZ(t,e){let n={},r={},o={},s=[],i=0,a=0,c=0,l=0,d={started:0,succeeded:0,failed:0,cancelled:0},u,p,f,m,h,y,b,k,_,E,x=!1;for(let N of t)switch(n[N.kind]=(n[N.kind]??0)+1,N.kind){case"tool_call":{let B=N.payload;if(B.phase!=="completed")break;if(B.circuitBreaker===!0){l++;break}i++;let K=r[B.name]??{total:0,errored:0};if(K.total++,B.isError===!0){c++,K.errored++;let Q=B.failureClass,Ne=Q??"unclassified";o[Ne]=(o[Ne]??0)+1,s.push({toolUseId:B.toolUseId,name:B.name,...Q!==void 0?{failureClass:Q}:{},durationMs:B.durationMs,ts:N.ts,truncated:B.truncated===!0,exempt:Q!==void 0&&TN.has(Q),...B.subagentId!==void 0?{subagentId:B.subagentId}:{}})}else a++;r[B.name]=K;break}case"subagent_lifecycle":{let B=N.payload.transition;B==="started"?d.started++:B==="succeeded"?d.succeeded++:B==="failed"?d.failed++:B==="cancelled"&&d.cancelled++;break}case"closure":{let B=N.payload;u=B.reason,p=B.lastStopReason,f=B.guidance,h=B.finalCostUsd,y=B.finalTurnCount,B.finalTokens!==void 0&&(m=B.finalTokens);break}case"session_sealed":{let B=N.payload;b=B.status,k=B.finalCostUsd,_=B.finalTurnCount,E=B.closedAt,B.incomplete===!0&&(x=!0);break}default:break}let T=s.filter(N=>!N.exempt).length,I=XZ.reduce((N,B)=>N+(o[B]??0),0),R=b??"unknown",v=t[0]?.ts,A=E??(t.length>0?t[t.length-1]?.ts:void 0),C;if(v!==void 0&&A!==void 0){let N=Date.parse(A)-Date.parse(v);Number.isFinite(N)&&N>=0&&(C=N)}let M=k??h,q=_??y,P=[];R==="failed"?P.push('Session sealed with status "failed".'):R==="cancelled"?P.push("Session was cancelled."):R==="unknown"&&P.push("No terminal session_sealed record found \u2014 the trace may be truncated or was read before the session sealed."),x&&P.push("Trace was sealed by the process-exit backstop, indicating an abnormal exit (crash, early EOF, or process.exit())."),u!==void 0&&u!=="model_end_turn"&&P.push(`Closure reason "${u}" is not a clean completion.`),T>0&&P.push(`${T} tool call(s) returned an error (excluding benign outcomes).`),l>0&&P.push(`Repeat-loop circuit breaker fired ${l} time(s).`),d.failed>0&&P.push(`${d.failed} subagent(s) failed.`);let $=["Sourced from witness-trace metadata only: raw tool output (stdout/stderr, file contents, error messages) is NOT recorded in the trace and is therefore absent here.","Failure entries list tool name, failure class, duration, and timestamp; inspect the trace at the path above for full per-call detail."];R==="unknown"&&$.push("No session_sealed record was present when this receipt was generated.");let D={...M!==void 0?{finalCostUsd:M}:{},...q!==void 0?{turnCount:q}:{},...m!==void 0?{tokens:m}:{}};return{schemaVersion:qZ,generatedAt:(e.now??new Date).toISOString(),witnessLabel:e.witnessLabel,tracePath:e.tracePath,...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.endReason!==void 0?{endReason:e.endReason}:{},status:R,...u!==void 0?{closureReason:u}:{},...p!==void 0?{lastStopReason:p}:{},...f!==void 0?{guidance:f}:{},incomplete:x,...v!==void 0?{startedAt:v}:{},...A!==void 0?{endedAt:A}:{},...C!==void 0?{durationMs:C}:{},toolCalls:{total:i,succeeded:a,errored:c,erroredNotable:T,refused:I,circuitBreakerHits:l,byTool:r,byFailureClass:o},events:{total:t.length,byKind:n},subagents:d,cost:D,failures:s,humanReviewRequired:P.length>0,humanReviewReasons:P,limitations:$}}function QZ(t){if(t<1e3)return`${t}ms`;let e=t/1e3;if(e<60)return`${e.toFixed(1)}s`;let n=Math.floor(e/60),r=Math.round(e%60);return`${n}m${r}s`}function ZZ(t){let e=[];e.push(`# Run receipt \u2014 ${t.witnessLabel}`),e.push(""),e.push(`**Status:** ${t.status} \xB7 **Review required:** ${t.humanReviewRequired?"\u26A0\uFE0F YES":"\u2713 no"}`);let n=[];if(t.sessionId!==void 0&&n.push(`**Session:** ${t.sessionId}`),t.endedAt!==void 0&&n.push(`**Ended:** ${t.endedAt}`),t.durationMs!==void 0&&n.push(`**Duration:** ${QZ(t.durationMs)}`),n.length>0&&e.push(n.join(" \xB7 ")),e.push(`**Trace:** \`${t.tracePath}\``),e.push(""),t.humanReviewRequired){e.push("## Why review is required");for(let o of t.humanReviewReasons)e.push(`- ${o}`);e.push("")}if(e.push("## Summary"),e.push(""),e.push("| Metric | Value |"),e.push("| --- | --- |"),e.push(`| Tool calls | ${t.toolCalls.total} |`),e.push(`| Errored | ${t.toolCalls.errored} (${t.toolCalls.erroredNotable} notable) |`),t.toolCalls.refused>0){let o=t.toolCalls.total>0?(t.toolCalls.refused/t.toolCalls.total*100).toFixed(1):"0.0";e.push(`| Refused (denylisted) | ${t.toolCalls.refused} (${o}% of calls) |`)}t.toolCalls.circuitBreakerHits>0&&e.push(`| Circuit-breaker hits | ${t.toolCalls.circuitBreakerHits} |`),t.cost.turnCount!==void 0&&e.push(`| Turns | ${t.cost.turnCount} |`),t.cost.finalCostUsd!==void 0&&e.push(`| Cost (USD) | ${t.cost.finalCostUsd.toFixed(4)} |`),t.subagents.started>0&&e.push(`| Subagents | ${t.subagents.started} started \xB7 ${t.subagents.succeeded} ok \xB7 ${t.subagents.failed} failed \xB7 ${t.subagents.cancelled} cancelled |`),t.closureReason!==void 0&&e.push(`| Closure | ${t.closureReason} |`),e.push("");let r=Object.keys(t.toolCalls.byTool).sort();if(r.length>0){e.push("## Tool calls by name"),e.push(""),e.push("| Tool | Calls | Errored |"),e.push("| --- | --- | --- |");for(let o of r){let s=t.toolCalls.byTool[o];s!==void 0&&e.push(`| ${o} | ${s.total} | ${s.errored} |`)}e.push("")}if(t.failures.length>0){e.push("## Failures"),e.push(""),e.push("| Tool | Class | Duration | When | Exempt |"),e.push("| --- | --- | --- | --- | --- |");for(let o of t.failures)e.push(`| ${o.name} | ${o.failureClass??"unclassified"} | ${o.durationMs}ms | ${o.ts} | ${o.exempt?"yes":"no"} |`);e.push("")}else e.push("No tool failures recorded."),e.push("");e.push("## Limitations"),e.push("");for(let o of t.limitations)e.push(`- ${o}`);return e.push(""),e.push("---"),e.push(`_Generated ${t.generatedAt} by the AFK run-receipt writer (read-only; no agent behavior was modified)._`),e.push(""),e.join(`
1640
1640
  `)}async function eee(t){let e;try{e=await WZ(t.tracePath,"utf8")}catch{return null}let n=zZ(e);if(n.length===0)return null;let r=JZ(t.tracePath),o=YZ(n,{tracePath:t.tracePath,witnessLabel:r.label,...t.sessionId!==void 0?{sessionId:t.sessionId}:{},...t.reason!==void 0?{endReason:t.reason}:{},...t.now!==void 0?{now:t.now}:{}});return await HZ(vf(),{recursive:!0}),await DU(r.jsonPath,JSON.stringify(o,null,2)+`
1641
- `,"utf8"),await DU(r.mdPath,ZZ(o),"utf8"),r}var LU=async t=>{if(t.event!=="SessionEnd")return{};if(t.parentSessionId!==void 0)return{};if(S.AFK_RUN_RECEIPT_DISABLED==="1")return{};if(t.tracePath===void 0)return{};try{await eee({tracePath:t.tracePath,...t.sessionId!==void 0?{sessionId:t.sessionId}:{},...t.reason!==void 0?{reason:t.reason}:{}})}catch{}return{}};Rb();ra();L();br();Be();wn();import UU from"path";ei();function tee(t){let{mode:e,resolvedPath:n}=t,r=JSON.stringify(n);return e==="write"?`Writes are confined to this fork's granted write roots by design (worktree isolation). To allow it, the parent must re-dispatch you via the \`agent\` tool with \`writeRoots: [${r}]\`, or perform the write itself. Return this exact path requirement to your parent.`:`Reads are confined to this fork's granted read roots. To allow it, the parent must re-dispatch you via the \`agent\` tool with \`readRoots: [${r}]\`, or read the path itself and pass the content to you in the prompt. A grant made after you were dispatched cannot reach you \u2014 your roots were fixed at dispatch. Return this exact path requirement to your parent.`}function NU(t){let{mode:e,resolvedPath:n}=t,r=tee(t);return`${Cm} ${n} is outside the session's granted ${e} roots. ${r}`}var $U=new Set(["read_file","write_file","edit_file","list_directory","glob","grep"]),BU=new Set(["write_file","edit_file"]);function qw(t,e){return`${t}:${e}`}function jU(t){let e={sessionApproved:new Set,onceApproved:new Map,inFlight:new Map};return{preToolUse:async(s,i)=>nee(t,e,s,i),postToolUse:s=>ree(t,e,s),sessionEnd:s=>oee(t,e,s)}}async function nee(t,e,n,r){if(n.event!=="PreToolUse")return{};if(!$U.has(n.toolName))return{};let o=n.input;if(!o)return{};let s=HU(n.toolName,o);if(s===void 0)return{};let i=BU.has(n.toolName)?"write":"read",a=n.grantManager??t.getGrantManager();if(!a)return{};let c=a.getGrants(),l=t.getCwd(),d=UU.isAbsolute(s)?s:UU.resolve(c.resolveBase??l??process.cwd(),s);if(i==="read"){let h=at(d);if(h.denied)return console.error(`[path-approval] surface=${t.surface} tool=${n.toolName} path=${d} outcome=read-denylist`),{decision:"block",reason:`Access denied: ${d} ${Sl} (${io} ${h.matched}). This path is never readable \u2014 it holds credentials, not task data; do not retry.`}}if(c.allowAll===!0)return{};if(c.resolveBase===void 0)return{};let u=ii(s,{cwd:l,resolveBase:c.resolveBase,readRoots:c.readRoots,writeRoots:c.writeRoots},i);if(!u.restricted)return{};if(n.parentSessionId!==void 0)return console.error(`[path-approval] surface=${t.surface} tool=${n.toolName} path=${u.resolved} outcome=subagent-autodeny`),{decision:"block",reason:NU({mode:i,resolvedPath:u.resolved})};let p=qw(i,u.resolved);if(e.sessionApproved.has(p))return{};let f=e.inFlight.get(p);if(f)return f;let m=see({toolName:n.toolName,resolvedPath:u.resolved,capturedCwd:l,mode:i,grantManager:a,state:e,surface:t.surface,...r!==void 0?{signal:r}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{}});e.inFlight.set(p,m);try{return await m}finally{e.inFlight.delete(p)}}function ree(t,e,n){if(n.event!=="PostToolUse")return{};if(!$U.has(n.toolName))return{};let r=n.input;if(!r)return{};let o=HU(n.toolName,r);if(o===void 0)return{};let s=BU.has(n.toolName)?"write":"read",i=n.grantManager??t.getGrantManager();if(!i)return{};let a=i.getGrants(),c,l;for(let[d,u]of e.onceApproved){if(u.mode!==s)continue;let{resolved:p}=ii(o,{cwd:u.capturedCwd,resolveBase:a.resolveBase??u.capturedCwd,readRoots:a.readRoots,writeRoots:a.writeRoots},s);if(qw(s,p)===d){c=u,l=d;break}}return!c||l===void 0?{}:(i.revokeRoot(c.resolvedPath,"tool"),e.onceApproved.delete(l),{})}function oee(t,e,n){if(n.event!=="SessionEnd")return{};let r=t.getGrantManager();if(r)for(let{resolvedPath:o}of e.onceApproved.values())r.revokeRoot(o,"tool");return e.onceApproved.clear(),{}}function HU(t,e){if(t==="read_file"||t==="write_file"||t==="edit_file"){let n=e.file_path;return typeof n=="string"?n:void 0}if(t==="list_directory"){let n=e.path;return typeof n=="string"?n:void 0}if(t==="glob"||t==="grep"){let n=e.path;return typeof n=="string"?n:void 0}}async function see(t){let{toolName:e,resolvedPath:n,capturedCwd:r,mode:o,grantManager:s,state:i,surface:a,signal:c,sessionId:l}=t,d=Fe(n),u=d!==n?`
1641
+ `,"utf8"),await DU(r.mdPath,ZZ(o),"utf8"),r}var LU=async t=>{if(t.event!=="SessionEnd")return{};if(t.parentSessionId!==void 0)return{};if(S.AFK_RUN_RECEIPT_DISABLED==="1")return{};if(t.tracePath===void 0)return{};try{await eee({tracePath:t.tracePath,...t.sessionId!==void 0?{sessionId:t.sessionId}:{},...t.reason!==void 0?{reason:t.reason}:{}})}catch{}return{}};Rb();ra();L();br();Be();wn();import UU from"path";ei();function tee(t){let{mode:e,resolvedPath:n}=t,r=JSON.stringify(n);return e==="write"?`Writes are confined to this fork's granted write roots by design (worktree isolation). To allow it, the parent must re-dispatch you via the \`agent\` tool with \`writeRoots: [${r}]\`, or perform the write itself. Return this exact path requirement to your parent.`:`Reads are confined to this fork's granted read roots. To allow it, the parent must re-dispatch you via the \`agent\` tool with \`readRoots: [${r}]\`, or read the path itself and pass the content to you in the prompt. A grant made after you were dispatched cannot reach you \u2014 your roots were fixed at dispatch. Return this exact path requirement to your parent.`}function NU(t){let{mode:e,resolvedPath:n}=t,r=tee(t);return`${Cm} ${n} is outside the session's granted ${e} roots. ${r}`}var $U=new Set(["read_file","write_file","edit_file","list_directory","glob","grep"]),BU=new Set(["write_file","edit_file"]);function qw(t,e){return`${t}:${e}`}function jU(t){let e={sessionApproved:new Set,onceApproved:new Map,inFlight:new Map,lastSeenGrantManager:void 0};return{preToolUse:async(s,i)=>nee(t,e,s,i),postToolUse:s=>ree(t,e,s),sessionEnd:s=>oee(t,e,s)}}async function nee(t,e,n,r){if(n.event!=="PreToolUse")return{};if(!$U.has(n.toolName))return{};let o=n.input;if(!o)return{};let s=HU(n.toolName,o);if(s===void 0)return{};let i=BU.has(n.toolName)?"write":"read",a=n.grantManager??t.getGrantManager?.();if(!a)return{};e.lastSeenGrantManager=a;let c=a.getGrants(),l=t.getCwd(),d=UU.isAbsolute(s)?s:UU.resolve(c.resolveBase??l??process.cwd(),s);if(i==="read"){let h=at(d);if(h.denied)return console.error(`[path-approval] surface=${t.surface} tool=${n.toolName} path=${d} outcome=read-denylist`),{decision:"block",reason:`Access denied: ${d} ${Sl} (${io} ${h.matched}). This path is never readable \u2014 it holds credentials, not task data; do not retry.`}}if(c.allowAll===!0)return{};if(c.resolveBase===void 0)return{};let u=ii(s,{cwd:l,resolveBase:c.resolveBase,readRoots:c.readRoots,writeRoots:c.writeRoots},i);if(!u.restricted)return{};if(n.parentSessionId!==void 0)return console.error(`[path-approval] surface=${t.surface} tool=${n.toolName} path=${u.resolved} outcome=subagent-autodeny`),{decision:"block",reason:NU({mode:i,resolvedPath:u.resolved})};let p=qw(i,u.resolved);if(e.sessionApproved.has(p))return{};let f=e.inFlight.get(p);if(f)return f;let m=see({toolName:n.toolName,resolvedPath:u.resolved,capturedCwd:l,mode:i,grantManager:a,state:e,surface:t.surface,...r!==void 0?{signal:r}:{},...n.sessionId!==void 0?{sessionId:n.sessionId}:{}});e.inFlight.set(p,m);try{return await m}finally{e.inFlight.delete(p)}}function ree(t,e,n){if(n.event!=="PostToolUse")return{};if(!$U.has(n.toolName))return{};let r=n.input;if(!r)return{};let o=HU(n.toolName,r);if(o===void 0)return{};let s=BU.has(n.toolName)?"write":"read",i=n.grantManager??e.lastSeenGrantManager;if(!i)return{};let a=i.getGrants(),c,l;for(let[d,u]of e.onceApproved){if(u.mode!==s)continue;let{resolved:p}=ii(o,{cwd:u.capturedCwd,resolveBase:a.resolveBase??u.capturedCwd,readRoots:a.readRoots,writeRoots:a.writeRoots},s);if(qw(s,p)===d){c=u,l=d;break}}return!c||l===void 0?{}:(i.revokeRoot(c.resolvedPath,"tool"),e.onceApproved.delete(l),{})}function oee(t,e,n){if(n.event!=="SessionEnd")return{};let r=e.lastSeenGrantManager;if(r)for(let{resolvedPath:o}of e.onceApproved.values())r.revokeRoot(o,"tool");return e.onceApproved.clear(),{}}function HU(t,e){if(t==="read_file"||t==="write_file"||t==="edit_file"){let n=e.file_path;return typeof n=="string"?n:void 0}if(t==="list_directory"){let n=e.path;return typeof n=="string"?n:void 0}if(t==="glob"||t==="grep"){let n=e.path;return typeof n=="string"?n:void 0}}async function see(t){let{toolName:e,resolvedPath:n,capturedCwd:r,mode:o,grantManager:s,state:i,surface:a,signal:c,sessionId:l}=t,d=Fe(n),u=d!==n?`
1642
1642
  (resolves to: ${d})`:"",p=`Tool \`${e}\` wants to ${o==="write"?"WRITE to":"read"} a path outside this session's granted roots:
1643
1643
 
1644
1644
  ${n}${u}
@@ -1647,7 +1647,7 @@ Choose how to handle this and future requests for this path.`,f=await Qe.route({
1647
1647
  ${k.trim()}`:""}`),m({decision:{}})}}),h.on("error",R=>{f||(clearTimeout(I),console.warn(`[hooks] command error: ${s} \u2014 ${R.message}`),m({decision:{}}))})})}function pee(t){let e=t.trim();if(!e)return{};let n;try{n=JSON.parse(e)}catch{return{}}if(n===null||typeof n!="object"||Array.isArray(n))return{};let r=n,o={};r.continue===!1&&(o.continue=!1),r.decision==="block"?o.decision="block":r.decision==="approve"&&(o.decision="approve"),typeof r.reason=="string"&&(o.reason=r.reason);let s=r.hookSpecificOutput;if(s!==null&&typeof s=="object"&&!Array.isArray(s)){let i=s;typeof i.additionalContext=="string"&&(o.injectContext=i.additionalContext)}return o}function XU(t,e,n){let r=n.cwd??process.cwd(),o=n.sessionId,s=e.userGlobalEnabled,i=["SessionStart","SessionEnd","SubagentStart","SubagentStop","PreToolUse","PostToolUse","PreCompact","PostToolUseFailure","Stop","UserPromptSubmit"];if(!s){let a=[];for(let c of i){let l=e.hooks[c];if(l!==void 0){for(let d of l)if(d.tier!=="plugin")for(let u of d.hooks)a.push(`${c}: ${u.command}`)}}a.length>0&&console.warn(`[hooks] shell hooks are disabled (enableShellHooks not set in user-global config).
1648
1648
  Skipped ${a.length} hook(s):
1649
1649
  `+a.map(c=>` - ${c}`).join(`
1650
- `))}for(let a of i){let c=e.hooks[a];if(!(c===void 0||c.length===0))for(let l of c){if(l.tier!=="plugin"&&!s)continue;let d=WU(l.matcher);for(let u of l.hooks){let p=u.command,f=u.timeoutMs,m=u.pluginRoot,h=async y=>(y.event==="PreToolUse"||y.event==="PostToolUse"||y.event==="PostToolUseFailure")&&!d(y.toolName)?{}:(await qU({command:p,context:y,agentCwd:r,sessionId:o,timeoutMs:f,...m!==void 0?{pluginRoot:m}:{}})).decision;t.register(a,h)}}}}var zU=!1,VU=new Set;function JU(t,e,n,r,o,s,i){let a=zx(),c=kU();a.register("SubagentStop",c),a.register("Stop",c),a.register("PreToolUse",AU()),a.register("PreToolUse",EU()),a.register("PreToolUse",xU());let l=n??new qe;r!==void 0&&(a.register("PreToolUse",RU(r)),a.register("PreToolUse",OU(r,s?.cwd,i,{...s?.traceWriter!==void 0?{traceWriter:s.traceWriter}:{},...s?.afkPromptForApproval!==void 0?{promptForApproval:s.afkPromptForApproval}:{},...s?.sessionId!==void 0?{sessionId:s.sessionId}:{}}),{longRunning:!0}));let d={current:void 0},u=S.AFK_DISABLE_PATH_APPROVAL==="1";if(u&&!zU&&(zU=!0,console.warn("[path-approval] disabled via AFK_DISABLE_PATH_APPROVAL=1 \u2014 typed-file path-access prompts and bash restrictions are OFF for this process.")),!u){let p=jU({getGrantManager:()=>d.current,getCwd:i??(()=>s?.cwd),surface:fee(e)});a.register("PreToolUse",p.preToolUse,{longRunning:!0}),a.register("PostToolUse",p.postToolUse),a.register("SessionEnd",p.sessionEnd),a.register("PreToolUse",NP({getGrantManager:()=>d.current,disableInterpreterGuard:S.AFK_DISABLE_BASH_INTERPRETER_GUARD==="1",forceInterpreterGuard:S.AFK_FORCE_BASH_INTERPRETER_GUARD==="1"}))}if(a.register("SessionEnd",Cf(l,e)),a.register("SessionEnd",p=>p.event!=="SessionEnd"?{}:(p.sessionId&&SU(p.sessionId),{})),a.register("SessionEnd",p=>p.event!=="SessionEnd"?{}:(p.sessionId&&Cr.clear(p.sessionId),{})),a.register("SessionEnd",LU),a.register("SessionEnd",xb()),t&&a.register("SubagentStop",p=>p.event!=="SubagentStop"?{}:p.status==="idle"||p.status==="running"?{}:(t({subagentId:p.subagentId,status:p.status,durationMs:p.durationMs,agentType:p.agentType}),{})),o!==void 0){for(let p of o.warnings)VU.has(p)||(VU.add(p),console.warn(`[hooks] ${p}`));XU(a,o,{cwd:s?.cwd,sessionId:s?.sessionId})}return{registry:a,memoryStore:l,pathApprovalGrantRef:d}}function fee(t){return t==="telegram"?"telegram":t==="cli"||t==="repl"?"repl":t==="web"?"web":"unknown"}function bs(t){let{memoryStore:e,getSession:n,cwd:r,traceWriter:o}=t;return JU(void 0,"telegram",e,()=>n()?.getSessionMetadata().permissionMode??"default",KU(r!==void 0&&r.length>0?{cwd:r}:{}),{cwd:r!==void 0&&r.length>0?r:void 0,...o!==null?{traceWriter:o}:{},afkPromptForApproval:!1},()=>r)}ho();function YU(t){let e=Math.round(t/1e3);if(e<=0)return"0s";let n=Math.floor(e/86400),r=Math.floor(e%86400/3600),o=Math.floor(e%3600/60),s=e%60;return n>0?`${n}d ${r}h`:r>0?`${r}h ${o}m`:o>0?`${o}m ${s}s`:`${s}s`}function mee(t){switch(t){case"completed":return"\u2705";case"failed":return"\u274C";default:return"\u2699\uFE0F"}}function gee(t){let e=mee(t.status),n=t.endedAt!==void 0?YU(t.endedAt-t.startedAt):"unknown",r=t.label||t.jobId;return`${e} Background task ${t.status}: ${r} \xB7 ${n}`}var gf=class{constructor(e,n,r){this.registry=e;this.chatId=n;this.threadId=r;e.on("settled",this.onSettled)}registry;chatId;threadId;onSettled=e=>{if(e.status==="cancelled")return;let n=gee(e);dr(n,{target:this.chatId,...this.threadId!==void 0?{messageThreadId:this.threadId}:{}}).catch(r=>{console.error(`[bg-notifier] push failed for job ${e.jobId}:`,r)}),this.registry.markDelivered(e.jobId)};dispose(){this.registry.off("settled",this.onSettled)}};async function QU(t){let{sessionConfig:e,config:n,layeredBasePrompt:r,sessionCwd:o,maxOutputTokens:s,maxToolUseIterations:i,traceWriter:a,mcpManager:c,memoryStore:l,workspaceStore:d,chatId:u,threadId:p,reportSession:f}=t,m,h=e.apiKey??n.apiKey??"",y=n.baseUrl,b=e.openaiBaseUrl??n.openaiBaseUrl,k={get sessionId(){return m?.sessionId},getInputStreamRef(){return m?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return m?.abortSignal??new AbortController().signal},get hookRegistry(){return m?.hookRegistry}},_=new $u(a?{traceWriter:a}:{}),E=new gf(_,u,p),{rootManager:x,subagentExecutor:T,skillExecutor:I,composeExecutor:R}=vU({surface:"telegram",parentSession:k,apiKey:h,model:e.model,managerParentModel:e.model,defaultSubagentModel:bN(e.model),resolveApiKeyForModel:yN,...r!==void 0?{systemPrompt:r}:{},...y!==void 0?{baseUrl:y}:{},...b!==void 0?{openaiBaseUrl:b}:{},...o!==void 0&&o.length>0?{cwd:o}:{},...a!==null?{traceWriter:a}:{},...d!==void 0?{workspaceStore:d}:{},backgroundRegistry:_}),v=dU(c?.getMcpToolWireNames()??[]),A=new Ie({permissions:{allowedTools:v},subagentExecutor:T,skillExecutor:I,composeExecutor:R,...c!==void 0?{mcpManager:c}:{},workspaceStore:d,surface:"telegram"}),C=r,M=n.autoRouting?.telegram??!1,q=typeof C=="string"?hs(C,M,"telegram"):C,P,$=bs({memoryStore:l,getSession:()=>P,cwd:o,traceWriter:a}),D=gs(ps({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},model:e.model,...e.resume!==void 0?{resume:e.resume}:{},...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.resumeHistory!==void 0?{resumeHistory:e.resumeHistory}:{},...q!==void 0?{systemPrompt:q}:{},maxTurns:100,drainSubagents:async N=>(E.dispose(),await _.cancelAll(),x.abortAllAndDrain("session_end","user_signal",void 0,N==="reset")),...s!==void 0?{maxOutputTokens:s}:{},...i!==void 0?{maxToolUseIterations:i}:{},...y!==void 0?{baseUrl:y}:{},...o!==void 0&&o.length>0?{cwd:o}:{},provider:A,hookRegistry:$.registry},{traceWriter:a}),c);return P=D,f(D),$.pathApprovalGrantRef.current=A,us(A),m=D,x.setOnSubagentSucceeded((N,B)=>{D.recordSubagentCompletion(N,B)}),R.setOnSubagentSucceeded((N,B)=>{D.recordSubagentCompletion(N,B)}),D}ue();async function ZU(t){let{sessionConfig:e,config:n,layeredBasePrompt:r,sessionCwd:o,maxOutputTokens:s,maxToolUseIterations:i,traceWriter:a,mcpManager:c,memoryStore:l,workspaceStore:d,reportSession:u}=t,p=r,f=n.autoRouting?.telegram??!1,m=typeof p=="string"?hs(p,f,"telegram"):p,h=e.openaiBaseUrl??n.openaiBaseUrl,y=new ke({surface:"telegram",...c!==void 0?{mcpManager:c}:{},workspaceStore:d}),b,k=bs({memoryStore:l,getSession:()=>b,cwd:o,traceWriter:a}),_=gs(ps({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},model:e.model,...e.resume!==void 0?{resume:e.resume}:{},...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.resumeHistory!==void 0?{resumeHistory:e.resumeHistory}:{},...m!==void 0?{systemPrompt:m}:{},maxTurns:100,...s!==void 0?{maxOutputTokens:s}:{},...i!==void 0?{maxToolUseIterations:i}:{},...h!==void 0?{openaiBaseUrl:h}:{},...o!==void 0&&o.length>0?{cwd:o}:{},provider:y,hookRegistry:k.registry},{traceWriter:a}),c);return b=_,u(_),k.pathApprovalGrantRef.current=y,us(y),_}Ra();as();async function e$(t){let{sessionConfig:e,config:n,layeredBasePrompt:r,sessionCwd:o,maxOutputTokens:s,maxToolUseIterations:i,traceWriter:a,mcpManager:c,memoryStore:l,reportSession:d,providerName:u}=t,p=r,f=n.autoRouting?.telegram??!1,m=typeof p=="string"?hs(p,f,"telegram"):p,h=_a(u,u==="xai-oauth"),y=new Nn({surface:"telegram",...h!==void 0?{authMode:h}:{},...c!==void 0?{mcpManager:c}:{}}),b,k=bs({memoryStore:l,getSession:()=>b,cwd:o,traceWriter:a}),_=gs(ps({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},model:e.model,...e.resume!==void 0?{resume:e.resume}:{},...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.resumeHistory!==void 0?{resumeHistory:e.resumeHistory}:{},...m!==void 0?{systemPrompt:m}:{},maxTurns:100,...s!==void 0?{maxOutputTokens:s}:{},...i!==void 0?{maxToolUseIterations:i}:{},...e.xaiBaseUrl!==void 0?{xaiBaseUrl:e.xaiBaseUrl}:{},...o!==void 0&&o.length>0?{cwd:o}:{},provider:y,hookRegistry:k.registry},{traceWriter:a}),c);return b=_,d(_),k.pathApprovalGrantRef.current=y,us(y),_}function t$(t){let{config:e,frameworkBase:n,telegramCwd:r,memoryStore:o}=t,s=t.log??console.log;return async function(a){let c=S.AFK_WORKSPACE_DISABLED==="1"?void 0:new Ks,l=we(a.model)??a.model;s(`Creating session with model: ${a.model} -> ${l}`);let d=G(l),u=Iw(d),p=Cw(d),f=u||p?void 0:wN(),m=SN(),h=a.systemPrompt??e.systemPrompt,y=Rw(n,typeof h=="string"?h:void 0),b=a.cwd??r,k=WN(),_=await lU(b,{...k!==null?{traceWriter:k}:{}}),E,x={sessionConfig:a,config:e,layeredBasePrompt:y,sessionCwd:b,maxOutputTokens:f,maxToolUseIterations:m,traceWriter:k,mcpManager:_,memoryStore:o,workspaceStore:c,...a.telegramChatId!==void 0?{chatId:a.telegramChatId}:{},...a.telegramThreadId!==void 0?{threadId:a.telegramThreadId}:{},reportSession:T=>{E=T}};try{return p?await e$({...x,providerName:d==="xai-oauth"?"xai-oauth":"xai"}):u?await ZU(x):await QU(x)}catch(T){throw E!==void 0?await E.close().catch(()=>{}):_!==void 0&&await _.disconnectAll(),T}}}function n$(t,e){return!t||!e||t==="unknown"||e==="unknown"?{drift:!1}:t===e?{drift:!1}:{drift:!0,message:`[daemon] Version mismatch: running ${t} but installed is ${e}. Exiting.`}}var hee=12;function r$(t){let e=t.maxDeferrals??hee;if(!t.drift.drift)return{action:"none",deferrals:0};let n=t.drift.message??"[daemon] Version drift detected.";if(t.busyCount<=0)return{action:"exit",deferrals:0,message:n};if(t.deferrals>=e)return{action:"force-exit",deferrals:t.deferrals,message:`${n} \u2014 forcing upgrade after ${t.deferrals} deferral(s): ${t.busyCount} session(s) still mid-turn (their turn will be interrupted).`};let r=t.deferrals+1;return{action:"defer",deferrals:r,message:`${n} \u2014 deferred (${r}/${e}): ${t.busyCount} active session(s) mid-turn.`}}var yee=3e5;function bee(t){let{bot:e,spawnedVersion:n,deferrals:r}=t,o=t.log??console.log,s=t.warn??console.warn,i=t.exit??(l=>process.exit(l)),a=t.readVersion??rf,c=e.getStats();o(`
1650
+ `))}for(let a of i){let c=e.hooks[a];if(!(c===void 0||c.length===0))for(let l of c){if(l.tier!=="plugin"&&!s)continue;let d=WU(l.matcher);for(let u of l.hooks){let p=u.command,f=u.timeoutMs,m=u.pluginRoot,h=async y=>(y.event==="PreToolUse"||y.event==="PostToolUse"||y.event==="PostToolUseFailure")&&!d(y.toolName)?{}:(await qU({command:p,context:y,agentCwd:r,sessionId:o,timeoutMs:f,...m!==void 0?{pluginRoot:m}:{}})).decision;t.register(a,h)}}}}var zU=!1,VU=new Set;function JU(t,e,n,r,o,s,i){let a=zx(),c=kU();a.register("SubagentStop",c),a.register("Stop",c),a.register("PreToolUse",AU()),a.register("PreToolUse",EU()),a.register("PreToolUse",xU());let l=n??new qe;r!==void 0&&(a.register("PreToolUse",RU(r)),a.register("PreToolUse",OU(r,s?.cwd,i,{...s?.traceWriter!==void 0?{traceWriter:s.traceWriter}:{},...s?.afkPromptForApproval!==void 0?{promptForApproval:s.afkPromptForApproval}:{},...s?.sessionId!==void 0?{sessionId:s.sessionId}:{}}),{longRunning:!0}));let d=S.AFK_DISABLE_PATH_APPROVAL==="1";if(d&&!zU&&(zU=!0,console.warn("[path-approval] disabled via AFK_DISABLE_PATH_APPROVAL=1 \u2014 typed-file path-access prompts and bash restrictions are OFF for this process.")),!d){let u=jU({getCwd:i??(()=>s?.cwd),surface:fee(e)});a.register("PreToolUse",u.preToolUse,{longRunning:!0}),a.register("PostToolUse",u.postToolUse),a.register("SessionEnd",u.sessionEnd),a.register("PreToolUse",NP({disableInterpreterGuard:S.AFK_DISABLE_BASH_INTERPRETER_GUARD==="1",forceInterpreterGuard:S.AFK_FORCE_BASH_INTERPRETER_GUARD==="1"}))}if(a.register("SessionEnd",Cf(l,e)),a.register("SessionEnd",u=>u.event!=="SessionEnd"?{}:(u.sessionId&&SU(u.sessionId),{})),a.register("SessionEnd",u=>u.event!=="SessionEnd"?{}:(u.sessionId&&Cr.clear(u.sessionId),{})),a.register("SessionEnd",LU),a.register("SessionEnd",xb()),t&&a.register("SubagentStop",u=>u.event!=="SubagentStop"?{}:u.status==="idle"||u.status==="running"?{}:(t({subagentId:u.subagentId,status:u.status,durationMs:u.durationMs,agentType:u.agentType}),{})),o!==void 0){for(let u of o.warnings)VU.has(u)||(VU.add(u),console.warn(`[hooks] ${u}`));XU(a,o,{cwd:s?.cwd,sessionId:s?.sessionId})}return{registry:a,memoryStore:l}}function fee(t){return t==="telegram"?"telegram":t==="cli"||t==="repl"?"repl":t==="web"?"web":"unknown"}function bs(t){let{memoryStore:e,getSession:n,cwd:r,traceWriter:o}=t;return JU(void 0,"telegram",e,()=>n()?.getSessionMetadata().permissionMode??"default",KU(r!==void 0&&r.length>0?{cwd:r}:{}),{cwd:r!==void 0&&r.length>0?r:void 0,...o!==null?{traceWriter:o}:{},afkPromptForApproval:!1},()=>r)}ho();function YU(t){let e=Math.round(t/1e3);if(e<=0)return"0s";let n=Math.floor(e/86400),r=Math.floor(e%86400/3600),o=Math.floor(e%3600/60),s=e%60;return n>0?`${n}d ${r}h`:r>0?`${r}h ${o}m`:o>0?`${o}m ${s}s`:`${s}s`}function mee(t){switch(t){case"completed":return"\u2705";case"failed":return"\u274C";default:return"\u2699\uFE0F"}}function gee(t){let e=mee(t.status),n=t.endedAt!==void 0?YU(t.endedAt-t.startedAt):"unknown",r=t.label||t.jobId;return`${e} Background task ${t.status}: ${r} \xB7 ${n}`}var gf=class{constructor(e,n,r){this.registry=e;this.chatId=n;this.threadId=r;e.on("settled",this.onSettled)}registry;chatId;threadId;onSettled=e=>{if(e.status==="cancelled")return;let n=gee(e);dr(n,{target:this.chatId,...this.threadId!==void 0?{messageThreadId:this.threadId}:{}}).catch(r=>{console.error(`[bg-notifier] push failed for job ${e.jobId}:`,r)}),this.registry.markDelivered(e.jobId)};dispose(){this.registry.off("settled",this.onSettled)}};async function QU(t){let{sessionConfig:e,config:n,layeredBasePrompt:r,sessionCwd:o,maxOutputTokens:s,maxToolUseIterations:i,traceWriter:a,mcpManager:c,memoryStore:l,workspaceStore:d,chatId:u,threadId:p,reportSession:f}=t,m,h=e.apiKey??n.apiKey??"",y=n.baseUrl,b=e.openaiBaseUrl??n.openaiBaseUrl,k={get sessionId(){return m?.sessionId},getInputStreamRef(){return m?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return m?.abortSignal??new AbortController().signal},get hookRegistry(){return m?.hookRegistry}},_=new $u(a?{traceWriter:a}:{}),E=new gf(_,u,p),{rootManager:x,subagentExecutor:T,skillExecutor:I,composeExecutor:R}=vU({surface:"telegram",parentSession:k,apiKey:h,model:e.model,managerParentModel:e.model,defaultSubagentModel:bN(e.model),resolveApiKeyForModel:yN,...r!==void 0?{systemPrompt:r}:{},...y!==void 0?{baseUrl:y}:{},...b!==void 0?{openaiBaseUrl:b}:{},...o!==void 0&&o.length>0?{cwd:o}:{},...a!==null?{traceWriter:a}:{},...d!==void 0?{workspaceStore:d}:{},backgroundRegistry:_}),v=dU(c?.getMcpToolWireNames()??[]),A=new Ie({permissions:{allowedTools:v},subagentExecutor:T,skillExecutor:I,composeExecutor:R,...c!==void 0?{mcpManager:c}:{},workspaceStore:d,surface:"telegram"}),C=r,M=n.autoRouting?.telegram??!1,q=typeof C=="string"?hs(C,M,"telegram"):C,P,$=bs({memoryStore:l,getSession:()=>P,cwd:o,traceWriter:a}),D=gs(ps({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},model:e.model,...e.resume!==void 0?{resume:e.resume}:{},...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.resumeHistory!==void 0?{resumeHistory:e.resumeHistory}:{},...q!==void 0?{systemPrompt:q}:{},maxTurns:100,drainSubagents:async N=>(E.dispose(),await _.cancelAll(),x.abortAllAndDrain("session_end","user_signal",void 0,N==="reset")),...s!==void 0?{maxOutputTokens:s}:{},...i!==void 0?{maxToolUseIterations:i}:{},...y!==void 0?{baseUrl:y}:{},...o!==void 0&&o.length>0?{cwd:o}:{},provider:A,hookRegistry:$.registry},{traceWriter:a}),c);return P=D,f(D),us(A),m=D,x.setOnSubagentSucceeded((N,B)=>{D.recordSubagentCompletion(N,B)}),R.setOnSubagentSucceeded((N,B)=>{D.recordSubagentCompletion(N,B)}),D}ue();async function ZU(t){let{sessionConfig:e,config:n,layeredBasePrompt:r,sessionCwd:o,maxOutputTokens:s,maxToolUseIterations:i,traceWriter:a,mcpManager:c,memoryStore:l,workspaceStore:d,reportSession:u}=t,p=r,f=n.autoRouting?.telegram??!1,m=typeof p=="string"?hs(p,f,"telegram"):p,h=e.openaiBaseUrl??n.openaiBaseUrl,y=new ke({surface:"telegram",...c!==void 0?{mcpManager:c}:{},workspaceStore:d}),b,k=bs({memoryStore:l,getSession:()=>b,cwd:o,traceWriter:a}),_=gs(ps({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},model:e.model,...e.resume!==void 0?{resume:e.resume}:{},...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.resumeHistory!==void 0?{resumeHistory:e.resumeHistory}:{},...m!==void 0?{systemPrompt:m}:{},maxTurns:100,...s!==void 0?{maxOutputTokens:s}:{},...i!==void 0?{maxToolUseIterations:i}:{},...h!==void 0?{openaiBaseUrl:h}:{},...o!==void 0&&o.length>0?{cwd:o}:{},provider:y,hookRegistry:k.registry},{traceWriter:a}),c);return b=_,u(_),us(y),_}Ra();as();async function e$(t){let{sessionConfig:e,config:n,layeredBasePrompt:r,sessionCwd:o,maxOutputTokens:s,maxToolUseIterations:i,traceWriter:a,mcpManager:c,memoryStore:l,reportSession:d,providerName:u}=t,p=r,f=n.autoRouting?.telegram??!1,m=typeof p=="string"?hs(p,f,"telegram"):p,h=_a(u,u==="xai-oauth"),y=new Nn({surface:"telegram",...h!==void 0?{authMode:h}:{},...c!==void 0?{mcpManager:c}:{}}),b,k=bs({memoryStore:l,getSession:()=>b,cwd:o,traceWriter:a}),_=gs(ps({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},model:e.model,...e.resume!==void 0?{resume:e.resume}:{},...e.sessionId!==void 0?{sessionId:e.sessionId}:{},...e.resumeHistory!==void 0?{resumeHistory:e.resumeHistory}:{},...m!==void 0?{systemPrompt:m}:{},maxTurns:100,...s!==void 0?{maxOutputTokens:s}:{},...i!==void 0?{maxToolUseIterations:i}:{},...e.xaiBaseUrl!==void 0?{xaiBaseUrl:e.xaiBaseUrl}:{},...o!==void 0&&o.length>0?{cwd:o}:{},provider:y,hookRegistry:k.registry},{traceWriter:a}),c);return b=_,d(_),us(y),_}function t$(t){let{config:e,frameworkBase:n,telegramCwd:r,memoryStore:o}=t,s=t.log??console.log;return async function(a){let c=S.AFK_WORKSPACE_DISABLED==="1"?void 0:new Ks,l=we(a.model)??a.model;s(`Creating session with model: ${a.model} -> ${l}`);let d=G(l),u=Iw(d),p=Cw(d),f=u||p?void 0:wN(),m=SN(),h=a.systemPrompt??e.systemPrompt,y=Rw(n,typeof h=="string"?h:void 0),b=a.cwd??r,k=WN(),_=await lU(b,{...k!==null?{traceWriter:k}:{}}),E,x={sessionConfig:a,config:e,layeredBasePrompt:y,sessionCwd:b,maxOutputTokens:f,maxToolUseIterations:m,traceWriter:k,mcpManager:_,memoryStore:o,workspaceStore:c,...a.telegramChatId!==void 0?{chatId:a.telegramChatId}:{},...a.telegramThreadId!==void 0?{threadId:a.telegramThreadId}:{},reportSession:T=>{E=T}};try{return p?await e$({...x,providerName:d==="xai-oauth"?"xai-oauth":"xai"}):u?await ZU(x):await QU(x)}catch(T){throw E!==void 0?await E.close().catch(()=>{}):_!==void 0&&await _.disconnectAll(),T}}}function n$(t,e){return!t||!e||t==="unknown"||e==="unknown"?{drift:!1}:t===e?{drift:!1}:{drift:!0,message:`[daemon] Version mismatch: running ${t} but installed is ${e}. Exiting.`}}var hee=12;function r$(t){let e=t.maxDeferrals??hee;if(!t.drift.drift)return{action:"none",deferrals:0};let n=t.drift.message??"[daemon] Version drift detected.";if(t.busyCount<=0)return{action:"exit",deferrals:0,message:n};if(t.deferrals>=e)return{action:"force-exit",deferrals:t.deferrals,message:`${n} \u2014 forcing upgrade after ${t.deferrals} deferral(s): ${t.busyCount} session(s) still mid-turn (their turn will be interrupted).`};let r=t.deferrals+1;return{action:"defer",deferrals:r,message:`${n} \u2014 deferred (${r}/${e}): ${t.busyCount} active session(s) mid-turn.`}}var yee=3e5;function bee(t){let{bot:e,spawnedVersion:n,deferrals:r}=t,o=t.log??console.log,s=t.warn??console.warn,i=t.exit??(l=>process.exit(l)),a=t.readVersion??rf,c=e.getStats();o(`
1651
1651
  \u{1F4CA} Stats: ${c.activeSessions} active sessions, ${c.totalChats} total chats`);try{let l=a();if(l===ja)return s("\u26A0\uFE0F [daemon] Could not re-read package.json for version drift check \u2014 skipping."),r;let d=n$(n,l),u=d.drift?e.getBusySessionCount():0,p=r$({drift:d,busyCount:u,deferrals:r});switch(p.action){case"none":break;case"defer":p.message!==void 0&&o(`\u26A0\uFE0F ${p.message}`);break;case"exit":case"force-exit":p.message!==void 0&&o(`\u26A0\uFE0F ${p.message}`),i(0)}return p.deferrals}catch{return s("\u26A0\uFE0F [daemon] Could not re-read package.json for version drift check \u2014 skipping."),r}}function o$(t){let e=0;return setInterval(()=>{e=bee({...t,deferrals:e})},t.intervalMs??yee)}async function s$(){let t=rf();t===ja&&console.warn("\u26A0\uFE0F [daemon] Could not read package.json at startup \u2014 version drift check disabled.");let e;try{e=bg()}catch(b){console.error("\u274C Configuration error:",b.message),process.exit(1)}let n=xw(),r=G(e.model),o=await lA(r),s=_N(r,{loadAnthropicCredential:()=>fo()??o});AN(s,e)||process.exit(1),kN($n());let i=S.TELEGRAM_BOT_TOKEN;i||(console.error("\u274C Error: TELEGRAM_BOT_TOKEN environment variable is required"),console.error(`
1652
1652
  How to get a bot token:`),console.error(" 1. Open Telegram and search for @BotFather"),console.error(" 2. Send /newbot and follow the instructions"),console.error(" 3. Run: afk telegram setup"),process.exit(1));let a=lr(S.AFK_TELEGRAM_ALLOWED_CHAT_IDS,console.warn);a.size===0&&(console.error("\u274C Error: AFK_TELEGRAM_ALLOWED_CHAT_IDS must list at least one chat ID"),console.error(`
1653
1653
  This is an allowlist that gates who can message the bot.`),console.error("Run `afk telegram setup` to set it interactively, or set it manually:"),console.error(" AFK_TELEGRAM_ALLOWED_CHAT_IDS=123456789,-100987654321"),process.exit(1)),console.log("\u{1F50E} Validating bot token...");let c=await gN(i);c||(console.error("\u274C Error: TELEGRAM_BOT_TOKEN was rejected by Telegram (getMe failed)"),console.error(" The token may be revoked, malformed, or your network may be unreachable."),console.error(" Re-run `afk telegram setup` to refresh it."),process.exit(1));let l=c.username?`@${c.username}`:c.firstName;console.log(""),console.log(`\u{1F916} Starting Agent AFK Telegram Bot as ${l} (id ${c.id})`),console.log(`\u{1F4E1} Model: ${e.model} \xB7 Provider: ${r}`),console.log(`\u{1F512} Allowlist: ${a.size} chat ID(s)`);let d=hi().tagOnlyChats,u=d&&d.length>0?new Set(d):lr(S.AFK_TELEGRAM_TAG_ONLY_CHAT_IDS,console.warn);u.size>0&&(console.log(`\u{1F3F7}\uFE0F Tag-only chats: ${u.size} chat ID(s) \u2014 bot responds only when addressed (reply/@mention)`),console.log(" \u26A0\uFE0F Set Telegram privacy mode OFF for this bot (@BotFather \u2192 /setprivacy \u2192 Disable) or non-addressed group messages never reach it."));let p=new qe,f=S.AFK_TELEGRAM_CWD,m=new nf({botToken:i,apiKey:e.apiKey??"",dataDir:S.TELEGRAM_DATA_DIR||"./data/telegram-sessions",defaultModel:e.model,verbose:["1","true","yes","on"].includes((S.TELEGRAM_VERBOSE??"").trim().toLowerCase()),allowedChatIds:a,tagOnlyChats:u,settingSources:["user","project"],...f!==void 0&&f.length>0?{botCwd:f}:{},createSession:t$({config:e,frameworkBase:n,telegramCwd:f,memoryStore:p})}),h=o$({bot:m,spawnedVersion:t}),y=async()=>{console.log(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "5.165.0",
3
+ "version": "5.165.2",
4
4
  "description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
5
5
  "main": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",