agent-afk 4.44.0 → 4.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -1078,7 +1078,7 @@ ${o}`;return s.includes("already checked out")||s.includes("is already used by w
1078
1078
  Effective base URL: ${r}`)),r}return t}function R1(){if(kg!==void 0)return kg;if(!Gk){let o=[$a(process.cwd(),".env"),mt(),OS()];for(let s of o)Eg(s)&&x1({path:s,override:!1});Gk=!0}let e={},t=v.AFK_MODEL??v.CLAUDE_MODEL;if(t){let o=t.toLowerCase();e.model=Mf(o)?o:t}if(re(t)==="anthropic-direct"){let o=xg();o!==void 0&&(e.apiKey=o)}let r=v.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=v.AFK_LOCAL_API_KEY||"local"),v.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(v.AFK_MAX_TOKENS,10)),v.AFK_TEMPERATURE&&(e.temperature=parseFloat(v.AFK_TEMPERATURE)),v.AFK_SYSTEM_PROMPT&&(e.systemPrompt=v.AFK_SYSTEM_PROMPT),v.AFK_AUTO_ROUTING){let o=v.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return v.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=T1(v.AFK_OPENAI_BASE_URL)),kg=e,e}function Tg(){if(Ws!==void 0)return Ws;let e=[$a(process.cwd(),"afk.config.json"),Ut(),pc()];for(let t of e)if(Eg(t))try{let n=zk(t,"utf-8"),r=JSON.parse(n),o={},s=hv(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=Mf(i)?i:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),typeof r.permissionMode=="string"){let i=r.permissionMode;(i==="default"||i==="plan"||i==="autonomous"||i==="bypassPermissions")&&(o.permissionMode=i)}if(r.autoRouting&&typeof r.autoRouting=="object"){let i={};typeof r.autoRouting.interactive=="boolean"&&(i.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(i.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(i.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(i.daemon=r.autoRouting.daemon),o.autoRouting=i}if(r.daemon&&typeof r.daemon=="object"){let i={};typeof r.daemon.task=="string"&&(i.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(i.taskId=r.daemon.taskId);let a=r.daemon.worktreePrune;a&&typeof a=="object"&&(i.worktreePrune={enabled:typeof a.enabled=="boolean"?a.enabled:!0,cron:typeof a.cron=="string"?a.cron:"0 4 * * *",maxAgeDaysClean:typeof a.maxAgeDaysClean=="number"?a.maxAgeDaysClean:14,maxAgeDaysDirty:typeof a.maxAgeDaysDirty=="number"?a.maxAgeDaysDirty:30,scope:typeof a.scope=="string"?a.scope:"all"}),o.daemon=i}if(r.telegram&&typeof r.telegram=="object"){let i={},a=r.telegram.notify;if(a&&typeof a=="object"){let l={};if((a.mode==="primary"||a.mode==="broadcast"||a.mode==="custom")&&(l.mode=a.mode),typeof a.primaryChatId=="number"&&Number.isFinite(a.primaryChatId)&&(l.primaryChatId=a.primaryChatId),Array.isArray(a.targets)){let c=a.targets.filter(u=>typeof u=="number"&&Number.isFinite(u));c.length>0&&(l.targets=c)}i.notify=l}typeof r.telegram.verifyDone=="boolean"&&(i.verifyDone=r.telegram.verifyDone),o.telegram=i}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.hooks!==null&&typeof r.hooks=="object"&&!Array.isArray(r.hooks)&&(o.hooks=r.hooks),typeof r.enableShellHooks=="boolean"&&(o.enableShellHooks=r.enableShellHooks),t!==$a(process.cwd(),"afk.config.json")){let i=Ma(r.importFrom);i!==void 0&&(o.importFrom=i)}if(r.interactive&&typeof r.interactive=="object"){let i={};typeof r.interactive.worktreeAutoname=="boolean"&&(i.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(i.worktreeBranchPrefix=bg(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(wg(r.interactive.worktreeBase,`${t}#/interactive/worktreeBase`),i.worktreeBase=r.interactive.worktreeBase),typeof r.interactive.suggestGhost=="boolean"&&(i.suggestGhost=r.interactive.suggestGhost),Object.keys(i).length>0&&(o.interactive=i)}return Ws={config:o,sourcePath:t,modelsPartial:s},Ws}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return Ws={config:{},sourcePath:void 0,modelsPartial:{}},Ws}function C1(){if(Ks!==void 0)return Ks.value;let e=[$a(process.cwd(),"AFK.md"),$a($e(),"AFK.md")];for(let t of e)if(Eg(t))try{let n=zk(t,"utf-8").trim();if(n.length>0)return Ks={value:{content:n,path:t}},Ks.value}catch{}return Ks={value:null},Ks.value}function lu(){return Tg().config.telegram??{}}function Gs(){return Tg().config.permissionMode??Jk}function Tt(e){let t=R1(),{config:n,sourcePath:r,modelsPartial:o}=Tg(),s={...Oa,...t,...n,...e},i;if(t.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=C1();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??Oa.model,maxTokens:s.maxTokens??Oa.maxTokens,temperature:s.temperature??Oa.temperature,updatePolicy:s.updatePolicy??Oa.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??Jk,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{}},l=e?.models??_f(o);if(Ac(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var Oa,Jk,Gk,kg,qk,Ws,Ks,It=_(()=>{"use strict";zn();tn();tt();G();js();Pa();q();sr();Oa={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},Jk="bypassPermissions",Gk=!1;qk=new Set});function A1(e,t){return t!==void 0&&Number.isFinite(t)&&t!==0?t:e.find(r=>r>0)??e[0]}function _1(e,t={}){let n=[...e],r=t.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(t.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=A1(n,t.primaryChatId);return o!==void 0?[o]:[]}function I1(e){if(!e)return;let t=e.trim();if(!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isFinite(n)&&n!==0?n:void 0}function P1(e){if(!e)return;let t=e.trim().toLowerCase();return t==="primary"||t==="broadcast"||t==="custom"?t:void 0}function M1(){let e=lu().notify??{},t=e.mode??P1(v.AFK_TELEGRAM_NOTIFY_MODE),n=e.primaryChatId??I1(v.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...t!==void 0?{mode:t}:{},...n!==void 0?{primaryChatId:n}:{},...e.targets!==void 0?{targets:e.targets}:{}}}function qs(){let e=Ck(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return _1(e,M1())}var cu=_(()=>{"use strict";Ak();It();q()});function Rg(e,t=4096){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let o=t,s=r.lastIndexOf(`
1079
1079
  `,t);if(s>t-500&&s>0)o=s+1;else{let i=r.slice(0,t).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let a=i[i.length-1];if(a){let l=r.lastIndexOf(a,t);l>t-200&&l>0&&(o=l+2)}}else{let a=r.lastIndexOf(" ",t);a>t-100&&a>0&&(o=a+1)}}n.push(r.slice(0,o).trim()),r=r.slice(o).trim()}return n}function Vk(e){e=e.replace(/[\x02\x03]/g,"");let t=e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),n=[];t=t.replace(/^ {0,3}```([\w]*)\n([\s\S]*?)```/gm,(o,s,i)=>{let a=n.length;if(i.trim()===""){let l=s?`(empty ${s} block)`:"(empty code block)";n.push(`<i>${l}</i>`)}else n.push(`<pre>${i}</pre>`);return`FENCED${a}`});let r=[];return t=t.replace(/`([^`]+)`/g,(o,s)=>{let i=r.length;return r.push(`<code>${s}</code>`),`CODE${i}`}),t=t.replace(/\*\*([^*]+)\*\*/g,"<b>$1</b>"),t=t.replace(/__([^_]+)__/g,"<b>$1</b>"),t=t.replace(/\*([^*]+)\*/g,"<i>$1</i>"),t=t.replace(/(^|[^\w])_([^_\n]+?)_(?!\w)/gm,"$1<i>$2</i>"),t=t.replace(/~~([^~]+)~~/g,"<s>$1</s>"),t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,s,i)=>'<a href="'+i.replace(/"/g,"&quot;")+'">'+s+"</a>"),t=t.replace(/^#{1,6}\s+/gm,""),t=t.replace(/\x02CODE(\d+)\x03/g,(o,s)=>r[Number(s)]??o),t=t.replace(/\x02FENCED(\d+)\x03/g,(o,s)=>n[Number(s)]??o),t}var Yk=_(()=>{"use strict"});var Cg={};oc(Cg,{push:()=>zs,pushIfConfigured:()=>Mr,pushMarkdown:()=>Xk});async function zs(e){if(!e.token)throw new Error("push: token is required");if(e.chatId===""||e.chatId==null||e.chatId===0)throw new Error("push: chatId is required");let t=e.fetchImpl??fetch,r=`${e.apiBase??O1}/bot${e.token}/sendMessage`,o={chat_id:e.chatId,text:e.text.slice(0,4096)};e.parseMode&&(o.parse_mode=e.parseMode),e.replyMarkup&&(o.reply_markup=e.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await t(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function Xk(e){let t=Vk(e.text),n=Rg(t),r={ok:!0,status:200};for(let o of n)if(r=await zs({...e,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?zs({...e}):r;return r}async function Mr(e,t={}){let n=v.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=qs();if(r.length===0)return null;let o=Rg(e),s=[];for(let i of r)for(let a=0;a<o.length;a++){let l={token:n,chatId:i,text:o[a]??"",...t.replyMarkup!==void 0&&a===0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}};s.push(t.markdown?await Xk(l):await zs({...l,...t.parseMode!==void 0?{parseMode:t.parseMode}:{}}))}return s}var O1,Ro=_(()=>{"use strict";cu();Yk();q();O1="https://api.telegram.org"});function $1(e=zs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>Zk)return{content:`Invalid input: message exceeds Telegram's ${Zk}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=qs();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of i){let c=await e({token:s,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var Zk,Qk,eE=_(()=>{"use strict";q();Ro();cu();Zk=4096;Qk=$1()});import{JSDOM as D1}from"jsdom";import{Readability as L1}from"@mozilla/readability";import F1 from"turndown";function tE(e){return e.replace(/\n{3,}/g,`
1080
1080
 
1081
- `).trim()}function N1(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function rE(e,t){let r=new D1(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new L1(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=tE(Ag.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=tE(Ag.turndown(a));return{title:o,markdown:l,textLength:N1(i),usedFallback:!0}}var nE,Ag,oE=_(()=>{"use strict";nE=200,Ag=new F1({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Ag.remove(["script","style","noscript","iframe"])});import{readFileSync as B1}from"node:fs";import{join as U1}from"path";function j1(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function sE(e,t){return j1(t).test(e)}function K1(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(H1.has(t))return!0;if(W1.has(t))return!1}return!1}function iE(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function G1(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function q1(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function z1(e){try{return B1(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function J1(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return n}function aE(e){let t=e?.env??v,n=e?.readFileSync??z1,r=e?.surface??t.AGENT_SURFACE,o=K1(t.AFK_BROWSER_HEADLESS,r),s=iE(t.AFK_BROWSER_ALLOWED_DOMAINS),i=iE(t.AFK_BROWSER_BLOCKED_DOMAINS),a=q1(t.AFK_BROWSER_DOM_SNAPSHOTS),l=G1(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():U1(en(),"browser.json"),p=n(d);if(p===void 0)return c;let m;try{m=JSON.parse(p)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${d} must be a JSON object`);let g=J1(c,m);return g.configPath=d,g}function _g(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(sE(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>sE(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var H1,W1,Ig=_(()=>{"use strict";q();G();H1=new Set(["daemon","subagent","telegram","afk"]),W1=new Set(["repl","interactive","cli"])});import V1 from"node:fs";import Y1 from"node:path";import{chromium as X1}from"playwright";function Z1(){try{return"4.44.0"}catch{}try{let e=Y1.resolve(import.meta.dirname,"../../../package.json"),t=V1.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Q1,uu,lE=_(()=>{"use strict";Q1=Z1(),uu=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=X1.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),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 o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}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",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),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 i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}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){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(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/${Q1}`}}}});import{createHash as eH}from"crypto";function Pg(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of tH)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function cE(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&nH.test(e.label))}function uE(e){return eH("sha256").update(e,"utf8").digest("hex").slice(0,8)}function dE(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var tH,nH,Da=_(()=>{"use strict";tH=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];nH=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as rH}from"node:crypto";function oH(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function sH(e,t,n){return`el_${rH("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function iH(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function pE(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function fE(e,t){let n=e.role??"",r=e.name??"";mE.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])fE(s,t)}async function aH(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);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(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},gE).catch(()=>[])}async function lH(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 s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.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 s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},gE).catch(()=>[])}function cH(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function du(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=cH(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=aH(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],fE(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await lH(e)).filter(F=>mE.has(F.role??"")));let S=new Map;for(let P of p){let F=pE(P.name),$=S.get(F);(!$||$.bbox.w===0&&P.bbox.w>0)&&S.set(F,P)}let w=b.map(P=>({ax:P,dom:S.get(pE(P.name??""))})),x=r?w:w.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);x.sort((P,F)=>{let $=P.dom?.bbox.y??0,N=F.dom?.bbox.y??0;if($!==N)return $-N;let B=P.dom?.bbox.x??0,H=F.dom?.bbox.x??0;return B-H}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let C=x.slice(0,n).map((P,F)=>{let $=P.ax.role??"generic",N=P.ax.name??"",B=sH($,N,F),H=P.dom?.bbox??{x:0,y:0,w:0,h:0},D=P.dom?.type??null,I=null;P.ax.value!==void 0&&P.ax.value!==null&&(I=String(P.ax.value)),P.ax.checked!==void 0&&(I=String(P.ax.checked)),cE({role:$,kind:D})&&(I="[redacted]");let U={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(U.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(U.selected=P.ax.selected),P.ax.expanded!==void 0&&(U.expanded=P.ax.expanded);let M;P.dom?.testId?M=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(M=`#${P.dom.id}`);let j={id:B,role:$,label:oH(N),kind:D,value:I,state:U,bbox:H};return M!==void 0&&(j.selector=M),j}),R="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?R="loading":P==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let k=iH(m),L=`obs_${t.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:L,url:g,title:h,textSummary:k,interactive:C,status:{httpStatus:t.httpStatus??null,loadingState:R,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:A}}var mE,gE,hE=_(()=>{"use strict";Da();mE=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);gE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function yE(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,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 i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Mg(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>yE(e,s)))).filter(o=>o!==null)}async function uH(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Og(e,t,n){switch(t.kind){case"element_id":return dH(e,t,n);case"selector":return pH(e,t);case"semantic":return mH(e,t)}}async function dH(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}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await Mg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function pH(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 Mg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function mH(e,t){return t.role!==void 0?fH(e,t.text,t.role):gH(e,t.text,t)}async function fH(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 s=await Mg(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function gH(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await uH(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),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await yE(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let x=0;x<S.length;x++)w=w*31+S.charCodeAt(x)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var bE=_(()=>{"use strict"});import{randomBytes as hH}from"crypto";import{mkdir as yH,stat as bH,writeFile as wH}from"fs/promises";import{join as $g}from"path";import{gzip as SH}from"zlib";import{promisify as vH}from"util";function kH(e){return $g(Ss(e),"browser")}function EH(e){return $g(kH(e),"screenshots")}function xH(){return new Date().toISOString().replace(/[:.]/g,"-")}function TH(){return hH(3).toString("hex")}async function Dg(e,t,n){if(t.length>wE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${wE} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=EH(e);await yH(r,{recursive:!0});let o=`${xH()}-${TH()}-${n}.png`,s=$g(r,o);await wH(s,t);let{size:i}=await bH(s);return{path:s,bytes:i}}var Dce,wE,SE=_(()=>{"use strict";G();Da();Dce=vH(SH);wE=5*1024*1024});var kE={};oc(kE,{PlaywrightProvider:()=>Lg});function vE(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 Lg,EE=_(()=>{"use strict";lE();hE();bE();Ig();Da();SE();Lg=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new uu(t)}async open(t){let n=_g(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),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await du(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}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),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await du(r,{observationCounter:o.observationCounter,screenshotPath:s,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,i.interactive,i.url,i.title,"browser_observe"),i}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),s=r.url(),i=t.timeoutMs??3e4,a=await Og(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${vE(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:i});break;case"fill":{let h=Pg(t.value??"");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:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,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=r.url();if(d!==s){let h=_g(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await du(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,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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),s;if(t.target!==void 0){let u=await Og(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${vE(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"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:i,bytes:a,width:l,height:c,dataBase64:s.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,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var Ao={};oc(Ao,{__resetBrowserRegistryForTests:()=>IH,browserProviderActive:()=>AH,closeBrowserProvider:()=>Fg,getBrowserProvider:()=>CH,peekBrowserProvider:()=>_H});function xE(){Promise.resolve(Fg()).then(()=>{process.exit(130)})}function TE(){Promise.resolve(Fg()).then(()=>{process.exit(143)})}function RE(){xn=null}function RH(){pu||(process.on("SIGINT",xE),process.on("SIGTERM",TE),process.on("exit",RE),pu=!0)}function CE(){pu&&(process.removeListener("SIGINT",xE),process.removeListener("SIGTERM",TE),process.removeListener("exit",RE),pu=!1)}async function CH(e){return xn!==null?xn:(Co!==null||(Co=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(EE(),kE)),n=aE(e),r=new t(n);return RH(),xn=r,Co=null,r})()),Co)}async function Fg(){if(xn===null)return;let e=xn;xn=null,Co=null,CE(),await e.shutdown()}function AH(){return xn!==null}function _H(){return xn}function IH(){xn=null,Co=null,CE()}var xn,Co,pu,_o=_(()=>{"use strict";Ig();xn=null,Co=null,pu=!1});function AE(e,t){try{return rE(e,t)}catch(n){return J("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function DH(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(_o(),Ao));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function _E(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??DH,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:$H,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(OH.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(MH.test(u)&&!PH.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=AE(d,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<nE)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=AE(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var PH,MH,OH,$H,IE=_(()=>{"use strict";oE();Pe();PH=/(text\/html|application\/xhtml\+xml)/i,MH=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,OH=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,$H={"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 NH(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(LH,{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),FH),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=xo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.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 PE(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?NH({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 ME(e,t){if(t.length===0)return`# Search results for "${e}"
1081
+ `).trim()}function N1(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function rE(e,t){let r=new D1(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new L1(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=tE(Ag.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=tE(Ag.turndown(a));return{title:o,markdown:l,textLength:N1(i),usedFallback:!0}}var nE,Ag,oE=_(()=>{"use strict";nE=200,Ag=new F1({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Ag.remove(["script","style","noscript","iframe"])});import{readFileSync as B1}from"node:fs";import{join as U1}from"path";function j1(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function sE(e,t){return j1(t).test(e)}function K1(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(H1.has(t))return!0;if(W1.has(t))return!1}return!1}function iE(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function G1(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function q1(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function z1(e){try{return B1(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function J1(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return n}function aE(e){let t=e?.env??v,n=e?.readFileSync??z1,r=e?.surface??t.AGENT_SURFACE,o=K1(t.AFK_BROWSER_HEADLESS,r),s=iE(t.AFK_BROWSER_ALLOWED_DOMAINS),i=iE(t.AFK_BROWSER_BLOCKED_DOMAINS),a=q1(t.AFK_BROWSER_DOM_SNAPSHOTS),l=G1(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():U1(en(),"browser.json"),p=n(d);if(p===void 0)return c;let m;try{m=JSON.parse(p)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${d} must be a JSON object`);let g=J1(c,m);return g.configPath=d,g}function _g(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(sE(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>sE(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var H1,W1,Ig=_(()=>{"use strict";q();G();H1=new Set(["daemon","subagent","telegram","afk"]),W1=new Set(["repl","interactive","cli"])});import V1 from"node:fs";import Y1 from"node:path";import{chromium as X1}from"playwright";function Z1(){try{return"4.44.1"}catch{}try{let e=Y1.resolve(import.meta.dirname,"../../../package.json"),t=V1.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Q1,uu,lE=_(()=>{"use strict";Q1=Z1(),uu=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=X1.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),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 o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}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",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),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 i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}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){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(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/${Q1}`}}}});import{createHash as eH}from"crypto";function Pg(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of tH)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function cE(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&nH.test(e.label))}function uE(e){return eH("sha256").update(e,"utf8").digest("hex").slice(0,8)}function dE(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var tH,nH,Da=_(()=>{"use strict";tH=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];nH=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as rH}from"node:crypto";function oH(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function sH(e,t,n){return`el_${rH("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function iH(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function pE(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function fE(e,t){let n=e.role??"",r=e.name??"";mE.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])fE(s,t)}async function aH(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);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(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},gE).catch(()=>[])}async function lH(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 s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.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 s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},gE).catch(()=>[])}function cH(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function du(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=cH(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=aH(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],fE(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await lH(e)).filter(F=>mE.has(F.role??"")));let S=new Map;for(let P of p){let F=pE(P.name),$=S.get(F);(!$||$.bbox.w===0&&P.bbox.w>0)&&S.set(F,P)}let w=b.map(P=>({ax:P,dom:S.get(pE(P.name??""))})),x=r?w:w.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);x.sort((P,F)=>{let $=P.dom?.bbox.y??0,N=F.dom?.bbox.y??0;if($!==N)return $-N;let B=P.dom?.bbox.x??0,H=F.dom?.bbox.x??0;return B-H}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let C=x.slice(0,n).map((P,F)=>{let $=P.ax.role??"generic",N=P.ax.name??"",B=sH($,N,F),H=P.dom?.bbox??{x:0,y:0,w:0,h:0},D=P.dom?.type??null,I=null;P.ax.value!==void 0&&P.ax.value!==null&&(I=String(P.ax.value)),P.ax.checked!==void 0&&(I=String(P.ax.checked)),cE({role:$,kind:D})&&(I="[redacted]");let U={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(U.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(U.selected=P.ax.selected),P.ax.expanded!==void 0&&(U.expanded=P.ax.expanded);let M;P.dom?.testId?M=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(M=`#${P.dom.id}`);let j={id:B,role:$,label:oH(N),kind:D,value:I,state:U,bbox:H};return M!==void 0&&(j.selector=M),j}),R="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?R="loading":P==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let k=iH(m),L=`obs_${t.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:L,url:g,title:h,textSummary:k,interactive:C,status:{httpStatus:t.httpStatus??null,loadingState:R,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:A}}var mE,gE,hE=_(()=>{"use strict";Da();mE=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);gE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function yE(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,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 i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Mg(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>yE(e,s)))).filter(o=>o!==null)}async function uH(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Og(e,t,n){switch(t.kind){case"element_id":return dH(e,t,n);case"selector":return pH(e,t);case"semantic":return mH(e,t)}}async function dH(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}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await Mg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function pH(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 Mg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function mH(e,t){return t.role!==void 0?fH(e,t.text,t.role):gH(e,t.text,t)}async function fH(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 s=await Mg(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function gH(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await uH(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),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await yE(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let x=0;x<S.length;x++)w=w*31+S.charCodeAt(x)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var bE=_(()=>{"use strict"});import{randomBytes as hH}from"crypto";import{mkdir as yH,stat as bH,writeFile as wH}from"fs/promises";import{join as $g}from"path";import{gzip as SH}from"zlib";import{promisify as vH}from"util";function kH(e){return $g(Ss(e),"browser")}function EH(e){return $g(kH(e),"screenshots")}function xH(){return new Date().toISOString().replace(/[:.]/g,"-")}function TH(){return hH(3).toString("hex")}async function Dg(e,t,n){if(t.length>wE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${wE} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=EH(e);await yH(r,{recursive:!0});let o=`${xH()}-${TH()}-${n}.png`,s=$g(r,o);await wH(s,t);let{size:i}=await bH(s);return{path:s,bytes:i}}var Dce,wE,SE=_(()=>{"use strict";G();Da();Dce=vH(SH);wE=5*1024*1024});var kE={};oc(kE,{PlaywrightProvider:()=>Lg});function vE(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 Lg,EE=_(()=>{"use strict";lE();hE();bE();Ig();Da();SE();Lg=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new uu(t)}async open(t){let n=_g(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),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await du(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}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),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await du(r,{observationCounter:o.observationCounter,screenshotPath:s,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,i.interactive,i.url,i.title,"browser_observe"),i}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),s=r.url(),i=t.timeoutMs??3e4,a=await Og(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${vE(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:i});break;case"fill":{let h=Pg(t.value??"");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:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,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=r.url();if(d!==s){let h=_g(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await du(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,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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),s;if(t.target!==void 0){let u=await Og(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${vE(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"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:i,bytes:a,width:l,height:c,dataBase64:s.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,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var Ao={};oc(Ao,{__resetBrowserRegistryForTests:()=>IH,browserProviderActive:()=>AH,closeBrowserProvider:()=>Fg,getBrowserProvider:()=>CH,peekBrowserProvider:()=>_H});function xE(){Promise.resolve(Fg()).then(()=>{process.exit(130)})}function TE(){Promise.resolve(Fg()).then(()=>{process.exit(143)})}function RE(){xn=null}function RH(){pu||(process.on("SIGINT",xE),process.on("SIGTERM",TE),process.on("exit",RE),pu=!0)}function CE(){pu&&(process.removeListener("SIGINT",xE),process.removeListener("SIGTERM",TE),process.removeListener("exit",RE),pu=!1)}async function CH(e){return xn!==null?xn:(Co!==null||(Co=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(EE(),kE)),n=aE(e),r=new t(n);return RH(),xn=r,Co=null,r})()),Co)}async function Fg(){if(xn===null)return;let e=xn;xn=null,Co=null,CE(),await e.shutdown()}function AH(){return xn!==null}function _H(){return xn}function IH(){xn=null,Co=null,CE()}var xn,Co,pu,_o=_(()=>{"use strict";Ig();xn=null,Co=null,pu=!1});function AE(e,t){try{return rE(e,t)}catch(n){return J("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function DH(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(_o(),Ao));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function _E(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??DH,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:$H,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(OH.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(MH.test(u)&&!PH.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=AE(d,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<nE)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=AE(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var PH,MH,OH,$H,IE=_(()=>{"use strict";oE();Pe();PH=/(text\/html|application\/xhtml\+xml)/i,MH=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,OH=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,$H={"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 NH(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(LH,{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),FH),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=xo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.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 PE(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?NH({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 ME(e,t){if(t.length===0)return`# Search results for "${e}"
1082
1082
 
1083
1083
  (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(`
1084
1084
  `).trimEnd()}var LH,FH,OE=_(()=>{"use strict";To();LH="https://api.exa.ai/search",FH=10});function qH(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,s;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=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 i=BH;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"};i=Math.min(t.timeout_ms,UH)}let a=jH;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,HH)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Ng(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+WH}function zH(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return GH.some(o=>r.includes(o))}function JH(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{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=qH(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let u=i.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let d;try{d=await t(s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(m){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await d.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}return{content:Ng(p,s.maxBytes)}}if(s.mode==="markdown")try{let d=await _E(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return d.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:Ng(d.markdown,s.maxBytes)}}catch(d){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=d instanceof Error?d.message:String(d),m=zH(d)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${m}`,isError:!0}}let u=PE({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let d=await u.search(s.query,{limit:KH,timeoutMs:s.timeoutMs,signal:i.signal});return{content:Ng(ME(s.query,d),s.maxBytes)}}catch(d){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${d instanceof Error?d.message:String(d)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var BH,UH,jH,HH,WH,KH,GH,$E,DE=_(()=>{"use strict";IE();OE();BH=3e4,UH=12e4,jH=1e6,HH=1e7,WH=`
@@ -2003,7 +2003,7 @@ _ended: ${new Date().toISOString()}_
2003
2003
  ${x}${S}
2004
2004
  ${w}
2005
2005
  ${x}`})}return{fileBlocks:a,warnings:l}}async function VO(e,t,n,r,o="summary",s,i){let a=KP(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,u=!1,d=!1,p=!1,m=!1,g,h=!1,b=!1,y={abort:null},S=0,w=3e3,x=[],T=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,R=()=>{let $=r.subagentControl;$?.hasPromotableForeground()&&$.promoteActiveForeground().then(N=>{for(let B of N)(s??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${B.jobId}: ${B.label}`))}).catch(()=>{})},k=r.getCompositor?r.getCompositor():null,L=()=>new Hi({out:Wi(s),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch($=>{He()&&console.error(" "+f.error("session.interrupt() failed:"),$)})},...r.subagentControl?{onBackground:R}:{},...i?.history?{history:i.history}:{},...i?.autocompleteState?{autocompleteState:i.autocompleteState}:{},...i?.promptText!==void 0?{promptText:i.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...k?{compositor:k}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),A=L(),P=async()=>{if(!p){p=!0;try{await A.dispose()}catch{}}},F=async()=>{await A.arm();let $=A.getCompositor();if(s&&$){let N=$;s.fn=B=>N.commitAbove(B)}r.setActiveCompositor?.($),r.setInterruptNotifier?.(N=>A.setInterrupting(N)),r.rearmStatus?.()};try{k?k.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(I=>{He()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),I)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(I=>{He()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),I)})}),await F(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(R);let{fileBlocks:$,warnings:N}=JO(e.text,{rootDir:process.cwd()});for(let I of N)(s??{fn:console.log}).fn(f.dim(` @-file: ${I}`));let B=$.length>0||e.attachments.length>0?qO(e.text,e.attachments,void 0,$):e.text,H=t.sendMessageStream(B);if(await Ds((I,U)=>{A.process(I,U)},async()=>{for await(let I of H){if(h||b)break;if(I.type==="chunk"&&I.chunk.type==="content"?(l+=I.chunk.content,u=!0):I.type==="message"&&!u&&(l=I.message.content),I.type==="stream_retry"&&(l=l.slice(0,c)),I.type==="chunk"&&I.chunk.type==="tool_use_detail"){let U=I.chunk,M={toolName:U.toolName,toolUseId:U.toolUseId,input:U.toolInput,...U.toolInputRaw!==void 0&&{inputRaw:U.toolInputRaw}};T.set(U.toolUseId,M),x.push(M)}else if(I.type==="chunk"&&I.chunk.type==="tool_result"){let U=I.chunk;c=l.length;let M=T.get(U.toolUseId);if(M&&(M.result=U.content,M.isError=U.isError,T.delete(U.toolUseId)),r.onContextProgress){let j=Date.now();if(j-S>=w){S=j;try{let Y=r.onContextProgress();Y instanceof Promise&&await Y}catch(Y){He()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),Y)}}}}if(I.type==="paused"){if(r.setPausedState?.(!0),await P(),k&&I.autoResume===!0){let U=new AbortController;y.abort=U;let M=I.resetsAt?I.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,j=M?`Keep waiting \u2014 auto-resumes at ${M}`:"Keep waiting \u2014 auto-resume in progress",Y="Switch model / provider (type /model after)",oe="Stop waiting",X=[f.warning(" \u23F3 Usage limit reached.")+(M?f.dim(` Auto-resumes at ${M}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];pm(k,{header:X,options:[j,Y,oe],signal:U.signal,initialIndex:0}).then(W=>{if(y.abort=null,!W)return;let ke=W[0];ke===void 0||ke===j||(b=!0,ke===Y&&(s??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Je=>{He()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),Je)}))}).catch(W=>{He()&&console.error(" "+f.error("picker promise rejected:"),W)})}else(s??{fn:console.log}).fn(rv({reason:I.reason,...I.resetsAt!==void 0?{resetsAt:I.resetsAt}:{},...I.accountId!==void 0?{accountId:I.accountId}:{},...I.autoResume!==void 0?{autoResume:I.autoResume}:{}}));continue}if(I.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let U=I.hotSwapped&&I.accountId?`\u25B6 Resumed on ${I.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,x.length=0,T.clear(),m=!1,g=void 0,d=!1,A=L(),p=!1,await F(),(s??{fn:console.log}).fn(f.success(U));continue}if(I.type==="error"){await P(),Ts(vs(I.error)),d=!0;continue}A.process(I),I.type==="done"&&(m=!0,g=I.metadata)}}),await P(),h){let I=s?s.fn:console.log;I(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),I("")}if(b){let I=s?s.fn:console.log;I(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),I("")}if(m&&!h&&!b){Lo(n,a,l,g,x),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),zd(process.stdout);let I=M=>{s?s.fn(M):console.log(M)},U=KO(l);if(U){if(I(GO(U)),I(""),r.onTerminalState)try{r.onTerminalState(U)}catch{}if(n.permissionMode==="autonomous"){let M=U.kind==="done"&&lu().verifyDone===!0&&!fI(x);hI(U,void 0,{unverified:M})}}if(f9(g,n,I),r.onAfterTurn){let M=r.onAfterTurn();M instanceof Promise&&await M.catch(()=>{})}}}catch($){await P(),d||Ts(vs($))}finally{await P(),s&&(s.fn=s.idleFn),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),y.abort?.abort(),y.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function f9(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(fe(e.durationMs)),e.totalCostUsd!==void 0&&r.push(rt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(ie(o+s)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Ly(t),a=Mt(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${ie(l)} tok \u2014 model output may be silently truncated`))}else if(i>.5){let l=i>.8?f.error:f.warning;n(l(` context ${Math.round(i*100)}% used of ${ie(a)}`))}n("")}var g9=5e3;async function h9(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(f.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function YO(e,t,n,r,o,s,i,a){let{contextPane:l,loopStageBar:c,verdictLedger:u,shellPassthrough:d}=i,p=null,m=[];e.session.current.waitForInitialization().then(async y=>{He()&&(p=np(y)),await qp(e.session.current),He()&&(m=K0())}).catch(()=>{});let g,h=!1,b=!1;for(;;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),m.length>0){for(let k of m)e.replRenderer.writeLine(k);e.replRenderer.writeLine(""),m=[]}let y=d.drainNotifications();for(let{job:k,result:L}of y){let A=L.errorReason===void 0?"\u2713":"\u2717",P=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,F=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${A} [${k.id}] ${P} \xB7 ${F}s \xB7 `)+k.command)}let S=l.renderIfChanged(e.stats.sessionId);if(S.length>0){for(let k of S)e.replRenderer.writeLine(k);e.replRenderer.writeLine("")}let w,x;if(g!==void 0){let k=g;g=void 0;let L=zi(e.stats.permissionMode),A=Ko({buffer:k.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:Di([...k.attachments])});e.replRenderer.writeLine(A),w=k.text.trim(),x=k.attachments}else{let k=await o.readLine({promptFn:()=>zi(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{mm(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});w=k.text.trim(),x=k.attachments}if(!w&&x.length===0)continue;if(w.startsWith("!")){let k=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!k&&(h||(h=!0,e.replRenderer.writeLine(f.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await d.dispatch(w))){e.statusLine.rearm();continue}}let T=!1;if(w.startsWith("/")){let k=await iI(w,e.slashCtx,x);if(k.handled){if(k.result==="exit"){e.rl.close();return}if((w==="/clear"||w.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),u.reset()),k.result!==null&&typeof k.result=="object"&&"kind"in k.result&&k.result.kind==="submit"){g={text:k.result.message,attachments:x??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}T=!0}a.push(w),await h9(e,w);let C=w;if(T){let k=Dy(w);if(k){let L=k.name.replace(/^\//,"").split(":").pop()??"";if(L&&Hb(L)){let A={skillName:L,rawArgs:k.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},P=e.session.current.sessionId,F=Qo(P),$=Date.now();J(`[afk trace] preflight.start commandName=${L}`);let N=!1,B=await Zo(A,{cwd:e.stats.cwd??process.cwd(),artifactDir:F},H=>{He()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${L}) failed: `)+(H instanceof Error?H.message:String(H)))});N=B!==null,J(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-$} success=${N}`),C=Kb(B?.manifestBlock,w)}}}let R=d.drainInjections();if(R.length>0&&(C=R+C),e.hookRegistry)try{let k={event:"UserPromptSubmit",prompt:C,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(k);L.injectContext&&(C=L.injectContext+C)}catch(k){if(k instanceof Ce){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(k.reason?f.dim(`: ${xo(k.reason)}`):"")),e.statusLine.rearm();continue}if(k instanceof Sn){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${k.timeoutMs}ms`)),e.statusLine.rearm();continue}throw k}if(await VO({text:C,attachments:x},e.session.current,e.stats,{setInFlight(k){n.turnInFlight=k},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(k){await t.appendUser(k)},async onTurnComplete(k,L){if(await t.appendTurn(k,L),e.stats.sessionId)try{On(e.stats)}catch(A){b||(b=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(A instanceof Error?A.message:String(A))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:k=>u?.push(k),setActiveCompositor:k=>{n.activeCompositor=k},setInterruptNotifier:k=>{n.notifyInterrupting=k},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:k=>o.setBackgroundHandler(k),setSoftStopHandler:s,setPausedState:k=>o.setPausedState(k),setPauseInterruptHandler:k=>o.setPauseInterruptHandler(k),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Ln(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:k=>c.repaint(k)}:{}},e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(zi(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,g9)}catch(k){if(k instanceof kt)throw k;k instanceof Sn?(J("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):k instanceof Ce?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${xo(k.reason??"no reason given")}`)):J("[stop hook] unexpected error: "+String(k))}}}function y9(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 XO(e,t,n,r){let o=await AO(),s=new dm({rl:e.rl,history:o,statusLine:e.statusLine}),i=y9(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await $O(e,s,n,t,r,i,{getLoopStageBar:()=>a?.loopStageBar});a=WO(e,n),await YO(e,t,n,r,s,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.loopStageBar.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 s.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Pa();import{execFile as b9}from"node:child_process";import{dirname as w9,isAbsolute as S9,resolve as v9}from"node:path";import{promisify as k9}from"node:util";var ZO=k9(b9),E9=3e3,x9=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function T9(){let t=(await ZO("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=S9(t)?t:v9(process.cwd(),t);return w9(n)}async function QO(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await T9()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),E9)});try{let o=Nn({execFile:ZO,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),s=await Promise.race([o,r]);if(s==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let i=s;return i.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:i.candidates.filter(c=>x9.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}_c();Pa();import{promises as R9}from"node:fs";import{dirname as C9,join as n$}from"node:path";import{randomBytes as A9}from"node:crypto";var _9=["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(`
2006
- `),e$=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pw=30,I9=1024,P9=8e3,M9="haiku";async function O9(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=F9(n,I9),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??P9),i=t.signal?N9([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Os({token:t.token,model:t.model??M9,system:_9,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=$9(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=C9(t.worktreePath);return await D9(l,c)}function $9(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(e$.test(t)&&t.length<=pw)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>pw)break;o=i}return e$.test(o)?o:null}async function D9(e,t){if(!await L9(n$(t,e)))return e;let n=A9(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pw-5)}-${n}`}async function L9(e){try{return await R9.access(e),!0}catch{return!1}}function F9(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 N9(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 r$(e){let t,n,r=n$(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await O9(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}}),s=t??"unknown",i=n;if(o!==null){let l=`${ou(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return t$(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return t$(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function t$(e,t){e&&e.setCwd(t),B9(t)}function B9(e){try{process.chdir(e)}catch{}}ze();It();G();import{spawn as s$}from"child_process";import{existsSync as i$,mkdirSync as K9,readFileSync as a$,unlinkSync as o$,writeFileSync as G9}from"fs";import{get as q9}from"https";import{join as l$}from"path";import{readFileSync as U9}from"fs";import{dirname as j9,join as H9}from"path";import{fileURLToPath as W9}from"url";function Sr(){try{return"4.44.0"}catch{}try{let e=j9(W9(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(U9(H9(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}q();var z9=64*1024,J9=1440*60*1e3,V9=3600*1e3,Y9="update-check.json",X9="pending-update.json";function c$(){return l$(lc(),Y9)}function Kl(){return l$(lc(),X9)}function u$(){let e=lc();i$(e)||K9(e,{recursive:!0})}function Z9(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),s=n(t).split(".").map(Number),i=Math.max(o.length,s.length);for(let a=0;a<i;a++){let l=o[a]??0,c=s[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Q9(){try{let e=a$(c$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function e7(){try{u$();let e=`
2006
+ `),e$=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pw=30,I9=1024,P9=8e3,M9="haiku";async function O9(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=F9(n,I9),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??P9),i=t.signal?N9([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Os({token:t.token,model:t.model??M9,system:_9,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=$9(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=C9(t.worktreePath);return await D9(l,c)}function $9(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(e$.test(t)&&t.length<=pw)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>pw)break;o=i}return e$.test(o)?o:null}async function D9(e,t){if(!await L9(n$(t,e)))return e;let n=A9(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pw-5)}-${n}`}async function L9(e){try{return await R9.access(e),!0}catch{return!1}}function F9(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 N9(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 r$(e){let t,n,r=n$(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await O9(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}}),s=t??"unknown",i=n;if(o!==null){let l=`${ou(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return t$(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return t$(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function t$(e,t){e&&e.setCwd(t),B9(t)}function B9(e){try{process.chdir(e)}catch{}}ze();It();G();import{spawn as s$}from"child_process";import{existsSync as i$,mkdirSync as K9,readFileSync as a$,unlinkSync as o$,writeFileSync as G9}from"fs";import{get as q9}from"https";import{join as l$}from"path";import{readFileSync as U9}from"fs";import{dirname as j9,join as H9}from"path";import{fileURLToPath as W9}from"url";function Sr(){try{return"4.44.1"}catch{}try{let e=j9(W9(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(U9(H9(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}q();var z9=64*1024,J9=1440*60*1e3,V9=3600*1e3,Y9="update-check.json",X9="pending-update.json";function c$(){return l$(lc(),Y9)}function Kl(){return l$(lc(),X9)}function u$(){let e=lc();i$(e)||K9(e,{recursive:!0})}function Z9(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),s=n(t).split(".").map(Number),i=Math.max(o.length,s.length);for(let a=0;a<i;a++){let l=o[a]??0,c=s[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Q9(){try{let e=a$(c$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function e7(){try{u$();let e=`
2007
2007
  const https = require('https');
2008
2008
  const fs = require('fs');
2009
2009
  const url = 'https://registry.npmjs.org/agent-afk/latest';