agent-afk 5.76.5 → 5.76.6

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
@@ -868,7 +868,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
868
868
  [results capped at 500 entries]`),{content:d}}catch(l){return l instanceof Error?"code"in l&&l.code==="ENOENT"?{content:`Path not found: ${a}`,isError:!0}:"code"in l&&l.code==="EACCES"?{content:`Permission denied: ${a}`,isError:!0}:{content:`Error scanning directory: ${l.message}`,isError:!0}:{content:"Unknown error scanning directory",isError:!0}}}}var $V,a_,l_=x(()=>{"use strict";Jn();$V=new Set(["node_modules",".git",".hg",".svn"]);a_=nS()});import{accessSync as NV,constants as BV}from"node:fs";function c_(e){try{NV(e,BV.X_OK);return}catch(t){let n=t instanceof Error?t.message:String(t);return`ripgrep binary is missing or not executable: ${e} (the @vscode/ripgrep platform optional-dependency for ${process.platform}-${process.arch} may not be installed \u2014 e.g. an install with --no-optional, an unsupported platform/arch, or a corrupted node_modules) \u2014 underlying: ${n}`}}var d_=x(()=>{"use strict"});import{spawn as UV}from"child_process";function jV(e,t,n){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let r=e;if(typeof r.pattern!="string")throw new Error('Input must have a "pattern" field of type string');let o=typeof r.path=="string"?r.path:t?.resolveBase??t?.cwd??n??process.cwd(),i=ln(o,t,"read"),s;if(r.include!==void 0){if(typeof r.include!="string")throw new Error("include must be a string");s=r.include}return{pattern:r.pattern,path:i,include:s}}function rS(e){return async(t,n,r)=>{let{pattern:o,path:i,include:s}=jV(t,r,e);if(n.aborted)return{content:"Search aborted",isError:!0};let a;try{({rgPath:a}=await import("@vscode/ripgrep"))}catch(l){return{content:`Failed to execute grep: ripgrep is unavailable \u2014 ${l instanceof Error?l.message:String(l)}`,isError:!0}}return new Promise(l=>{let c=!1;function d(k){c||(c=!0,n.removeEventListener("abort",S),l(k))}let u=["-n","--no-heading","--color=never","--hidden"];s&&u.push("-g",s),u.push("-g","!.git"),u.push("--",o,i);let m=r?.resolveBase??r?.cwd??e,f=UV(a,u,m!==void 0?{cwd:m}:{}),g="",h="",y=0,b=!1;function w(k){if(b||c||y<8e6)return;b=!0,console.warn(`[grep] overflow kill: stream=${k} totalBytes=${y} pattern=${o} path=${i}`),$e({event:"tool.overflow_kill",tool:"grep",total_bytes:y,stream:k}),f.kill("SIGKILL");let T=zn((g+h).trimEnd()),A=Er(T,1e5)+Lp;d({content:A,truncated:!0})}f.stdout.on("data",k=>{let T=8e6-y,A=k.length<=T?k:k.subarray(0,Math.max(0,T));y+=A.length,g+=A.toString("utf8"),w("stdout")}),f.stderr.on("data",k=>{let T=8e6-y,A=k.length<=T?k:k.subarray(0,Math.max(0,T));y+=A.length,h+=A.toString("utf8"),w("stderr")});let S=()=>{f.kill(),d({content:"Search aborted",isError:!0})};n.addEventListener("abort",S),f.on("close",k=>{if(b)return;if(k===1){let D=`No matches found for '${o}' in ${i}`;d({content:D});return}if(k===2){let D=Ws(h.trim());d({content:`grep error: ${D.content}`,isError:!0,...D.truncated?{truncated:!0}:{}});return}let T=zn(g.trimEnd()),A=Ws(T);d({content:A.content,...A.truncated?{truncated:!0}:{}})}),f.on("error",k=>{let T=c_(a);if(T!==void 0){d({content:`Failed to execute grep: ${T}`,isError:!0});return}let A;if(m===void 0&&Ac(k))try{A=Ys(k,process.cwd())}catch{A=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${k.message}`}else A=Ys(k,m);d({content:`Failed to execute grep: ${A}`,isError:!0})})})}}var u_,p_=x(()=>{"use strict";Gn();Jn();co();Yw();d_();Ks();u_=rS()});import{promises as HV}from"fs";function oS(e){return(t,n,r)=>WV(t,n,r,e)}var WV,m_,f_=x(()=>{"use strict";Jn();WV=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 HV.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(`
869
869
  `)}}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}}};m_=oS()});function KV(e=Ns){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>g_)return{content:`Invalid input: message exceeds Telegram's ${g_}-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=kp(i,Tp());if(!c.ok)return{content:c.message,isError:!0};let d=Ms(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(!pp(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=Ls();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 g_,h_,y_=x(()=>{"use strict";K();vr();gc();mp();g_=4096;h_=KV()});async function GV(){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 qV(){return iS===null&&(iS=GV()),iS}function b_(e){return e.replace(/\n{3,}/g,`
870
870
 
871
- `).trim()}function zV(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function w_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await qV(),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=b_(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=b_(o.turndown(d));return{title:a,markdown:u,textLength:zV(c),usedFallback:!0}}var iS,S_=x(()=>{"use strict";iS=null});function YV(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 v_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function VV(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 rm(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??YV,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(!JV.has(u.status)||d===o)return u;let m=VV(u,s)??v_(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=v_(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 JV,sS=x(()=>{"use strict";ye();JV=new Set([429,502,503,504])});import{readFileSync as XV}from"node:fs";import{join as ZV}from"path";function QV(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function k_(e,t){return QV(t).test(e)}function n4(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(e4.has(t))return!0;if(t4.has(t))return!1}return!1}function T_(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function r4(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function E_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Xl(t),t}function o4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function i4(e){try{return XV(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function s4(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=E_(t.defaultProfile)),n}function x_(e){let t=e?.env??v,n=e?.readFileSync??i4,r=e?.surface??t.AGENT_SURFACE,o=n4(t.AFK_BROWSER_HEADLESS,r),i=T_(t.AFK_BROWSER_ALLOWED_DOMAINS),s=T_(t.AFK_BROWSER_BLOCKED_DOMAINS),a=o4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=r4(t.AFK_BROWSER_BACKEND),c=E_(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():ZV(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=s4(d,g);return h.configPath=m,h}function aS(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(k_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>k_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var e4,t4,lS=x(()=>{"use strict";K();q();e4=new Set(["daemon","subagent","telegram","afk"]),t4=new Set(["repl","interactive","cli"])});import gi from"node:fs";import om from"node:path";import{randomBytes as a4}from"node:crypto";import{chromium as l4}from"playwright";function c4(){try{return"5.76.5"}catch{}try{let e=om.resolve(import.meta.dirname,"../../../package.json"),t=gi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var d4,im,R_=x(()=>{"use strict";q();ye();d4=c4(),im=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=l4.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/${d4}`}}loadStorageState(t){let n=Zl(t);try{if(!gi.existsSync(n))return;let r=JSON.parse(gi.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=Zl(t);if(!gi.existsSync(r))return;let o=await n.storageState(),i=om.join(om.dirname(r),`.${om.basename(r)}.${process.pid}.${a4(4).toString("hex")}.tmp`);gi.writeFileSync(i,JSON.stringify(o),{mode:384}),gi.chmodSync(i,384),gi.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 u4}from"crypto";function cS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of p4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function A_(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&m4.test(e.label))}function C_(e){return u4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function __(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var p4,m4,Ic=x(()=>{"use strict";p4=[{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}];m4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as f4}from"node:crypto";function g4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function h4(e,t,n){return`el_${f4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function y4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function I_(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function M_(e,t){let n=e.role??"",r=e.name??"";P_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])M_(i,t)}async function b4(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},O_).catch(()=>[])}async function w4(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},O_).catch(()=>[])}function S4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function sm(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=b4(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=[],M_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await w4(e)).filter(U=>P_.has(U.role??"")));let w=new Map;for(let O of m){let U=I_(O.name),j=w.get(U);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(U,O)}let S=y.map(O=>({ax:O,dom:w.get(I_(O.name??""))})),k=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);k.sort((O,U)=>{let j=O.dom?.bbox.y??0,$=U.dom?.bbox.y??0;if(j!==$)return j-$;let B=O.dom?.bbox.x??0,P=U.dom?.bbox.x??0;return B-P}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=k.slice(0,n).map((O,U)=>{let j=O.ax.role??"generic",$=O.ax.name??"",B=h4(j,$,U),P=O.dom?.bbox??{x:0,y:0,w:0,h:0},N=O.dom?.type??null,_=null;O.ax.value!==void 0&&O.ax.value!==null&&(_=String(O.ax.value)),O.ax.checked!==void 0&&(_=String(O.ax.checked)),A_({role:j,kind:N})&&(_="[redacted]");let M={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(M.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(M.selected=O.ax.selected),O.ax.expanded!==void 0&&(M.expanded=O.ax.expanded);let I;O.dom?.testId?I=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(I=`#${O.dom.id}`);let H={id:B,role:j,label:g4($),kind:N,value:_,state:M,bbox:P};return I!==void 0&&(H.selector=I),H}),D="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?D="loading":O==="interactive"?D="navigating":D="idle"}catch{D="navigating"}D!=="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=y4(f),F=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:F,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:D,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var P_,O_,$_=x(()=>{"use strict";Ic();P_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);O_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function D_(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 dS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>D_(e,i)))).filter(o=>o!==null)}async function v4(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 uS(e,t,n){switch(t.kind){case"element_id":return k4(e,t,n);case"selector":return T4(e,t);case"semantic":return E4(e,t)}}async function k4(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 dS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function T4(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 dS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function E4(e,t){return t.role!==void 0?x4(e,t.text,t.role):R4(e,t.text,t)}async function x4(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 dS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function R4(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 v4(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 D_(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 F_=x(()=>{"use strict"});import{randomBytes as A4}from"crypto";import{mkdir as C4,stat as _4,writeFile as I4}from"fs/promises";import{join as pS}from"path";import{gzip as P4}from"zlib";import{promisify as M4}from"util";function O4(e){return pS(Xo(e),"browser")}function $4(e){return pS(O4(e),"screenshots")}function D4(){return new Date().toISOString().replace(/[:.]/g,"-")}function F4(){return A4(3).toString("hex")}async function mS(e,t,n){if(t.length>L_)throw new Error(`writeScreenshotSidecar: buffer exceeds ${L_} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=$4(e);await C4(r,{recursive:!0});let o=`${D4()}-${F4()}-${n}.png`,i=pS(r,o);await I4(i,t);let{size:s}=await _4(i);return{path:i,bytes:s}}var fxe,L_,N_=x(()=>{"use strict";q();Ic();fxe=M4(P4);L_=5*1024*1024});var U_={};Iu(U_,{PlaywrightProvider:()=>fS});function B_(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 fS,j_=x(()=>{"use strict";R_();$_();F_();lS();Ic();N_();fS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new im(t)}async open(t){let n=aS(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 sm(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 sm(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 uS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${B_(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=cS(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=aS(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 sm(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 uS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${B_(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 mS(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 mS(n,o,r);return i}catch{return null}}}});var yi={};Iu(yi,{__resetBrowserRegistryForTests:()=>j4,browserProviderActive:()=>B4,closeBrowserProvider:()=>gS,getBrowserProvider:()=>N4,peekBrowserProvider:()=>U4});function H_(){Promise.resolve(gS()).then(()=>{process.exit(130)})}function W_(){Promise.resolve(gS()).then(()=>{process.exit(143)})}function K_(){Yn=null}function L4(){am||(process.on("SIGINT",H_),process.on("SIGTERM",W_),process.on("exit",K_),am=!0)}function G_(){am&&(process.removeListener("SIGINT",H_),process.removeListener("SIGTERM",W_),process.removeListener("exit",K_),am=!1)}async function N4(e){return Yn!==null?Yn:(hi!==null||(hi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(j_(),U_)),n=x_(e),r=new t(n);return L4(),Yn=r,hi=null,r})()),hi)}async function gS(){if(Yn===null)return;let e=Yn;Yn=null,hi=null,G_(),await e.shutdown()}function B4(){return Yn!==null}function U4(){return Yn}function j4(){Yn=null,hi=null,G_()}var Yn,hi,am,bi=x(()=>{"use strict";lS();Yn=null,hi=null,am=!1});async function q_(e,t){try{return await w_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function z4(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(bi(),yi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function z_(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??z4,o=null,i=e,s=null,a=null;try{let c=await rm(n,e,{headers:q4,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(G4.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(K4.test(d)&&!W4.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await q_(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 q_(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 W4,K4,G4,q4,J_=x(()=>{"use strict";S_();sS();ye();W4=/(text\/html|application\/xhtml\+xml)/i,K4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,G4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,q4={"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 V4(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(J4,{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),Y4),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Ar(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 Y_(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?V4({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 V_(e,t){if(t.length===0)return`# Search results for "${e}"
871
+ `).trim()}function zV(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function w_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await qV(),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=b_(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=b_(o.turndown(d));return{title:a,markdown:u,textLength:zV(c),usedFallback:!0}}var iS,S_=x(()=>{"use strict";iS=null});function YV(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 v_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function VV(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 rm(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??YV,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(!JV.has(u.status)||d===o)return u;let m=VV(u,s)??v_(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=v_(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 JV,sS=x(()=>{"use strict";ye();JV=new Set([429,502,503,504])});import{readFileSync as XV}from"node:fs";import{join as ZV}from"path";function QV(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function k_(e,t){return QV(t).test(e)}function n4(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(e4.has(t))return!0;if(t4.has(t))return!1}return!1}function T_(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function r4(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function E_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Xl(t),t}function o4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function i4(e){try{return XV(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function s4(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=E_(t.defaultProfile)),n}function x_(e){let t=e?.env??v,n=e?.readFileSync??i4,r=e?.surface??t.AGENT_SURFACE,o=n4(t.AFK_BROWSER_HEADLESS,r),i=T_(t.AFK_BROWSER_ALLOWED_DOMAINS),s=T_(t.AFK_BROWSER_BLOCKED_DOMAINS),a=o4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=r4(t.AFK_BROWSER_BACKEND),c=E_(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():ZV(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=s4(d,g);return h.configPath=m,h}function aS(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(k_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>k_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var e4,t4,lS=x(()=>{"use strict";K();q();e4=new Set(["daemon","subagent","telegram","afk"]),t4=new Set(["repl","interactive","cli"])});import gi from"node:fs";import om from"node:path";import{randomBytes as a4}from"node:crypto";import{chromium as l4}from"playwright";function c4(){try{return"5.76.6"}catch{}try{let e=om.resolve(import.meta.dirname,"../../../package.json"),t=gi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var d4,im,R_=x(()=>{"use strict";q();ye();d4=c4(),im=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=l4.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/${d4}`}}loadStorageState(t){let n=Zl(t);try{if(!gi.existsSync(n))return;let r=JSON.parse(gi.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=Zl(t);if(!gi.existsSync(r))return;let o=await n.storageState(),i=om.join(om.dirname(r),`.${om.basename(r)}.${process.pid}.${a4(4).toString("hex")}.tmp`);gi.writeFileSync(i,JSON.stringify(o),{mode:384}),gi.chmodSync(i,384),gi.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 u4}from"crypto";function cS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of p4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function A_(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&m4.test(e.label))}function C_(e){return u4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function __(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var p4,m4,Ic=x(()=>{"use strict";p4=[{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}];m4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as f4}from"node:crypto";function g4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function h4(e,t,n){return`el_${f4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function y4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function I_(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function M_(e,t){let n=e.role??"",r=e.name??"";P_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])M_(i,t)}async function b4(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},O_).catch(()=>[])}async function w4(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},O_).catch(()=>[])}function S4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function sm(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=b4(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=[],M_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await w4(e)).filter(U=>P_.has(U.role??"")));let w=new Map;for(let O of m){let U=I_(O.name),j=w.get(U);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(U,O)}let S=y.map(O=>({ax:O,dom:w.get(I_(O.name??""))})),k=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);k.sort((O,U)=>{let j=O.dom?.bbox.y??0,$=U.dom?.bbox.y??0;if(j!==$)return j-$;let B=O.dom?.bbox.x??0,P=U.dom?.bbox.x??0;return B-P}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=k.slice(0,n).map((O,U)=>{let j=O.ax.role??"generic",$=O.ax.name??"",B=h4(j,$,U),P=O.dom?.bbox??{x:0,y:0,w:0,h:0},N=O.dom?.type??null,_=null;O.ax.value!==void 0&&O.ax.value!==null&&(_=String(O.ax.value)),O.ax.checked!==void 0&&(_=String(O.ax.checked)),A_({role:j,kind:N})&&(_="[redacted]");let M={disabled:O.ax.disabled??!1};O.ax.checked!==void 0&&(M.checked=O.ax.checked===!0||O.ax.checked==="mixed"),O.ax.selected!==void 0&&(M.selected=O.ax.selected),O.ax.expanded!==void 0&&(M.expanded=O.ax.expanded);let I;O.dom?.testId?I=`[data-testid="${O.dom.testId}"]`:O.dom?.id&&(I=`#${O.dom.id}`);let H={id:B,role:j,label:g4($),kind:N,value:_,state:M,bbox:P};return I!==void 0&&(H.selector=I),H}),D="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?D="loading":O==="interactive"?D="navigating":D="idle"}catch{D="navigating"}D!=="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=y4(f),F=`obs_${t.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:F,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:D,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:C}}var P_,O_,$_=x(()=>{"use strict";Ic();P_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);O_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function D_(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 dS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>D_(e,i)))).filter(o=>o!==null)}async function v4(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 uS(e,t,n){switch(t.kind){case"element_id":return k4(e,t,n);case"selector":return T4(e,t);case"semantic":return E4(e,t)}}async function k4(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 dS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function T4(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 dS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function E4(e,t){return t.role!==void 0?x4(e,t.text,t.role):R4(e,t.text,t)}async function x4(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 dS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function R4(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 v4(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 D_(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 F_=x(()=>{"use strict"});import{randomBytes as A4}from"crypto";import{mkdir as C4,stat as _4,writeFile as I4}from"fs/promises";import{join as pS}from"path";import{gzip as P4}from"zlib";import{promisify as M4}from"util";function O4(e){return pS(Xo(e),"browser")}function $4(e){return pS(O4(e),"screenshots")}function D4(){return new Date().toISOString().replace(/[:.]/g,"-")}function F4(){return A4(3).toString("hex")}async function mS(e,t,n){if(t.length>L_)throw new Error(`writeScreenshotSidecar: buffer exceeds ${L_} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=$4(e);await C4(r,{recursive:!0});let o=`${D4()}-${F4()}-${n}.png`,i=pS(r,o);await I4(i,t);let{size:s}=await _4(i);return{path:i,bytes:s}}var fxe,L_,N_=x(()=>{"use strict";q();Ic();fxe=M4(P4);L_=5*1024*1024});var U_={};Iu(U_,{PlaywrightProvider:()=>fS});function B_(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 fS,j_=x(()=>{"use strict";R_();$_();F_();lS();Ic();N_();fS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new im(t)}async open(t){let n=aS(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 sm(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 sm(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 uS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${B_(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=cS(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=aS(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 sm(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 uS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${B_(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 mS(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 mS(n,o,r);return i}catch{return null}}}});var yi={};Iu(yi,{__resetBrowserRegistryForTests:()=>j4,browserProviderActive:()=>B4,closeBrowserProvider:()=>gS,getBrowserProvider:()=>N4,peekBrowserProvider:()=>U4});function H_(){Promise.resolve(gS()).then(()=>{process.exit(130)})}function W_(){Promise.resolve(gS()).then(()=>{process.exit(143)})}function K_(){Yn=null}function L4(){am||(process.on("SIGINT",H_),process.on("SIGTERM",W_),process.on("exit",K_),am=!0)}function G_(){am&&(process.removeListener("SIGINT",H_),process.removeListener("SIGTERM",W_),process.removeListener("exit",K_),am=!1)}async function N4(e){return Yn!==null?Yn:(hi!==null||(hi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(j_(),U_)),n=x_(e),r=new t(n);return L4(),Yn=r,hi=null,r})()),hi)}async function gS(){if(Yn===null)return;let e=Yn;Yn=null,hi=null,G_(),await e.shutdown()}function B4(){return Yn!==null}function U4(){return Yn}function j4(){Yn=null,hi=null,G_()}var Yn,hi,am,bi=x(()=>{"use strict";lS();Yn=null,hi=null,am=!1});async function q_(e,t){try{return await w_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function z4(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(bi(),yi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function z_(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??z4,o=null,i=e,s=null,a=null;try{let c=await rm(n,e,{headers:q4,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(G4.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(K4.test(d)&&!W4.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await q_(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 q_(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 W4,K4,G4,q4,J_=x(()=>{"use strict";S_();sS();ye();W4=/(text\/html|application\/xhtml\+xml)/i,K4=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,G4=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,q4={"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 V4(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(J4,{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),Y4),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Ar(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 Y_(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?V4({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 V_(e,t){if(t.length===0)return`# Search results for "${e}"
872
872
 
873
873
  (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(`
874
874
  `).trimEnd()}var J4,Y4,X_=x(()=>{"use strict";co();J4="https://api.exa.ai/search",Y4=10});function r8(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=X4;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,Z4)}let a=Q4;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,e8)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function hS(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Er(e,t),truncated:!0}}function o8(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 n8.some(o=>r.includes(o))}function i8(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=r8(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 rm(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=hS(m,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let u=await z_(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=hS(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=o8(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=Y_({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:t8,timeoutMs:i.timeoutMs,signal:s.signal}),m=hS(V_(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 X4,Z4,Q4,e8,t8,n8,Z_,Q_=x(()=>{"use strict";J_();X_();sS();Ks();X4=3e4,Z4=12e4,Q4=1e5,e8=1e6,t8=10,n8=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"];Z_=i8()});import{existsSync as tI,mkdirSync as s8,readFileSync as a8,renameSync as l8,unlinkSync as c8,writeFileSync as d8}from"node:fs";import{dirname as eI,join as u8}from"node:path";import{randomBytes as p8}from"node:crypto";function cn(e){let t=e??hb();if(!tI(t))return[];try{let n=a8(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 wi(e,t){let n=t??hb();s8(eI(n),{recursive:!0});let r=u8(eI(n),`.schedules.json.${process.pid}.${p8(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{d8(r,o,"utf-8"),l8(r,n)}catch(i){try{tI(r)&&c8(r)}catch{}throw i}}function lm(e,t){let n=cn(t),r=n.map(l=>l.id),o=m8(e.name),i=f8(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),wi(n,t),a}function cm(e,t){let n=cn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(wi(o,t),!0)}function Pc(e,t){return cn(t).find(n=>n.id===e)}function m8(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function f8(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function nI(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 dm=x(()=>{"use strict";q()});import{existsSync as g8,readFileSync as h8}from"node:fs";import{join as y8}from"node:path";async function En(e,t,n){let r;try{let o=y8(Bu("default"),"port");if(!g8(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=h8(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 mo,yS=x(()=>{"use strict";q();mo="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 b8}from"node:fs";import{readFile as w8}from"node:fs/promises";var rI,oI,iI,sI,aI=x(()=>{"use strict";dm();q();yS();rI=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=lm({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:mo}})}},oI=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})))}},iI=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(!b8(i))return{content:JSON.stringify([])};let s;try{let c=await w8(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
@@ -1752,7 +1752,7 @@ ${S}
1752
1752
  ${k}`})}return{fileBlocks:a,warnings:l}}async function C1(e,t,n,r,o="summary",i,s){let a=aB(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),Za(process.stdout,Cd(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,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,D=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then($=>{for(let B of $)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${B.jobId}: ${B.label}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,F=()=>new hl({out:yl(i),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(j=>{Ke()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:D}:{},...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=F(),O=async()=>{if(!m){m=!0;try{await C.dispose()}catch{}}},U=async()=>{await C.arm();let j=C.getCompositor();if(i&&j){let $=j;i.fn=B=>$.commitAbove(B),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.($=>C.setInterrupting($)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,C.setSoftStopping(!0),t.interrupt().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),M)});let _=r.subagentControl;_?.hasActiveForeground()&&_.cancelActiveForeground().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(_=>{Ke()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),_)})}),await U(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(D);let{fileBlocks:j,warnings:$}=A1(e.text,{rootDir:process.cwd()});for(let _ of $)(i??{fn:console.log}).fn(p.dim(` @-file: ${_}`));let B=j.length>0||e.attachments.length>0?x1(e.text,e.attachments,void 0,j):e.text,P=t.sendMessageStream(B);if(await js((_,M)=>{C.process(_,M)},async()=>{for await(let _ of P){if(h||y)break;if(_.type==="chunk"&&_.chunk.type==="content"?(l+=_.chunk.content,d=!0):_.type==="message"&&!d&&(l=_.message.content),_.type==="stream_retry"&&(l=l.slice(0,c)),_.type==="chunk"&&_.chunk.type==="tool_use_detail"){let M=_.chunk,I={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};T.set(M.toolUseId,I),k.push(I)}else if(_.type==="chunk"&&_.chunk.type==="tool_result"){let M=_.chunk;c=l.length;let I=T.get(M.toolUseId);if(I&&(I.result=M.content,I.isError=M.isError,T.delete(M.toolUseId)),r.onContextProgress){let H=Date.now();if(H-w>=S){w=H;try{let G=r.onContextProgress();G instanceof Promise&&await G}catch(G){Ke()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),G)}}}}if(_.type==="paused"){if(r.setPausedState?.(!0),await O(),R&&_.autoResume===!0){let M=new AbortController;b.abort=M;let I=_.resetsAt?_.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,H=I?`Keep waiting \u2014 auto-resumes at ${I}`:"Keep waiting \u2014 auto-resume in progress",G="Switch model / provider (type /model after)",Z="Stop waiting",ee=[p.warning(" \u23F3 Usage limit reached.")+(I?p.dim(` Auto-resumes at ${I}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];lr(R,{header:ee,options:[H,G,Z],signal:M.signal,initialIndex:0}).then(ie=>{if(b.abort=null,!ie)return;let z=ie[0];z===void 0||z===H||(y=!0,z===G&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(fe=>{Ke()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),fe)}))}).catch(ie=>{Ke()&&console.error(" "+p.error("picker promise rejected:"),ie)})}else(i??{fn:console.log}).fn(jR({reason:_.reason,..._.resetsAt!==void 0?{resetsAt:_.resetsAt}:{},..._.accountId!==void 0?{accountId:_.accountId}:{},..._.autoResume!==void 0?{autoResume:_.autoResume}:{}}));continue}if(_.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=_.hotSwapped&&_.accountId?`\u25B6 Resumed on ${_.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,k.length=0,T.clear(),f=!1,g=void 0,u=!1,C=F(),m=!1,await U(),(i??{fn:console.log}).fn(p.success(M));continue}if(_.type==="error"){await O(),Ts(ys(_.error)),u=!0;continue}C.process(_),_.type==="done"&&(f=!0,g=_.metadata)}}),await O(),h){let _=i?i.fn:console.log,M=R?R.getPendingCount():0,I=M>0?` \xB7 ${M} queued`:"";_(p.warning(`\u23F8 Stopped${I} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),_("")}if(y){let _=i?i.fn:console.log;_(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),_("")}if(f&&!h&&!y){Oi(n,a,l,g,k),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Xa(process.stdout),XF(process.stdout,"afk: turn complete");let _=I=>{i?i.fn(I):console.log(I)},M=hy(l);if(M){_(E1(M)),_("");let I=vL(k);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:I})}catch{}if(n.permissionMode==="autonomous"){let H=M.kind==="done"&&fc().verifyDone===!0&&!I;TL(M,void 0,{unverified:H})}}if(Gle(g,n,_),r.onAfterTurn){let I=r.onAfterTurn();I instanceof Promise&&await I.catch(()=>{})}}}catch(j){await O(),u||Ts(ys(j))}finally{await O(),Za(process.stdout,Cd(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 Kle(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 Gle(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ve(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=Jk(t),a=Gt(t.model),l=Kle(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 qle=5e3,zle=3,Jle="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Yle(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 _1(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 D=>{Ke()&&(f=Vg(D)),await nu(e.session.current),Ke()&&(g=sE())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,k,T,A=0;for(m.onInjectable=()=>{A>=zle||!o.isAwaitingInput()||!o.bufferIsEmpty()||(A++,Xa(process.stdout),h={text:Jle,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let P of g)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),g=[]}let D=u.drainNotifications();for(let{job:P,result:N}of D){let _=N.errorReason===void 0?"\u2713":"\u2717",M=N.errorReason==="abort"?"killed":N.errorReason==="timeout"?"timed out":N.errorReason==="signal-killed"?"killed by signal":`exit ${N.exitCode??0}`,I=Math.max(0,Math.round(N.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${_} [${P.id}] ${M} \xB7 ${I}s \xB7 `)+P.command)}let R=m.drainNotifications();for(let{job:P}of R){let N=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",_=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,M=P.label.length>60?`${P.label.slice(0,60)}\u2026`:P.label;e.replRenderer.writeLine(p.dim(` ${N} [${P.jobId}] subagent ${P.status} \xB7 ${_}s \xB7 `)+M)}let F=l.renderIfChanged(e.stats.sessionId);if(F.length>0){for(let P of F)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let C,O;if(h===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,h={text:P.message,attachments:[]})}if(h!==void 0){let P=h;h=void 0;let N=vl(e.stats.permissionMode),_=Hi({buffer:P.text,promptText:N,isTTY:!!process.stdout.isTTY,attachmentSummary:sl([...P.attachments])});e.replRenderer.writeLine(_),C=P.text.trim(),O=P.attachments}else{let P=y;y=void 0;let N=await o.readLine({promptFn:()=>vl(e.stats.permissionMode),...P!==void 0?{initialBuffer:P}:{},onSigint:r,onShiftTab:()=>{py(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});C=N.text.trim(),O=N.attachments}if(!C&&O.length===0)continue;if(C.startsWith("!")){let P=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(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 U=!1;if(C.startsWith("/")){let P=await cL(C,e.slashCtx,O);if(P.handled){if(P.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),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){h={text:P.result.message,attachments:O??[]},e.statusLine.rearm();continue}if(P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="prefill"){y=P.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}U=!0}a.push(C),await Yle(e,C);let j=C;if(U){let P=zk(C);if(P){let N=P.name.replace(/^\//,"").split(":").pop()??"";if(N&&nE(N)){let _={skillName:N,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,I=Xi(M),H=Date.now();W(`[afk trace] preflight.start commandName=${N}`);let G=!1,Z=await Vi(_,{cwd:e.stats.cwd??process.cwd(),artifactDir:I},ee=>{Ke()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${N}) failed: `)+(ee instanceof Error?ee.message:String(ee)))});G=Z!==null,W(`[afk trace] preflight.end commandName=${N} durationMs=${Date.now()-H} success=${G}`),j=oE(Z?.manifestBlock,C)}}}let $=u.drainInjections();$.length>0&&(j=$+j);let B=m.drainInjections();if(B.length>0&&(j=B+j),S!==void 0&&(j=S+`
1753
1753
 
1754
1754
  `+j,S=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:j,sessionId:e.stats.sessionId},N=await e.hookRegistry.dispatch(P);N.injectContext&&(j=N.injectContext+j)}catch(P){if(P instanceof he){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(P.reason?p.dim(`: ${Ar(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Wn){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(k=void 0,T=void 0,await C1({text:j,attachments:O},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onTurnComplete(P,N){if(await t.appendTurn(P,N),e.stats.sessionId)try{Mo(e.stats)}catch(_){w||(w=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(_ instanceof Error?_.message:String(_))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,N)=>{d?.push(P),k=P.kind,T=N?.doneHasCorroboratingEvidence},setActiveCompositor:P=>{n.activeCompositor=P},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(ar(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:P=>c.repaint(P)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(vl(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...k!==void 0?{terminalState:k}:{},...T!==void 0?{doneHasCorroboratingEvidence:T}:{}},void 0,qle);P.injectContext&&P.injectContext.trim().length>0&&(S=P.injectContext)}catch(P){if(P instanceof ct)throw P;P instanceof Wn?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):P instanceof he?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${Ar(P.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(P))}}}function Vle(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 I1(e,t,n,r){let o=await l1(),i=new uy({rl:e.rl,history:o,statusLine:e.statusLine}),s=Vle(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await m1(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=T1(e,n),await _1(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)}}dc();Zs();import{execFile as Xle}from"node:child_process";import{dirname as Zle,isAbsolute as Qle,resolve as ece}from"node:path";import{promisify as tce}from"node:util";var P1=tce(Xle),nce=3e3,rce=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function oce(){let t=(await P1("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Qle(t)?t:ece(process.cwd(),t);return Zle(n)}async function M1(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await oce()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),nce)});try{let o=dn({execFile:P1,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=>rce.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}sp();dc();import{promises as ice}from"node:fs";import{dirname as sce,join as D1}from"node:path";import{randomBytes as ace}from"node:crypto";var lce=["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(`
1755
- `),O1=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,CE=30,cce=1024,dce=8e3,uce="haiku";async function pce(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=hce(n,cce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??dce),s=t.signal?yce([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Is({token:t.token,model:t.model??uce,system:lce,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=mce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=sce(t.worktreePath);return await fce(l,c)}function mce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(O1.test(t)&&t.length<=CE)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>CE)break;o=s}return O1.test(o)?o:null}async function fce(e,t){if(!await gce(D1(t,e)))return e;let n=ace(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,CE-5)}-${n}`}async function gce(e){try{return await ice.access(e),!0}catch{return!1}}function hce(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 yce(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 F1(e){let t,n,r=D1(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await pce(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=`${hp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return $1(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 $1(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 $1(e,t){e&&e.setCwd(t),bce(t)}function bce(e){try{process.chdir(e)}catch{}}Ut();q();import{spawn as N1}from"child_process";import{existsSync as B1,mkdirSync as Tce,readFileSync as U1,unlinkSync as L1,writeFileSync as j1}from"fs";import{get as Ece}from"https";import{join as H1}from"path";import{readFileSync as wce}from"fs";import{dirname as Sce,join as vce}from"path";import{fileURLToPath as kce}from"url";function mr(){try{return"5.76.5"}catch{}try{let e=Sce(kce(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(wce(vce(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var xce=64*1024,Rce=10800*1e3,Ace=800,Cce=3600*1e3,_ce="update-check.json",Ice="pending-update.json";function _E(){return H1(fs(),_ce)}function lu(){return H1(fs(),Ice)}function IE(){let e=fs();B1(e)||Tce(e,{recursive:!0})}function W1(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 K1(){try{let e=U1(_E(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function G1(){try{IE();let e=`
1755
+ `),O1=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,CE=30,cce=1024,dce=8e3,uce="haiku";async function pce(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=hce(n,cce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??dce),s=t.signal?yce([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Is({token:t.token,model:t.model??uce,system:lce,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=mce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=sce(t.worktreePath);return await fce(l,c)}function mce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(O1.test(t)&&t.length<=CE)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>CE)break;o=s}return O1.test(o)?o:null}async function fce(e,t){if(!await gce(D1(t,e)))return e;let n=ace(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,CE-5)}-${n}`}async function gce(e){try{return await ice.access(e),!0}catch{return!1}}function hce(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 yce(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 F1(e){let t,n,r=D1(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await pce(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=`${hp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return $1(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 $1(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 $1(e,t){e&&e.setCwd(t),bce(t)}function bce(e){try{process.chdir(e)}catch{}}Ut();q();import{spawn as N1}from"child_process";import{existsSync as B1,mkdirSync as Tce,readFileSync as U1,unlinkSync as L1,writeFileSync as j1}from"fs";import{get as Ece}from"https";import{join as H1}from"path";import{readFileSync as wce}from"fs";import{dirname as Sce,join as vce}from"path";import{fileURLToPath as kce}from"url";function mr(){try{return"5.76.6"}catch{}try{let e=Sce(kce(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(wce(vce(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var xce=64*1024,Rce=10800*1e3,Ace=800,Cce=3600*1e3,_ce="update-check.json",Ice="pending-update.json";function _E(){return H1(fs(),_ce)}function lu(){return H1(fs(),Ice)}function IE(){let e=fs();B1(e)||Tce(e,{recursive:!0})}function W1(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 K1(){try{let e=U1(_E(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function G1(){try{IE();let e=`
1756
1756
  const https = require('https');
1757
1757
  const fs = require('fs');
1758
1758
  const url = 'https://registry.npmjs.org/agent-afk/latest';