agent-afk 5.71.1 → 5.73.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 $=Hs(h.trim());d({content:`grep error: ${$.content}`,isError:!0,...$.truncated?{truncated:!0}:{}});return}let T=qn(g.trimEnd()),_=Hs(T);d({content:_.content,..._.truncated?{truncated:!0}:{}})}),f.on("error",k=>{let T;if(m===void 0&&Rc(k))try{T=Js(k,process.cwd())}catch{T=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${k.message}`}else T=Js(k,m);d({content:`Failed to execute grep: ${T}`,isError:!0})})})}}var ZA,e_=x(()=>{"use strict";Kn();zn();lo();Kw();Ws();ZA=Qw()});import{promises as AV}from"fs";function Zw(e){return(t,n,r)=>_V(t,n,r,e)}var _V,t_,n_=x(()=>{"use strict";zn();_V=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 AV.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}}};t_=Zw()});function IV(e=Ls){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let r=t,o=r.message,i=r.chat;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(i!==void 0&&typeof i!="number"&&typeof i!="string")return{content:"Invalid input: chat must be a number (chat id) or string (chat id or alias name)",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>r_)return{content:`Invalid input: message exceeds Telegram's ${r_}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let a;if(i!==void 0){let c=wp(i,Sp());if(!c.ok)return{content:c.message,isError:!0};let d=Ps(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(!cp(c.id,d)){let u=[...d];return{content:`Refusing to send: chat ${c.id} is not in the allowlist (AFK_TELEGRAM_ALLOWED_CHAT_IDS). `+(u.length>0?`Allowed chat id(s): ${u.join(", ")}. `:"The allowlist is empty or unset. ")+"Add the chat id to the allowlist before targeting it.",isError:!0}}a=[c.id]}else a=Fs();if(a.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 l=[];for(let c of a){let d=await e({token:s,chatId:c,text:o});d.ok||l.push(`chat ${c}: ${d.errorMessage??`HTTP ${d.status}`}`)}return l.length===a.length?{content:`Failed to send Telegram message to any chat. ${l.join("; ")}`,isError:!0}:l.length>0?{content:`Sent Telegram message to ${a.length-l.length}/${a.length} chat(s); ${l.length} failed: ${l.join("; ")}`}:{content:a.length===1?`Sent Telegram message to chat ${a[0]}.`:`Sent Telegram message to ${a.length} chats.`}}}var r_,o_,i_=x(()=>{"use strict";K();Sr();fc();dp();r_=4096;o_=IV()});async function PV(){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 MV(){return eS===null&&(eS=PV()),eS}function s_(e){return e.replace(/\n{3,}/g,`
871
871
 
872
- `).trim()}function OV(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function a_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await MV(),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=s_(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=s_(o.turndown(d));return{title:a,markdown:u,textLength:OV(c),usedFallback:!0}}var eS,l_=x(()=>{"use strict";eS=null});function DV(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 c_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function FV(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 em(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??DV,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(!$V.has(u.status)||d===o)return u;let m=FV(u,s)??c_(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=c_(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 $V,tS=x(()=>{"use strict";he();$V=new Set([429,502,503,504])});import{readFileSync as LV}from"node:fs";import{join as NV}from"path";function BV(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function d_(e,t){return BV(t).test(e)}function HV(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(UV.has(t))return!0;if(jV.has(t))return!1}return!1}function u_(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function WV(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 p_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Vl(t),t}function KV(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function GV(e){try{return LV(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function qV(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=p_(t.defaultProfile)),n}function m_(e){let t=e?.env??v,n=e?.readFileSync??GV,r=e?.surface??t.AGENT_SURFACE,o=HV(t.AFK_BROWSER_HEADLESS,r),i=u_(t.AFK_BROWSER_ALLOWED_DOMAINS),s=u_(t.AFK_BROWSER_BLOCKED_DOMAINS),a=KV(t.AFK_BROWSER_DOM_SNAPSHOTS),l=WV(t.AFK_BROWSER_BACKEND),c=p_(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():NV(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=qV(d,g);return h.configPath=m,h}function nS(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(d_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>d_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var UV,jV,rS=x(()=>{"use strict";K();G();UV=new Set(["daemon","subagent","telegram","afk"]),jV=new Set(["repl","interactive","cli"])});import mi from"node:fs";import tm from"node:path";import{randomBytes as zV}from"node:crypto";import{chromium as JV}from"playwright";function YV(){try{return"5.71.1"}catch{}try{let e=tm.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 VV,nm,f_=x(()=>{"use strict";G();he();VV=YV(),nm=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=JV.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/${VV}`}}loadStorageState(t){let n=Xl(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=Xl(t);if(!mi.existsSync(r))return;let o=await n.storageState(),i=tm.join(tm.dirname(r),`.${tm.basename(r)}.${process.pid}.${zV(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 XV}from"crypto";function oS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of QV)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function g_(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&ZV.test(e.label))}function h_(e){return XV("sha256").update(e,"utf8").digest("hex").slice(0,8)}function y_(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var QV,ZV,_c=x(()=>{"use strict";QV=[{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}];ZV=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as e4}from"node:crypto";function t4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function n4(e,t,n){return`el_${e4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function r4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function b_(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function S_(e,t){let n=e.role??"",r=e.name??"";w_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])S_(i,t)}async function o4(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},v_).catch(()=>[])}async function i4(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},v_).catch(()=>[])}function s4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function rm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=s4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=o4(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=[],S_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await i4(e)).filter(N=>w_.has(N.role??"")));let w=new Map;for(let P of m){let N=b_(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(b_(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=n4(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)),g_({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:t4(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=r4(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 w_,v_,k_=x(()=>{"use strict";_c();w_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);v_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function T_(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 iS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>T_(e,i)))).filter(o=>o!==null)}async function a4(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 sS(e,t,n){switch(t.kind){case"element_id":return l4(e,t,n);case"selector":return c4(e,t);case"semantic":return d4(e,t)}}async function l4(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 iS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function c4(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 iS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function d4(e,t){return t.role!==void 0?u4(e,t.text,t.role):p4(e,t.text,t)}async function u4(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 iS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function p4(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 a4(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 T_(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 E_=x(()=>{"use strict"});import{randomBytes as m4}from"crypto";import{mkdir as f4,stat as g4,writeFile as h4}from"fs/promises";import{join as aS}from"path";import{gzip as y4}from"zlib";import{promisify as b4}from"util";function w4(e){return aS(Vo(e),"browser")}function S4(e){return aS(w4(e),"screenshots")}function v4(){return new Date().toISOString().replace(/[:.]/g,"-")}function k4(){return m4(3).toString("hex")}async function lS(e,t,n){if(t.length>x_)throw new Error(`writeScreenshotSidecar: buffer exceeds ${x_} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=S4(e);await f4(r,{recursive:!0});let o=`${v4()}-${k4()}-${n}.png`,i=aS(r,o);await h4(i,t);let{size:s}=await g4(i);return{path:i,bytes:s}}var JEe,x_,R_=x(()=>{"use strict";G();_c();JEe=b4(y4);x_=5*1024*1024});var A_={};Cu(A_,{PlaywrightProvider:()=>cS});function C_(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 cS,__=x(()=>{"use strict";f_();k_();E_();rS();_c();R_();cS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new nm(t)}async open(t){let n=nS(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 rm(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 rm(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 sS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${C_(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=oS(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=nS(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 rm(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 sS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${C_(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 lS(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 lS(n,o,r);return i}catch{return null}}}});var gi={};Cu(gi,{__resetBrowserRegistryForTests:()=>C4,browserProviderActive:()=>x4,closeBrowserProvider:()=>dS,getBrowserProvider:()=>E4,peekBrowserProvider:()=>R4});function I_(){Promise.resolve(dS()).then(()=>{process.exit(130)})}function P_(){Promise.resolve(dS()).then(()=>{process.exit(143)})}function M_(){Jn=null}function T4(){om||(process.on("SIGINT",I_),process.on("SIGTERM",P_),process.on("exit",M_),om=!0)}function O_(){om&&(process.removeListener("SIGINT",I_),process.removeListener("SIGTERM",P_),process.removeListener("exit",M_),om=!1)}async function E4(e){return Jn!==null?Jn:(fi!==null||(fi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(__(),A_)),n=m_(e),r=new t(n);return T4(),Jn=r,fi=null,r})()),fi)}async function dS(){if(Jn===null)return;let e=Jn;Jn=null,fi=null,O_(),await e.shutdown()}function x4(){return Jn!==null}function R4(){return Jn}function C4(){Jn=null,fi=null,O_()}var Jn,fi,om,hi=x(()=>{"use strict";rS();Jn=null,fi=null,om=!1});async function $_(e,t){try{return await a_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function O4(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 D_(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??O4,o=null,i=e,s=null,a=null;try{let c=await em(n,e,{headers:M4,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(P4.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(I4.test(d)&&!_4.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await $_(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 $_(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 _4,I4,P4,M4,F_=x(()=>{"use strict";l_();tS();he();_4=/(text\/html|application\/xhtml\+xml)/i,I4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,P4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,M4={"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 F4(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t($4,{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),D4),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 L_(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?F4({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 N_(e,t){if(t.length===0)return`# Search results for "${e}"
872
+ `).trim()}function OV(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function a_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await MV(),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=s_(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=s_(o.turndown(d));return{title:a,markdown:u,textLength:OV(c),usedFallback:!0}}var eS,l_=x(()=>{"use strict";eS=null});function DV(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 c_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function FV(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 em(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??DV,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(!$V.has(u.status)||d===o)return u;let m=FV(u,s)??c_(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=c_(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 $V,tS=x(()=>{"use strict";he();$V=new Set([429,502,503,504])});import{readFileSync as LV}from"node:fs";import{join as NV}from"path";function BV(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function d_(e,t){return BV(t).test(e)}function HV(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(UV.has(t))return!0;if(jV.has(t))return!1}return!1}function u_(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function WV(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 p_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Vl(t),t}function KV(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function GV(e){try{return LV(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function qV(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=p_(t.defaultProfile)),n}function m_(e){let t=e?.env??v,n=e?.readFileSync??GV,r=e?.surface??t.AGENT_SURFACE,o=HV(t.AFK_BROWSER_HEADLESS,r),i=u_(t.AFK_BROWSER_ALLOWED_DOMAINS),s=u_(t.AFK_BROWSER_BLOCKED_DOMAINS),a=KV(t.AFK_BROWSER_DOM_SNAPSHOTS),l=WV(t.AFK_BROWSER_BACKEND),c=p_(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():NV(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=qV(d,g);return h.configPath=m,h}function nS(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(d_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>d_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var UV,jV,rS=x(()=>{"use strict";K();G();UV=new Set(["daemon","subagent","telegram","afk"]),jV=new Set(["repl","interactive","cli"])});import mi from"node:fs";import tm from"node:path";import{randomBytes as zV}from"node:crypto";import{chromium as JV}from"playwright";function YV(){try{return"5.73.0"}catch{}try{let e=tm.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 VV,nm,f_=x(()=>{"use strict";G();he();VV=YV(),nm=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=JV.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/${VV}`}}loadStorageState(t){let n=Xl(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=Xl(t);if(!mi.existsSync(r))return;let o=await n.storageState(),i=tm.join(tm.dirname(r),`.${tm.basename(r)}.${process.pid}.${zV(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 XV}from"crypto";function oS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of QV)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function g_(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&ZV.test(e.label))}function h_(e){return XV("sha256").update(e,"utf8").digest("hex").slice(0,8)}function y_(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var QV,ZV,_c=x(()=>{"use strict";QV=[{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}];ZV=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as e4}from"node:crypto";function t4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function n4(e,t,n){return`el_${e4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function r4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function b_(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function S_(e,t){let n=e.role??"",r=e.name??"";w_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])S_(i,t)}async function o4(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},v_).catch(()=>[])}async function i4(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},v_).catch(()=>[])}function s4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function rm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=s4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=o4(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=[],S_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await i4(e)).filter(N=>w_.has(N.role??"")));let w=new Map;for(let P of m){let N=b_(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(b_(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=n4(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)),g_({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:t4(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=r4(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 w_,v_,k_=x(()=>{"use strict";_c();w_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);v_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function T_(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 iS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>T_(e,i)))).filter(o=>o!==null)}async function a4(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 sS(e,t,n){switch(t.kind){case"element_id":return l4(e,t,n);case"selector":return c4(e,t);case"semantic":return d4(e,t)}}async function l4(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 iS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function c4(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 iS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function d4(e,t){return t.role!==void 0?u4(e,t.text,t.role):p4(e,t.text,t)}async function u4(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 iS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function p4(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 a4(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 T_(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 E_=x(()=>{"use strict"});import{randomBytes as m4}from"crypto";import{mkdir as f4,stat as g4,writeFile as h4}from"fs/promises";import{join as aS}from"path";import{gzip as y4}from"zlib";import{promisify as b4}from"util";function w4(e){return aS(Vo(e),"browser")}function S4(e){return aS(w4(e),"screenshots")}function v4(){return new Date().toISOString().replace(/[:.]/g,"-")}function k4(){return m4(3).toString("hex")}async function lS(e,t,n){if(t.length>x_)throw new Error(`writeScreenshotSidecar: buffer exceeds ${x_} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=S4(e);await f4(r,{recursive:!0});let o=`${v4()}-${k4()}-${n}.png`,i=aS(r,o);await h4(i,t);let{size:s}=await g4(i);return{path:i,bytes:s}}var JEe,x_,R_=x(()=>{"use strict";G();_c();JEe=b4(y4);x_=5*1024*1024});var A_={};Cu(A_,{PlaywrightProvider:()=>cS});function C_(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 cS,__=x(()=>{"use strict";f_();k_();E_();rS();_c();R_();cS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new nm(t)}async open(t){let n=nS(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 rm(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 rm(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 sS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${C_(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=oS(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=nS(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 rm(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 sS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${C_(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 lS(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 lS(n,o,r);return i}catch{return null}}}});var gi={};Cu(gi,{__resetBrowserRegistryForTests:()=>C4,browserProviderActive:()=>x4,closeBrowserProvider:()=>dS,getBrowserProvider:()=>E4,peekBrowserProvider:()=>R4});function I_(){Promise.resolve(dS()).then(()=>{process.exit(130)})}function P_(){Promise.resolve(dS()).then(()=>{process.exit(143)})}function M_(){Jn=null}function T4(){om||(process.on("SIGINT",I_),process.on("SIGTERM",P_),process.on("exit",M_),om=!0)}function O_(){om&&(process.removeListener("SIGINT",I_),process.removeListener("SIGTERM",P_),process.removeListener("exit",M_),om=!1)}async function E4(e){return Jn!==null?Jn:(fi!==null||(fi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(__(),A_)),n=m_(e),r=new t(n);return T4(),Jn=r,fi=null,r})()),fi)}async function dS(){if(Jn===null)return;let e=Jn;Jn=null,fi=null,O_(),await e.shutdown()}function x4(){return Jn!==null}function R4(){return Jn}function C4(){Jn=null,fi=null,O_()}var Jn,fi,om,hi=x(()=>{"use strict";rS();Jn=null,fi=null,om=!1});async function $_(e,t){try{return await a_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function O4(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 D_(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??O4,o=null,i=e,s=null,a=null;try{let c=await em(n,e,{headers:M4,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(P4.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(I4.test(d)&&!_4.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await $_(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 $_(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 _4,I4,P4,M4,F_=x(()=>{"use strict";l_();tS();he();_4=/(text\/html|application\/xhtml\+xml)/i,I4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,P4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,M4={"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 F4(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t($4,{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),D4),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 L_(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?F4({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 N_(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 $4,D4,B_=x(()=>{"use strict";lo();$4="https://api.exa.ai/search",D4=10});function W4(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=L4;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,N4)}let a=B4;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,U4)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function uS(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Tr(e,t),truncated:!0}}function K4(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 H4.some(o=>r.includes(o))}function G4(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=W4(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 em(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=uS(m,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let u=await D_(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=uS(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=K4(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=L_({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:j4,timeoutMs:i.timeoutMs,signal:s.signal}),m=uS(N_(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 L4,N4,B4,U4,j4,H4,U_,j_=x(()=>{"use strict";F_();B_();tS();Ws();L4=3e4,N4=12e4,B4=1e5,U4=1e6,j4=10,H4=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"];U_=G4()});import{existsSync as W_,mkdirSync as q4,readFileSync as z4,renameSync as J4,unlinkSync as Y4,writeFileSync as V4}from"node:fs";import{dirname as H_,join as X4}from"node:path";import{randomBytes as Q4}from"node:crypto";function cn(e){let t=e??pb();if(!W_(t))return[];try{let n=z4(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??pb();q4(H_(n),{recursive:!0});let r=X4(H_(n),`.schedules.json.${process.pid}.${Q4(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{V4(r,o,"utf-8"),J4(r,n)}catch(i){try{W_(r)&&Y4(r)}catch{}throw i}}function im(e,t){let n=cn(t),r=n.map(l=>l.id),o=Z4(e.name),i=e8(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 sm(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 Ic(e,t){return cn(t).find(n=>n.id===e)}function Z4(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function e8(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function K_(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var am=x(()=>{"use strict";G()});import{existsSync as t8,readFileSync as n8}from"node:fs";import{join as r8}from"node:path";async function En(e,t,n){let r;try{let o=r8(Fu("default"),"port");if(!t8(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=n8(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,pS=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 o8}from"node:fs";import{readFile as i8}from"node:fs/promises";var G_,q_,z_,J_,Y_=x(()=>{"use strict";am();G();pS();G_=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=im({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await En("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await En("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:po}})}},q_=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})))}},z_=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(!o8(i))return{content:JSON.stringify([])};let s;try{let c=await i8(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1746,7 +1746,7 @@ ${S}
1746
1746
  ${k}`})}return{fileBlocks:a,warnings:l}}async function b1(e,t,n,r,o="summary",i,s){let a=XN(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),Xa(process.stdout,xd(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 gl({out:hl(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}=y1(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?g1(e.text,e.attachments,void 0,B):e.text,I=t.sendMessageStream(j);if(await Us((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(OR({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(()=>{}),Va(process.stdout),jF(process.stdout,"afk: turn complete");let A=O=>{i?i.fn(O):console.log(O)},M=py(l);if(M){A(f1(M)),A("");let O=uL(k);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:O})}catch{}if(n.permissionMode==="autonomous"){let H=M.kind==="done"&&mc().verifyDone===!0&&!O;mL(M,void 0,{unverified:H})}}if(Ale(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(),Xa(process.stdout,xd(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 Cle(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 Ale(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=Uk(t),a=Gt(t.model),l=Cle(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 _le=5e3,Ile=3,Ple="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Mle(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 w1(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=qg($)),await Zd(e.session.current),He()&&(g=QT())}).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=()=>{_>=Ile||!o.isAwaitingInput()||!o.bufferIsEmpty()||(_++,Va(process.stdout),h={text:Ple,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=Sl(e.stats.permissionMode),A=ji({buffer:I.text,promptText:F,isTTY:!!process.stdout.isTTY,attachmentSummary:il([...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:()=>Sl(e.stats.permissionMode),...I!==void 0?{initialBuffer:I}:{},onSigint:r,onShiftTab:()=>{ly(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 ZF(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 Mle(e,C);let B=C;if(N){let I=Bk(C);if(I){let F=I.name.replace(/^\//,"").split(":").pop()??"";if(F&&JT(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=VT(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+`
1747
1747
 
1748
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 b1({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(Sl(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,_le);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 Ole(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 S1(e,t,n,r){let o=await Qj(),i=new ay({rl:e.rl,history:o,statusLine:e.statusLine}),s=Ole(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await r1(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=m1(e,n),await w1(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)}}cc();Qs();import{execFile as $le}from"node:child_process";import{dirname as Dle,isAbsolute as Fle,resolve as Lle}from"node:path";import{promisify as Nle}from"node:util";var v1=Nle($le),Ble=3e3,Ule=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function jle(){let t=(await v1("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Fle(t)?t:Lle(process.cwd(),t);return Dle(n)}async function k1(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await jle()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Ble)});try{let o=dn({execFile:v1,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=>Ule.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}rp();cc();import{promises as Hle}from"node:fs";import{dirname as Wle,join as x1}from"node:path";import{randomBytes as Kle}from"node:crypto";var Gle=["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(`
1749
- `),T1=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,SE=30,qle=1024,zle=8e3,Jle="haiku";async function Yle(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=Zle(n,qle),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??zle),s=t.signal?ece([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??Jle,system:Gle,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=Vle(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Wle(t.worktreePath);return await Xle(l,c)}function Vle(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(T1.test(t)&&t.length<=SE)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>SE)break;o=s}return T1.test(o)?o:null}async function Xle(e,t){if(!await Qle(x1(t,e)))return e;let n=Kle(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,SE-5)}-${n}`}async function Qle(e){try{return await Hle.access(e),!0}catch{return!1}}function Zle(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 ece(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 R1(e){let t,n,r=x1(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Yle(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=`${mp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return E1(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 E1(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 E1(e,t){e&&e.setCwd(t),tce(t)}function tce(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as A1}from"child_process";import{existsSync as _1,mkdirSync as sce,readFileSync as I1,unlinkSync as C1,writeFileSync as P1}from"fs";import{get as ace}from"https";import{join as M1}from"path";import{readFileSync as nce}from"fs";import{dirname as rce,join as oce}from"path";import{fileURLToPath as ice}from"url";function pr(){try{return"5.71.1"}catch{}try{let e=rce(ice(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(nce(oce(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var lce=64*1024,cce=10800*1e3,dce=800,uce=3600*1e3,pce="update-check.json",mce="pending-update.json";function vE(){return M1(ms(),pce)}function iu(){return M1(ms(),mce)}function kE(){let e=ms();_1(e)||sce(e,{recursive:!0})}function O1(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 $1(){try{let e=I1(vE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function D1(){try{kE();let e=`
1749
+ `),T1=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,SE=30,qle=1024,zle=8e3,Jle="haiku";async function Yle(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=Zle(n,qle),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??zle),s=t.signal?ece([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??Jle,system:Gle,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=Vle(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Wle(t.worktreePath);return await Xle(l,c)}function Vle(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(T1.test(t)&&t.length<=SE)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>SE)break;o=s}return T1.test(o)?o:null}async function Xle(e,t){if(!await Qle(x1(t,e)))return e;let n=Kle(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,SE-5)}-${n}`}async function Qle(e){try{return await Hle.access(e),!0}catch{return!1}}function Zle(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 ece(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 R1(e){let t,n,r=x1(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Yle(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=`${mp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return E1(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 E1(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 E1(e,t){e&&e.setCwd(t),tce(t)}function tce(e){try{process.chdir(e)}catch{}}Ut();G();import{spawn as A1}from"child_process";import{existsSync as _1,mkdirSync as sce,readFileSync as I1,unlinkSync as C1,writeFileSync as P1}from"fs";import{get as ace}from"https";import{join as M1}from"path";import{readFileSync as nce}from"fs";import{dirname as rce,join as oce}from"path";import{fileURLToPath as ice}from"url";function pr(){try{return"5.73.0"}catch{}try{let e=rce(ice(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(nce(oce(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var lce=64*1024,cce=10800*1e3,dce=800,uce=3600*1e3,pce="update-check.json",mce="pending-update.json";function vE(){return M1(ms(),pce)}function iu(){return M1(ms(),mce)}function kE(){let e=ms();_1(e)||sce(e,{recursive:!0})}function O1(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 $1(){try{let e=I1(vE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function D1(){try{kE();let e=`
1750
1750
  const https = require('https');
1751
1751
  const fs = require('fs');
1752
1752
  const url = 'https://registry.npmjs.org/agent-afk/latest';