agent-afk 5.203.1 → 5.204.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,6 +23,7 @@ export type LedgerPayload = {
23
23
  } | {
24
24
  kind: 'tool';
25
25
  toolName: string;
26
+ toolUseId: string;
26
27
  input: string;
27
28
  } | {
28
29
  kind: 'tool_error';
package/dist/cli.mjs CHANGED
@@ -436,7 +436,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
436
436
 
437
437
  ${t}`}var UTe,RP=y(()=>{"use strict";UTe=new Set(["script","style","noscript","template","svg"])});function WTe(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function VK(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function KTe(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function YK(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??WTe,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!HTe.has(d.status)||u===o)return d;let p=KTe(d,s)??VK(u,i,s);N("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=VK(u,i,s);N("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var HTe,XK=y(()=>{"use strict";ge();HTe=new Set([429,502,503,504])});import{BlockList as GTe,isIP as CP}from"node:net";import{lookup as qTe}from"node:dns/promises";import{Agent as zTe}from"undici";function ZK(){let e=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function XTe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function AP(e){let t=CP(e);return t===0?!1:YTe.check(e,t===4?"ipv4":"ipv6")}async function eG(e){return qTe(e,{all:!0,verbatim:!0})}async function Ga(e,t={}){if(t.allowPrivateHosts??ZK())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=XTe(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(CP(r)!==0)return AP(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??eG,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(AP(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function xf(e,t={}){let n=await Ga(e,t);if(!n.allowed)throw new Qt(n.reason)}async function ts(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=QK;s++){await xf(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??ZK())?{dispatcher:QTe}:{}},l=await YK(e,i,a,r.retry??{});if(!ZTe.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new Qt(`too many redirects (>${QK}) starting from ${t}`)}var JTe,VTe,YTe,Qt,QTe,QK,ZTe,qa=y(()=>{"use strict";F();XK();JTe=[["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]],VTe=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],YTe=(()=>{let e=new GTe;for(let[t,n]of JTe)e.addSubnet(t,n,"ipv4");for(let[t,n]of VTe)e.addSubnet(t,n,"ipv6");return e})(),Qt=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};QTe=new zTe({connect:{lookup(e,t,n){eG(e).then(r=>{let o=r.find(s=>AP(s.address));if(o!==void 0){n(new Qt(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,CP(i.address))},r=>n(r,"",0))}}});QK=20,ZTe=new Set([301,302,303,307,308])});var PP={};$n(PP,{enforceDomainPolicy:()=>$r,loadBrowserConfig:()=>_P});import{readFileSync as eEe}from"node:fs";import{join as tEe}from"path";function nEe(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function tG(e,t){return nEe(t).test(e)}function iEe(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(rEe.has(t))return!0;if(oEe.has(t))return!1}return!1}function nG(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function sEe(e){if(e===void 0||e==="")return"auto";if(e==="playwright"||e==="agent-browser"||e==="auto")return e;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${e}`)}function rG(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ic(t),t}function aEe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function lEe(e){try{return eEe(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function cEe(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright"||t.backend==="agent-browser"||t.backend==="auto")n.backend=t.backend;else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=rG(t.defaultProfile)),n}function _P(e){let t=e?.env??k,n=e?.readFileSync??lEe,r=e?.surface??t.AGENT_SURFACE,o=iEe(t.AFK_BROWSER_HEADLESS,r),i=nG(t.AFK_BROWSER_ALLOWED_DOMAINS),s=nG(t.AFK_BROWSER_BLOCKED_DOMAINS),a=aEe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=sEe(t.AFK_BROWSER_BACKEND),c=rG(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():tEe(Qn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=cEe(u,g);return h.configPath=p,h}function $r(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(tG(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>tG(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var rEe,oEe,ns=y(()=>{"use strict";F();B();rEe=new Set(["daemon","subagent","telegram","afk"]),oEe=new Set(["repl","interactive","cli"])});import{readFileSync as uEe}from"node:fs";import{join as dEe}from"node:path";import{homedir as pEe}from"node:os";function fEe(e){let t=e??mEe,n;try{n=uEe(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(typeof r!="object"||r===null||Array.isArray(r))return null;let o=r;if(typeof o.url!="string"||typeof o.token!="string"||typeof o.pid!="number")return null;let i;try{i=new URL(o.url)}catch{return null}let{hostname:s,protocol:a}=i;if(!(s==="127.0.0.1"||s==="localhost"||s==="::1")||a!=="http:")throw new Error(`Agent Browser connection file contains an untrusted URL: ${o.url}. Only http://127.0.0.1 or http://localhost is permitted.`);return{url:o.url,token:o.token,pid:o.pid,version:typeof o.version=="string"?o.version:"unknown"}}function gEe(e){try{return process.kill(e,0),!0}catch{return!1}}async function hEe(e,t,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),i=await fetch(`${e}/health`,{method:"GET",headers:{Authorization:`Bearer ${t}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),i.ok}catch{return!1}}async function IP(e){let t=fEe(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:gEe(t.pid)?await hEe(t.url,t.token)?{available:!0,connection:t,reason:null}:{available:!1,connection:t,reason:`health probe failed at ${t.url}`}:{available:!1,connection:t,reason:`stale connection file: PID ${t.pid} not alive`}}var mEe,oG=y(()=>{"use strict";mEe=dEe(pEe(),".config","agent-browser","connection.json")});async function iG(e){let{config:t,surface:n}=e;if(t.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(t.backend==="agent-browser"){let s=Date.now(),a=await IP(),l=Date.now()-s;if(!a.available)throw new Error(`AFK_BROWSER_BACKEND=agent-browser but Agent Browser is not available: ${a.reason}`);return{backend:"agent-browser",reason:"explicit config: backend=agent-browser",probeMs:l,availability:a}}if(n&&yEe.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(t.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await IP(),i=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:i,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:i,availability:o}}var yEe,sG=y(()=>{"use strict";oG();yEe=new Set(["daemon","subagent"])});import{createHash as bEe}from"crypto";function aG(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&wEe.test(e.label))}function lG(e){return bEe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function cG(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var wEe,Gw=y(()=>{"use strict";wEe=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as SEe}from"crypto";import{mkdir as vEe,stat as kEe,writeFile as TEe}from"fs/promises";import{join as MP}from"path";import{gzip as EEe}from"zlib";import{promisify as xEe}from"util";function REe(e){return MP(Vt(e),"browser")}function AEe(e){return MP(REe(e),"screenshots")}function CEe(){return new Date().toISOString().replace(/[:.]/g,"-")}function _Ee(){return SEe(3).toString("hex")}async function ku(e,t,n){if(t.length>uG)throw new Error(`writeScreenshotSidecar: buffer exceeds ${uG} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=AEe(e);await vEe(r,{recursive:!0});let o=`${CEe()}-${_Ee()}-${n}.png`,i=MP(r,o);await TEe(i,t);let{size:s}=await kEe(i);return{path:i,bytes:s}}var Blt,uG,OP=y(()=>{"use strict";B();Gw();Blt=xEe(EEe);uG=5*1024*1024});var qw,dG=y(()=>{"use strict";qw=class{baseUrl;token;constructor(t){this.baseUrl=t.url,this.token=t.token}async call(t,n,r=3e4){let o={version:1,method:t,params:n},i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let a=await fetch(`${this.baseUrl}/agent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`,Host:new URL(this.baseUrl).host},body:JSON.stringify(o),signal:i.signal});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Agent Browser ${t} failed (HTTP ${a.status}): ${l}`)}return await a.json()}finally{clearTimeout(s)}}async listTabs(){return(await this.call("tabs.list",null)).tabs}async openTab(t){return{tabId:(await this.call("tabs.open",{url:t},6e4)).tab_id}}async closeTab(t){await this.call("tabs.close",{tab_id:t})}async read(t,n){return this.call("page.read",{tab_id:t,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(t,n){return this.call("page.inspect",{tab_id:t,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(t,n){await this.call("page.click",{tab_id:t,element_id:n})}async fill(t,n,r){await this.call("page.fill",{tab_id:t,element_id:n,value:r})}async press(t,n,r){await this.call("page.press",{tab_id:t,key:n,...r?{element_id:r}:{}})}async select(t,n,r){await this.call("page.select",{tab_id:t,element_id:n,value:r})}async waitFor(t,n,r){await this.call("page.wait",{tab_id:t,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(t,n){return this.call("page.eval",{tab_id:t,script:n})}async screenshot(t){return this.call("page.screenshot",{tab_id:t})}}});function $P(e){return{id:e.id,role:e.role,label:e.label,kind:e.kind,value:e.value,state:{disabled:e.disabled,...e.checked!==void 0?{checked:e.checked}:{},...e.selected!==void 0?{selected:e.selected}:{},...e.expanded!==void 0?{expanded:e.expanded}:{}},bbox:e.bbox,...e.selector?{selector:e.selector}:{}}}function pG(e,t){switch(t.kind){case"element_id":if(e.has(t.elementId))return t.elementId;throw new Error(`Element ${t.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function DP(e,t,n,r,o,i){switch(n){case"click":await e.click(t,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await e.fill(t,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await e.press(t,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await e.select(t,r,o);break;case"hover":throw new Error("hover is not supported by Agent Browser; use element_id from a prior observation to target clicks instead");case"scroll_to":{let s=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await e.evalScript(t,`document.querySelector('[data-element-id="${s}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await e.waitFor(t,"element",{value:r,timeout:i??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function mG(e,t){if(t.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await e.client.inspect(e.tabId,{mode:"interactive",query:t.target.text,limit:10}),r=n;if(t.target.role){let l=t.target.role.toLowerCase();r=n.filter(c=>c.role.toLowerCase()===l)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${t.target.text}"`+(t.target.role?`, role="${t.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:t.target.text,...t.target.role?{role:t.target.role}:{}},candidates:r.slice(0,5).map($P)};let i=r[0].id;await DP(e.client,e.tabId,t.action,i,t.value,t.timeoutMs);let s=await e.client.read(e.tabId,{mode:"main"}),a=$r(s.url,e.config);return a.allowed?{elementId:i}:{outcome:"blocked_by_policy",url:s.url,reason:`action navigated to blocked domain: ${a.reason}`}}var fG=y(()=>{"use strict";ns()});var gG={};$n(gG,{AgentBrowserProvider:()=>LP});var LP,hG=y(()=>{"use strict";ns();OP();dG();fG();LP=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new qw(n)}async open(t){let n=$r(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let r=this.sessions.get(t.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(t.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:t.timeoutMs??3e4});else{let{tabId:s}=await this.client.openTab(t.url);await this.client.waitFor(s,"load",{timeout:t.timeoutMs??3e4}),r={tabId:s,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(t.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),i=$r(o.url,this.config);return i.allowed?this.buildObservation(r,t.sessionId,t.screenshot,void 0,"browser_open"):(await this.client.evalScript(r.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`redirected to blocked domain: ${i.reason}`})}async observe(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);return this.buildObservation(n,t.sessionId,t.screenshot,t.maxElements,"browser_observe")}async act(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);let r=pG(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await mG({client:this.client,config:this.config,tabId:n.tabId},t);return"outcome"in s?s:(n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"))}throw t.target.kind==="selector"?new Error("selector targets are not supported by Agent Browser; use element_id or semantic targets"):new Error(`Cannot resolve target: ${JSON.stringify(t.target)}`)}await DP(this.client,n.tabId,t.action,r,t.value,t.timeoutMs),n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),i=$r(o.url,this.config);return i.allowed?this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"):(await this.client.evalScript(n.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`action navigated to blocked domain: ${i.reason}`})}async render(t){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);if(t.target!==void 0||t.fullPage)throw new Error("Agent Browser does not support element or full-page screenshots; omit target and fullPage.");let r=await this.client.screenshot(n.tabId),o=Buffer.from(r.data,"base64"),i=o.length>=24?o.readUInt32BE(16):0,s=o.length>=24?o.readUInt32BE(20):0;return{path:(await ku(t.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:i,height:s,dataBase64:r.data,mediaType:"image/png"}}async extract(t){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(t){let n=this.sessions.get(t.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(t.sessionId)}}describe(t){let n=this.sessions.get(t);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let t=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(t),this.sessions.clear()}async buildObservation(t,n,r,o,i="browser_open"){let[s,a]=await Promise.all([this.client.read(t.tabId,{mode:"main",budget:4e3}),this.client.inspect(t.tabId,{mode:"interactive",limit:o??80})]),l=a.elements.map($P),c=o??80,u=l.slice(0,c);t.observationCounter+=1,t.knownElements=new Map(u.map(h=>[h.id,h])),t.currentUrl=s.url,t.currentTitle=s.title;let d=[];l.length>c&&d.push(`page has ${l.length} interactive elements; showing first ${c}`);let p=null;if(r)try{let h=await this.client.screenshot(t.tabId),b=Buffer.from(h.data,"base64");p=(await ku(n,b,i)).path}catch{d.push("screenshot capture failed")}let f=`obs_${t.observationCounter.toString(36)}`,g={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:s.url,title:s.title,textSummary:s.content.slice(0,4e3),interactive:u,status:g,warnings:d,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as PEe,readFileSync as IEe}from"node:fs";import{createRequire as MEe}from"node:module";import{dirname as OEe,join as $Ee}from"node:path";function wG(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<LEe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function kn(e){let t=wG(e);return bG.some(n=>t.includes(n))}function FEe(){try{let t=MEe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(IEe(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=$Ee(OEe(t),o);return PEe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Rf(){return yG??=FEe()??DEe,yG}function FP(e){return e.includes("install chromium")}function ar(e,t){let n=wG(e),r=t?.latched===!0?` ${NEe}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${Rf()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Rf()}). Or pick a different tool.${r}`}function Tu(e,t,n=!1){if(!kn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
438
438
 
439
- ${ar(e,{headless:t,latched:n})}`,{cause:e})}var bG,DEe,LEe,yG,NEe,zw=y(()=>{"use strict";bG=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],DEe="pnpm exec playwright install chromium",LEe=4;NEe="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 za from"node:fs";import Jw from"node:path";import{randomBytes as BEe}from"node:crypto";function UEe(){try{return"5.203.1"}catch{}try{let e=Jw.resolve(import.meta.dirname,"../../../package.json"),t=za.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var jEe,Vw,SG=y(()=>{"use strict";zw();B();ge();jEe=UEe(),Vw=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let t;try{({chromium:t}=await import("playwright"))}catch(n){let r=Tu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Tu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${jEe}`}}loadStorageState(t){let n=Mc(t);try{if(!za.existsSync(n))return;let r=JSON.parse(za.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Mc(t);if(!za.existsSync(r))return;let o=await n.storageState(),i=Jw.join(Jw.dirname(r),`.${Jw.basename(r)}.${process.pid}.${BEe(4).toString("hex")}.tmp`);za.writeFileSync(i,JSON.stringify(o),{mode:384}),za.chmodSync(i,384),za.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as HEe}from"node:crypto";function WEe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function KEe(e,t,n){return`el_${HEe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function GEe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function vG(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function TG(e,t){let n=e.role??"",r=e.name??"";kG.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])TG(i,t)}async function qEe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},EG).catch(()=>[])}async function zEe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},EG).catch(()=>[])}function JEe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Yw(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=JEe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=qEe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],TG(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await zEe(e)).filter(M=>kG.has(M.role??"")));let S=new Map;for(let I of p){let M=vG(I.name),U=S.get(M);(!U||U.bbox.w===0&&I.bbox.w>0)&&S.set(M,I)}let v=b.map(I=>({ax:I,dom:S.get(vG(I.name??""))})),E=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);E.sort((I,M)=>{let U=I.dom?.bbox.y??0,O=M.dom?.bbox.y??0;if(U!==O)return U-O;let j=I.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((I,M)=>{let U=I.ax.role??"generic",O=I.ax.name??"",j=KEe(U,O,M),q=I.dom?.bbox??{x:0,y:0,w:0,h:0},H=I.dom?.type??null,K=null;I.ax.value!==void 0&&I.ax.value!==null&&(K=String(I.ax.value)),I.ax.checked!==void 0&&(K=String(I.ax.checked)),aG({role:U,kind:H})&&(K="[redacted]");let X={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(X.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(X.selected=I.ax.selected),I.ax.expanded!==void 0&&(X.expanded=I.ax.expanded);let D;I.dom?.testId?D=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(D=`#${I.dom.id}`);let G={id:j,role:U,label:WEe(O),kind:H,value:K,state:X,bbox:q};return D!==void 0&&(G.selector=D),G}),_="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?_="loading":I==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let P=GEe(f),R=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:R,url:g,title:h,textSummary:P,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var kG,EG,xG=y(()=>{"use strict";Gw();kG=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);EG="a[href], button, input, select, textarea, [role], [tabindex], label"});async function RG(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function NP(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>RG(e,i)))).filter(o=>o!==null)}async function VEe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function BP(e,t,n){switch(t.kind){case"element_id":return YEe(e,t,n);case"selector":return XEe(e,t);case"semantic":return QEe(e,t)}}async function YEe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await NP(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function XEe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await NP(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function QEe(e,t){return t.role!==void 0?ZEe(e,t.text,t.role):exe(e,t.text,t)}async function ZEe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await NP(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function exe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await VEe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await RG(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var AG=y(()=>{"use strict"});async function UP(e,t,n,r){let o=e.url();if(o===n)return null;let i=$r(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var CG=y(()=>{"use strict";ns()});var HP={};$n(HP,{PlaywrightProvider:()=>jP});function _G(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var jP,WP=y(()=>{"use strict";SG();xG();AG();ns();CG();OP();jP=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Vw(t)}async open(t){let n=$r(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await UP(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await Yw(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Yw(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await BP(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${_G(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await UP(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Yw(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await BP(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${_G(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await ku(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await ku(n,o,r);return i}catch{return null}}}});var Va={};$n(Va,{__resetBrowserRegistryForTests:()=>sxe,browserProviderActive:()=>rxe,closeBrowserProvider:()=>GP,getBrowserProvider:()=>nxe,getLastRoutingDecision:()=>ixe,peekBrowserProvider:()=>oxe});function PG(){Promise.resolve(GP()).then(()=>{process.exit(130)})}function IG(){Promise.resolve(GP()).then(()=>{process.exit(143)})}function MG(){Eo=null}function txe(){Xw||(process.on("SIGINT",PG),process.on("SIGTERM",IG),process.on("exit",MG),Xw=!0)}function OG(){Xw&&(process.removeListener("SIGINT",PG),process.removeListener("SIGTERM",IG),process.removeListener("exit",MG),Xw=!1)}async function nxe(e){return Eo!==null?Eo:(Ja!==null||(Ja=(async()=>{let t=_P(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await iG({config:t,surface:n});KP=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(hG(),gG)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(WP(),HP));o=new i(t)}return txe(),Eo=o,Ja=null,o})()),Ja)}async function GP(){if(Eo===null)return;let e=Eo;Eo=null,Ja=null,OG(),await e.shutdown()}function rxe(){return Eo!==null}function oxe(){return Eo}function ixe(){return KP}function sxe(){Eo=null,Ja=null,KP=null,OG()}var Eo,Ja,Xw,KP,Ya=y(()=>{"use strict";ns();sG();F();Eo=null,Ja=null,Xw=!1,KP=null});async function $G(e,t){try{return await qK(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function pxe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ya(),Va)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(WP(),HP)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(ns(),PP)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function DG(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??pxe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await ts(n,e,{headers:dxe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(uxe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(cxe.test(p)&&!lxe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await $G(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof Qt||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=xP({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await xf(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>xf(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await xf(d.finalUrl,o);let p=await $G(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=xP({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof Qt)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var lxe,cxe,uxe,dxe,LG=y(()=>{"use strict";zK();RP();qa();ge();lxe=/(text\/html|application\/xhtml\+xml)/i,cxe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uxe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,dxe={"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 gxe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(mxe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),fxe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function FG(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?gxe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function NG(e,t){if(t.length===0)return`# Search results for "${e}"
439
+ ${ar(e,{headless:t,latched:n})}`,{cause:e})}var bG,DEe,LEe,yG,NEe,zw=y(()=>{"use strict";bG=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],DEe="pnpm exec playwright install chromium",LEe=4;NEe="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 za from"node:fs";import Jw from"node:path";import{randomBytes as BEe}from"node:crypto";function UEe(){try{return"5.204.0"}catch{}try{let e=Jw.resolve(import.meta.dirname,"../../../package.json"),t=za.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var jEe,Vw,SG=y(()=>{"use strict";zw();B();ge();jEe=UEe(),Vw=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=(async()=>{let t;try{({chromium:t}=await import("playwright"))}catch(n){let r=Tu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),this.launchPromise=void 0,r}try{let n=await t.launch({headless:this.config.headless});return this.browser=n,this.clearLaunchFailure(),n}catch(n){let r=Tu(n,this.config.headless,!0);throw this.latchLaunchFailure(r),r}finally{this.launchPromise=void 0}})(),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${jEe}`}}loadStorageState(t){let n=Mc(t);try{if(!za.existsSync(n))return;let r=JSON.parse(za.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Mc(t);if(!za.existsSync(r))return;let o=await n.storageState(),i=Jw.join(Jw.dirname(r),`.${Jw.basename(r)}.${process.pid}.${BEe(4).toString("hex")}.tmp`);za.writeFileSync(i,JSON.stringify(o),{mode:384}),za.chmodSync(i,384),za.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as HEe}from"node:crypto";function WEe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function KEe(e,t,n){return`el_${HEe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function GEe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function vG(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function TG(e,t){let n=e.role??"",r=e.name??"";kG.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])TG(i,t)}async function qEe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},EG).catch(()=>[])}async function zEe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},EG).catch(()=>[])}function JEe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Yw(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=JEe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=qEe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],TG(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await zEe(e)).filter(M=>kG.has(M.role??"")));let S=new Map;for(let I of p){let M=vG(I.name),U=S.get(M);(!U||U.bbox.w===0&&I.bbox.w>0)&&S.set(M,I)}let v=b.map(I=>({ax:I,dom:S.get(vG(I.name??""))})),E=r?v:v.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);E.sort((I,M)=>{let U=I.dom?.bbox.y??0,O=M.dom?.bbox.y??0;if(U!==O)return U-O;let j=I.dom?.bbox.x??0,q=M.dom?.bbox.x??0;return j-q}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let x=E.slice(0,n).map((I,M)=>{let U=I.ax.role??"generic",O=I.ax.name??"",j=KEe(U,O,M),q=I.dom?.bbox??{x:0,y:0,w:0,h:0},H=I.dom?.type??null,K=null;I.ax.value!==void 0&&I.ax.value!==null&&(K=String(I.ax.value)),I.ax.checked!==void 0&&(K=String(I.ax.checked)),aG({role:U,kind:H})&&(K="[redacted]");let X={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(X.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(X.selected=I.ax.selected),I.ax.expanded!==void 0&&(X.expanded=I.ax.expanded);let D;I.dom?.testId?D=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(D=`#${I.dom.id}`);let G={id:j,role:U,label:WEe(O),kind:H,value:K,state:X,bbox:q};return D!==void 0&&(G.selector=D),G}),_="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?_="loading":I==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let P=GEe(f),R=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:R,url:g,title:h,textSummary:P,interactive:x,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var kG,EG,xG=y(()=>{"use strict";Gw();kG=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);EG="a[href], button, input, select, textarea, [role], [tabindex], label"});async function RG(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function NP(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>RG(e,i)))).filter(o=>o!==null)}async function VEe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function BP(e,t,n){switch(t.kind){case"element_id":return YEe(e,t,n);case"selector":return XEe(e,t);case"semantic":return QEe(e,t)}}async function YEe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await NP(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function XEe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await NP(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function QEe(e,t){return t.role!==void 0?ZEe(e,t.text,t.role):exe(e,t.text,t)}async function ZEe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await NP(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function exe(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await VEe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await RG(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,v=0;for(let E=0;E<S.length;E++)v=v*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var AG=y(()=>{"use strict"});async function UP(e,t,n,r){let o=e.url();if(o===n)return null;let i=$r(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var CG=y(()=>{"use strict";ns()});var HP={};$n(HP,{PlaywrightProvider:()=>jP});function _G(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var jP,WP=y(()=>{"use strict";SG();xG();AG();ns();CG();OP();jP=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Vw(t)}async open(t){let n=$r(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await UP(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await Yw(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Yw(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await BP(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${_G(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await UP(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Yw(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await BP(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${_G(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await ku(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await ku(n,o,r);return i}catch{return null}}}});var Va={};$n(Va,{__resetBrowserRegistryForTests:()=>sxe,browserProviderActive:()=>rxe,closeBrowserProvider:()=>GP,getBrowserProvider:()=>nxe,getLastRoutingDecision:()=>ixe,peekBrowserProvider:()=>oxe});function PG(){Promise.resolve(GP()).then(()=>{process.exit(130)})}function IG(){Promise.resolve(GP()).then(()=>{process.exit(143)})}function MG(){Eo=null}function txe(){Xw||(process.on("SIGINT",PG),process.on("SIGTERM",IG),process.on("exit",MG),Xw=!0)}function OG(){Xw&&(process.removeListener("SIGINT",PG),process.removeListener("SIGTERM",IG),process.removeListener("exit",MG),Xw=!1)}async function nxe(e){return Eo!==null?Eo:(Ja!==null||(Ja=(async()=>{let t=_P(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??k.AGENT_SURFACE,r=await iG({config:t,surface:n});KP=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(hG(),gG)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(WP(),HP));o=new i(t)}return txe(),Eo=o,Ja=null,o})()),Ja)}async function GP(){if(Eo===null)return;let e=Eo;Eo=null,Ja=null,OG(),await e.shutdown()}function rxe(){return Eo!==null}function oxe(){return Eo}function ixe(){return KP}function sxe(){Eo=null,Ja=null,KP=null,OG()}var Eo,Ja,Xw,KP,Ya=y(()=>{"use strict";ns();sG();F();Eo=null,Ja=null,Xw=!1,KP=null});async function $G(e,t){try{return await qK(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function pxe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Ya(),Va)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(WP(),HP)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(ns(),PP)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function DG(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??pxe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await ts(n,e,{headers:dxe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(uxe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(cxe.test(p)&&!lxe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await $G(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof Qt||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=xP({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await xf(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>xf(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await xf(d.finalUrl,o);let p=await $G(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=xP({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof Qt)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var lxe,cxe,uxe,dxe,LG=y(()=>{"use strict";zK();RP();qa();ge();lxe=/(text\/html|application\/xhtml\+xml)/i,cxe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uxe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,dxe={"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 gxe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(mxe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),fxe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function FG(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?gxe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function NG(e,t){if(t.length===0)return`# Search results for "${e}"
440
440
 
441
441
  (no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
442
442
  `).trimEnd()}var mxe,fxe,BG=y(()=>{"use strict";Fe();mxe="https://api.exa.ai/search",fxe=10});function Qw(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var Xa=y(()=>{"use strict";zw()});function vxe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=hxe;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,yxe)}let a=bxe;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,wxe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function qP(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Ir(e,t),truncated:!0}}function kxe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=vxe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await Ga(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await ts(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof Qt?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=qP(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await DG(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=qP(JK(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof Qt)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=kn(p)&&!FP(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Rf()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=FG({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:Sxe,timeoutMs:s.timeoutMs,signal:a.signal}),f=qP(NG(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var hxe,yxe,bxe,wxe,Sxe,UG,jG=y(()=>{"use strict";LG();BG();qa();fo();RP();Xa();hxe=3e4,yxe=12e4,bxe=1e5,wxe=1e6,Sxe=10;UG=kxe()});function xxe(e){return Txe.has(e)?"low":e==="DELETE"?"high":"medium"}function Rxe(e){return Exe.has(e)}function _xe(e){let t={};return e.forEach((n,r)=>{let o=r.toLowerCase();Cxe.has(o)||Axe.some(i=>o.startsWith(i))||(t[r]=n)}),t}function Pxe(e,t){if(e==null)return{serialized:void 0,inferredContentType:void 0};let n=Object.keys(t).some(o=>o.toLowerCase()==="content-type");return typeof e=="string"?{serialized:e,inferredContentType:n?void 0:"text/plain"}:{serialized:JSON.stringify(e),inferredContentType:n?void 0:"application/json"}}function Ixe(e,t,n){let r=Buffer.byteLength(e,"utf8"),o=e,i=!1;if(r>n&&(o=Ir(e,n),i=!0),!i&&/application\/json/i.test(t))try{return{body:JSON.parse(o),truncated:!1}}catch{}return{body:o,truncated:i}}async function KG(e){let{url:t,method:n,signal:r,domainCheck:o,recordEffect:i}=e,s=Math.min(e.maxResponseBytes??zP,JP),a={...e.headers},l=e.fetchFn??globalThis.fetch,c=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},u=xxe(n);if(o!==void 0){let R=o(t);if(!R.allowed)throw Object.assign(new Error(`web_request blocked by domain policy: ${R.reason}`),{name:"DomainPolicyError"})}let d=await Ga(t,c);if(!d.allowed)throw new Qt(d.reason);let{serialized:p,inferredContentType:f}=Pxe(e.body,a);f!==void 0&&(a["content-type"]=f);let g={method:n,headers:Object.keys(a).length>0?a:void 0,body:p,signal:r},b=Rxe(n)?{retries:2,baseDelayMs:300,maxDelayMs:5e3}:{retries:0},w=Date.now(),S;try{S=await ts(l,t,g,{...c,retry:b})}catch(R){throw R instanceof Qt,R}let v=Date.now()-w,E=S.headers.get("content-type")??"",T;try{let R=S.body?.getReader();if(!R)T="";else{let C=[],I=0,M=s*2;for(;;){let{done:U,value:O}=await R.read();if(U||!O)break;if(C.push(O),I+=O.byteLength,I>=M){await R.cancel();break}}T=new TextDecoder().decode(Buffer.concat(C,I))}}catch{T=""}let{body:x,truncated:_}=Ixe(T,E,s),P=_xe(S.headers);return i!==void 0&&Promise.resolve(i({url:t,method:n,status:S.status,risk:u,timing_ms:v})).catch(()=>{}),{status:S.status,headers:P,body:x,truncated:_,timing_ms:v,risk:u}}function GG(e){if(typeof e!="string"||e.trim().length===0)return{error:"method must be a non-empty string (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS)"};let t=e.trim().toUpperCase(),n=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"];return n.includes(t)?t:{error:`method "${e}" is not supported \u2014 must be one of: ${n.join(", ")}`}}var HG,WG,zP,JP,Txe,Exe,Axe,Cxe,qG=y(()=>{"use strict";qa();fo();HG=3e4,WG=12e4,zP=1e5,JP=1e6,Txe=new Set(["GET","HEAD","OPTIONS"]),Exe=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]);Axe=["set-cookie","x-"],Cxe=new Set(["server","via","age","vary","authorization","www-authenticate"])});function Mxe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e;if(typeof t.url!="string"||t.url.length===0)return{error:'Invalid input: "url" must be a non-empty string'};let n;try{n=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{error:`Invalid input: protocol "${n.protocol}" not supported (http/https only)`};n.username="",n.password="";let r=n.toString(),o=GG(t.method);if(typeof o=="object"&&"error"in o)return{error:`Invalid input: ${o.error}`};let i=o,s;if(t.body!==void 0&&t.body!==null){if(typeof t.body!="string"&&typeof t.body!="object")return{error:'Invalid input: "body" must be a string, object, or array'};s=t.body}let a={};if(t.headers!==void 0){if(typeof t.headers!="object"||t.headers===null||Array.isArray(t.headers))return{error:'Invalid input: "headers" must be a string-keyed object'};let d=t.headers;for(let[p,f]of Object.entries(d)){if(typeof f!="string")return{error:`Invalid input: header value for "${p}" must be a string`};a[p]=f}}let l=HG;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:'Invalid input: "timeout_ms" must be a positive finite number'};l=Math.min(t.timeout_ms,WG)}let c=zP;if(t.max_response_bytes!==void 0){if(typeof t.max_response_bytes!="number"||!Number.isFinite(t.max_response_bytes)||t.max_response_bytes<=0)return{error:'Invalid input: "max_response_bytes" must be a positive finite number'};c=Math.min(t.max_response_bytes,JP)}let u;if(t.credential!==void 0){if(typeof t.credential!="string"||t.credential.length===0)return{error:'Invalid input: "credential" must be a non-empty string (an env var name)'};u=t.credential}return{url:r,method:i,body:s,headers:a,timeoutMs:l,maxResponseBytes:c,credential:u}}function Oxe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;async function r(){if(e.domainCheck!==void 0)return e.domainCheck;try{let{loadBrowserConfig:o,enforceDomainPolicy:i}=await Promise.resolve().then(()=>(ns(),PP)),s=o();return a=>i(a,s)}catch{return}}return async(o,i)=>{if(typeof t!="function")return{content:"web_request unavailable: global fetch() is not present (agent-afk requires Node 20+).",isError:!0};let s=Mxe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let p=i.reason;return{content:`web_request aborted: ${p instanceof Error?p.message:String(p??"aborted")}`,isError:!0}}let a={...s.headers};if(s.credential!==void 0){let p=n[s.credential];if(p===void 0||p.trim().length===0)return{content:`web_request credential error: environment variable "${s.credential}" is not set. Set it in afk.env or export it in the shell before starting AFK.`,isError:!0};if(Object.keys(a).some(g=>g.toLowerCase()==="authorization"))return{content:'web_request credential error: both "credential" and an explicit Authorization header were provided. Use one or the other.',isError:!0};a.Authorization=`Bearer ${p}`}let l=new AbortController,c=()=>l.abort(i.reason),u,d=()=>{let p=l.signal.reason;return p instanceof Error?p.message:String(p??"aborted")};try{i.addEventListener("abort",c,{once:!0}),u=setTimeout(()=>{l.abort(new Error(`web_request timeout after ${s.timeoutMs}ms`))},s.timeoutMs);let p=await r(),f={url:s.url,method:s.method,body:s.body,headers:a,maxResponseBytes:s.maxResponseBytes,signal:l.signal,fetchFn:t,lookupFn:e.lookupFn,domainCheck:p,recordEffect:e.recordEffect},g;try{g=await KG(f)}catch(S){if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};if(S instanceof Qt)return{content:`web_request blocked: ${S.message}`,isError:!0};let v=S instanceof Error&&S.name==="DomainPolicyError"?"blocked":"network error",E=S instanceof Error?S.message:String(S);return{content:`web_request ${v}: ${E}`,isError:!0}}if(l.signal.aborted)return{content:`web_request aborted: ${d()}`,isError:!0};let h=g.body;if(typeof h=="string")h=pt(h);else if(typeof h=="object"&&h!==null){let S=pt(JSON.stringify(h));try{h=JSON.parse(S)}catch{h=S}}let b={status:g.status,headers:g.headers,body:h,timing_ms:g.timing_ms,...g.truncated?{truncated:!0}:{}};return{content:JSON.stringify(b,null,2),...g.truncated?{truncated:!0}:{}}}finally{u!==void 0&&clearTimeout(u),i.removeEventListener("abort",c)}}}var zG,JG=y(()=>{"use strict";qG();qa();Ar();zG=Oxe()});import{existsSync as YG,mkdirSync as $xe,readFileSync as Dxe,renameSync as Lxe,unlinkSync as Fxe,writeFileSync as Nxe}from"node:fs";import{dirname as VG,join as Bxe}from"node:path";import{randomBytes as Uxe}from"node:crypto";function Ht(e){let t=e??zy();if(!YG(t))return[];try{let n=Dxe(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Dr(e,t){let n=t??zy();$xe(VG(n),{recursive:!0});let r=Bxe(VG(n),`.schedules.json.${process.pid}.${Uxe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{Nxe(r,o,"utf-8"),Lxe(r,n)}catch(i){try{YG(r)&&Fxe(r)}catch{}throw i}}function Eu(e,t){let n=Ht(t),r=n.map(l=>l.id),o=jxe(e.name),i=Hxe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Dr(n,t),a}function xu(e,t){let n=Ht(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Dr(o,t),!0)}function Qa(e,t){return Ht(t).find(n=>n.id===e)}function jxe(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function Hxe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function rs(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Af=y(()=>{"use strict";B()});import{existsSync as Wxe,readFileSync as Kxe}from"node:fs";import{join as Gxe}from"node:path";async function mt(e,t,n){let r,o;try{let i=Gxe(ga("default"),"port");if(!Wxe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=Kxe(i,"utf-8").trim(),a=VP(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function VP(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var jn,Zw=y(()=>{"use strict";B();jn="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 qxe}from"node:fs";import{readFile as zxe}from"node:fs/promises";var XG,QG,ZG,e2,t2=y(()=>{"use strict";Af();B();Zw();XG=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=Eu({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await mt("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await mt("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:jn}})}},QG=async(e,t)=>{let n=Ht();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})))}},ZG=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=Ln();if(!qxe(i))return{content:JSON.stringify([])};let s;try{let c=await zxe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -454,7 +454,7 @@ ${ar(e,{headless:t,latched:n})}`,{cause:e})}var bG,DEe,LEe,yG,NEe,zw=y(()=>{"use
454
454
  ?`,"m");if(!r.test(n))return!1;let o=n.replace(r,"");return kt(e,o,384),!0}function x2(e,t){if(!If(e))return;let r=lS(e,"utf-8").match(new RegExp(`^${xo(t)}=(.*)$`,"m"));return r?r[1]:void 0}function R2(e){let t={};if(!If(e))return t;let n=lS(e,"utf-8");for(let r of n.split(`
455
455
  `)){let o=r.trim();if(!o||o.startsWith("#"))continue;let i=o.indexOf("=");if(i<=0)continue;let s=o.slice(0,i).trim(),a=o.slice(i+1);t[s]=a}return t}var Ro=y(()=>{"use strict";Pf()});function Au(e){let t=ua(e);return t?GRe.has(e)?"non-config":t.secret?"secret":qRe.has(e)||e.endsWith("_BASE_URL")?"protected":"settable":"unknown"}function A2(e,t=zRe,n=JRe){let r=e.trim().toLowerCase();if(t.includes(r))return!0;if(n.includes(r))return!1}function C2(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:void 0}function _2(e,t){if(t.includes(`
456
456
  `))return{ok:!1,error:`value for ${e.name} must not contain newlines`};switch(e.type){case"number":return C2(t)===void 0?{ok:!1,error:`${e.name} expects a number, got ${JSON.stringify(t)}`}:{ok:!0,value:t.trim()};case"boolean":{let n=t.trim().toLowerCase();return A2(n)===void 0?{ok:!1,error:`${e.name} expects a boolean (true/false/1/0/yes/no/on/off), got ${JSON.stringify(t)}`}:{ok:!0,value:n}}case"json":{try{JSON.parse(t)}catch{return{ok:!1,error:`${e.name} expects valid JSON`}}return{ok:!0,value:t}}default:return{ok:!0,value:t}}}function cS(e){return P2.get(e)}function pI(e){let t=P2.get(e);return t?t.tier:"unknown"}function uS(e,t){switch(e.type){case"boolean":{if(typeof t=="boolean")return{ok:!0,value:t};if(typeof t=="string"){let n=A2(t);if(n!==void 0)return{ok:!0,value:n}}return{ok:!1,error:`${e.path} expects a boolean`}}case"number":{let n=typeof t=="number"||typeof t=="string"?C2(t):void 0;return n===void 0?{ok:!1,error:`${e.path} expects a number`}:e.clamp?e.clamp.integer&&!Number.isInteger(n)?{ok:!1,error:`${e.path} expects an integer`}:{ok:!0,value:Math.min(e.clamp.max,Math.max(e.clamp.min,n))}:{ok:!0,value:n}}case"enum":return typeof t=="string"&&e.enumValues?.includes(t)?{ok:!0,value:t}:{ok:!1,error:`${e.path} expects one of: ${e.enumValues?.join(", ")}`};case"number-array":{let n;if(Array.isArray(t))n=t;else if(typeof t=="string")n=t.split(",").map(o=>o.trim()).filter(o=>o.length>0).map(o=>Number(o));else return{ok:!1,error:`${e.path} expects an array of numbers`};let r=[];for(let o of n){let i=typeof o=="number"?o:Number(o);if(!Number.isFinite(i))return{ok:!1,error:`${e.path} contains a non-number`};r.push(i)}return{ok:!0,value:r}}case"model-slot":{if(typeof t=="string")return t.trim().length===0?{ok:!1,error:`${e.path} must not be empty`}:{ok:!0,value:t.trim()};let n=Gj(t);return n.ok?{ok:!0,value:n.value}:{ok:!1,error:`${e.path}: ${n.error}`}}default:return typeof t!="string"?{ok:!1,error:`${e.path} expects a string`}:t.trim().length===0?{ok:!1,error:`${e.path} must not be empty`}:{ok:!0,value:t}}}function Mf(e,t){let n=e;for(let r of t.split(".")){if(n===null||typeof n!="object")return;n=n[r]}return n}function I2(e,t,n){let r=t.split("."),o=e;for(let i=0;i<r.length-1;i++){let s=r[i],a=o[s];(a===null||typeof a!="object"||Array.isArray(a))&&(o[s]={}),o=o[s]}o[r[r.length-1]]=n}function M2(e,t){let n=t.split("."),r=[e],o=e;for(let s=0;s<n.length-1;s++){let a=n[s],l=o[a];if(l===null||typeof l!="object"||Array.isArray(l))return!1;o=l,r.push(o)}let i=n[n.length-1];if(!(i in o))return!1;delete o[i];for(let s=r.length-1;s>=1;s--){let a=r[s];if(Object.keys(a).length===0){let l=n[s-1];delete r[s-1][l]}else break}return!0}var GRe,qRe,zRe,JRe,dI,P2,el=y(()=>{"use strict";F();_t();GRe=new Set(["HOME","PATH","SHELL","PAGER","NODE_ENV","CI","VITEST","DEBUG","FORCE_COLOR","NO_COLOR","AGENT_SURFACE","AFK_SESSION_ID","NO_UPDATE_NOTIFIER","SCRIPT","ASCIINEMA_REC"]),qRe=new Set(["AFK_MODEL_SMALL_BASE_URL","AFK_MODEL_MEDIUM_BASE_URL","AFK_MODEL_LARGE_BASE_URL","AFK_LOCAL_BASE_URL","AFK_OPENAI_BASE_URL","AFK_SYSTEM_PROMPT","AFK_DAEMON_TASK","AFK_DAEMON_TASK_ID","AFK_DAEMON_CWD","AFK_DAEMON_HOST","AFK_BROWSER_ALLOWED_DOMAINS","AFK_BROWSER_BLOCKED_DOMAINS","AFK_BROWSER_CONFIG","AFK_ALLOW_PROJECT_MCP","AFK_INTERNAL","AFK_WORKTREE_BASE","AFK_WORKTREE_BRANCH_PREFIX","AFK_WORKTREE_ON_EXIT","AFK_TELEGRAM_ALLOWED_CHAT_IDS","AFK_TELEGRAM_TAG_ONLY_CHAT_IDS","AFK_TELEGRAM_NOTIFY_MODE","AFK_TELEGRAM_PRIMARY_CHAT_ID","AFK_HOME","AFK_STATE_DIR","AFK_FRAMEWORK_DIR","TELEGRAM_DATA_DIR","AFK_TELEGRAM_CWD"]);zRe=["true","1","yes","on"],JRe=["false","0","no","off"];dI=[{path:"model",tier:"agent",type:"string",description:"Default model id / alias."},{path:"models.local",tier:"agent",type:"model-slot",description:"Local-tier model id (OpenAI-compatible shim: Ollama, LM Studio, vLLM, MLX). Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.small",tier:"agent",type:"model-slot",description:"Small-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.medium",tier:"agent",type:"model-slot",description:"Medium-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"models.large",tier:"agent",type:"model-slot",description:"Large-tier model id. Accepts a bare id string or a { id, provider, name } object (provider: anthropic | openai | chatgpt-oauth | xai | xai-oauth \u2014 chatgpt is accepted shorthand; baseUrl/apiKey are human-gated: set them via the AFK_MODEL_<TIER>_BASE_URL / _API_KEY env vars, not here)."},{path:"maxTokens",tier:"agent",type:"number",clamp:{min:1,max:1e6,integer:!0},description:"Deprecated and inert: not read by the generation path. Use AFK_MAX_OUTPUT_TOKENS or --max-output-tokens to cap per-response output."},{path:"temperature",tier:"agent",type:"number",clamp:{min:0,max:2},description:"Sampling temperature."},{path:"autoRouting.interactive",tier:"agent",type:"boolean",description:"Auto-route model in the REPL."},{path:"autoRouting.chat",tier:"agent",type:"boolean",description:"Auto-route model for chat."},{path:"autoRouting.telegram",tier:"agent",type:"boolean",description:"Auto-route model for Telegram."},{path:"autoRouting.daemon",tier:"agent",type:"boolean",description:"Auto-route model for the daemon."},{path:"telegram.notify.mode",tier:"human",type:"enum",enumValues:["primary","broadcast","custom"],description:"Telegram notify routing mode (human-tier: notification-redirect vector)."},{path:"telegram.notify.primaryChatId",tier:"human",type:"number",clamp:{min:-1e15,max:1e15,integer:!0},description:"Primary Telegram chat id (human-tier: notification-redirect vector)."},{path:"telegram.notify.targets",tier:"human",type:"number-array",description:"Custom Telegram target chat ids (human-tier: notification-redirect vector)."},{path:"telegram.tagOnlyChats",tier:"human",type:"number-array",description:"Chat ids where the bot answers only when addressed (reply to the bot, @mention, or text_mention resolving to the bot). Human-tier: it governs which chats the bot will respond in \u2014 a message-routing / who-can-drive-the-bot control, same class as the allowlist and telegram.notify.*. Requires Telegram privacy mode OFF for the bot to matter in groups."},{path:"telegram.verifyDone",tier:"human",type:"boolean",description:`Opt-in AFK "Done" verification gate (human-tier: a self-honesty check on the agent's own completion reporting \u2014 the agent must not be able to disable it on its own config, same rationale as enableShellHooks/permissionMode).`},{path:"enforceDoneEvidence",tier:"human",type:"boolean",description:'Opt-in AFK terminal-state enforcement gate: in autonomous mode a turn that self-certifies "Done" with no corroborating evidence (a successful file write/edit or executed command) gets a framework correction injected into the next turn, which must substantiate or downgrade the claim (issue #237). Human-tier: a self-honesty check the agent must not be able to disable on its own config, same rationale as telegram.verifyDone. Sibling of telegram.verifyDone (which only relabels the Telegram push; this one bounces the turn).'},{path:"interactive.worktreeAutoname",tier:"agent",type:"boolean",description:"Auto-name worktrees."},{path:"interactive.suggestGhost",tier:"agent",type:"boolean",description:"Ghost-text suggestions in the REPL."},{path:"interactive.thinkingUi",tier:"agent",type:"enum",enumValues:["summary","live","digest","off"],description:"Default REPL thinking-display mode."},{path:"theme",tier:"agent",type:"enum",enumValues:["dark","light","umber","auto"],description:"TUI color palette (dark | light | umber | auto). Display-only; auto detects a light/dark background from the terminal and falls back to dark. umber matches the Umber terminal and is dark-only, so auto never selects it."},{path:"updatePolicy",tier:"human",type:"enum",enumValues:["notify","auto","off"],description:"Self-update policy (human-tier: auto self-update is scope-widening)."},{path:"autoResumeOnUsageLimit",tier:"agent",type:"boolean",description:"Auto-resume after a usage-limit pause."},{path:"bgSummaries",tier:"agent",type:"boolean",description:"Background summarisation."},{path:"maxSummaryCallsPerSession",tier:"agent",type:"number",clamp:{min:1,max:500,integer:!0},description:"Cap on summary calls per session."},{path:"systemPrompt",tier:"human",type:"string",description:"Operator system-prompt overlay."},{path:"permissionMode",tier:"human",type:"enum",enumValues:["default","plan","autonomous","bypassPermissions"],description:"Session permission mode for afk chat/interactive (human-tier: privilege-escalation vector). Unset \u2192 bypassPermissions (new-install default); set `default` to re-enable path containment + the approval prompt."},{path:"enableShellHooks",tier:"human",type:"boolean",description:"Enable shell hooks (trust gate)."},{path:"enablePluginHooks",tier:"human",type:"boolean",description:"Enable Claude Code plugin-contributed hooks (trust gate for third-party plugin hooks.json; independent of enableShellHooks)."},{path:"interactive.worktreeBranchPrefix",tier:"human",type:"string",description:"Worktree branch prefix (git-flag sensitive)."},{path:"interactive.worktreeBase",tier:"human",type:"string",description:"Worktree base ref (git-flag sensitive)."},{path:"interactive.worktreeOnExit",tier:"human",type:"enum",enumValues:["ask","keep","remove"],description:"Clean-worktree quit policy (ask | keep | remove)."},{path:"daemon.task",tier:"human",type:"string",description:"Daemon task prompt."},{path:"daemon.taskId",tier:"human",type:"string",description:"Daemon task id."},{path:"daemon.verifyDone",tier:"human",type:"boolean",description:`Opt-in daemon-surface "Done" verification gate: a cron-tick completion push whose response self-certifies "Done" with no corroborating evidence (a successful file write/edit or executed command) is relabelled "\u26A0\uFE0F Done (unverified)" with a caveat line. The daemon analog of telegram.verifyDone (which is REPL-only); the daemon is single-turn-per-tick, so the only honest enforcement is relabelling the outgoing push rather than bouncing a next turn. Human-tier: a self-honesty check on the agent's own completion reporting \u2014 the agent must not be able to disable it on its own config, same rationale as telegram.verifyDone.`}],P2=new Map(dI.map(e=>[e.path,e]))});import{existsSync as O2,readFileSync as VRe,copyFileSync as YRe,chmodSync as XRe}from"fs";function $f(e){return e===void 0||e.length===0?"<unset>":e.length<=4?"set (****)":`set (****${e.slice(-4)})`}function mS(e){return e?.filePath??Yt()}function $2(e,t,n){let r=Au(e);if(r==="unknown")throw new Of(e);if(r==="non-config")throw new mI(e);if(r==="secret"&&!t)throw new fI(e);if(r==="protected"&&!n)throw new gI(e);return r}function fS(e,t,n){let r=$2(e,n?.allowSecret,n?.allowProtected),o=ua(e),i=_2(o,t);if(!i.ok)throw new dS(i.error);let s=mS(n);return Lr(s,e,i.value),{key:e,class:r,persistedTo:s,display:r==="secret"?$f(i.value):i.value}}function gS(e,t){let n=$2(e,t?.allowSecret,t?.allowProtected),r=mS(t),o=E2(r,e);return{key:e,class:n,removed:o,persistedTo:r}}function hS(e,t){let n=Au(e);if(n==="unknown")throw new Of(e);let r=mS(t),o=x2(r,e),i=Tc(e),s=n==="secret"?o!==void 0?$f(o):void 0:o;return{key:e,class:n,persisted:s,activeInProcess:i}}function yS(e){let t=mS(e),n=R2(t),r=[];for(let o of Ec){let i=o.name,s=Au(i),a=n[i],l=Tc(i);if(!e?.all&&a===void 0&&!l)continue;let c=s==="secret"?a!==void 0?$f(a):void 0:a;r.push({key:i,class:s,persisted:c,activeInProcess:l})}return r}function bS(e){return e?.filePath??yn()}function wS(e){if(!O2(e))return{};let t;try{t=JSON.parse(VRe(e,"utf-8"))}catch{throw new pS(e)}if(t===null||typeof t!="object"||Array.isArray(t))throw new pS(e);return t}function D2(e,t){if(O2(e))try{YRe(e,`${e}.bak`),XRe(`${e}.bak`,384)}catch{}kt(e,JSON.stringify(t,null,2)+`
457
- `,384)}function L2(e,t){let n=pI(e);if(n==="unknown")throw new Of(e);if(n==="human"&&!t)throw new hI(e);return n}function os(e,t,n){let r=L2(e,n?.allowHumanOnly),o=cS(e),i=uS(o,t);if(!i.ok)throw new dS(i.error);let s=bS(n),a=wS(s);return I2(a,e,i.value),D2(s,a),{path:e,class:r,value:i.value,persistedTo:s}}function SS(e,t){let n=L2(e,t?.allowHumanOnly),r=bS(t),o=wS(r),i=M2(o,e);return i&&D2(r,o),{path:e,class:n,removed:i,persistedTo:r}}function Cu(e,t){let n=pI(e),r=bS(t),o=wS(r);return{path:e,class:n,value:Mf(o,e)}}function vS(e){return wS(bS(e))}var ur,Of,mI,fI,gI,hI,dS,pS,_u=y(()=>{"use strict";B();F();Ro();el();ur="effective on the next session/daemon restart; the current session is unchanged",Of=class extends Error{constructor(t){super(`unknown config key: ${t}`),this.name="UnknownKeyError"}},mI=class extends Error{constructor(t){super(`${t} is a process/inherited env var and is not afk-configurable`),this.name="NonConfigKeyError"}},fI=class extends Error{constructor(t){super(`${t} holds a credential; the agent cannot set it. A human must run \`afk config env set ${t}\` (the value is entered masked and never enters the model context).`),this.name="SecretWriteRefused"}},gI=class extends Error{constructor(t){super(`${t} controls identity, safety, capability, autonomous runs, request routing, or where AFK's own state lives; the agent cannot set it. A human must run \`afk config env set ${t}\`.`),this.name="ProtectedEnvKeyRefused"}},hI=class extends Error{constructor(t){super(`${t} is human-gated (prompt/hooks/identity); the agent cannot set it. A human must run \`afk config set ${t}\`.`),this.name="HumanOnlyKeyRefused"}},dS=class extends Error{constructor(t){super(t),this.name="ConfigValidationError"}},pS=class extends Error{constructor(t){super(`refusing to write: existing ${t} is not valid JSON (fix or remove it by hand first)`),this.name="MalformedConfigError"}}});function F2(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function N2(e){return e==="env"||e==="config"?e:void 0}function oi(e){return{content:e,isError:!0}}var B2,U2,j2=y(()=>{"use strict";_u();B2=async e=>{let t=F2(e);if(!t)return oi("config_get: expected an object input");let n=N2(t.target);if(!n)return oi("config_get: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0,o=t.all===!0;try{if(n==="env"){if(r){let i=hS(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(yS({all:o}),null,2)}}if(r){let i=Cu(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(vS(),null,2)}}catch(i){return oi(`config_get: ${i.message}`)}},U2=async e=>{let t=F2(e);if(!t)return oi("config_set: expected an object input");let n=N2(t.target);if(!n)return oi("config_set: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0;if(!r)return oi("config_set: `key` is required");let o=t.action==="unset"?"unset":"set",i=t.value;try{if(o==="unset"){if(n==="env"){let l=gS(r);return{content:l.removed?`Removed ${l.key} from afk.env (${l.persistedTo}). ${ur}.`:`${l.key} was not set in afk.env; nothing to remove.`}}let a=SS(r);return{content:a.removed?`Removed ${a.path} from afk.config.json (${a.persistedTo}). ${ur}.`:`${a.path} was not set in afk.config.json; nothing to remove.`}}if(i==null)return oi(`config_set: \`value\` is required to set ${r}`);if(n==="env"){if(typeof i!="string"&&typeof i!="number"&&typeof i!="boolean")return oi("config_set: env values must be a string, number, or boolean");let a=fS(r,String(i));return{content:`Set ${a.key} = ${a.display} in afk.env (${a.persistedTo}). ${ur}.`}}let s=os(r,i);return{content:`Set ${s.path} = ${JSON.stringify(s.value)} in afk.config.json (${s.persistedTo}). ${ur}.`}}catch(s){return oi(`config_set: ${s.message}`)}}});function tl(e,t){return e.length>t?`${e.slice(0,t)}\u2026 [truncated]`:e}function yI(e){switch(e.type){case"message":return e.message.role!=="assistant"||!e.message.content?null:{kind:"assistant",text:tl(e.message.content,8e3)};case"chunk":{let t=e.chunk;return t.type==="tool_use_detail"?t.pending?null:{kind:"tool",toolName:t.toolName,input:tl(t.toolInput,400)}:t.type==="tool_result"?t.isError===!0?{kind:"tool_error",content:tl(t.content,400)}:{kind:"tool_result",toolUseId:t.toolUseId,content:tl(t.content,400),...typeof t.durationMs=="number"?{durationMs:t.durationMs}:{},...t.metadata?.toolName!==void 0?{toolName:String(t.metadata.toolName)}:{}}:t.type==="thinking"?{kind:"thinking",text:tl(t.content,8e3)}:null}case"done":{let t=e.metadata,n=t?.totalCostUsd,r=t?.durationMs,o=t?.usage,i=typeof o?.input_tokens=="number"?o.input_tokens:void 0,s=typeof o?.output_tokens=="number"?o.output_tokens:void 0,a=typeof o?.cache_read_input_tokens=="number"?o.cache_read_input_tokens:void 0,l=typeof t?.stopReason=="string"?t.stopReason:void 0;return{kind:"done",...typeof n=="number"?{costUsd:n}:{},...typeof r=="number"?{durationMs:r}:{},...i!==void 0?{inputTokens:i}:{},...s!==void 0?{outputTokens:s}:{},...a!==void 0?{cacheReadTokens:a}:{},...l!==void 0?{stopReason:l}:{}}}case"error":return{kind:"error",message:e.error.message};case"paused":return{kind:"paused",...e.resetsAt?{resetsAt:e.resetsAt.toISOString()}:{}};case"resumed":return{kind:"resumed"};case"notice":return null;case"tool-activity":return{kind:"tool_activity",activeCount:e.activeCount,activeToolUseIds:e.activeToolUseIds};case"rate_limit":return{kind:"rate_limit",...typeof e.retryAfterMs=="number"?{retryAfterMs:e.retryAfterMs}:{}};case"progress":return{kind:"progress",message:e.progress.summary??e.progress.description};case"subagent_lifecycle":return{kind:"subagent_lifecycle",subagentId:e.subagentId,status:e.status,...e.model!==void 0?{model:e.model}:{},...e.agentType!==void 0?{agentType:e.agentType}:{},...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.totalCostUsd!==void 0?{totalCostUsd:e.totalCostUsd}:{},...e.outputBytes!==void 0?{outputBytes:e.outputBytes}:{},...e.errorClass!==void 0?{errorClass:e.errorClass}:{},...e.errorMessage!==void 0?{errorMessage:e.errorMessage}:{},...e.promptHead!==void 0?{promptHead:e.promptHead}:{}};case"background_job":return{kind:"background_job",jobId:e.jobId,status:e.status,...e.label!==void 0?{label:e.label}:{}};case"plan_mode":return{kind:"plan_mode",mode:e.mode};default:return null}}var bI=y(()=>{"use strict"});import*as H2 from"node:fs";import*as Pu from"node:fs/promises";import*as W2 from"node:readline";function K2(e){let t=e.trim();if(!t)return null;try{let n=JSON.parse(t);return n.v!==1||typeof n.ts!="number"||typeof n.kind!="string"?null:n}catch{return null}}async function*ii(e){if(!xr(e))return;let t;try{t=await Pu.open(Li(e),"r")}catch(n){if(n.code==="ENOENT")return;throw n}try{let n=W2.createInterface({input:t.createReadStream({encoding:"utf8"}),crlfDelay:1/0});for await(let r of n){let o=K2(r);o&&(yield o)}}finally{await t.close()}}async function*Iu(e,t){if(!xr(e))return;let n=Li(e),r=ha(e),{fromStart:o=!1,signal:i}=t??{},s=0,a="",l=!1;async function*c(){let f=null;try{f=await Pu.open(n,"r");let g=await f.stat();if(g.size<=s)return;let h=g.size-s,b=Buffer.allocUnsafe(h),{bytesRead:w}=await f.read(b,0,h,s);if(w===0)return;s+=w,a+=b.toString("utf8",0,w);let S=a.split(`
457
+ `,384)}function L2(e,t){let n=pI(e);if(n==="unknown")throw new Of(e);if(n==="human"&&!t)throw new hI(e);return n}function os(e,t,n){let r=L2(e,n?.allowHumanOnly),o=cS(e),i=uS(o,t);if(!i.ok)throw new dS(i.error);let s=bS(n),a=wS(s);return I2(a,e,i.value),D2(s,a),{path:e,class:r,value:i.value,persistedTo:s}}function SS(e,t){let n=L2(e,t?.allowHumanOnly),r=bS(t),o=wS(r),i=M2(o,e);return i&&D2(r,o),{path:e,class:n,removed:i,persistedTo:r}}function Cu(e,t){let n=pI(e),r=bS(t),o=wS(r);return{path:e,class:n,value:Mf(o,e)}}function vS(e){return wS(bS(e))}var ur,Of,mI,fI,gI,hI,dS,pS,_u=y(()=>{"use strict";B();F();Ro();el();ur="effective on the next session/daemon restart; the current session is unchanged",Of=class extends Error{constructor(t){super(`unknown config key: ${t}`),this.name="UnknownKeyError"}},mI=class extends Error{constructor(t){super(`${t} is a process/inherited env var and is not afk-configurable`),this.name="NonConfigKeyError"}},fI=class extends Error{constructor(t){super(`${t} holds a credential; the agent cannot set it. A human must run \`afk config env set ${t}\` (the value is entered masked and never enters the model context).`),this.name="SecretWriteRefused"}},gI=class extends Error{constructor(t){super(`${t} controls identity, safety, capability, autonomous runs, request routing, or where AFK's own state lives; the agent cannot set it. A human must run \`afk config env set ${t}\`.`),this.name="ProtectedEnvKeyRefused"}},hI=class extends Error{constructor(t){super(`${t} is human-gated (prompt/hooks/identity); the agent cannot set it. A human must run \`afk config set ${t}\`.`),this.name="HumanOnlyKeyRefused"}},dS=class extends Error{constructor(t){super(t),this.name="ConfigValidationError"}},pS=class extends Error{constructor(t){super(`refusing to write: existing ${t} is not valid JSON (fix or remove it by hand first)`),this.name="MalformedConfigError"}}});function F2(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function N2(e){return e==="env"||e==="config"?e:void 0}function oi(e){return{content:e,isError:!0}}var B2,U2,j2=y(()=>{"use strict";_u();B2=async e=>{let t=F2(e);if(!t)return oi("config_get: expected an object input");let n=N2(t.target);if(!n)return oi("config_get: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0,o=t.all===!0;try{if(n==="env"){if(r){let i=hS(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(yS({all:o}),null,2)}}if(r){let i=Cu(r);return{content:JSON.stringify(i,null,2)}}return{content:JSON.stringify(vS(),null,2)}}catch(i){return oi(`config_get: ${i.message}`)}},U2=async e=>{let t=F2(e);if(!t)return oi("config_set: expected an object input");let n=N2(t.target);if(!n)return oi("config_set: `target` must be 'env' or 'config'");let r=typeof t.key=="string"?t.key:void 0;if(!r)return oi("config_set: `key` is required");let o=t.action==="unset"?"unset":"set",i=t.value;try{if(o==="unset"){if(n==="env"){let l=gS(r);return{content:l.removed?`Removed ${l.key} from afk.env (${l.persistedTo}). ${ur}.`:`${l.key} was not set in afk.env; nothing to remove.`}}let a=SS(r);return{content:a.removed?`Removed ${a.path} from afk.config.json (${a.persistedTo}). ${ur}.`:`${a.path} was not set in afk.config.json; nothing to remove.`}}if(i==null)return oi(`config_set: \`value\` is required to set ${r}`);if(n==="env"){if(typeof i!="string"&&typeof i!="number"&&typeof i!="boolean")return oi("config_set: env values must be a string, number, or boolean");let a=fS(r,String(i));return{content:`Set ${a.key} = ${a.display} in afk.env (${a.persistedTo}). ${ur}.`}}let s=os(r,i);return{content:`Set ${s.path} = ${JSON.stringify(s.value)} in afk.config.json (${s.persistedTo}). ${ur}.`}}catch(s){return oi(`config_set: ${s.message}`)}}});function tl(e,t){return e.length>t?`${e.slice(0,t)}\u2026 [truncated]`:e}function yI(e){switch(e.type){case"message":return e.message.role!=="assistant"||!e.message.content?null:{kind:"assistant",text:tl(e.message.content,8e3)};case"chunk":{let t=e.chunk;return t.type==="tool_use_detail"?t.pending?null:{kind:"tool",toolName:t.toolName,toolUseId:t.toolUseId,input:tl(t.toolInput,400)}:t.type==="tool_result"?t.isError===!0?{kind:"tool_error",content:tl(t.content,400),...t.metadata?.toolName!==void 0?{toolName:String(t.metadata.toolName)}:{}}:{kind:"tool_result",toolUseId:t.toolUseId,content:tl(t.content,400),...typeof t.durationMs=="number"?{durationMs:t.durationMs}:{},...t.metadata?.toolName!==void 0?{toolName:String(t.metadata.toolName)}:{}}:t.type==="thinking"?{kind:"thinking",text:tl(t.content,8e3)}:null}case"done":{let t=e.metadata,n=t?.totalCostUsd,r=t?.durationMs,o=t?.usage,i=typeof o?.input_tokens=="number"?o.input_tokens:void 0,s=typeof o?.output_tokens=="number"?o.output_tokens:void 0,a=typeof o?.cache_read_input_tokens=="number"?o.cache_read_input_tokens:void 0,l=typeof t?.stopReason=="string"?t.stopReason:void 0;return{kind:"done",...typeof n=="number"?{costUsd:n}:{},...typeof r=="number"?{durationMs:r}:{},...i!==void 0?{inputTokens:i}:{},...s!==void 0?{outputTokens:s}:{},...a!==void 0?{cacheReadTokens:a}:{},...l!==void 0?{stopReason:l}:{}}}case"error":return{kind:"error",message:e.error.message};case"paused":return{kind:"paused",...e.resetsAt?{resetsAt:e.resetsAt.toISOString()}:{}};case"resumed":return{kind:"resumed"};case"notice":return null;case"tool-activity":return{kind:"tool_activity",activeCount:e.activeCount,activeToolUseIds:e.activeToolUseIds};case"rate_limit":return{kind:"rate_limit",...typeof e.retryAfterMs=="number"?{retryAfterMs:e.retryAfterMs}:{}};case"progress":return{kind:"progress",message:e.progress.summary??e.progress.description};case"subagent_lifecycle":return{kind:"subagent_lifecycle",subagentId:e.subagentId,status:e.status,...e.model!==void 0?{model:e.model}:{},...e.agentType!==void 0?{agentType:e.agentType}:{},...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.totalCostUsd!==void 0?{totalCostUsd:e.totalCostUsd}:{},...e.outputBytes!==void 0?{outputBytes:e.outputBytes}:{},...e.errorClass!==void 0?{errorClass:e.errorClass}:{},...e.errorMessage!==void 0?{errorMessage:e.errorMessage}:{},...e.promptHead!==void 0?{promptHead:e.promptHead}:{}};case"background_job":return{kind:"background_job",jobId:e.jobId,status:e.status,...e.label!==void 0?{label:e.label}:{}};case"plan_mode":return{kind:"plan_mode",mode:e.mode};default:return null}}var bI=y(()=>{"use strict"});import*as H2 from"node:fs";import*as Pu from"node:fs/promises";import*as W2 from"node:readline";function K2(e){let t=e.trim();if(!t)return null;try{let n=JSON.parse(t);return n.v!==1||typeof n.ts!="number"||typeof n.kind!="string"?null:n}catch{return null}}async function*ii(e){if(!xr(e))return;let t;try{t=await Pu.open(Li(e),"r")}catch(n){if(n.code==="ENOENT")return;throw n}try{let n=W2.createInterface({input:t.createReadStream({encoding:"utf8"}),crlfDelay:1/0});for await(let r of n){let o=K2(r);o&&(yield o)}}finally{await t.close()}}async function*Iu(e,t){if(!xr(e))return;let n=Li(e),r=ha(e),{fromStart:o=!1,signal:i}=t??{},s=0,a="",l=!1;async function*c(){let f=null;try{f=await Pu.open(n,"r");let g=await f.stat();if(g.size<=s)return;let h=g.size-s,b=Buffer.allocUnsafe(h),{bytesRead:w}=await f.read(b,0,h,s);if(w===0)return;s+=w,a+=b.toString("utf8",0,w);let S=a.split(`
458
458
  `);a=S.pop()??"";for(let v of S){let E=K2(v);if(E&&(E.kind==="closed"&&(l=!0),yield E,l))return}}catch(g){g.code!=="ENOENT"&&process.stderr.write(`[afk] session-ledger: tail read error for ${e}: ${String(g)}
459
459
  `)}finally{f&&await f.close().catch(()=>{})}}if(o){if(yield*c(),l)return}else try{s=(await Pu.stat(n)).size}catch{}let u=null,d=null,p=()=>new Promise(f=>{let g=setTimeout(()=>{d=null,f()},QRe);d=()=>{clearTimeout(g),d=null,f()},i?.addEventListener("abort",()=>{clearTimeout(g),d=null,f()},{once:!0})});try{u=H2.watch(r,{persistent:!1},()=>{d?.()})}catch{}try{for(;!i?.aborted&&!l&&(await p(),!i?.aborted);)yield*c()}finally{u?.close()}}var QRe,G2=y(()=>{"use strict";B();QRe=250});import*as TS from"node:fs";var kS,nl=y(()=>{"use strict";B();bI();bI();G2();kS=class{sessionId;ledgerPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;constructor(t){if(this.sessionId=t,!xr(t)){this.errored=!0,this.ledgerPath="";return}this.ledgerPath=Li(t);try{TS.mkdirSync(ha(t),{recursive:!0})}catch(n){process.stderr.write(`[afk] session-ledger: mkdir failed for ${t}: ${String(n)}
460
460
  `),this.errored=!0}}get active(){return!this.errored&&!this.closed}record(t){if(this.errored||this.closed)return;let n={v:1,ts:Date.now(),...t},r=JSON.stringify(n)+`
@@ -2180,7 +2180,7 @@ ${E}
2180
2180
  ${T}`})}return{fileBlocks:l,warnings:c}}function yle(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function ble(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}F();L();F();nt();L();Al();function wle(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function Sle(e,t){He()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function vle(e,t,n,r){if(!He())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=$e(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${ye(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function kle(e,t,n,r){if(!He())return;let{subagentId:o,agentType:i}=n,s=$e(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${ye(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var NR=class{state;writer;ttfb;constructor(t,n){this.state=wle(),this.writer=t,this.ttfb=n}onToolStart(t){Sle(this.state,t)}onToolResult(t,n){vle(this.state,t,n,this.writer)}onSubagentEvent(t,n){kle(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function Tle(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function Ele(e){return e.received?{}:{turnStartedAt:e.startedAt}}function xle(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function Rle(e,t=process.stdout,n){if(!He()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new NR(e,n)))}ge();L();var lJe=3e3;async function Ale(e,t){if(!e)return t;let n=Date.now();if(n-t<lJe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){qe()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}L();ge();bt();Vs();var cJe="Keep waiting \u2014 auto-resume in progress",Cle="Switch model / provider (type /model after)",uJe="Stop waiting";async function _le(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:cJe,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Pn(r,{header:p,options:[d,Cle,uJe],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===Cle&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{qe()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{qe()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(HU({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}HE();async function Ple(e,t,n,r,o="summary",i,s){let a=Mee(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=Tle(l);Rle(i,process.stdout,c),Yd(process.stdout,ah(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,w,S=!1,v=!1,E={abort:null},T=0,x=[],_=new Map,P=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,R=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&ble(j,C,r.onQueuedUserMessage).then(({jobs:q,flushedText:H,flushedPreview:K})=>{let X=(i??{fn:console.log}).fn;for(let D of q)X(m.dim(` \u2192 subagent backgrounded as ${D.jobId}: ${D.label}`));q.some(D=>D.sharesWorktree)&&X(m.warning("\u26A0 Background child is writing to your worktree \u2014 edits may conflict until it finishes")),H!==void 0&&X(m.dim(` \u2192 queued message sent to this turn: ${yle(K??H)}`))}).catch(()=>{})},C=r.getCompositor?r.getCompositor():null,I=()=>new Sp({out:kp(i),thinkingMode:o,...P?{activeSkillName:P}:{},onCancel:()=>{t.interrupt().catch(j=>{qe()&&console.error(" "+m.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:R}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...C?{compositor:C}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...Ele(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),M=I();r.bashTailSetter&&(r.bashTailSetter.current=(j,q)=>M.setBashOutputTail(j,q));let U=async()=>{if(!h){h=!0,r.bashTailSetter&&(r.bashTailSetter.current=void 0);try{await M.dispose()}catch{}}},O=async()=>{await M.arm();let j=M.getCompositor();if(i&&j){let q=j;i.fn=H=>q.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(q=>M.setInterrupting(q)),r.rearmStatus?.()};try{C?C.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,M.setSoftStopping(!0),t.interrupt().catch(Z=>{qe()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),Z)});let W=r.subagentControl;W?.hasActiveForeground()&&W.cancelActiveForeground().catch(Z=>{qe()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),Z)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{v=!0,t.interrupt().catch(W=>{qe()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),W)})}),await O(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(R),r.setTaskViewHandler?.(dle(r));let{fileBlocks:j,warnings:q}=hle(e.text,{rootDir:process.cwd()});for(let W of q)(i??{fn:console.log}).fn(m.dim(` @-file: ${W}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let H=j.length>0||e.attachments.length>0?await gle(e.text,e.attachments,void 0,j,t.sessionId):e.text,K=t.sendMessageStream(H);await Nu((W,Z)=>{M.process(W,Z),Z&&c.plainHooks?.onSubagentEvent(W,Z)},async()=>{for await(let W of K){if(S||v)break;let Z=xle(c,W,f);if(W.type==="chunk"&&W.chunk.type==="content"?(u=p?cle(u,W.chunk.content):u+W.chunk.content,p=!1,f=!0):W.type==="message"&&!f&&(u=W.message.content),W.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),W.type==="chunk"&&W.chunk.type==="tool_use_detail"){let ce=W.chunk,te={toolName:ce.toolName,toolUseId:ce.toolUseId,input:ce.toolInput,...ce.toolInputRaw!==void 0&&{inputRaw:ce.toolInputRaw}};_.set(ce.toolUseId,te),x.push(te),c.plainHooks?.onToolStart(ce)}else if(W.type==="chunk"&&W.chunk.type==="tool_result"){let ce=W.chunk;d=u.length,p=!0;let te=_.get(ce.toolUseId);te&&(te.result=ce.content,te.isError=ce.isError,_.delete(ce.toolUseId)),c.plainHooks?.onToolResult(ce,te?.toolName),T=await Ale(r.onContextProgress,T)}if(W.type==="paused"){await _le({event:W,session:t,borrowedCompositor:C,pickerRef:E,completionWriter:i,disposeRendererOnce:U,setPausedState:r.setPausedState,onPauseInterrupt:()=>{v=!0}});continue}if(W.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let ce=W.hotSwapped&&W.accountId?`\u25B6 Resumed on ${W.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,x.length=0,_.clear(),b=!1,w=void 0,g=!1,M=I(),h=!1,await O(),(i??{fn:console.log}).fn(m.success(ce));continue}if(W.type==="error"){await U(),Gc(Lc(W.error)),g=!0;continue}M.process(W),Z&&(c.plainHooks?.onFirstContent(process.stdout),M.notifyFirstContent()),W.type==="done"&&(b=!0,w=W.metadata)}});let D=!1;if(b&&!S&&!v){let W=ale(M.getPendingBuffer());W>=0?M.stripPendingTerminalState(W):iy(u)!==null&&(D=!0)}await U();let G=i?i.fn:console.log;if(S){let W=C?C.getPendingCount():0,Z=W>0?` \xB7 ${W} queued`:"";G(m.warning(`\u23F8 Stopped${Z} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),G("")}if(v&&(G(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),G("")),b&&!S&&!v){Ol(n,a,u,w,x),await r.onTurnComplete?.(a,u).catch(()=>{}),Vd(process.stdout),U7(process.stdout,"afk: turn complete");let W=ce=>{i?i.fn(ce):console.log(ce)},Z=iy(u);if(Z&&!D){W(ule(Z,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:x.length})),W("");let ce=uF(x),te=aoe(x);if(r.onTerminalState)try{r.onTerminalState(Z,{doneHasCorroboratingEvidence:te,doneEvidenceClassification:ce})}catch{}if(n.permissionMode==="autonomous"){let Ie=Z.kind==="done"&&kf().verifyDone===!0&&!te;coe(Z,void 0,{unverified:Ie})}}if(fN(w,n,W),gN(W,process.stdout),r.onAfterTurn){let ce=r.onAfterTurn();ce instanceof Promise&&await ce.catch(()=>{})}}}catch(j){await U(),g||Gc(Lc(j))}finally{await U(),Yd(process.stdout,ah(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setTaskViewHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Bs();km();var dJe=5e3,pJe=3,mJe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function fJe(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function Ile(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async I=>{qe()&&(h=Hx(I)),await Nh(e.session.current),qe()&&(b=ML())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,v=!1,E=!1,T;e.clearPendingStopInjection=()=>{T=void 0};let x,_,P,R=(()=>{let I=parseInt(e.options.maxTurns,10);return I>0?I:void 0})(),C=0;for(g.onInjectable=()=>{C>=pJe||!o.isAwaitingInput()||!o.bufferIsEmpty()||(C++,Vd(process.stdout),w={text:mJe,attachments:[]},o.abortPendingRead())};;){if(C=0,h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let D of b)e.replRenderer.writeLine(D);e.replRenderer.writeLine(""),b=[]}let I=f.drainNotifications();for(let{job:D,result:G}of I){let W=G.errorReason===void 0?"\u2713":"\u2717",Z=G.errorReason==="abort"?"killed":G.errorReason==="timeout"?"timed out":G.errorReason==="signal-killed"?"killed by signal":`exit ${G.exitCode??0}`,ce=Math.max(0,Math.round(G.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${W} [${D.id}] ${Z} \xB7 ${ce}s \xB7 `)+D.command)}let M=g.drainNotifications();for(let{job:D}of M){let G=D.status==="completed"?"\u2713":D.status==="failed"?"\u2717":"\u2298",W=D.endedAt!==void 0?Math.max(0,Math.round((D.endedAt-D.startedAt)/100)/10):0,Z=ee(D.label,60);e.replRenderer.writeLine(m.dim(` ${G} [${D.jobId}] subagent ${D.status} \xB7 ${W}s \xB7 `)+Z)}let U=l.renderIfChanged(e.stats.sessionId);if(U.length>0){for(let D of U)e.replRenderer.writeLine(D);e.replRenderer.writeLine("")}let O,j;if(w===void 0){let D=await e.session.current.takePendingPlanExitSeed();D!==void 0&&(e.stats.permissionMode=D.mode,w={text:D.message,attachments:[]})}if(w!==void 0){let D=w;w=void 0;let G=Ip(e.stats.permissionMode),W=Fl({buffer:D.text,promptText:G,isTTY:!!process.stdout.isTTY,attachmentSummary:sp([...D.attachments])});e.replRenderer.writeLine(W),O=D.text.trim(),j=D.attachments}else{let D=S;S=void 0;let G=await o.readLine({promptFn:()=>Ip(e.stats.permissionMode),...D!==void 0?{initialBuffer:D}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{IR(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});O=G.text.trim(),j=G.attachments}if(!O&&j.length===0)continue;if(O.startsWith("!")){let D=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!D&&(v||(v=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(O))){e.statusLine.rearm();continue}}let q=!1;if(O.startsWith("/")){let D=await W7(O,e.slashCtx,j);if(D.handled){if(D.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),D.result!==null&&typeof D.result=="object"&&"kind"in D.result&&D.result.kind==="submit"){w={text:D.result.message,attachments:j??[]},e.statusLine.rearm();continue}if(D.result!==null&&typeof D.result=="object"&&"kind"in D.result&&D.result.kind==="prefill"){S=D.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}q=!0}a.push(O),await fJe(e,O);let H=O;if(q){let D=tD(O);if(D){let G=D.name.replace(/^\//,"").split(":").pop()??"";if(G&&AL(G)){let W={skillName:G,rawArgs:D.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},Z=e.session.current.sessionId,ce=nc(Z),te=Date.now();N(`[afk trace] preflight.start commandName=${G}`);let Ie=!1,ze=await tc(W,{cwd:e.stats.cwd??process.cwd(),artifactDir:ce},Qr=>{qe()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${G}) failed: `)+(Qr instanceof Error?Qr.message:String(Qr)))});Ie=ze!==null,N(`[afk trace] preflight.end commandName=${G} durationMs=${Date.now()-te} success=${Ie}`),H=PL(ze?.manifestBlock,O)}}}let K=f.drainInjections();K.length>0&&(H=K+H);let X=g.drainInjections();if(X.length>0&&(H=X+H),T!==void 0&&(H=T+`
2181
2181
 
2182
2182
  `+H,T=void 0),e.hookRegistry)try{let D={event:"UserPromptSubmit",prompt:H,sessionId:e.stats.sessionId},G=await e.hookRegistry.dispatch(D);G.injectContext&&(H=G.injectContext+H)}catch(D){if(D instanceof Ce){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(D.reason?m.dim(`: ${se(D.reason)}`):"")),e.statusLine.rearm();continue}if(D instanceof po){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${D.timeoutMs}ms`)),e.statusLine.rearm();continue}throw D}if(x=_=P=void 0,VU(),ZU(),await Ple({text:H,attachments:j},e.session.current,e.stats,{setInFlight(D){n.turnInFlight=D},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(D){await t.appendUser(D)},async onQueuedUserMessage(D){await t.appendQueuedUser(D)},async onTurnComplete(D,G){if(await t.appendTurn(D,G),e.stats.sessionId)try{Ns(e.stats)}catch(W){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(W instanceof Error?W.message:String(W))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(wr(e.stats,e.contextSampler,e.gitStatusSampler,R)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(D,G)=>{p?.push(D),x=D.kind,_=G?.doneHasCorroboratingEvidence,P=G?.doneEvidenceClassification},setActiveCompositor:D=>{n.activeCompositor=D,D===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:D=>{n.notifyInterrupting=D},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:D=>o.setBackgroundHandler(D),setTaskViewHandler:D=>o.setTaskViewHandler(D),setSoftStopHandler:i,setPausedState:D=>o.setPausedState(D),setPauseInterruptHandler:D=>o.setPauseInterruptHandler(D),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(wr(e.stats,e.contextSampler,e.gitStatusSampler,R)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(D,G)=>{c.repaint(D),u?.onStage(D,G)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{},bashTailSetter:e.bashTailSetter},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ip(e.stats.permissionMode))),e.hookRegistry)try{let D=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...x!==void 0?{terminalState:x}:{},..._!==void 0?{doneHasCorroboratingEvidence:_}:{},...P!==void 0?{doneEvidenceClassification:P}:{}},void 0,dJe);D.injectContext&&D.injectContext.trim().length>0&&(T=D.injectContext)}catch(D){if(D instanceof Nt)throw D;D instanceof po?(N("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):D instanceof Ce?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${se(D.reason??"no reason given")}`)):N("[stop hook] unexpected error: "+String(D))}}}function gJe(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function Mle(e,t,n,r){let o=await vae(),i=new PR({rl:e.rl,history:o,statusLine:e.statusLine}),s=gJe(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await Wae(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=sle(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await Ile(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}ff();Ru();import{execFile as hJe}from"node:child_process";import{dirname as yJe,isAbsolute as bJe,resolve as wJe}from"node:path";import{promisify as SJe}from"node:util";var Ole=SJe(hJe),vJe=3e3,kJe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function TJe(){let t=(await Ole("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=bJe(t)?t:wJe(process.cwd(),t);return yJe(n)}async function $le(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await TJe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),vJe)});try{let o=cr({execFile:Ole,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>kJe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Pb();ff();import{promises as EJe}from"node:fs";import{dirname as xJe,join as Fle}from"node:path";import{randomBytes as RJe}from"node:crypto";var AJe=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
2183
- `),Dle=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,yN=30,CJe=1024,_Je=8e3,PJe="haiku";async function IJe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=DJe(n,CJe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??_Je),s=t.signal?LJe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Vc({token:t.token,model:t.model??PJe,system:AJe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=MJe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=xJe(t.worktreePath);return await OJe(l,c)}function MJe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Dle.test(t)&&t.length<=yN)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>yN)break;o=s}return Dle.test(o)?o:null}async function OJe(e,t){if(!await $Je(Fle(t,e)))return e;let n=RJe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,yN-5)}-${n}`}async function $Je(e){try{return await EJe.access(e),!0}catch{return!1}}function DJe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function LJe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Nle(e){let t,n,r=Fle(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await IJe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Fw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Lle(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Lle(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Lle(e,t){e&&e.setCwd(t),FJe(t)}function FJe(e){try{process.chdir(e)}catch{}}ht();vt();$c();jo();B();import{spawn as Ule}from"child_process";import{existsSync as jle,mkdirSync as HJe,readFileSync as Hle,unlinkSync as Ble,writeFileSync as Wle}from"fs";import{get as WJe}from"https";import{join as Kle}from"path";import{readFileSync as NJe}from"fs";import{dirname as BJe,join as UJe}from"path";import{fileURLToPath as jJe}from"url";function Ko(){try{return"5.203.1"}catch{}try{let e=BJe(jJe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(NJe(UJe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var KJe=64*1024,GJe=10800*1e3,qJe=800,zJe=3600*1e3,JJe="update-check.json",VJe="pending-update.json";function bN(){return Kle(fa(),JJe)}function sy(){return Kle(fa(),VJe)}function wN(){let e=fa();jle(e)||HJe(e,{recursive:!0})}function Gle(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function qle(){try{let e=Hle(bN(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function zle(){try{wN();let e=`
2183
+ `),Dle=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,yN=30,CJe=1024,_Je=8e3,PJe="haiku";async function IJe(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=DJe(n,CJe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??_Je),s=t.signal?LJe([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Vc({token:t.token,model:t.model??PJe,system:AJe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=MJe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=xJe(t.worktreePath);return await OJe(l,c)}function MJe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Dle.test(t)&&t.length<=yN)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>yN)break;o=s}return Dle.test(o)?o:null}async function OJe(e,t){if(!await $Je(Fle(t,e)))return e;let n=RJe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,yN-5)}-${n}`}async function $Je(e){try{return await EJe.access(e),!0}catch{return!1}}function DJe(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function LJe(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Nle(e){let t,n,r=Fle(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await IJe(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Fw(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Lle(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Lle(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Lle(e,t){e&&e.setCwd(t),FJe(t)}function FJe(e){try{process.chdir(e)}catch{}}ht();vt();$c();jo();B();import{spawn as Ule}from"child_process";import{existsSync as jle,mkdirSync as HJe,readFileSync as Hle,unlinkSync as Ble,writeFileSync as Wle}from"fs";import{get as WJe}from"https";import{join as Kle}from"path";import{readFileSync as NJe}from"fs";import{dirname as BJe,join as UJe}from"path";import{fileURLToPath as jJe}from"url";function Ko(){try{return"5.204.0"}catch{}try{let e=BJe(jJe(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(NJe(UJe(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}L();F();var KJe=64*1024,GJe=10800*1e3,qJe=800,zJe=3600*1e3,JJe="update-check.json",VJe="pending-update.json";function bN(){return Kle(fa(),JJe)}function sy(){return Kle(fa(),VJe)}function wN(){let e=fa();jle(e)||HJe(e,{recursive:!0})}function Gle(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function qle(){try{let e=Hle(bN(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function zle(){try{wN();let e=`
2184
2184
  const https = require('https');
2185
2185
  const fs = require('fs');
2186
2186
  const url = 'https://registry.npmjs.org/agent-afk/latest';