agent-afk 5.66.0 → 5.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs 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:$});return}if(k===2){let $=js(h.trim());d({content:`grep error: ${$.content}`,isError:!0,...$.truncated?{truncated:!0}:{}});return}let T=qn(g.trimEnd()),_=js(T);d({content:_.content,..._.truncated?{truncated:!0}:{}})}),f.on("error",k=>{let T;if(m===void 0&&Tc(k))try{T=zs(k,process.cwd())}catch{T=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${k.message}`}else T=zs(k,m);d({content:`Failed to execute grep: ${T}`,isError:!0})})})}}var jA,HA=x(()=>{"use strict";Kn();zn();lo();$w();Hs();jA=Hw()});import{promises as iV}from"fs";function Ww(e){return(t,n,r)=>sV(t,n,r,e)}var sV,WA,KA=x(()=>{"use strict";zn();sV=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=ln(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await iV.readdir(s,{withFileTypes:!0}),l=a.filter(m=>m.isDirectory()).map(m=>`${m.name}/`),c=a.filter(m=>!m.isDirectory()).map(m=>m.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}}};WA=Ww()});function aV(e=Fs){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>GA)return{content:`Invalid input: message exceeds Telegram's ${GA}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=v.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=Ds();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 GA,qA,zA=x(()=>{"use strict";K();Sr();mp();GA=4096;qA=aV()});async function lV(){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 cV(){return Kw===null&&(Kw=lV()),Kw}function JA(e){return e.replace(/\n{3,}/g,`
871
871
 
872
- `).trim()}function dV(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function YA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await cV(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=JA(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=JA(o.turndown(d));return{title:a,markdown:u,textLength:dV(c),usedFallback:!0}}var Kw,VA=x(()=>{"use strict";Kw=null});function pV(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 XA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function mV(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 zp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??pV,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(!uV.has(u.status)||d===o)return u;let m=mV(u,s)??XA(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=XA(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var uV,Gw=x(()=>{"use strict";he();uV=new Set([429,502,503,504])});import{readFileSync as fV}from"node:fs";import{join as gV}from"path";function hV(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function QA(e,t){return hV(t).test(e)}function wV(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(yV.has(t))return!0;if(bV.has(t))return!1}return!1}function ZA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function SV(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 e_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Yl(t),t}function vV(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function kV(e){try{return fV(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function TV(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=e_(t.defaultProfile)),n}function t_(e){let t=e?.env??v,n=e?.readFileSync??kV,r=e?.surface??t.AGENT_SURFACE,o=wV(t.AFK_BROWSER_HEADLESS,r),i=ZA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=ZA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=vV(t.AFK_BROWSER_DOM_SNAPSHOTS),l=SV(t.AFK_BROWSER_BACKEND),c=e_(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,m=u!==void 0&&u.trim()!==""?u.trim():gV(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=TV(d,g);return h.configPath=m,h}function qw(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(QA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>QA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var yV,bV,zw=x(()=>{"use strict";K();G();yV=new Set(["daemon","subagent","telegram","afk"]),bV=new Set(["repl","interactive","cli"])});import mi from"node:fs";import Jp from"node:path";import{randomBytes as EV}from"node:crypto";import{chromium as xV}from"playwright";function RV(){try{return"5.66.0"}catch{}try{let e=Jp.resolve(import.meta.dirname,"../../../package.json"),t=mi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var CV,Yp,n_=x(()=>{"use strict";G();he();CV=RV(),Yp=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=xV.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/${CV}`}}loadStorageState(t){let n=Vl(t);try{if(!mi.existsSync(n))return;let r=JSON.parse(mi.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=Vl(t);if(!mi.existsSync(r))return;let o=await n.storageState(),i=Jp.join(Jp.dirname(r),`.${Jp.basename(r)}.${process.pid}.${EV(4).toString("hex")}.tmp`);mi.writeFileSync(i,JSON.stringify(o),{mode:384}),mi.chmodSync(i,384),mi.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 AV}from"crypto";function Jw(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of _V)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function r_(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&IV.test(e.label))}function o_(e){return AV("sha256").update(e,"utf8").digest("hex").slice(0,8)}function i_(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var _V,IV,Rc=x(()=>{"use strict";_V=[{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}];IV=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as PV}from"node:crypto";function MV(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function OV(e,t,n){return`el_${PV("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function $V(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function s_(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function l_(e,t){let n=e.role??"",r=e.name??"";a_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])l_(i,t)}async function DV(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},c_).catch(()=>[])}async function FV(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,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},c_).catch(()=>[])}function LV(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Vp(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=LV(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=DV(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],l_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await FV(e)).filter(N=>a_.has(N.role??"")));let w=new Map;for(let P of m){let N=s_(P.name),B=w.get(N);(!B||B.bbox.w===0&&P.bbox.w>0)&&w.set(N,P)}let S=y.map(P=>({ax:P,dom:w.get(s_(P.name??""))})),k=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);k.sort((P,N)=>{let B=P.dom?.bbox.y??0,U=N.dom?.bbox.y??0;if(B!==U)return B-U;let j=P.dom?.bbox.x??0,I=N.dom?.bbox.x??0;return j-I}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=k.slice(0,n).map((P,N)=>{let B=P.ax.role??"generic",U=P.ax.name??"",j=OV(B,U,N),I=P.dom?.bbox??{x:0,y:0,w:0,h:0},F=P.dom?.type??null,A=null;P.ax.value!==void 0&&P.ax.value!==null&&(A=String(P.ax.value)),P.ax.checked!==void 0&&(A=String(P.ax.checked)),r_({role:B,kind:F})&&(A="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let O;P.dom?.testId?O=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(O=`#${P.dom.id}`);let H={id:j,role:B,label:MV(U),kind:F,value:A,state:M,bbox:I};return O!==void 0&&(H.selector=O),H}),$="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?$="loading":P==="interactive"?$="navigating":$="idle"}catch{$="navigating"}$!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=$V(f),D=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:_,status:{httpStatus:t.httpStatus??null,loadingState:$,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var a_,c_,d_=x(()=>{"use strict";Rc();a_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);c_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function u_(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 Yw(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>u_(e,i)))).filter(o=>o!==null)}async function NV(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 Vw(e,t,n){switch(t.kind){case"element_id":return BV(e,t,n);case"selector":return UV(e,t);case"semantic":return jV(e,t)}}async function BV(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 Yw(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function UV(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 Yw(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function jV(e,t){return t.role!==void 0?HV(e,t.text,t.role):WV(e,t.text,t)}async function HV(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 Yw(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function WV(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 NV(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 m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await u_(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let k=0;k<w.length;k++)S=S*31+w.charCodeAt(k)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var p_=x(()=>{"use strict"});import{randomBytes as KV}from"crypto";import{mkdir as GV,stat as qV,writeFile as zV}from"fs/promises";import{join as Xw}from"path";import{gzip as JV}from"zlib";import{promisify as YV}from"util";function VV(e){return Xw(Vo(e),"browser")}function XV(e){return Xw(VV(e),"screenshots")}function QV(){return new Date().toISOString().replace(/[:.]/g,"-")}function ZV(){return KV(3).toString("hex")}async function Qw(e,t,n){if(t.length>m_)throw new Error(`writeScreenshotSidecar: buffer exceeds ${m_} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=XV(e);await GV(r,{recursive:!0});let o=`${QV()}-${ZV()}-${n}.png`,i=Xw(r,o);await zV(i,t);let{size:s}=await qV(i);return{path:i,bytes:s}}var wEe,m_,f_=x(()=>{"use strict";G();Rc();wEe=YV(JV);m_=5*1024*1024});var h_={};Tu(h_,{PlaywrightProvider:()=>Zw});function g_(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var Zw,y_=x(()=>{"use strict";n_();d_();p_();zw();Rc();f_();Zw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Yp(t)}async open(t){let n=qw(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 Vp(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 Vp(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 Vw(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${g_(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Jw(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=qw(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Vp(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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 Vw(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${g_(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 Qw(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 Qw(n,o,r);return i}catch{return null}}}});var gi={};Tu(gi,{__resetBrowserRegistryForTests:()=>o4,browserProviderActive:()=>n4,closeBrowserProvider:()=>eS,getBrowserProvider:()=>t4,peekBrowserProvider:()=>r4});function b_(){Promise.resolve(eS()).then(()=>{process.exit(130)})}function w_(){Promise.resolve(eS()).then(()=>{process.exit(143)})}function S_(){Jn=null}function e4(){Xp||(process.on("SIGINT",b_),process.on("SIGTERM",w_),process.on("exit",S_),Xp=!0)}function v_(){Xp&&(process.removeListener("SIGINT",b_),process.removeListener("SIGTERM",w_),process.removeListener("exit",S_),Xp=!1)}async function t4(e){return Jn!==null?Jn:(fi!==null||(fi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(y_(),h_)),n=t_(e),r=new t(n);return e4(),Jn=r,fi=null,r})()),fi)}async function eS(){if(Jn===null)return;let e=Jn;Jn=null,fi=null,v_(),await e.shutdown()}function n4(){return Jn!==null}function r4(){return Jn}function o4(){Jn=null,fi=null,v_()}var Jn,fi,Xp,hi=x(()=>{"use strict";zw();Jn=null,fi=null,Xp=!1});async function k_(e,t){try{return await YA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function d4(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(hi(),gi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function T_(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??d4,o=null,i=e,s=null,a=null;try{let c=await zp(n,e,{headers:c4,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(l4.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(a4.test(d)&&!s4.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await k_(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 k_(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"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}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 s4,a4,l4,c4,E_=x(()=>{"use strict";VA();Gw();he();s4=/(text\/html|application\/xhtml\+xml)/i,a4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,l4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,c4={"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 m4(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(u4,{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),p4),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Rr(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 x_(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?m4({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 R_(e,t){if(t.length===0)return`# Search results for "${e}"
872
+ `).trim()}function dV(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function YA(e,t){let{JSDOM:n,Readability:r,turndown:o}=await cV(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=JA(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=JA(o.turndown(d));return{title:a,markdown:u,textLength:dV(c),usedFallback:!0}}var Kw,VA=x(()=>{"use strict";Kw=null});function pV(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 XA(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function mV(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 zp(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??pV,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(!uV.has(u.status)||d===o)return u;let m=mV(u,s)??XA(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=XA(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var uV,Gw=x(()=>{"use strict";he();uV=new Set([429,502,503,504])});import{readFileSync as fV}from"node:fs";import{join as gV}from"path";function hV(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function QA(e,t){return hV(t).test(e)}function wV(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(yV.has(t))return!0;if(bV.has(t))return!1}return!1}function ZA(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function SV(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 e_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Yl(t),t}function vV(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function kV(e){try{return fV(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function TV(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=e_(t.defaultProfile)),n}function t_(e){let t=e?.env??v,n=e?.readFileSync??kV,r=e?.surface??t.AGENT_SURFACE,o=wV(t.AFK_BROWSER_HEADLESS,r),i=ZA(t.AFK_BROWSER_ALLOWED_DOMAINS),s=ZA(t.AFK_BROWSER_BLOCKED_DOMAINS),a=vV(t.AFK_BROWSER_DOM_SNAPSHOTS),l=SV(t.AFK_BROWSER_BACKEND),c=e_(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,m=u!==void 0&&u.trim()!==""?u.trim():gV(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=TV(d,g);return h.configPath=m,h}function qw(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(QA(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>QA(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var yV,bV,zw=x(()=>{"use strict";K();G();yV=new Set(["daemon","subagent","telegram","afk"]),bV=new Set(["repl","interactive","cli"])});import mi from"node:fs";import Jp from"node:path";import{randomBytes as EV}from"node:crypto";import{chromium as xV}from"playwright";function RV(){try{return"5.67.0"}catch{}try{let e=Jp.resolve(import.meta.dirname,"../../../package.json"),t=mi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var CV,Yp,n_=x(()=>{"use strict";G();he();CV=RV(),Yp=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=xV.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/${CV}`}}loadStorageState(t){let n=Vl(t);try{if(!mi.existsSync(n))return;let r=JSON.parse(mi.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=Vl(t);if(!mi.existsSync(r))return;let o=await n.storageState(),i=Jp.join(Jp.dirname(r),`.${Jp.basename(r)}.${process.pid}.${EV(4).toString("hex")}.tmp`);mi.writeFileSync(i,JSON.stringify(o),{mode:384}),mi.chmodSync(i,384),mi.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 AV}from"crypto";function Jw(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of _V)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function r_(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&IV.test(e.label))}function o_(e){return AV("sha256").update(e,"utf8").digest("hex").slice(0,8)}function i_(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var _V,IV,Rc=x(()=>{"use strict";_V=[{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}];IV=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as PV}from"node:crypto";function MV(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function OV(e,t,n){return`el_${PV("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function $V(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function s_(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function l_(e,t){let n=e.role??"",r=e.name??"";a_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])l_(i,t)}async function DV(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},c_).catch(()=>[])}async function FV(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,m=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},c_).catch(()=>[])}function LV(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Vp(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=LV(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=DV(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],l_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await FV(e)).filter(N=>a_.has(N.role??"")));let w=new Map;for(let P of m){let N=s_(P.name),B=w.get(N);(!B||B.bbox.w===0&&P.bbox.w>0)&&w.set(N,P)}let S=y.map(P=>({ax:P,dom:w.get(s_(P.name??""))})),k=r?S:S.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);k.sort((P,N)=>{let B=P.dom?.bbox.y??0,U=N.dom?.bbox.y??0;if(B!==U)return B-U;let j=P.dom?.bbox.x??0,I=N.dom?.bbox.x??0;return j-I}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=k.slice(0,n).map((P,N)=>{let B=P.ax.role??"generic",U=P.ax.name??"",j=OV(B,U,N),I=P.dom?.bbox??{x:0,y:0,w:0,h:0},F=P.dom?.type??null,A=null;P.ax.value!==void 0&&P.ax.value!==null&&(A=String(P.ax.value)),P.ax.checked!==void 0&&(A=String(P.ax.checked)),r_({role:B,kind:F})&&(A="[redacted]");let M={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(M.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(M.selected=P.ax.selected),P.ax.expanded!==void 0&&(M.expanded=P.ax.expanded);let O;P.dom?.testId?O=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(O=`#${P.dom.id}`);let H={id:j,role:B,label:MV(U),kind:F,value:A,state:M,bbox:I};return O!==void 0&&(H.selector=O),H}),$="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?$="loading":P==="interactive"?$="navigating":$="idle"}catch{$="navigating"}$!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=$V(f),D=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:_,status:{httpStatus:t.httpStatus??null,loadingState:$,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var a_,c_,d_=x(()=>{"use strict";Rc();a_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);c_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function u_(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 Yw(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>u_(e,i)))).filter(o=>o!==null)}async function NV(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 Vw(e,t,n){switch(t.kind){case"element_id":return BV(e,t,n);case"selector":return UV(e,t);case"semantic":return jV(e,t)}}async function BV(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 Yw(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function UV(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 Yw(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function jV(e,t){return t.role!==void 0?HV(e,t.text,t.role):WV(e,t.text,t)}async function HV(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 Yw(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function WV(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 NV(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 m=u.slice(0,5),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await u_(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let k=0;k<w.length;k++)S=S*31+w.charCodeAt(k)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var p_=x(()=>{"use strict"});import{randomBytes as KV}from"crypto";import{mkdir as GV,stat as qV,writeFile as zV}from"fs/promises";import{join as Xw}from"path";import{gzip as JV}from"zlib";import{promisify as YV}from"util";function VV(e){return Xw(Vo(e),"browser")}function XV(e){return Xw(VV(e),"screenshots")}function QV(){return new Date().toISOString().replace(/[:.]/g,"-")}function ZV(){return KV(3).toString("hex")}async function Qw(e,t,n){if(t.length>m_)throw new Error(`writeScreenshotSidecar: buffer exceeds ${m_} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=XV(e);await GV(r,{recursive:!0});let o=`${QV()}-${ZV()}-${n}.png`,i=Xw(r,o);await zV(i,t);let{size:s}=await qV(i);return{path:i,bytes:s}}var wEe,m_,f_=x(()=>{"use strict";G();Rc();wEe=YV(JV);m_=5*1024*1024});var h_={};Tu(h_,{PlaywrightProvider:()=>Zw});function g_(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var Zw,y_=x(()=>{"use strict";n_();d_();p_();zw();Rc();f_();Zw=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Yp(t)}async open(t){let n=qw(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 Vp(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 Vp(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 Vw(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${g_(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=Jw(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=qw(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Vp(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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 Vw(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${g_(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 Qw(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 Qw(n,o,r);return i}catch{return null}}}});var gi={};Tu(gi,{__resetBrowserRegistryForTests:()=>o4,browserProviderActive:()=>n4,closeBrowserProvider:()=>eS,getBrowserProvider:()=>t4,peekBrowserProvider:()=>r4});function b_(){Promise.resolve(eS()).then(()=>{process.exit(130)})}function w_(){Promise.resolve(eS()).then(()=>{process.exit(143)})}function S_(){Jn=null}function e4(){Xp||(process.on("SIGINT",b_),process.on("SIGTERM",w_),process.on("exit",S_),Xp=!0)}function v_(){Xp&&(process.removeListener("SIGINT",b_),process.removeListener("SIGTERM",w_),process.removeListener("exit",S_),Xp=!1)}async function t4(e){return Jn!==null?Jn:(fi!==null||(fi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(y_(),h_)),n=t_(e),r=new t(n);return e4(),Jn=r,fi=null,r})()),fi)}async function eS(){if(Jn===null)return;let e=Jn;Jn=null,fi=null,v_(),await e.shutdown()}function n4(){return Jn!==null}function r4(){return Jn}function o4(){Jn=null,fi=null,v_()}var Jn,fi,Xp,hi=x(()=>{"use strict";zw();Jn=null,fi=null,Xp=!1});async function k_(e,t){try{return await YA(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function d4(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(hi(),gi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function T_(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??d4,o=null,i=e,s=null,a=null;try{let c=await zp(n,e,{headers:c4,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(l4.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(a4.test(d)&&!s4.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await k_(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 k_(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"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}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 s4,a4,l4,c4,E_=x(()=>{"use strict";VA();Gw();he();s4=/(text\/html|application\/xhtml\+xml)/i,a4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,l4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,c4={"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 m4(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(u4,{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),p4),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Rr(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 x_(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?m4({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 R_(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 u4,p4,C_=x(()=>{"use strict";lo();u4="https://api.exa.ai/search",p4=10});function S4(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=f4;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,g4)}let a=h4;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,y4)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function tS(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Tr(e,t),truncated:!0}}function v4(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 w4.some(o=>r.includes(o))}function k4(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=S4(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 zp(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(g){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let m;try{m=await u.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let f=tS(m,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let u=await T_(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});if(u.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let m=tS(u.markdown,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),f=v4(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${f}`,isError:!0}}let d=x_({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:b4,timeoutMs:i.timeoutMs,signal:s.signal}),m=tS(R_(i.query,u),i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}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 f4,g4,h4,y4,b4,w4,A_,__=x(()=>{"use strict";E_();C_();Gw();Hs();f4=3e4,g4=12e4,h4=1e5,y4=1e6,b4=10,w4=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"];A_=k4()});import{existsSync as P_,mkdirSync as T4,readFileSync as E4,renameSync as x4,unlinkSync as R4,writeFileSync as C4}from"node:fs";import{dirname as I_,join as A4}from"node:path";import{randomBytes as _4}from"node:crypto";function cn(e){let t=e??ob();if(!P_(t))return[];try{let n=E4(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function yi(e,t){let n=t??ob();T4(I_(n),{recursive:!0});let r=A4(I_(n),`.schedules.json.${process.pid}.${_4(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{C4(r,o,"utf-8"),x4(r,n)}catch(i){try{P_(r)&&R4(r)}catch{}throw i}}function Qp(e,t){let n=cn(t),r=n.map(l=>l.id),o=I4(e.name),i=P4(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),yi(n,t),a}function Zp(e,t){let n=cn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(yi(o,t),!0)}function Cc(e,t){return cn(t).find(n=>n.id===e)}function I4(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function P4(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function M_(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{}}}var em=x(()=>{"use strict";G()});import{existsSync as M4,readFileSync as O4}from"node:fs";import{join as $4}from"node:path";async function En(e,t,n){let r;try{let o=$4(Mu("default"),"port");if(!M4(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=O4(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var po,nS=x(()=>{"use strict";G();po="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as D4}from"node:fs";import{readFile as F4}from"node:fs/promises";var O_,$_,D_,F_,L_=x(()=>{"use strict";em();G();nS();O_=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=Qp({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,enabled:typeof n.enabled=="boolean"?n.enabled:!0}),i=o.enabled?await En("POST","/tasks",{taskId:o.id,command:o.command,cron:o.cron,trigger:o.trigger,notifyOn:o.notifyOn}):await En("DELETE",`/tasks/${o.id}`);return{content:JSON.stringify({id:o.id,name:o.name,cron:o.cron,enabled:o.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:po}})}},$_=async(e,t)=>{let n=cn();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},D_=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=Fn();if(!D4(i))return{content:JSON.stringify([])};let s;try{let c=await F4(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -991,6 +991,8 @@ ${t}`)}var ov=x(()=>{"use strict"});function nM(e){return typeof e=="string"&&e.
991
991
 
992
992
  Work autonomously from the task prompt you were dispatched with: investigate, act, and verify. You have the parent session's full child tool surface. Keep intermediate exploration out of your reply.
993
993
 
994
+ Watch for non-convergence: if repeated attempts at the same sub-goal \u2014 the same fix, the same search, the same command \u2014 stop making progress after a few tries, STOP and do not keep retrying. Activity is not progress. Return your best PARTIAL result with a clear note on what you could not resolve and why.
995
+
994
996
  Reply with a compressed result: answer/outcome first, then evidence with file:line citations where applicable, risks or caveats, and anything you did not check. Your final message is the only thing the dispatching session sees.`,$6=`You are Explore, a fast read-only sub-agent optimized for searching and analyzing codebases.
995
997
 
996
998
  Rules:
@@ -1744,7 +1746,7 @@ ${S}
1744
1746
  ${k}`})}return{fileBlocks:a,warnings:l}}async function Qj(e,t,n,r,o="summary",i,s){let a=MN(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),Va(process.stdout,kd(process.cwd(),!0));let l="",c=0,d=!1,u=!1,m=!1,f=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,k=[],T=new Map,_=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,$=()=>{let B=r.subagentControl;B?.hasPromotableForeground()&&B.promoteActiveForeground().then(U=>{for(let j of U)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${j.jobId}: ${j.label}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,D=()=>new fl({out:gl(i),thinkingMode:o,..._?{activeSkillName:_}:{},onCancel:()=>{t.interrupt().catch(B=>{He()&&console.error(" "+p.error("session.interrupt() failed:"),B)})},...r.subagentControl?{onBackground:$}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...R?{compositor:R}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),C=D(),P=async()=>{if(!m){m=!0;try{await C.dispose()}catch{}}},N=async()=>{await C.arm();let B=C.getCompositor();if(i&&B){let U=B;i.fn=j=>U.commitAbove(j),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(B),r.setInterruptNotifier?.(U=>C.setInterrupting(U)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,C.setSoftStopping(!0),t.interrupt().catch(M=>{He()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),M)});let A=r.subagentControl;A?.hasActiveForeground()&&A.cancelActiveForeground().catch(M=>{He()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(A=>{He()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),A)})}),await N(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler($);let{fileBlocks:B,warnings:U}=Xj(e.text,{rootDir:process.cwd()});for(let A of U)(i??{fn:console.log}).fn(p.dim(` @-file: ${A}`));let j=B.length>0||e.attachments.length>0?Yj(e.text,e.attachments,void 0,B):e.text,I=t.sendMessageStream(j);if(await Bs((A,M)=>{C.process(A,M)},async()=>{for await(let A of I){if(h||y)break;if(A.type==="chunk"&&A.chunk.type==="content"?(l+=A.chunk.content,d=!0):A.type==="message"&&!d&&(l=A.message.content),A.type==="stream_retry"&&(l=l.slice(0,c)),A.type==="chunk"&&A.chunk.type==="tool_use_detail"){let M=A.chunk,O={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};T.set(M.toolUseId,O),k.push(O)}else if(A.type==="chunk"&&A.chunk.type==="tool_result"){let M=A.chunk;c=l.length;let O=T.get(M.toolUseId);if(O&&(O.result=M.content,O.isError=M.isError,T.delete(M.toolUseId)),r.onContextProgress){let H=Date.now();if(H-w>=S){w=H;try{let J=r.onContextProgress();J instanceof Promise&&await J}catch(J){He()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),J)}}}}if(A.type==="paused"){if(r.setPausedState?.(!0),await P(),R&&A.autoResume===!0){let M=new AbortController;b.abort=M;let O=A.resetsAt?A.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,H=O?`Keep waiting \u2014 auto-resumes at ${O}`:"Keep waiting \u2014 auto-resume in progress",J="Switch model / provider (type /model after)",Q="Stop waiting",Z=[p.warning(" \u23F3 Usage limit reached.")+(O?p.dim(` Auto-resumes at ${O}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];ar(R,{header:Z,options:[H,J,Q],signal:M.signal,initialIndex:0}).then(ie=>{if(b.abort=null,!ie)return;let q=ie[0];q===void 0||q===H||(y=!0,q===J&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(ve=>{He()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),ve)}))}).catch(ie=>{He()&&console.error(" "+p.error("picker promise rejected:"),ie)})}else(i??{fn:console.log}).fn(ER({reason:A.reason,...A.resetsAt!==void 0?{resetsAt:A.resetsAt}:{},...A.accountId!==void 0?{accountId:A.accountId}:{},...A.autoResume!==void 0?{autoResume:A.autoResume}:{}}));continue}if(A.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=A.hotSwapped&&A.accountId?`\u25B6 Resumed on ${A.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,k.length=0,T.clear(),f=!1,g=void 0,u=!1,C=D(),m=!1,await N(),(i??{fn:console.log}).fn(p.success(M));continue}if(A.type==="error"){await P(),ks(hs(A.error)),u=!0;continue}C.process(A),A.type==="done"&&(f=!0,g=A.metadata)}}),await P(),h){let A=i?i.fn:console.log,M=R?R.getPendingCount():0,O=M>0?` \xB7 ${M} queued`:"";A(p.warning(`\u23F8 Stopped${O} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),A("")}if(y){let A=i?i.fn:console.log;A(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),A("")}if(f&&!h&&!y){Pi(n,a,l,g,k),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Ya(process.stdout),TF(process.stdout,"afk: turn complete");let A=O=>{i?i.fn(O):console.log(O)},M=oy(l);if(M){A(Jj(M)),A("");let O=zF(k);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:O})}catch{}if(n.permissionMode==="autonomous"){let H=M.kind==="done"&&pp().verifyDone===!0&&!O;YF(M,void 0,{unverified:H})}}if(ole(g,n,A),r.onAfterTurn){let O=r.onAfterTurn();O instanceof Promise&&await O.catch(()=>{})}}}catch(B){await P(),u||ks(hs(B))}finally{await P(),Va(process.stdout,kd(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function rle(e,t){let n=Math.round(e*100),r=de(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${de(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 ole(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(Se(e.durationMs)),e.totalCostUsd!==void 0&&r.push(st(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(de(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=Ik(t),a=Gt(t.model),l=rle(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(c(l.text))}n("")}var ile=5e3,sle=3,ale="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function lle(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(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function Zj(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async $=>{He()&&(f=Ng($)),await Yd(e.session.current),He()&&(g=WT())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,k,T,_=0;for(m.onInjectable=()=>{_>=sle||!o.isAwaitingInput()||!o.bufferIsEmpty()||(_++,Ya(process.stdout),h={text:ale,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let I of g)e.replRenderer.writeLine(I);e.replRenderer.writeLine(""),g=[]}let $=u.drainNotifications();for(let{job:I,result:F}of $){let A=F.errorReason===void 0?"\u2713":"\u2717",M=F.errorReason==="abort"?"killed":F.errorReason==="timeout"?"timed out":F.errorReason==="signal-killed"?"killed by signal":`exit ${F.exitCode??0}`,O=Math.max(0,Math.round(F.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${A} [${I.id}] ${M} \xB7 ${O}s \xB7 `)+I.command)}let R=m.drainNotifications();for(let{job:I}of R){let F=I.status==="completed"?"\u2713":I.status==="failed"?"\u2717":"\u2298",A=I.endedAt!==void 0?Math.max(0,Math.round((I.endedAt-I.startedAt)/100)/10):0,M=I.label.length>60?`${I.label.slice(0,60)}\u2026`:I.label;e.replRenderer.writeLine(p.dim(` ${F} [${I.jobId}] subagent ${I.status} \xB7 ${A}s \xB7 `)+M)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let I of D)e.replRenderer.writeLine(I);e.replRenderer.writeLine("")}let C,P;if(h===void 0){let I=await e.session.current.takePendingPlanExitSeed();I!==void 0&&(e.stats.permissionMode=I.mode,h={text:I.message,attachments:[]})}if(h!==void 0){let I=h;h=void 0;let F=wl(e.stats.permissionMode),A=ji({buffer:I.text,promptText:F,isTTY:!!process.stdout.isTTY,attachmentSummary:ol([...I.attachments])});e.replRenderer.writeLine(A),C=I.text.trim(),P=I.attachments}else{let I=y;y=void 0;let F=await o.readLine({promptFn:()=>wl(e.stats.permissionMode),...I!==void 0?{initialBuffer:I}:{},onSigint:r,onShiftTab:()=>{ey(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});C=F.text.trim(),P=F.attachments}if(!C&&P.length===0)continue;if(C.startsWith("!")){let I=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!I&&(b||(b=!0,e.replRenderer.writeLine(p.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(C))){e.statusLine.rearm();continue}}let N=!1;if(C.startsWith("/")){let I=await DF(C,e.slashCtx,P);if(I.handled){if(I.result==="exit"){e.rl.close();return}if((C==="/clear"||C.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),S=void 0),I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="submit"){h={text:I.result.message,attachments:P??[]},e.statusLine.rearm();continue}if(I.result!==null&&typeof I.result=="object"&&"kind"in I.result&&I.result.kind==="prefill"){y=I.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}N=!0}a.push(C),await lle(e,C);let B=C;if(N){let I=_k(C);if(I){let F=I.name.replace(/^\//,"").split(":").pop()??"";if(F&&BT(F)){let A={skillName:F,rawArgs:I.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,O=Vi(M),H=Date.now();W(`[afk trace] preflight.start commandName=${F}`);let J=!1,Q=await Yi(A,{cwd:e.stats.cwd??process.cwd(),artifactDir:O},Z=>{He()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${F}) failed: `)+(Z instanceof Error?Z.message:String(Z)))});J=Q!==null,W(`[afk trace] preflight.end commandName=${F} durationMs=${Date.now()-H} success=${J}`),B=jT(Q?.manifestBlock,C)}}}let U=u.drainInjections();U.length>0&&(B=U+B);let j=m.drainInjections();if(j.length>0&&(B=j+B),S!==void 0&&(B=S+`
1745
1747
 
1746
1748
  `+B,S=void 0),e.hookRegistry)try{let I={event:"UserPromptSubmit",prompt:B,sessionId:e.stats.sessionId},F=await e.hookRegistry.dispatch(I);F.injectContext&&(B=F.injectContext+B)}catch(I){if(I instanceof ge){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(I.reason?p.dim(`: ${Rr(I.reason)}`):"")),e.statusLine.rearm();continue}if(I instanceof Hn){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${I.timeoutMs}ms`)),e.statusLine.rearm();continue}throw I}if(k=void 0,T=void 0,await Qj({text:B,attachments:P},e.session.current,e.stats,{setInFlight(I){n.turnInFlight=I},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(I){await t.appendUser(I)},async onTurnComplete(I,F){if(await t.appendTurn(I,F),e.stats.sessionId)try{Mo(e.stats)}catch(A){w||(w=!0,e.replRenderer.writeLine(p.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:(I,F)=>{d?.push(I),k=I.kind,T=F?.doneHasCorroboratingEvidence},setActiveCompositor:I=>{n.activeCompositor=I},setInterruptNotifier:I=>{n.notifyInterrupting=I},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:I=>o.setBackgroundHandler(I),setSoftStopHandler:i,setPausedState:I=>o.setPausedState(I),setPauseInterruptHandler:I=>o.setPauseInterruptHandler(I),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(sr(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:I=>c.repaint(I)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(wl(e.stats.permissionMode))),e.hookRegistry)try{let I=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...k!==void 0?{terminalState:k}:{},...T!==void 0?{doneHasCorroboratingEvidence:T}:{}},void 0,ile);I.injectContext&&I.injectContext.trim().length>0&&(S=I.injectContext)}catch(I){if(I instanceof dt)throw I;I instanceof Hn?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):I instanceof ge?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${Rr(I.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(I))}}}function cle(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 e1(e,t,n,r){let o=await Mj(),i=new Zh({rl:e.rl,history:o,statusLine:e.statusLine}),s=cle(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await Lj(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=zj(e,n),await Zj(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)}}lc();Xs();import{execFile as dle}from"node:child_process";import{dirname as ule,isAbsolute as ple,resolve as mle}from"node:path";import{promisify as fle}from"node:util";var t1=fle(dle),gle=3e3,hle=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function yle(){let t=(await t1("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=ple(t)?t:mle(process.cwd(),t);return ule(n)}async function n1(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await yle()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),gle)});try{let o=dn({execFile:t1,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=>hle.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Qu();lc();import{promises as ble}from"node:fs";import{dirname as wle,join as i1}from"node:path";import{randomBytes as Sle}from"node:crypto";var vle=["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(`
1747
- `),r1=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,uE=30,kle=1024,Tle=8e3,Ele="haiku";async function xle(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=_le(n,kle),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Tle),s=t.signal?Ile([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await _s({token:t.token,model:t.model??Ele,system:vle,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Rle(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=wle(t.worktreePath);return await Cle(l,c)}function Rle(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(r1.test(t)&&t.length<=uE)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>uE)break;o=s}return r1.test(o)?o:null}async function Cle(e,t){if(!await Ale(i1(t,e)))return e;let n=Sle(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,uE-5)}-${n}`}async function Ale(e){try{return await ble.access(e),!0}catch{return!1}}function _le(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 Ile(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 s1(e){let t,n,r=i1(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await xle(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=`${sp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return o1(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 o1(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 o1(e,t){e&&e.setCwd(t),Ple(t)}function Ple(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as l1}from"child_process";import{existsSync as c1,mkdirSync as Fle,readFileSync as d1,unlinkSync as a1,writeFileSync as u1}from"fs";import{get as Lle}from"https";import{join as p1}from"path";import{readFileSync as Mle}from"fs";import{dirname as Ole,join as $le}from"path";import{fileURLToPath as Dle}from"url";function pr(){try{return"5.66.0"}catch{}try{let e=Ole(Dle(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Mle($le(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var Nle=64*1024,Ble=10800*1e3,Ule=800,jle=3600*1e3,Hle="update-check.json",Wle="pending-update.json";function pE(){return p1(ms(),Hle)}function tu(){return p1(ms(),Wle)}function mE(){let e=ms();c1(e)||Fle(e,{recursive:!0})}function m1(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 f1(){try{let e=d1(pE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function g1(){try{mE();let e=`
1749
+ `),r1=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,uE=30,kle=1024,Tle=8e3,Ele="haiku";async function xle(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=_le(n,kle),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Tle),s=t.signal?Ile([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await _s({token:t.token,model:t.model??Ele,system:vle,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Rle(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=wle(t.worktreePath);return await Cle(l,c)}function Rle(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(r1.test(t)&&t.length<=uE)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>uE)break;o=s}return r1.test(o)?o:null}async function Cle(e,t){if(!await Ale(i1(t,e)))return e;let n=Sle(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,uE-5)}-${n}`}async function Ale(e){try{return await ble.access(e),!0}catch{return!1}}function _le(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 Ile(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 s1(e){let t,n,r=i1(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await xle(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=`${sp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return o1(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 o1(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 o1(e,t){e&&e.setCwd(t),Ple(t)}function Ple(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as l1}from"child_process";import{existsSync as c1,mkdirSync as Fle,readFileSync as d1,unlinkSync as a1,writeFileSync as u1}from"fs";import{get as Lle}from"https";import{join as p1}from"path";import{readFileSync as Mle}from"fs";import{dirname as Ole,join as $le}from"path";import{fileURLToPath as Dle}from"url";function pr(){try{return"5.67.0"}catch{}try{let e=Ole(Dle(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Mle($le(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var Nle=64*1024,Ble=10800*1e3,Ule=800,jle=3600*1e3,Hle="update-check.json",Wle="pending-update.json";function pE(){return p1(ms(),Hle)}function tu(){return p1(ms(),Wle)}function mE(){let e=ms();c1(e)||Fle(e,{recursive:!0})}function m1(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 f1(){try{let e=d1(pE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function g1(){try{mE();let e=`
1748
1750
  const https = require('https');
1749
1751
  const fs = require('fs');
1750
1752
  const url = 'https://registry.npmjs.org/agent-afk/latest';