agent-afk 5.81.1 → 5.81.2
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 +2 -2
- package/dist/index.mjs +131 -127
- package/dist/telegram/streaming.d.ts +5 -0
- package/dist/telegram.mjs +172 -168
- package/package.json +1 -1
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 l4,B_,U_=x(()=>{"use strict";Xn();l4=new Set(["node_modules",".git",".hg",".svn"]);B_=TS()});import{accessSync as p4,constants as m4}from"node:fs";function j_(e){try{p4(e,m4.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 H_=x(()=>{"use strict"});import{spawn as f4}from"child_process";function g4(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=an(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 ES(e){return async(t,n,r)=>{let{pattern:o,path:i,include:s}=g4(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(T){c||(c=!0,n.removeEventListener("abort",S),l(T))}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=f4(a,u,m!==void 0?{cwd:m}:{}),g="",h="",y=0,b=!1;function w(T){if(b||c||y<8e6)return;b=!0,console.warn(`[grep] overflow kill: stream=${T} totalBytes=${y} pattern=${o} path=${i}`),$e({event:"tool.overflow_kill",tool:"grep",total_bytes:y,stream:T}),f.kill("SIGKILL");let k=Vn((g+h).trimEnd()),A=Ar(k,1e5)+Qp;d({content:A,truncated:!0})}f.stdout.on("data",T=>{let k=8e6-y,A=T.length<=k?T:T.subarray(0,Math.max(0,k));y+=A.length,g+=A.toString("utf8"),w("stdout")}),f.stderr.on("data",T=>{let k=8e6-y,A=T.length<=k?T:T.subarray(0,Math.max(0,k));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",T=>{if(b)return;if(T===1){let F=`No matches found for '${o}' in ${i}`;d({content:F});return}if(T===2){let F=Gs(h.trim());d({content:`grep error: ${F.content}`,isError:!0,...F.truncated?{truncated:!0}:{}});return}let k=Vn(g.trimEnd()),A=Gs(k);d({content:A.content,...A.truncated?{truncated:!0}:{}})}),f.on("error",T=>{let k=j_(a);if(k!==void 0){d({content:`Failed to execute grep: ${k}`,isError:!0});return}let A;if(m===void 0&&Pc(T))try{A=Xs(T,process.cwd())}catch{A=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${T.message}`}else A=Xs(T,m);d({content:`Failed to execute grep: ${A}`,isError:!0})})})}}var W_,K_=x(()=>{"use strict";Jn();Xn();po();hS();H_();qs();W_=ES()});import{promises as h4}from"fs";function xS(e){return(t,n,r)=>y4(t,n,r,e)}var y4,G_,q_=x(()=>{"use strict";Xn();y4=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=an(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await h4.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}}};G_=xS()});function b4(e=Bs){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>z_)return{content:`Invalid input: message exceeds Telegram's ${z_}-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=Op(i,$p());if(!c.ok)return{content:c.message,isError:!0};let d=Os(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(!Tp(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=Ns();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 z_,J_,Y_=x(()=>{"use strict";G();Tr();wc();Ep();z_=4096;J_=b4()});async function w4(){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 S4(){return RS===null&&(RS=w4()),RS}function V_(e){return e.replace(/\n{3,}/g,`
|
|
870
870
|
|
|
871
|
-
`).trim()}function v4(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function X_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await S4(),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=V_(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=V_(o.turndown(d));return{title:a,markdown:u,textLength:v4(c),usedFallback:!0}}var RS,Q_=x(()=>{"use strict";RS=null});function T4(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 Z_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function E4(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 ym(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??T4,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(!k4.has(u.status)||d===o)return u;let m=E4(u,s)??Z_(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=Z_(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 k4,AS=x(()=>{"use strict";ye();k4=new Set([429,502,503,504])});import{readFileSync as x4}from"node:fs";import{join as R4}from"path";function A4(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function eI(e,t){return A4(t).test(e)}function I4(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(C4.has(t))return!0;if(_4.has(t))return!1}return!1}function tI(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function P4(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 nI(e){let t=e===void 0||e.trim()===""?"default":e.trim();return tc(t),t}function M4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function O4(e){try{return x4(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function $4(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=nI(t.defaultProfile)),n}function rI(e){let t=e?.env??v,n=e?.readFileSync??O4,r=e?.surface??t.AGENT_SURFACE,o=I4(t.AFK_BROWSER_HEADLESS,r),i=tI(t.AFK_BROWSER_ALLOWED_DOMAINS),s=tI(t.AFK_BROWSER_BLOCKED_DOMAINS),a=M4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=P4(t.AFK_BROWSER_BACKEND),c=nI(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():R4(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=$4(d,g);return h.configPath=m,h}function CS(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(eI(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>eI(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var C4,_4,_S=x(()=>{"use strict";G();q();C4=new Set(["daemon","subagent","telegram","afk"]),_4=new Set(["repl","interactive","cli"])});import hi from"node:fs";import bm from"node:path";import{randomBytes as D4}from"node:crypto";import{chromium as F4}from"playwright";function L4(){try{return"5.81.1"}catch{}try{let e=bm.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var N4,wm,oI=x(()=>{"use strict";q();ye();N4=L4(),wm=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=F4.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/${N4}`}}loadStorageState(t){let n=nc(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nc(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=bm.join(bm.dirname(r),`.${bm.basename(r)}.${process.pid}.${D4(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as B4}from"crypto";function IS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of U4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function iI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&j4.test(e.label))}function sI(e){return B4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function aI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var U4,j4,$c=x(()=>{"use strict";U4=[{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}];j4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as H4}from"node:crypto";function W4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function K4(e,t,n){return`el_${H4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function G4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function lI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function dI(e,t){let n=e.role??"",r=e.name??"";cI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])dI(i,t)}async function q4(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},uI).catch(()=>[])}async function z4(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},uI).catch(()=>[])}function J4(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=J4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=q4(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=[],dI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await z4(e)).filter(B=>cI.has(B.role??"")));let w=new Map;for(let O of m){let B=lI(O.name),j=w.get(B);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(B,O)}let S=y.map(O=>({ax:O,dom:w.get(lI(O.name??""))})),T=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,B)=>{let j=O.dom?.bbox.y??0,$=B.dom?.bbox.y??0;if(j!==$)return j-$;let H=O.dom?.bbox.x??0,C=B.dom?.bbox.x??0;return H-C}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,B)=>{let j=O.ax.role??"generic",$=O.ax.name??"",H=K4(j,$,B),C=O.dom?.bbox??{x:0,y:0,w:0,h:0},L=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),iI({role:j,kind:L})&&(P="[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 U={id:H,role:j,label:W4($),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(U.selector=I),U}),F="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?F="loading":O==="interactive"?F="navigating":F="idle"}catch{F="navigating"}F!=="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=G4(f),D=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:F,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var cI,uI,pI=x(()=>{"use strict";$c();cI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);uI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function mI(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 PS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>mI(e,i)))).filter(o=>o!==null)}async function Y4(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 MS(e,t,n){switch(t.kind){case"element_id":return V4(e,t,n);case"selector":return X4(e,t);case"semantic":return Q4(e,t)}}async function V4(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 PS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function X4(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 PS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Q4(e,t){return t.role!==void 0?Z4(e,t.text,t.role):e8(e,t.text,t)}async function Z4(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 PS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function e8(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 Y4(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 mI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>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 fI=x(()=>{"use strict"});import{randomBytes as t8}from"crypto";import{mkdir as n8,stat as r8,writeFile as o8}from"fs/promises";import{join as OS}from"path";import{gzip as i8}from"zlib";import{promisify as s8}from"util";function a8(e){return OS(Xo(e),"browser")}function l8(e){return OS(a8(e),"screenshots")}function c8(){return new Date().toISOString().replace(/[:.]/g,"-")}function d8(){return t8(3).toString("hex")}async function $S(e,t,n){if(t.length>gI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${gI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=l8(e);await n8(r,{recursive:!0});let o=`${c8()}-${d8()}-${n}.png`,i=OS(r,o);await o8(i,t);let{size:s}=await r8(i);return{path:i,bytes:s}}var sRe,gI,hI=x(()=>{"use strict";q();$c();sRe=s8(i8);gI=5*1024*1024});var bI={};Bu(bI,{PlaywrightProvider:()=>DS});function yI(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 DS,wI=x(()=>{"use strict";oI();pI();fI();_S();$c();hI();DS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new wm(t)}async open(t){let n=CS(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 MS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${yI(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=IS(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=CS(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 MS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${yI(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 $S(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 $S(n,o,r);return i}catch{return null}}}});var bi={};Bu(bi,{__resetBrowserRegistryForTests:()=>g8,browserProviderActive:()=>m8,closeBrowserProvider:()=>FS,getBrowserProvider:()=>p8,peekBrowserProvider:()=>f8});function SI(){Promise.resolve(FS()).then(()=>{process.exit(130)})}function vI(){Promise.resolve(FS()).then(()=>{process.exit(143)})}function kI(){Qn=null}function u8(){vm||(process.on("SIGINT",SI),process.on("SIGTERM",vI),process.on("exit",kI),vm=!0)}function TI(){vm&&(process.removeListener("SIGINT",SI),process.removeListener("SIGTERM",vI),process.removeListener("exit",kI),vm=!1)}async function p8(e){return Qn!==null?Qn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(wI(),bI)),n=rI(e),r=new t(n);return u8(),Qn=r,yi=null,r})()),yi)}async function FS(){if(Qn===null)return;let e=Qn;Qn=null,yi=null,TI(),await e.shutdown()}function m8(){return Qn!==null}function f8(){return Qn}function g8(){Qn=null,yi=null,TI()}var Qn,yi,vm,wi=x(()=>{"use strict";_S();Qn=null,yi=null,vm=!1});async function EI(e,t){try{return await X_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function v8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function xI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??v8,o=null,i=e,s=null,a=null;try{let c=await ym(n,e,{headers:S8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(w8.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(b8.test(d)&&!y8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await EI(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 EI(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 y8,b8,w8,S8,RI=x(()=>{"use strict";Q_();AS();ye();y8=/(text\/html|application\/xhtml\+xml)/i,b8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,w8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,S8={"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 E8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(k8,{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),T8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(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 AI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?E8({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 CI(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
871
|
+
`).trim()}function v4(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function X_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await S4(),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=V_(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=V_(o.turndown(d));return{title:a,markdown:u,textLength:v4(c),usedFallback:!0}}var RS,Q_=x(()=>{"use strict";RS=null});function T4(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 Z_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function E4(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 ym(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??T4,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(!k4.has(u.status)||d===o)return u;let m=E4(u,s)??Z_(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=Z_(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 k4,AS=x(()=>{"use strict";ye();k4=new Set([429,502,503,504])});import{readFileSync as x4}from"node:fs";import{join as R4}from"path";function A4(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function eI(e,t){return A4(t).test(e)}function I4(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(C4.has(t))return!0;if(_4.has(t))return!1}return!1}function tI(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function P4(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 nI(e){let t=e===void 0||e.trim()===""?"default":e.trim();return tc(t),t}function M4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function O4(e){try{return x4(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function $4(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=nI(t.defaultProfile)),n}function rI(e){let t=e?.env??v,n=e?.readFileSync??O4,r=e?.surface??t.AGENT_SURFACE,o=I4(t.AFK_BROWSER_HEADLESS,r),i=tI(t.AFK_BROWSER_ALLOWED_DOMAINS),s=tI(t.AFK_BROWSER_BLOCKED_DOMAINS),a=M4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=P4(t.AFK_BROWSER_BACKEND),c=nI(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():R4(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=$4(d,g);return h.configPath=m,h}function CS(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(eI(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>eI(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var C4,_4,_S=x(()=>{"use strict";G();q();C4=new Set(["daemon","subagent","telegram","afk"]),_4=new Set(["repl","interactive","cli"])});import hi from"node:fs";import bm from"node:path";import{randomBytes as D4}from"node:crypto";import{chromium as F4}from"playwright";function L4(){try{return"5.81.2"}catch{}try{let e=bm.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var N4,wm,oI=x(()=>{"use strict";q();ye();N4=L4(),wm=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=F4.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/${N4}`}}loadStorageState(t){let n=nc(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=nc(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=bm.join(bm.dirname(r),`.${bm.basename(r)}.${process.pid}.${D4(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as B4}from"crypto";function IS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of U4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function iI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&j4.test(e.label))}function sI(e){return B4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function aI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var U4,j4,$c=x(()=>{"use strict";U4=[{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}];j4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as H4}from"node:crypto";function W4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function K4(e,t,n){return`el_${H4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function G4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function lI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function dI(e,t){let n=e.role??"",r=e.name??"";cI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])dI(i,t)}async function q4(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},uI).catch(()=>[])}async function z4(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},uI).catch(()=>[])}function J4(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=J4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=q4(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=[],dI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await z4(e)).filter(B=>cI.has(B.role??"")));let w=new Map;for(let O of m){let B=lI(O.name),j=w.get(B);(!j||j.bbox.w===0&&O.bbox.w>0)&&w.set(B,O)}let S=y.map(O=>({ax:O,dom:w.get(lI(O.name??""))})),T=r?S:S.filter(O=>O.dom?O.dom.bbox.w>0||O.dom.bbox.h>0:!0);T.sort((O,B)=>{let j=O.dom?.bbox.y??0,$=B.dom?.bbox.y??0;if(j!==$)return j-$;let H=O.dom?.bbox.x??0,C=B.dom?.bbox.x??0;return H-C}),T.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=T.slice(0,n).map((O,B)=>{let j=O.ax.role??"generic",$=O.ax.name??"",H=K4(j,$,B),C=O.dom?.bbox??{x:0,y:0,w:0,h:0},L=O.dom?.type??null,P=null;O.ax.value!==void 0&&O.ax.value!==null&&(P=String(O.ax.value)),O.ax.checked!==void 0&&(P=String(O.ax.checked)),iI({role:j,kind:L})&&(P="[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 U={id:H,role:j,label:W4($),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(U.selector=I),U}),F="idle";try{let O=await e.evaluate(()=>document.readyState);O==="loading"?F="loading":O==="interactive"?F="navigating":F="idle"}catch{F="navigating"}F!=="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=G4(f),D=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:D,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:F,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var cI,uI,pI=x(()=>{"use strict";$c();cI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);uI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function mI(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 PS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>mI(e,i)))).filter(o=>o!==null)}async function Y4(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 MS(e,t,n){switch(t.kind){case"element_id":return V4(e,t,n);case"selector":return X4(e,t);case"semantic":return Q4(e,t)}}async function V4(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 PS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function X4(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 PS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Q4(e,t){return t.role!==void 0?Z4(e,t.text,t.role):e8(e,t.text,t)}async function Z4(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 PS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function e8(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 Y4(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 mI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let T=0;T<w.length;T++)S=S*31+w.charCodeAt(T)>>>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 fI=x(()=>{"use strict"});import{randomBytes as t8}from"crypto";import{mkdir as n8,stat as r8,writeFile as o8}from"fs/promises";import{join as OS}from"path";import{gzip as i8}from"zlib";import{promisify as s8}from"util";function a8(e){return OS(Xo(e),"browser")}function l8(e){return OS(a8(e),"screenshots")}function c8(){return new Date().toISOString().replace(/[:.]/g,"-")}function d8(){return t8(3).toString("hex")}async function $S(e,t,n){if(t.length>gI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${gI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=l8(e);await n8(r,{recursive:!0});let o=`${c8()}-${d8()}-${n}.png`,i=OS(r,o);await o8(i,t);let{size:s}=await r8(i);return{path:i,bytes:s}}var sRe,gI,hI=x(()=>{"use strict";q();$c();sRe=s8(i8);gI=5*1024*1024});var bI={};Bu(bI,{PlaywrightProvider:()=>DS});function yI(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 DS,wI=x(()=>{"use strict";oI();pI();fI();_S();$c();hI();DS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new wm(t)}async open(t){let n=CS(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 MS(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${yI(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=IS(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=CS(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 MS(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${yI(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 $S(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 $S(n,o,r);return i}catch{return null}}}});var bi={};Bu(bi,{__resetBrowserRegistryForTests:()=>g8,browserProviderActive:()=>m8,closeBrowserProvider:()=>FS,getBrowserProvider:()=>p8,peekBrowserProvider:()=>f8});function SI(){Promise.resolve(FS()).then(()=>{process.exit(130)})}function vI(){Promise.resolve(FS()).then(()=>{process.exit(143)})}function kI(){Qn=null}function u8(){vm||(process.on("SIGINT",SI),process.on("SIGTERM",vI),process.on("exit",kI),vm=!0)}function TI(){vm&&(process.removeListener("SIGINT",SI),process.removeListener("SIGTERM",vI),process.removeListener("exit",kI),vm=!1)}async function p8(e){return Qn!==null?Qn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(wI(),bI)),n=rI(e),r=new t(n);return u8(),Qn=r,yi=null,r})()),yi)}async function FS(){if(Qn===null)return;let e=Qn;Qn=null,yi=null,TI(),await e.shutdown()}function m8(){return Qn!==null}function f8(){return Qn}function g8(){Qn=null,yi=null,TI()}var Qn,yi,vm,wi=x(()=>{"use strict";_S();Qn=null,yi=null,vm=!1});async function EI(e,t){try{return await X_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function v8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function xI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??v8,o=null,i=e,s=null,a=null;try{let c=await ym(n,e,{headers:S8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(w8.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(b8.test(d)&&!y8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await EI(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 EI(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 y8,b8,w8,S8,RI=x(()=>{"use strict";Q_();AS();ye();y8=/(text\/html|application\/xhtml\+xml)/i,b8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,w8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,S8={"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 E8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(k8,{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),T8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(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 AI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?E8({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 CI(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 k8,T8,_I=x(()=>{"use strict";po();k8="https://api.exa.ai/search",T8=10});function P8(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=x8;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,R8)}let a=A8;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,C8)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function LS(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Ar(e,t),truncated:!0}}function M8(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 I8.some(o=>r.includes(o))}function O8(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=P8(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 ym(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=LS(m,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let u=await xI(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=LS(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=M8(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=AI({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:_8,timeoutMs:i.timeoutMs,signal:s.signal}),m=LS(CI(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 x8,R8,A8,C8,_8,I8,II,PI=x(()=>{"use strict";RI();_I();AS();qs();x8=3e4,R8=12e4,A8=1e5,C8=1e6,_8=10,I8=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"];II=O8()});import{existsSync as OI,mkdirSync as $8,readFileSync as D8,renameSync as F8,unlinkSync as L8,writeFileSync as N8}from"node:fs";import{dirname as MI,join as B8}from"node:path";import{randomBytes as U8}from"node:crypto";function ln(e){let t=e??$b();if(!OI(t))return[];try{let n=D8(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 Si(e,t){let n=t??$b();$8(MI(n),{recursive:!0});let r=B8(MI(n),`.schedules.json.${process.pid}.${U8(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{N8(r,o,"utf-8"),F8(r,n)}catch(i){try{OI(r)&&L8(r)}catch{}throw i}}function km(e,t){let n=ln(t),r=n.map(l=>l.id),o=j8(e.name),i=H8(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Si(n,t),a}function Tm(e,t){let n=ln(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Si(o,t),!0)}function Dc(e,t){return ln(t).find(n=>n.id===e)}function j8(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function H8(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function $I(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 Em=x(()=>{"use strict";q()});import{existsSync as W8,readFileSync as K8}from"node:fs";import{join as G8}from"node:path";async function xn(e,t,n){let r;try{let o=G8(Ju("default"),"port");if(!W8(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=K8(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 go,NS=x(()=>{"use strict";q();go="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 q8}from"node:fs";import{readFile as z8}from"node:fs/promises";var DI,FI,LI,NI,BI=x(()=>{"use strict";Em();q();NS();DI=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=km({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 xn("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 xn("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:go}})}},FI=async(e,t)=>{let n=ln();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})))}},LI=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=Bn();if(!q8(i))return{content:JSON.stringify([])};let s;try{let c=await z8(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
|
${T}`})}return{fileBlocks:a,warnings:l}}async function eH(e,t,n,r,o="summary",i,s){let a=OB(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),nl(process.stdout,Ld(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,T=[],k=new Map,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,F=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then($=>{for(let H of $)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${H.jobId}: ${H.label}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,D=()=>new Sl({out:vl(i),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(j=>{Ke()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:F}:{},...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}:{}}),_=D(),O=async()=>{if(!m){m=!0;try{await _.dispose()}catch{}}},B=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let $=j;i.fn=H=>$.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.($=>_.setInterrupting($)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,_.setSoftStopping(!0),t.interrupt().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),M)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(P=>{Ke()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),P)})}),await B(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(F);let{fileBlocks:j,warnings:$}=Z1(e.text,{rootDir:process.cwd()});for(let P of $)(i??{fn:console.log}).fn(p.dim(` @-file: ${P}`));let H=j.length>0||e.attachments.length>0?X1(e.text,e.attachments,void 0,j):e.text,C=t.sendMessageStream(H);if(await Ws((P,M)=>{_.process(P,M)},async()=>{for await(let P of C){if(h||y)break;if(P.type==="chunk"&&P.chunk.type==="content"?(l+=P.chunk.content,d=!0):P.type==="message"&&!d&&(l=P.message.content),P.type==="stream_retry"&&(l=l.slice(0,c)),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let M=P.chunk,I={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};k.set(M.toolUseId,I),T.push(I)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let M=P.chunk;c=l.length;let I=k.get(M.toolUseId);if(I&&(I.result=M.content,I.isError=M.isError,k.delete(M.toolUseId)),r.onContextProgress){let U=Date.now();if(U-w>=S){w=U;try{let K=r.onContextProgress();K instanceof Promise&&await K}catch(K){Ke()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),K)}}}}if(P.type==="paused"){if(r.setPausedState?.(!0),await O(),R&&P.autoResume===!0){let M=new AbortController;b.abort=M;let I=P.resetsAt?P.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,U=I?`Keep waiting \u2014 auto-resumes at ${I}`:"Keep waiting \u2014 auto-resume in progress",K="Switch model / provider (type /model after)",Z="Stop waiting",te=[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."),""];dr(R,{header:te,options:[U,K,Z],signal:M.signal,initialIndex:0}).then(se=>{if(b.abort=null,!se)return;let z=se[0];z===void 0||z===U||(y=!0,z===K&&(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(se=>{Ke()&&console.error(" "+p.error("picker promise rejected:"),se)})}else(i??{fn:console.log}).fn(dA({reason:P.reason,...P.resetsAt!==void 0?{resetsAt:P.resetsAt}:{},...P.accountId!==void 0?{accountId:P.accountId}:{},...P.autoResume!==void 0?{autoResume:P.autoResume}:{}}));continue}if(P.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,T.length=0,k.clear(),f=!1,g=void 0,u=!1,_=D(),m=!1,await B(),(i??{fn:console.log}).fn(p.success(M));continue}if(P.type==="error"){await O(),xs(ws(P.error)),u=!0;continue}_.process(P),P.type==="done"&&(f=!0,g=P.metadata)}}),await O(),h){let P=i?i.fn:console.log,M=R?R.getPendingCount():0,I=M>0?` \xB7 ${M} queued`:"";P(p.warning(`\u23F8 Stopped${I} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),P("")}if(y){let P=i?i.fn:console.log;P(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(f&&!h&&!y){Di(n,a,l,g,T),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),tl(process.stdout),kL(process.stdout,"afk: turn complete");let P=I=>{i?i.fn(I):console.log(I)},M=$y(l);if(M){P(V1(M)),P("");let I=zL(T);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:I})}catch{}if(n.permissionMode==="autonomous"){let U=M.kind==="done"&&bc().verifyDone===!0&&!I;YL(M,void 0,{unverified:U})}}if(Ice(g,n,P),r.onAfterTurn){let I=r.onAfterTurn();I instanceof Promise&&await I.catch(()=>{})}}}catch(j){await O(),u||xs(ws(j))}finally{await O(),nl(process.stdout,Ld(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 _ce(e,t){let n=Math.round(e*100),r=ue(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ue(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 Ice(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(ue(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=yT(t),a=qt(t.model),l=_ce(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 Pce=5e3,Mce=3,Oce="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function $ce(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 tH(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 F=>{Ke()&&(f=mh(F)),await uu(e.session.current),Ke()&&(g=_E())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,T,k,A=0;for(m.onInjectable=()=>{A>=Mce||!o.isAwaitingInput()||!o.bufferIsEmpty()||(A++,tl(process.stdout),h={text:Oce,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let C of g)e.replRenderer.writeLine(C);e.replRenderer.writeLine(""),g=[]}let F=u.drainNotifications();for(let{job:C,result:L}of F){let P=L.errorReason===void 0?"\u2713":"\u2717",M=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,I=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${P} [${C.id}] ${M} \xB7 ${I}s \xB7 `)+C.command)}let R=m.drainNotifications();for(let{job:C}of R){let L=C.status==="completed"?"\u2713":C.status==="failed"?"\u2717":"\u2298",P=C.endedAt!==void 0?Math.max(0,Math.round((C.endedAt-C.startedAt)/100)/10):0,M=C.label.length>60?`${C.label.slice(0,60)}\u2026`:C.label;e.replRenderer.writeLine(p.dim(` ${L} [${C.jobId}] subagent ${C.status} \xB7 ${P}s \xB7 `)+M)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let C of D)e.replRenderer.writeLine(C);e.replRenderer.writeLine("")}let _,O;if(h===void 0){let C=await e.session.current.takePendingPlanExitSeed();C!==void 0&&(e.stats.permissionMode=C.mode,h={text:C.message,attachments:[]})}if(h!==void 0){let C=h;h=void 0;let L=xl(e.stats.permissionMode),P=Ki({buffer:C.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:dl([...C.attachments])});e.replRenderer.writeLine(P),_=C.text.trim(),O=C.attachments}else{let C=y;y=void 0;let L=await o.readLine({promptFn:()=>xl(e.stats.permissionMode),...C!==void 0?{initialBuffer:C}:{},onSigint:r,onShiftTab:()=>{Iy(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});_=L.text.trim(),O=L.attachments}if(!_&&O.length===0)continue;if(_.startsWith("!")){let C=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!C&&(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(_))){e.statusLine.rearm();continue}}let B=!1;if(_.startsWith("/")){let C=await $L(_,e.slashCtx,O);if(C.handled){if(C.result==="exit"){e.rl.close();return}if((_==="/clear"||_.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),S=void 0),C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="submit"){h={text:C.result.message,attachments:O??[]},e.statusLine.rearm();continue}if(C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="prefill"){y=C.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}a.push(_),await $ce(e,_);let j=_;if(B){let C=hT(_);if(C){let L=C.name.replace(/^\//,"").split(":").pop()??"";if(L&&xE(L)){let P={skillName:L,rawArgs:C.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,I=Zi(M),U=Date.now();W(`[afk trace] preflight.start commandName=${L}`);let K=!1,Z=await Qi(P,{cwd:e.stats.cwd??process.cwd(),artifactDir:I},te=>{Ke()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${L}) failed: `)+(te instanceof Error?te.message:String(te)))});K=Z!==null,W(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-U} success=${K}`),j=AE(Z?.manifestBlock,_)}}}let $=u.drainInjections();$.length>0&&(j=$+j);let H=m.drainInjections();if(H.length>0&&(j=H+j),S!==void 0&&(j=S+`
|
|
1753
1753
|
|
|
1754
1754
|
`+j,S=void 0),e.hookRegistry)try{let C={event:"UserPromptSubmit",prompt:j,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(C);L.injectContext&&(j=L.injectContext+j)}catch(C){if(C instanceof he){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(C.reason?p.dim(`: ${_r(C.reason)}`):"")),e.statusLine.rearm();continue}if(C instanceof qn){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${C.timeoutMs}ms`)),e.statusLine.rearm();continue}throw C}if(T=void 0,k=void 0,await eH({text:j,attachments:O},e.session.current,e.stats,{setInFlight(C){n.turnInFlight=C},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(C){await t.appendUser(C)},async onTurnComplete(C,L){if(await t.appendTurn(C,L),e.stats.sessionId)try{Mo(e.stats)}catch(P){w||(w=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(P instanceof Error?P.message:String(P))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(C,L)=>{d?.push(C),T=C.kind,k=L?.doneHasCorroboratingEvidence},setActiveCompositor:C=>{n.activeCompositor=C},setInterruptNotifier:C=>{n.notifyInterrupting=C},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:C=>o.setBackgroundHandler(C),setSoftStopHandler:i,setPausedState:C=>o.setPausedState(C),setPauseInterruptHandler:C=>o.setPauseInterruptHandler(C),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:C=>c.repaint(C)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(xl(e.stats.permissionMode))),e.hookRegistry)try{let C=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...T!==void 0?{terminalState:T}:{},...k!==void 0?{doneHasCorroboratingEvidence:k}:{}},void 0,Pce);C.injectContext&&C.injectContext.trim().length>0&&(S=C.injectContext)}catch(C){if(C instanceof ct)throw C;C instanceof qn?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):C instanceof he?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${_r(C.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(C))}}}function Dce(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 nH(e,t,n,r){let o=await $1(),i=new _y({rl:e.rl,history:o,statusLine:e.statusLine}),s=Dce(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await B1(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=Y1(e,n),await tH(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)}}fc();ea();import{execFile as Fce}from"node:child_process";import{dirname as Lce,isAbsolute as Nce,resolve as Bce}from"node:path";import{promisify as Uce}from"node:util";var rH=Uce(Fce),jce=3e3,Hce=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Wce(){let t=(await rH("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Nce(t)?t:Bce(process.cwd(),t);return Lce(n)}async function oH(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Wce()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),jce)});try{let o=cn({execFile:rH,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=>Hce.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}gp();fc();import{promises as Kce}from"node:fs";import{dirname as Gce,join as aH}from"node:path";import{randomBytes as qce}from"node:crypto";var zce=["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
|
-
`),iH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,XE=30,Jce=1024,Yce=8e3,Vce="haiku";async function Xce(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=tde(n,Jce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Yce),s=t.signal?nde([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ms({token:t.token,model:t.model??Vce,system:zce,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=Qce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Gce(t.worktreePath);return await Zce(l,c)}function Qce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(iH.test(t)&&t.length<=XE)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>XE)break;o=s}return iH.test(o)?o:null}async function Zce(e,t){if(!await ede(aH(t,e)))return e;let n=qce(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,XE-5)}-${n}`}async function ede(e){try{return await Kce.access(e),!0}catch{return!1}}function tde(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 nde(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 lH(e){let t,n,r=aH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Xce(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=`${Ap(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return sH(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 sH(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 sH(e,t){e&&e.setCwd(t),rde(t)}function rde(e){try{process.chdir(e)}catch{}}jt();q();import{spawn as dH}from"child_process";import{existsSync as uH,mkdirSync as lde,readFileSync as pH,unlinkSync as cH,writeFileSync as mH}from"fs";import{get as cde}from"https";import{join as fH}from"path";import{readFileSync as ode}from"fs";import{dirname as ide,join as sde}from"path";import{fileURLToPath as ade}from"url";function gr(){try{return"5.81.
|
|
1755
|
+
`),iH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,XE=30,Jce=1024,Yce=8e3,Vce="haiku";async function Xce(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=tde(n,Jce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Yce),s=t.signal?nde([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ms({token:t.token,model:t.model??Vce,system:zce,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=Qce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Gce(t.worktreePath);return await Zce(l,c)}function Qce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(iH.test(t)&&t.length<=XE)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>XE)break;o=s}return iH.test(o)?o:null}async function Zce(e,t){if(!await ede(aH(t,e)))return e;let n=qce(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,XE-5)}-${n}`}async function ede(e){try{return await Kce.access(e),!0}catch{return!1}}function tde(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 nde(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 lH(e){let t,n,r=aH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Xce(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=`${Ap(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return sH(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 sH(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 sH(e,t){e&&e.setCwd(t),rde(t)}function rde(e){try{process.chdir(e)}catch{}}jt();q();import{spawn as dH}from"child_process";import{existsSync as uH,mkdirSync as lde,readFileSync as pH,unlinkSync as cH,writeFileSync as mH}from"fs";import{get as cde}from"https";import{join as fH}from"path";import{readFileSync as ode}from"fs";import{dirname as ide,join as sde}from"path";import{fileURLToPath as ade}from"url";function gr(){try{return"5.81.2"}catch{}try{let e=ide(ade(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(ode(sde(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var dde=64*1024,ude=10800*1e3,pde=800,mde=3600*1e3,fde="update-check.json",gde="pending-update.json";function QE(){return fH(hs(),fde)}function yu(){return fH(hs(),gde)}function ZE(){let e=hs();uH(e)||lde(e,{recursive:!0})}function gH(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 hH(){try{let e=pH(QE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function yH(){try{ZE();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';
|