agent-afk 5.54.0 → 5.54.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
@@ -869,7 +869,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
869
869
  Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2014 not alternation. If you intended "A or B", retry with extended: true (extended regex / ERE). If you meant the literal character '|', this empty result stands.`),d({content:A});return}if(v===2){let A=Ws(h.trim());d({content:`grep error: ${A.content}`,isError:!0,...A.truncated?{truncated:!0}:{}});return}let E=Qn(g.trimEnd()),R=Ws(E);d({content:R.content,...R.truncated?{truncated:!0}:{}})}),m.on("error",v=>{let E;if(p===void 0&&fc(v))try{E=Hs(v,process.cwd())}catch{E=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${v.message}`}else E=Hs(v,p);d({content:`Failed to execute grep: ${E}`,isError:!0})})})}}var mA,fA=x(()=>{"use strict";Vn();Mr();po();hw();yw();mA=Cw()});import{promises as iY}from"fs";function Aw(e){return(t,n,r)=>sY(t,n,r,e)}var sY,gA,hA=x(()=>{"use strict";Mr();sY=async(e,t,n,r)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let i=e.path;if(typeof i!="string")throw new Error("Invalid input: path must be a string");let s;try{s=fn(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await iY.readdir(s,{withFileTypes:!0}),l=a.filter(p=>p.isDirectory()).map(p=>`${p.name}/`),c=a.filter(p=>!p.isDirectory()).map(p=>p.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
870
870
  `)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};gA=Aw()});function aY(e=Os){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>yA)return{content:`Invalid input: message exceeds Telegram's ${yA}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=k.TELEGRAM_BOT_TOKEN;if(!i)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 s=Ms();if(s.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 s){let c=await e({token:i,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===s.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${s.length-a.length}/${s.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:s.length===1?`Sent Telegram message to chat ${s[0]}.`:`Sent Telegram message to ${s.length} chats.`}}}var yA,bA,wA=x(()=>{"use strict";K();Rr();ep();yA=4096;bA=aY()});async function lY(){let[{JSDOM:e},{Readability:t},{default:n}]=await Promise.all([import("jsdom"),import("@mozilla/readability"),import("turndown")]),r=new n({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});return r.remove(["script","style","noscript","iframe"]),{JSDOM:e,Readability:t,turndown:r}}function cY(){return _w===null&&(_w=lY()),_w}function SA(e){return e.replace(/\n{3,}/g,`
871
871
 
872
- `).trim()}function dY(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function vA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await cY(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let p=s.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=SA(o.turndown(l.content)),m=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:m,markdown:p,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=SA(o.turndown(d));return{title:a,markdown:u,textLength:dY(c),usedFallback:!0}}var _w,kA=x(()=>{"use strict";_w=null});function pY(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function EA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function mY(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function $p(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??pY,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!uY.has(u.status)||d===o)return u;let p=mY(u,s)??EA(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=EA(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var uY,Iw=x(()=>{"use strict";fe();uY=new Set([429,502,503,504])});import{readFileSync as fY}from"node:fs";import{join as gY}from"path";function hY(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function TA(e,t){return hY(t).test(e)}function wY(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(yY.has(t))return!0;if(bY.has(t))return!1}return!1}function xA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function SY(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 RA(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ul(t),t}function vY(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function kY(e){try{return fY(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function EY(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=RA(t.defaultProfile)),n}function CA(e){let t=e?.env??k,n=e?.readFileSync??kY,r=e?.surface??t.AGENT_SURFACE,o=wY(t.AFK_BROWSER_HEADLESS,r),i=xA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=xA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=vY(t.AFK_BROWSER_DOM_SNAPSHOTS),l=SY(t.AFK_BROWSER_BACKEND),c=RA(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():gY(Tn(),"browser.json"),m=n(p);if(m===void 0)return d;let g;try{g=JSON.parse(m)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=EY(d,g);return h.configPath=p,h}function Pw(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(TA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>TA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var yY,bY,Mw=x(()=>{"use strict";K();G();yY=new Set(["daemon","subagent","telegram","afk"]),bY=new Set(["repl","interactive","cli"])});import hi from"node:fs";import Dp from"node:path";import{randomBytes as TY}from"node:crypto";import{chromium as xY}from"playwright";function RY(){try{return"5.54.0"}catch{}try{let e=Dp.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var CY,Fp,AA=x(()=>{"use strict";G();fe();CY=RY(),Fp=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=xY.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 r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),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),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.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/${CY}`}}loadStorageState(t){let n=jl(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=jl(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=Dp.join(Dp.dirname(r),`.${Dp.basename(r)}.${process.pid}.${TY(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as AY}from"crypto";function Ow(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of _Y)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function _A(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&IY.test(e.label))}function IA(e){return AY("sha256").update(e,"utf8").digest("hex").slice(0,8)}function PA(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var _Y,IY,bc=x(()=>{"use strict";_Y=[{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}];IY=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as PY}from"node:crypto";function MY(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function OY(e,t,n){return`el_${PY("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function $Y(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function MA(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function $A(e,t){let n=e.role??"",r=e.name??"";OA.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])$A(i,t)}async function DY(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},DA).catch(()=>[])}async function FY(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,p=i.disabled??!1,m=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),m!==void 0&&(g.checked=m),o.push(g)}return o},DA).catch(()=>[])}function LY(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Lp(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=LY(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=DY(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,m,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],$A(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await FY(e)).filter(B=>OA.has(B.role??"")));let w=new Map;for(let M of p){let B=MA(M.name),j=w.get(B);(!j||j.bbox.w===0&&M.bbox.w>0)&&w.set(B,M)}let S=y.map(M=>({ax:M,dom:w.get(MA(M.name??""))})),v=r?S:S.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);v.sort((M,B)=>{let j=M.dom?.bbox.y??0,U=B.dom?.bbox.y??0;if(j!==U)return j-U;let P=M.dom?.bbox.x??0,D=B.dom?.bbox.x??0;return P-D}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=v.slice(0,n).map((M,B)=>{let j=M.ax.role??"generic",U=M.ax.name??"",P=OY(j,U,B),D=M.dom?.bbox??{x:0,y:0,w:0,h:0},F=M.dom?.type??null,I=null;M.ax.value!==void 0&&M.ax.value!==null&&(I=String(M.ax.value)),M.ax.checked!==void 0&&(I=String(M.ax.checked)),_A({role:j,kind:F})&&(I="[redacted]");let O={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(O.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(O.selected=M.ax.selected),M.ax.expanded!==void 0&&(O.expanded=M.ax.expanded);let $;M.dom?.testId?$=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&($=`#${M.dom.id}`);let H={id:P,role:j,label:MY(U),kind:F,value:I,state:O,bbox:D};return $!==void 0&&(H.selector=$),H}),A="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?A="loading":M==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=$Y(m),N=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var OA,DA,FA=x(()=>{"use strict";bc();OA=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);DA="a[href], button, input, select, textarea, [role], [tabindex], label"});async function LA(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function $w(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>LA(e,i)))).filter(o=>o!==null)}async function NY(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function Dw(e,t,n){switch(t.kind){case"element_id":return BY(e,t,n);case"selector":return UY(e,t);case"semantic":return jY(e,t)}}async function BY(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await $w(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function UY(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 $w(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function jY(e,t){return t.role!==void 0?HY(e,t.text,t.role):WY(e,t.text,t)}async function HY(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await $w(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function WY(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await NY(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),m=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await LA(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let v=0;v<w.length;v++)S=S*31+w.charCodeAt(v)>>>0;m.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var NA=x(()=>{"use strict"});import{randomBytes as KY}from"crypto";import{mkdir as GY,stat as qY,writeFile as zY}from"fs/promises";import{join as Fw}from"path";import{gzip as JY}from"zlib";import{promisify as YY}from"util";function VY(e){return Fw(Zo(e),"browser")}function XY(e){return Fw(VY(e),"screenshots")}function QY(){return new Date().toISOString().replace(/[:.]/g,"-")}function ZY(){return KY(3).toString("hex")}async function Lw(e,t,n){if(t.length>BA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${BA} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=XY(e);await GY(r,{recursive:!0});let o=`${QY()}-${ZY()}-${n}.png`,i=Fw(r,o);await zY(i,t);let{size:s}=await qY(i);return{path:i,bytes:s}}var Lke,BA,UA=x(()=>{"use strict";G();bc();Lke=YY(JY);BA=5*1024*1024});var HA={};du(HA,{PlaywrightProvider:()=>Nw});function jA(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 Nw,WA=x(()=>{"use strict";AA();FA();NA();Mw();bc();UA();Nw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Fp(t)}async open(t){let n=Pw(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Lp(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Lp(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await Dw(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${jA(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Ow(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:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=Pw(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,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 Lp(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),i;if(t.target!==void 0){let d=await Dw(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${jA(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Lw(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Lw(n,o,r);return i}catch{return null}}}});var bi={};du(bi,{__resetBrowserRegistryForTests:()=>oV,browserProviderActive:()=>nV,closeBrowserProvider:()=>Bw,getBrowserProvider:()=>tV,peekBrowserProvider:()=>rV});function KA(){Promise.resolve(Bw()).then(()=>{process.exit(130)})}function GA(){Promise.resolve(Bw()).then(()=>{process.exit(143)})}function qA(){Zn=null}function eV(){Np||(process.on("SIGINT",KA),process.on("SIGTERM",GA),process.on("exit",qA),Np=!0)}function zA(){Np&&(process.removeListener("SIGINT",KA),process.removeListener("SIGTERM",GA),process.removeListener("exit",qA),Np=!1)}async function tV(e){return Zn!==null?Zn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(WA(),HA)),n=CA(e),r=new t(n);return eV(),Zn=r,yi=null,r})()),yi)}async function Bw(){if(Zn===null)return;let e=Zn;Zn=null,yi=null,zA(),await e.shutdown()}function nV(){return Zn!==null}function rV(){return Zn}function oV(){Zn=null,yi=null,zA()}var Zn,yi,Np,wi=x(()=>{"use strict";Mw();Zn=null,yi=null,Np=!1});async function JA(e,t){try{return await vA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function dV(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function YA(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??dV,o=null,i=e,s=null,a=null;try{let c=await $p(n,e,{headers:cV,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(lV.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(aV.test(d)&&!sV.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await JA(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}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<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await JA(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var sV,aV,lV,cV,VA=x(()=>{"use strict";kA();Iw();fe();sV=/(text\/html|application\/xhtml\+xml)/i,aV=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,lV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,cV={"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 mV(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(uV,{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),pV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Pr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function XA(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?mV({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 QA(e,t){if(t.length===0)return`# Search results for "${e}"
872
+ `).trim()}function dY(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function vA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await cY(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let p=s.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=SA(o.turndown(l.content)),m=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:m,markdown:p,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=SA(o.turndown(d));return{title:a,markdown:u,textLength:dY(c),usedFallback:!0}}var _w,kA=x(()=>{"use strict";_w=null});function pY(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function EA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function mY(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function $p(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??pY,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!uY.has(u.status)||d===o)return u;let p=mY(u,s)??EA(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=EA(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var uY,Iw=x(()=>{"use strict";fe();uY=new Set([429,502,503,504])});import{readFileSync as fY}from"node:fs";import{join as gY}from"path";function hY(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function TA(e,t){return hY(t).test(e)}function wY(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(yY.has(t))return!0;if(bY.has(t))return!1}return!1}function xA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function SY(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 RA(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ul(t),t}function vY(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function kY(e){try{return fY(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function EY(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=RA(t.defaultProfile)),n}function CA(e){let t=e?.env??k,n=e?.readFileSync??kY,r=e?.surface??t.AGENT_SURFACE,o=wY(t.AFK_BROWSER_HEADLESS,r),i=xA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=xA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=vY(t.AFK_BROWSER_DOM_SNAPSHOTS),l=SY(t.AFK_BROWSER_BACKEND),c=RA(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():gY(Tn(),"browser.json"),m=n(p);if(m===void 0)return d;let g;try{g=JSON.parse(m)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=EY(d,g);return h.configPath=p,h}function Pw(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(TA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>TA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var yY,bY,Mw=x(()=>{"use strict";K();G();yY=new Set(["daemon","subagent","telegram","afk"]),bY=new Set(["repl","interactive","cli"])});import hi from"node:fs";import Dp from"node:path";import{randomBytes as TY}from"node:crypto";import{chromium as xY}from"playwright";function RY(){try{return"5.54.1"}catch{}try{let e=Dp.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var CY,Fp,AA=x(()=>{"use strict";G();fe();CY=RY(),Fp=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=xY.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 r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),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),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.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/${CY}`}}loadStorageState(t){let n=jl(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=jl(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=Dp.join(Dp.dirname(r),`.${Dp.basename(r)}.${process.pid}.${TY(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as AY}from"crypto";function Ow(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of _Y)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function _A(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&IY.test(e.label))}function IA(e){return AY("sha256").update(e,"utf8").digest("hex").slice(0,8)}function PA(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var _Y,IY,bc=x(()=>{"use strict";_Y=[{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}];IY=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as PY}from"node:crypto";function MY(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function OY(e,t,n){return`el_${PY("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function $Y(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function MA(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function $A(e,t){let n=e.role??"",r=e.name??"";OA.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])$A(i,t)}async function DY(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},DA).catch(()=>[])}async function FY(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,p=i.disabled??!1,m=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),m!==void 0&&(g.checked=m),o.push(g)}return o},DA).catch(()=>[])}function LY(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Lp(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=LY(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=DY(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,m,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],$A(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await FY(e)).filter(B=>OA.has(B.role??"")));let w=new Map;for(let M of p){let B=MA(M.name),j=w.get(B);(!j||j.bbox.w===0&&M.bbox.w>0)&&w.set(B,M)}let S=y.map(M=>({ax:M,dom:w.get(MA(M.name??""))})),v=r?S:S.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);v.sort((M,B)=>{let j=M.dom?.bbox.y??0,U=B.dom?.bbox.y??0;if(j!==U)return j-U;let P=M.dom?.bbox.x??0,D=B.dom?.bbox.x??0;return P-D}),v.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=v.slice(0,n).map((M,B)=>{let j=M.ax.role??"generic",U=M.ax.name??"",P=OY(j,U,B),D=M.dom?.bbox??{x:0,y:0,w:0,h:0},F=M.dom?.type??null,I=null;M.ax.value!==void 0&&M.ax.value!==null&&(I=String(M.ax.value)),M.ax.checked!==void 0&&(I=String(M.ax.checked)),_A({role:j,kind:F})&&(I="[redacted]");let O={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(O.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(O.selected=M.ax.selected),M.ax.expanded!==void 0&&(O.expanded=M.ax.expanded);let $;M.dom?.testId?$=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&($=`#${M.dom.id}`);let H={id:P,role:j,label:MY(U),kind:F,value:I,state:O,bbox:D};return $!==void 0&&(H.selector=$),H}),A="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?A="loading":M==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=$Y(m),N=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:N,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var OA,DA,FA=x(()=>{"use strict";bc();OA=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);DA="a[href], button, input, select, textarea, [role], [tabindex], label"});async function LA(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function $w(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>LA(e,i)))).filter(o=>o!==null)}async function NY(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function Dw(e,t,n){switch(t.kind){case"element_id":return BY(e,t,n);case"selector":return UY(e,t);case"semantic":return jY(e,t)}}async function BY(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await $w(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function UY(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 $w(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function jY(e,t){return t.role!==void 0?HY(e,t.text,t.role):WY(e,t.text,t)}async function HY(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await $w(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function WY(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await NY(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),m=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let b=await LA(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let v=0;v<w.length;v++)S=S*31+w.charCodeAt(v)>>>0;m.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var NA=x(()=>{"use strict"});import{randomBytes as KY}from"crypto";import{mkdir as GY,stat as qY,writeFile as zY}from"fs/promises";import{join as Fw}from"path";import{gzip as JY}from"zlib";import{promisify as YY}from"util";function VY(e){return Fw(Zo(e),"browser")}function XY(e){return Fw(VY(e),"screenshots")}function QY(){return new Date().toISOString().replace(/[:.]/g,"-")}function ZY(){return KY(3).toString("hex")}async function Lw(e,t,n){if(t.length>BA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${BA} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=XY(e);await GY(r,{recursive:!0});let o=`${QY()}-${ZY()}-${n}.png`,i=Fw(r,o);await zY(i,t);let{size:s}=await qY(i);return{path:i,bytes:s}}var Lke,BA,UA=x(()=>{"use strict";G();bc();Lke=YY(JY);BA=5*1024*1024});var HA={};du(HA,{PlaywrightProvider:()=>Nw});function jA(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 Nw,WA=x(()=>{"use strict";AA();FA();NA();Mw();bc();UA();Nw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Fp(t)}async open(t){let n=Pw(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Lp(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Lp(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await Dw(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${jA(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Ow(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:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){c=y}else c=h}let u=r.url();if(u!==i){let h=Pw(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,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 Lp(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),i;if(t.target!==void 0){let d=await Dw(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${jA(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await Lw(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await Lw(n,o,r);return i}catch{return null}}}});var bi={};du(bi,{__resetBrowserRegistryForTests:()=>oV,browserProviderActive:()=>nV,closeBrowserProvider:()=>Bw,getBrowserProvider:()=>tV,peekBrowserProvider:()=>rV});function KA(){Promise.resolve(Bw()).then(()=>{process.exit(130)})}function GA(){Promise.resolve(Bw()).then(()=>{process.exit(143)})}function qA(){Zn=null}function eV(){Np||(process.on("SIGINT",KA),process.on("SIGTERM",GA),process.on("exit",qA),Np=!0)}function zA(){Np&&(process.removeListener("SIGINT",KA),process.removeListener("SIGTERM",GA),process.removeListener("exit",qA),Np=!1)}async function tV(e){return Zn!==null?Zn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(WA(),HA)),n=CA(e),r=new t(n);return eV(),Zn=r,yi=null,r})()),yi)}async function Bw(){if(Zn===null)return;let e=Zn;Zn=null,yi=null,zA(),await e.shutdown()}function nV(){return Zn!==null}function rV(){return Zn}function oV(){Zn=null,yi=null,zA()}var Zn,yi,Np,wi=x(()=>{"use strict";Mw();Zn=null,yi=null,Np=!1});async function JA(e,t){try{return await vA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function dV(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function YA(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??dV,o=null,i=e,s=null,a=null;try{let c=await $p(n,e,{headers:cV,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(lV.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(aV.test(d)&&!sV.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await JA(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}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<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=await JA(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var sV,aV,lV,cV,VA=x(()=>{"use strict";kA();Iw();fe();sV=/(text\/html|application\/xhtml\+xml)/i,aV=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,lV=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,cV={"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 mV(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(uV,{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),pV),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Pr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function XA(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?mV({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 QA(e,t){if(t.length===0)return`# Search results for "${e}"
873
873
 
874
874
  (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(`
875
875
  `).trimEnd()}var uV,pV,ZA=x(()=>{"use strict";po();uV="https://api.exa.ai/search",pV=10});function vV(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=fV;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,gV)}let a=hV;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,yV)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function Uw(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+bV}function kV(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 SV.some(o=>r.includes(o))}function EV(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 i=vV(r);if("error"in i)return{content:i.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let s=new AbortController,a=()=>{s.abort(o.reason)},l,c=()=>{let d=s.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{s.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.mode==="raw"){let u;try{u=await $p(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(m){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let p;try{p=await u.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}return{content:Uw(p,i.maxBytes)}}if(i.mode==="markdown")try{let u=await YA(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0}:{content:Uw(u.markdown,i.maxBytes)}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=u instanceof Error?u.message:String(u),m=kV(u)?" (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 d=XA({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(i.query,{limit:wV,timeoutMs:i.timeoutMs,signal:s.signal});return{content:Uw(QA(i.query,u),i.maxBytes)}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var fV,gV,hV,yV,bV,wV,SV,e_,t_=x(()=>{"use strict";VA();ZA();Iw();fV=3e4,gV=12e4,hV=1e6,yV=1e7,bV=`
@@ -1738,7 +1738,7 @@ ${S}
1738
1738
  ${v}`})}return{fileBlocks:a,warnings:l}}async function ZU(e,t,n,r,o="summary",i,s){let a=WL(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,d=!1,u=!1,p=!1,m=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,v=[],E=new Map,R=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then(U=>{for(let P of U)(i??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${P.jobId}: ${P.label}`))}).catch(()=>{})},C=r.getCompositor?r.getCompositor():null,N=()=>new il({out:sl(i),thinkingMode:o,...R?{activeSkillName:R}:{},onCancel:()=>{t.interrupt().catch(j=>{Ge()&&console.error(" "+f.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:A}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...C?{compositor:C}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=N(),M=async()=>{if(!p){p=!0;try{await _.dispose()}catch{}}},B=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let U=j;i.fn=P=>U.commitAbove(P),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(U=>_.setInterrupting(U)),r.rearmStatus?.()};try{C?C.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(O=>{Ge()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),O)});let I=r.subagentControl;I?.hasActiveForeground()&&I.cancelActiveForeground().catch(O=>{Ge()&&console.error(" "+f.error("soft-stop cancelActiveForeground() failed:"),O)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(I=>{Ge()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),I)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A);let{fileBlocks:j,warnings:U}=QU(e.text,{rootDir:process.cwd()});for(let I of U)(i??{fn:console.log}).fn(f.dim(` @-file: ${I}`));let P=j.length>0||e.attachments.length>0?VU(e.text,e.attachments,void 0,j):e.text,D=t.sendMessageStream(P);if(await Fs((I,O)=>{_.process(I,O)},async()=>{for await(let I of D){if(h||y)break;if(I.type==="chunk"&&I.chunk.type==="content"?(l+=I.chunk.content,d=!0):I.type==="message"&&!d&&(l=I.message.content),I.type==="stream_retry"&&(l=l.slice(0,c)),I.type==="chunk"&&I.chunk.type==="tool_use_detail"){let O=I.chunk,$={toolName:O.toolName,toolUseId:O.toolUseId,input:O.toolInput,...O.toolInputRaw!==void 0&&{inputRaw:O.toolInputRaw}};E.set(O.toolUseId,$),v.push($)}else if(I.type==="chunk"&&I.chunk.type==="tool_result"){let O=I.chunk;c=l.length;let $=E.get(O.toolUseId);if($&&($.result=O.content,$.isError=O.isError,E.delete(O.toolUseId)),r.onContextProgress){let H=Date.now();if(H-w>=S){w=H;try{let z=r.onContextProgress();z instanceof Promise&&await z}catch(z){Ge()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),z)}}}}if(I.type==="paused"){if(r.setPausedState?.(!0),await M(),C&&I.autoResume===!0){let O=new AbortController;b.abort=O;let $=I.resetsAt?I.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,H=$?`Keep waiting \u2014 auto-resumes at ${$}`:"Keep waiting \u2014 auto-resume in progress",z="Switch model / provider (type /model after)",Q="Stop waiting",te=[f.warning(" \u23F3 Usage limit reached.")+($?f.dim(` Auto-resumes at ${$}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];pr(C,{header:te,options:[H,z,Q],signal:O.signal,initialIndex:0}).then(oe=>{if(b.abort=null,!oe)return;let q=oe[0];q===void 0||q===H||(y=!0,q===z&&(i??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Se=>{Ge()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),Se)}))}).catch(oe=>{Ge()&&console.error(" "+f.error("picker promise rejected:"),oe)})}else(i??{fn:console.log}).fn(zx({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),b.abort?.abort(),b.abort=null;let O=I.hotSwapped&&I.accountId?`\u25B6 Resumed on ${I.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,v.length=0,E.clear(),m=!1,g=void 0,u=!1,_=N(),p=!1,await B(),(i??{fn:console.log}).fn(f.success(O));continue}if(I.type==="error"){await M(),ws(fs(I.error)),u=!0;continue}_.process(I),I.type==="done"&&(m=!0,g=I.metadata)}}),await M(),h){let I=i?i.fn:console.log;I(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),I("")}if(y){let I=i?i.fn:console.log;I(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),I("")}if(m&&!h&&!y){Pi(n,a,l,g,v),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Ha(process.stdout);let I=$=>{i?i.fn($):console.log($)},O=Uh(l);if(O){I(YU(O)),I("");let $=dF(v);if(r.onTerminalState)try{r.onTerminalState(O,{doneHasCorroboratingEvidence:$})}catch{}if(n.permissionMode==="autonomous"){let H=O.kind==="done"&&Zu().verifyDone===!0&&!$;pF(O,void 0,{unverified:H})}}if(Cse(g,n,I),r.onAfterTurn){let $=r.onAfterTurn();$ instanceof Promise&&await $.catch(()=>{})}}}catch(j){await M(),u||ws(fs(j))}finally{await M(),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function Rse(e,t){let n=Math.round(e*100),r=le(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${le(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function Cse(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(we(e.durationMs)),e.totalCostUsd!==void 0&&r.push(ut(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(le(o+i)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let s=uk(t),a=Xt(t.model),l=Rse(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?f.error:l.tier==="caution"?f.warning:f.dim;n(c(l.text))}n("")}var Ase=5e3,_se=3,Ise="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Pse(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 ej(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:p}=s,m=null,g=[];e.session.current.waitForInitialization().then(async R=>{Ge()&&(m=kg(R)),await Dd(e.session.current),Ge()&&(g=vE())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y=!1,b=!1,w,S,v,E=0;for(p.onInjectable=()=>{E>=_se||!o.isAwaitingInput()||!o.bufferIsEmpty()||(E++,Ha(process.stdout),h={text:Ise,attachments:[]},o.abortPendingRead())};;){if(m&&(e.replRenderer.writeLine(m),e.replRenderer.writeLine(""),m=null),g.length>0){for(let P of g)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),g=[]}let R=u.drainNotifications();for(let{job:P,result:D}of R){let F=D.errorReason===void 0?"\u2713":"\u2717",I=D.errorReason==="abort"?"killed":D.errorReason==="timeout"?"timed out":D.errorReason==="signal-killed"?"killed by signal":`exit ${D.exitCode??0}`,O=Math.max(0,Math.round(D.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${F} [${P.id}] ${I} \xB7 ${O}s \xB7 `)+P.command)}let A=p.drainNotifications();for(let{job:P}of A){let D=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",F=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,I=P.label.length>60?`${P.label.slice(0,60)}\u2026`:P.label;e.replRenderer.writeLine(f.dim(` ${D} [${P.jobId}] subagent ${P.status} \xB7 ${F}s \xB7 `)+I)}let C=l.renderIfChanged(e.stats.sessionId);if(C.length>0){for(let P of C)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let N,_;if(h===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,h={text:P.message,attachments:[]})}if(h!==void 0){let P=h;h=void 0;let D=dl(e.stats.permissionMode),F=ji({buffer:P.text,promptText:D,isTTY:!!process.stdout.isTTY,attachmentSummary:Ya([...P.attachments])});e.replRenderer.writeLine(F),N=P.text.trim(),_=P.attachments}else{let P=await o.readLine({promptFn:()=>dl(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Fh(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});N=P.text.trim(),_=P.attachments}if(!N&&_.length===0)continue;if(N.startsWith("!")){let P=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(y||(y=!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 u.dispatch(N))){e.statusLine.rearm();continue}}let M=!1;if(N.startsWith("/")){let P=await QD(N,e.slashCtx,_);if(P.handled){if(P.result==="exit"){e.rl.close();return}if((N==="/clear"||N.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),d.reset(),w=void 0),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){h={text:P.result.message,attachments:_??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}M=!0}a.push(N),await Pse(e,N);let B=N;if(M){let P=dk(N);if(P){let D=P.name.replace(/^\//,"").split(":").pop()??"";if(D&&yE(D)){let F={skillName:D,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},I=e.session.current.sessionId,O=Yi(I),$=Date.now();W(`[afk trace] preflight.start commandName=${D}`);let H=!1,z=await Ji(F,{cwd:e.stats.cwd??process.cwd(),artifactDir:O},Q=>{Ge()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${D}) failed: `)+(Q instanceof Error?Q.message:String(Q)))});H=z!==null,W(`[afk trace] preflight.end commandName=${D} durationMs=${Date.now()-$} success=${H}`),B=wE(z?.manifestBlock,N)}}}let j=u.drainInjections();j.length>0&&(B=j+B);let U=p.drainInjections();if(U.length>0&&(B=U+B),w!==void 0&&(B=w+`
1739
1739
 
1740
1740
  `+B,w=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:B,sessionId:e.stats.sessionId},D=await e.hookRegistry.dispatch(P);D.injectContext&&(B=D.injectContext+B)}catch(P){if(P instanceof me){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(P.reason?f.dim(`: ${Pr(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Jn){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(S=void 0,v=void 0,await ZU({text:B,attachments:_},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onTurnComplete(P,D){if(await t.appendTurn(P,D),e.stats.sessionId)try{Do(e.stats)}catch(F){b||(b=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(F instanceof Error?F.message:String(F))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,D)=>{d?.push(P),S=P.kind,v=D?.doneHasCorroboratingEvidence},setActiveCompositor:P=>{n.activeCompositor=P},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(ur(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:P=>c.repaint(P)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(dl(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...S!==void 0?{terminalState:S}:{},...v!==void 0?{doneHasCorroboratingEvidence:v}:{}},void 0,Ase);P.injectContext&&P.injectContext.trim().length>0&&(w=P.injectContext)}catch(P){if(P instanceof gt)throw P;P instanceof Jn?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):P instanceof me?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${Pr(P.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(P))}}}function Mse(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 tj(e,t,n,r){let o=await OU(),i=new Dh({rl:e.rl,history:o,statusLine:e.statusLine}),s=Mse(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await NU(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=JU(e,n),await ej(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),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 i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Zl();qs();import{execFile as Ose}from"node:child_process";import{dirname as $se,isAbsolute as Dse,resolve as Fse}from"node:path";import{promisify as Lse}from"node:util";var nj=Lse(Ose),Nse=3e3,Bse=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Use(){let t=(await nj("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Dse(t)?t:Fse(process.cwd(),t);return $se(n)}async function rj(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Use()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Nse)});try{let o=hn({execFile:nj,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>Bse.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Bu();Zl();import{promises as jse}from"node:fs";import{dirname as Hse,join as sj}from"node:path";import{randomBytes as Wse}from"node:crypto";var Kse=["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(`
1741
- `),oj=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,WE=30,Gse=1024,qse=8e3,zse="haiku";async function Jse(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=Qse(n,Gse),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??qse),s=t.signal?Zse([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rs({token:t.token,model:t.model??zse,system:Kse,user:r,maxTokens:32,signal:s})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Yse(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Hse(t.worktreePath);return await Vse(l,c)}function Yse(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(oj.test(t)&&t.length<=WE)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>WE)break;o=s}return oj.test(o)?o:null}async function Vse(e,t){if(!await Xse(sj(t,e)))return e;let n=Wse(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,WE-5)}-${n}`}async function Xse(e){try{return await jse.access(e),!0}catch{return!1}}function Qse(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 Zse(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 aj(e){let t,n,r=sj(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Jse(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${zu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return ij(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return ij(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function ij(e,t){e&&e.setCwd(t),eae(t)}function eae(e){try{process.chdir(e)}catch{}}qt();G();import{spawn as cj}from"child_process";import{existsSync as dj,mkdirSync as iae,readFileSync as uj,unlinkSync as lj,writeFileSync as pj}from"fs";import{get as sae}from"https";import{join as mj}from"path";import{readFileSync as tae}from"fs";import{dirname as nae,join as rae}from"path";import{fileURLToPath as oae}from"url";function yr(){try{return"5.54.0"}catch{}try{let e=nae(oae(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(tae(rae(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var aae=64*1024,lae=10800*1e3,cae=800,dae=3600*1e3,uae="update-check.json",pae="pending-update.json";function KE(){return mj(ps(),uae)}function jd(){return mj(ps(),pae)}function GE(){let e=ps();dj(e)||iae(e,{recursive:!0})}function fj(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function gj(){try{let e=uj(KE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function hj(){try{GE();let e=`
1741
+ `),oj=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,WE=30,Gse=1024,qse=8e3,zse="haiku";async function Jse(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=Qse(n,Gse),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??qse),s=t.signal?Zse([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Rs({token:t.token,model:t.model??zse,system:Kse,user:r,maxTokens:32,signal:s})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=Yse(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Hse(t.worktreePath);return await Vse(l,c)}function Yse(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(oj.test(t)&&t.length<=WE)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>WE)break;o=s}return oj.test(o)?o:null}async function Vse(e,t){if(!await Xse(sj(t,e)))return e;let n=Wse(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,WE-5)}-${n}`}async function Xse(e){try{return await jse.access(e),!0}catch{return!1}}function Qse(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 Zse(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 aj(e){let t,n,r=sj(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Jse(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${zu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return ij(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return ij(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function ij(e,t){e&&e.setCwd(t),eae(t)}function eae(e){try{process.chdir(e)}catch{}}qt();G();import{spawn as cj}from"child_process";import{existsSync as dj,mkdirSync as iae,readFileSync as uj,unlinkSync as lj,writeFileSync as pj}from"fs";import{get as sae}from"https";import{join as mj}from"path";import{readFileSync as tae}from"fs";import{dirname as nae,join as rae}from"path";import{fileURLToPath as oae}from"url";function yr(){try{return"5.54.1"}catch{}try{let e=nae(oae(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(tae(rae(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var aae=64*1024,lae=10800*1e3,cae=800,dae=3600*1e3,uae="update-check.json",pae="pending-update.json";function KE(){return mj(ps(),uae)}function jd(){return mj(ps(),pae)}function GE(){let e=ps();dj(e)||iae(e,{recursive:!0})}function fj(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function gj(){try{let e=uj(KE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function hj(){try{GE();let e=`
1742
1742
  const https = require('https');
1743
1743
  const fs = require('fs');
1744
1744
  const url = 'https://registry.npmjs.org/agent-afk/latest';