agent-afk 5.158.0 → 5.158.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +2 -2
- package/dist/index.mjs +170 -170
- package/dist/telegram/session-manager.hydrate-stats.d.ts +4 -0
- package/dist/telegram.mjs +257 -257
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -386,7 +386,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
|
|
|
386
386
|
|
|
387
387
|
${t}`}var ohe,eC=y(()=>{"use strict";ohe=new Set(["script","style","noscript","template","svg"])});function ahe(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 Yj(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function lhe(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 Jj(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??ahe,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!she.has(d.status)||u===o)return d;let p=lhe(d,s)??Yj(u,i,s);B("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=Yj(u,i,s);B("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var she,Xj=y(()=>{"use strict";ue();she=new Set([429,502,503,504])});import{BlockList as che,isIP as nC}from"node:net";import{lookup as uhe}from"node:dns/promises";import{Agent as dhe}from"undici";function Zj(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function ghe(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function tC(e){let t=nC(e);return t===0?!1:fhe.check(e,t===4?"ipv4":"ipv6")}async function e1(e){return uhe(e,{all:!0,verbatim:!0})}async function rC(e,t={}){if(t.allowPrivateHosts??Zj())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=ghe(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(nC(r)!==0)return tC(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??e1,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(tC(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function lm(e,t={}){let n=await rC(e,t);if(!n.allowed)throw new dr(n.reason)}async function lb(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=Qj;s++){await lm(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??Zj())?{dispatcher:hhe}:{}},l=await Jj(e,i,a,r.retry??{});if(!yhe.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new dr(`too many redirects (>${Qj}) starting from ${t}`)}var phe,mhe,fhe,dr,hhe,Qj,yhe,oC=y(()=>{"use strict";L();Xj();phe=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],mhe=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],fhe=(()=>{let e=new che;for(let[t,n]of phe)e.addSubnet(t,n,"ipv4");for(let[t,n]of mhe)e.addSubnet(t,n,"ipv6");return e})(),dr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};hhe=new dhe({connect:{lookup(e,t,n){e1(e).then(r=>{let o=r.find(s=>tC(s.address));if(o!==void 0){n(new dr(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,nC(i.address))},r=>n(r,"",0))}}});Qj=20,yhe=new Set([301,302,303,307,308])});import{readFileSync as bhe}from"node:fs";import{join as She}from"path";function whe(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function t1(e,t){return whe(t).test(e)}function The(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(vhe.has(t))return!0;if(khe.has(t))return!1}return!1}function n1(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Ehe(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 r1(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ml(t),t}function Rhe(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function xhe(e){try{return bhe(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Ahe(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=r1(t.defaultProfile)),n}function o1(e){let t=e?.env??v,n=e?.readFileSync??xhe,r=e?.surface??t.AGENT_SURFACE,o=The(t.AFK_BROWSER_HEADLESS,r),i=n1(t.AFK_BROWSER_ALLOWED_DOMAINS),s=n1(t.AFK_BROWSER_BLOCKED_DOMAINS),a=Rhe(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Ehe(t.AFK_BROWSER_BACKEND),c=r1(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():She($n(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Ahe(u,g);return h.configPath=p,h}function cb(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(t1(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>t1(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var vhe,khe,ub=y(()=>{"use strict";L();H();vhe=new Set(["daemon","subagent","telegram","afk"]),khe=new Set(["repl","interactive","cli"])});import{existsSync as Che,readFileSync as _he}from"node:fs";import{createRequire as Ihe}from"node:module";import{dirname as Phe,join as Mhe}from"node:path";function a1(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Dhe&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function fn(e){let t=a1(e);return s1.some(n=>t.includes(n))}function $he(){try{let t=Ihe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(_he(t,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let i=Mhe(Phe(t),o);return Che(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function cm(){return i1??=$he()??Ohe,i1}function iC(e){return e.includes("install chromium")}function Wn(e,t){let n=a1(e),r=t?.latched===!0?` ${Fhe}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${cm()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${cm()}). Or pick a different tool.${r}`}function um(e,t,n=!1){if(!fn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
388
388
|
|
|
389
|
-
${Wn(e,{headless:t,latched:n})}`,{cause:e})}var s1,Ohe,Dhe,i1,Fhe,db=y(()=>{"use strict";s1=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Ohe="pnpm exec playwright install chromium",Dhe=4;Fhe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import oa from"node:fs";import pb from"node:path";import{randomBytes as Lhe}from"node:crypto";import{chromium as Nhe}from"playwright";function Bhe(){try{return"5.158.0"}catch{}try{let e=pb.resolve(import.meta.dirname,"../../../package.json"),t=oa.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Uhe,mb,l1=y(()=>{"use strict";db();H();ue();Uhe=Bhe(),mb=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=Nhe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=um(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),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;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{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",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),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){this.clearLaunchFailure();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.clearLaunchFailure(),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/${Uhe}`}}loadStorageState(t){let n=Ol(t);try{if(!oa.existsSync(n))return;let r=JSON.parse(oa.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ol(t);if(!oa.existsSync(r))return;let o=await n.storageState(),i=pb.join(pb.dirname(r),`.${pb.basename(r)}.${process.pid}.${Lhe(4).toString("hex")}.tmp`);oa.writeFileSync(i,JSON.stringify(o),{mode:384}),oa.chmodSync(i,384),oa.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as jhe}from"crypto";function c1(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Hhe.test(e.label))}function u1(e){return jhe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function d1(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Hhe,fb=y(()=>{"use strict";Hhe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Whe}from"node:crypto";function Khe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Ghe(e,t,n){return`el_${Whe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function qhe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function p1(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function f1(e,t){let n=e.role??"",r=e.name??"";m1.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])f1(i,t)}async function zhe(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 u=window.getComputedStyle(s);if(u.display==="none"||u.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},g1).catch(()=>[])}async function Vhe(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 u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},g1).catch(()=>[])}function Yhe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function gb(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Yhe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=zhe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],f1(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Vhe(e)).filter(D=>m1.has(D.role??"")));let w=new Map;for(let M of p){let D=p1(M.name),F=w.get(D);(!F||F.bbox.w===0&&M.bbox.w>0)&&w.set(D,M)}let k=b.map(M=>({ax:M,dom:w.get(p1(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,D)=>{let F=M.dom?.bbox.y??0,U=D.dom?.bbox.y??0;if(F!==U)return F-U;let W=M.dom?.bbox.x??0,G=D.dom?.bbox.x??0;return W-G}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,D)=>{let F=M.ax.role??"generic",U=M.ax.name??"",W=Ghe(F,U,D),G=M.dom?.bbox??{x:0,y:0,w:0,h:0},j=M.dom?.type??null,K=null;M.ax.value!==void 0&&M.ax.value!==null&&(K=String(M.ax.value)),M.ax.checked!==void 0&&(K=String(M.ax.checked)),c1({role:F,kind:j})&&(K="[redacted]");let Q={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(Q.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(Q.selected=M.ax.selected),M.ax.expanded!==void 0&&(Q.expanded=M.ax.expanded);let P;M.dom?.testId?P=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(P=`#${M.dom.id}`);let N={id:W,role:F,label:Khe(U),kind:j,value:K,state:Q,bbox:G};return P!==void 0&&(N.selector=P),N}),I="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?I="loading":M==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=qhe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var m1,g1,h1=y(()=>{"use strict";fb();m1=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);g1="a[href], button, input, select, textarea, [role], [tabindex], label"});async function y1(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")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.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 sC(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>y1(e,i)))).filter(o=>o!==null)}async function Jhe(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 aC(e,t,n){switch(t.kind){case"element_id":return Xhe(e,t,n);case"selector":return Qhe(e,t);case"semantic":return Zhe(e,t)}}async function Xhe(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 sC(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Qhe(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 sC(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Zhe(e,t){return t.role!==void 0?eye(e,t.text,t.role):tye(e,t.text,t)}async function eye(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 sC(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function tye(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 u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Jhe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await y1(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let E=0;E<w.length;E++)k=k*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var b1=y(()=>{"use strict"});async function lC(e,t,n,r){let o=e.url();if(o===n)return null;let i=cb(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var S1=y(()=>{"use strict";ub()});import{randomBytes as nye}from"crypto";import{mkdir as rye,stat as oye,writeFile as iye}from"fs/promises";import{join as cC}from"path";import{gzip as sye}from"zlib";import{promisify as aye}from"util";function lye(e){return cC(an(e),"browser")}function cye(e){return cC(lye(e),"screenshots")}function uye(){return new Date().toISOString().replace(/[:.]/g,"-")}function dye(){return nye(3).toString("hex")}async function uC(e,t,n){if(t.length>w1)throw new Error(`writeScreenshotSidecar: buffer exceeds ${w1} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=cye(e);await rye(r,{recursive:!0});let o=`${uye()}-${dye()}-${n}.png`,i=cC(r,o);await iye(i,t);let{size:s}=await oye(i);return{path:i,bytes:s}}var hQe,w1,v1=y(()=>{"use strict";H();fb();hQe=aye(sye);w1=5*1024*1024});var T1={};Ar(T1,{PlaywrightProvider:()=>dC});function k1(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 dC,E1=y(()=>{"use strict";l1();h1();b1();ub();S1();v1();dC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new mb(t)}async open(t){let n=cb(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(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await lC(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await gb(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,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}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 gb(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 aC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${k1(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":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 u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await lC(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await gb(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,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,requestGuard:t.requestGuard})}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 u=await aC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${k1(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await uC(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.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 uC(n,o,r);return i}catch{return null}}}});var sa={};Ar(sa,{__resetBrowserRegistryForTests:()=>hye,browserProviderActive:()=>fye,closeBrowserProvider:()=>pC,getBrowserProvider:()=>mye,peekBrowserProvider:()=>gye});function R1(){Promise.resolve(pC()).then(()=>{process.exit(130)})}function x1(){Promise.resolve(pC()).then(()=>{process.exit(143)})}function A1(){Kr=null}function pye(){hb||(process.on("SIGINT",R1),process.on("SIGTERM",x1),process.on("exit",A1),hb=!0)}function C1(){hb&&(process.removeListener("SIGINT",R1),process.removeListener("SIGTERM",x1),process.removeListener("exit",A1),hb=!1)}async function mye(e){return Kr!==null?Kr:(ia!==null||(ia=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(E1(),T1)),n=o1(e),r=new t(n);return pye(),Kr=r,ia=null,r})()),ia)}async function pC(){if(Kr===null)return;let e=Kr;Kr=null,ia=null,C1(),await e.shutdown()}function fye(){return Kr!==null}function gye(){return Kr}function hye(){Kr=null,ia=null,C1()}var Kr,ia,hb,aa=y(()=>{"use strict";ub();Kr=null,ia=null,hb=!1});async function _1(e,t){try{return await qj(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function kye(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(aa(),sa));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function I1(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??kye,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await lb(n,e,{headers:vye,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(wye.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Sye.test(p)&&!bye.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await _1(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof dr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=ZA({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await lm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>lm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await lm(d.finalUrl,o);let p=await _1(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=ZA({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof dr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var bye,Sye,wye,vye,P1=y(()=>{"use strict";zj();eC();oC();ue();bye=/(text\/html|application\/xhtml\+xml)/i,Sye=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,wye=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,vye={"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 Rye(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Tye,{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),Eye),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}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 M1(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Rye({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 O1(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
389
|
+
${Wn(e,{headless:t,latched:n})}`,{cause:e})}var s1,Ohe,Dhe,i1,Fhe,db=y(()=>{"use strict";s1=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Ohe="pnpm exec playwright install chromium",Dhe=4;Fhe="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import oa from"node:fs";import pb from"node:path";import{randomBytes as Lhe}from"node:crypto";import{chromium as Nhe}from"playwright";function Bhe(){try{return"5.158.1"}catch{}try{let e=pb.resolve(import.meta.dirname,"../../../package.json"),t=oa.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Uhe,mb,l1=y(()=>{"use strict";db();H();ue();Uhe=Bhe(),mb=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=Nhe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=um(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),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;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let s=()=>{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",s,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),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){this.clearLaunchFailure();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.clearLaunchFailure(),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/${Uhe}`}}loadStorageState(t){let n=Ol(t);try{if(!oa.existsSync(n))return;let r=JSON.parse(oa.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ol(t);if(!oa.existsSync(r))return;let o=await n.storageState(),i=pb.join(pb.dirname(r),`.${pb.basename(r)}.${process.pid}.${Lhe(4).toString("hex")}.tmp`);oa.writeFileSync(i,JSON.stringify(o),{mode:384}),oa.chmodSync(i,384),oa.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as jhe}from"crypto";function c1(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Hhe.test(e.label))}function u1(e){return jhe("sha256").update(e,"utf8").digest("hex").slice(0,8)}function d1(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Hhe,fb=y(()=>{"use strict";Hhe=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as Whe}from"node:crypto";function Khe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function Ghe(e,t,n){return`el_${Whe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function qhe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function p1(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function f1(e,t){let n=e.role??"",r=e.name??"";m1.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])f1(i,t)}async function zhe(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 u=window.getComputedStyle(s);if(u.display==="none"||u.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},g1).catch(()=>[])}async function Vhe(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 u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},g1).catch(()=>[])}function Yhe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function gb(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Yhe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=zhe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,S=!1;d!==null?(b=[],f1(d,b)):(o.push("observation skipped accessibility tree (returned null)"),S=!0,b=(await Vhe(e)).filter(D=>m1.has(D.role??"")));let w=new Map;for(let M of p){let D=p1(M.name),F=w.get(D);(!F||F.bbox.w===0&&M.bbox.w>0)&&w.set(D,M)}let k=b.map(M=>({ax:M,dom:w.get(p1(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,D)=>{let F=M.dom?.bbox.y??0,U=D.dom?.bbox.y??0;if(F!==U)return F-U;let W=M.dom?.bbox.x??0,G=D.dom?.bbox.x??0;return W-G}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,D)=>{let F=M.ax.role??"generic",U=M.ax.name??"",W=Ghe(F,U,D),G=M.dom?.bbox??{x:0,y:0,w:0,h:0},j=M.dom?.type??null,K=null;M.ax.value!==void 0&&M.ax.value!==null&&(K=String(M.ax.value)),M.ax.checked!==void 0&&(K=String(M.ax.checked)),c1({role:F,kind:j})&&(K="[redacted]");let Q={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(Q.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(Q.selected=M.ax.selected),M.ax.expanded!==void 0&&(Q.expanded=M.ax.expanded);let P;M.dom?.testId?P=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(P=`#${M.dom.id}`);let N={id:W,role:F,label:Khe(U),kind:j,value:K,state:Q,bbox:G};return P!==void 0&&(N.selector=P),N}),I="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?I="loading":M==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),S&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=qhe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var m1,g1,h1=y(()=>{"use strict";fb();m1=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);g1="a[href], button, input, select, textarea, [role], [tabindex], label"});async function y1(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")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.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 sC(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>y1(e,i)))).filter(o=>o!==null)}async function Jhe(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 aC(e,t,n){switch(t.kind){case"element_id":return Xhe(e,t,n);case"selector":return Qhe(e,t);case"semantic":return Zhe(e,t)}}async function Xhe(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 sC(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function Qhe(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 sC(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Zhe(e,t){return t.role!==void 0?eye(e,t.text,t.role):tye(e,t.text,t)}async function eye(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 sC(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function tye(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 u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Jhe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let S=await y1(b.locator,b.index);if(S!==null){let w=`${S.role}:${S.label}:${h}`,k=0;for(let E=0;E<w.length;E++)k=k*31+w.charCodeAt(E)>>>0;f.push({...S,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var b1=y(()=>{"use strict"});async function lC(e,t,n,r){let o=e.url();if(o===n)return null;let i=cb(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var S1=y(()=>{"use strict";ub()});import{randomBytes as nye}from"crypto";import{mkdir as rye,stat as oye,writeFile as iye}from"fs/promises";import{join as cC}from"path";import{gzip as sye}from"zlib";import{promisify as aye}from"util";function lye(e){return cC(an(e),"browser")}function cye(e){return cC(lye(e),"screenshots")}function uye(){return new Date().toISOString().replace(/[:.]/g,"-")}function dye(){return nye(3).toString("hex")}async function uC(e,t,n){if(t.length>w1)throw new Error(`writeScreenshotSidecar: buffer exceeds ${w1} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=cye(e);await rye(r,{recursive:!0});let o=`${uye()}-${dye()}-${n}.png`,i=cC(r,o);await iye(i,t);let{size:s}=await oye(i);return{path:i,bytes:s}}var hQe,w1,v1=y(()=>{"use strict";H();fb();hQe=aye(sye);w1=5*1024*1024});var T1={};Ar(T1,{PlaywrightProvider:()=>dC});function k1(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 dC,E1=y(()=>{"use strict";l1();h1();b1();ub();S1();v1();dC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new mb(t)}async open(t){let n=cb(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(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await lC(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await gb(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,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}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 gb(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 aC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${k1(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":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 u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await lC(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await gb(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,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,requestGuard:t.requestGuard})}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 u=await aC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${k1(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await uC(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.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 uC(n,o,r);return i}catch{return null}}}});var sa={};Ar(sa,{__resetBrowserRegistryForTests:()=>hye,browserProviderActive:()=>fye,closeBrowserProvider:()=>pC,getBrowserProvider:()=>mye,peekBrowserProvider:()=>gye});function R1(){Promise.resolve(pC()).then(()=>{process.exit(130)})}function x1(){Promise.resolve(pC()).then(()=>{process.exit(143)})}function A1(){Kr=null}function pye(){hb||(process.on("SIGINT",R1),process.on("SIGTERM",x1),process.on("exit",A1),hb=!0)}function C1(){hb&&(process.removeListener("SIGINT",R1),process.removeListener("SIGTERM",x1),process.removeListener("exit",A1),hb=!1)}async function mye(e){return Kr!==null?Kr:(ia!==null||(ia=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(E1(),T1)),n=o1(e),r=new t(n);return pye(),Kr=r,ia=null,r})()),ia)}async function pC(){if(Kr===null)return;let e=Kr;Kr=null,ia=null,C1(),await e.shutdown()}function fye(){return Kr!==null}function gye(){return Kr}function hye(){Kr=null,ia=null,C1()}var Kr,ia,hb,aa=y(()=>{"use strict";ub();Kr=null,ia=null,hb=!1});async function _1(e,t){try{return await qj(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function kye(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(aa(),sa));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}async function I1(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??kye,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await lb(n,e,{headers:vye,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(wye.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Sye.test(p)&&!bye.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await _1(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof dr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=ZA({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await lm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>lm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await lm(d.finalUrl,o);let p=await _1(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=ZA({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof dr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var bye,Sye,wye,vye,P1=y(()=>{"use strict";zj();eC();oC();ue();bye=/(text\/html|application\/xhtml\+xml)/i,Sye=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,wye=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,vye={"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 Rye(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Tye,{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),Eye),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}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 M1(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Rye({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 O1(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
390
390
|
|
|
391
391
|
(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(`
|
|
392
392
|
`).trimEnd()}var Tye,Eye,D1=y(()=>{"use strict";Xe();Tye="https://api.exa.ai/search",Eye=10});function yb(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var la=y(()=>{"use strict";db()});function Pye(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=xye;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,Aye)}let a=Cye;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,_ye)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function mC(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Gs(e,t),truncated:!0}}function Mye(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{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 s=Pye(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await rC(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await lb(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof dr?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=mC(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await I1(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=mC(Vj(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof dr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=fn(p)&&!iC(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${cm()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=M1({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:Iye,timeoutMs:s.timeoutMs,signal:a.signal}),f=mC(O1(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var xye,Aye,Cye,_ye,Iye,$1,F1=y(()=>{"use strict";P1();D1();oC();di();eC();la();xye=3e4,Aye=12e4,Cye=1e5,_ye=1e6,Iye=10;$1=Mye()});import{existsSync as N1,mkdirSync as Oye,readFileSync as Dye,renameSync as $ye,unlinkSync as Fye,writeFileSync as Lye}from"node:fs";import{dirname as L1,join as Nye}from"node:path";import{randomBytes as Bye}from"node:crypto";function Rn(e){let t=e??mh();if(!N1(t))return[];try{let n=Dye(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 hi(e,t){let n=t??mh();Oye(L1(n),{recursive:!0});let r=Nye(L1(n),`.schedules.json.${process.pid}.${Bye(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{Lye(r,o,"utf-8"),$ye(r,n)}catch(i){try{N1(r)&&Fye(r)}catch{}throw i}}function bb(e,t){let n=Rn(t),r=n.map(l=>l.id),o=Uye(e.name),i=jye(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),hi(n,t),a}function Sb(e,t){let n=Rn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(hi(o,t),!0)}function dm(e,t){return Rn(t).find(n=>n.id===e)}function Uye(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function jye(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function wb(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 vb=y(()=>{"use strict";H()});import{existsSync as Hye,readFileSync as Wye}from"node:fs";import{join as Kye}from"node:path";async function Kn(e,t,n){let r,o;try{let i=Kye(ip("default"),"port");if(!Hye(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=Wye(i,"utf-8").trim(),a=Gye(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function Gye(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var yi,fC=y(()=>{"use strict";H();yi="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 qye}from"node:fs";import{readFile as zye}from"node:fs/promises";var B1,U1,j1,H1,W1=y(()=>{"use strict";vb();H();fC();B1=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=bb({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 Kn("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 Kn("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:yi}})}},U1=async(e,t)=>{let n=Rn();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})))}},j1=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=or();if(!qye(i))return{content:JSON.stringify([])};let s;try{let c=await zye(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1991,7 +1991,7 @@ ${E}
|
|
|
1991
1991
|
${T}`})}return{fileBlocks:l,warnings:c}}function tne(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function nne(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}L();$();L();tt();$();Oa();function rne(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function one(e,t){Fe()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function ine(e,t,n,r){if(!Fe())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Me(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${ye(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function sne(e,t,n,r){if(!Fe())return;let{subagentId:o,agentType:i}=n,s=Me(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${ye(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var jE=class{state;writer;ttfb;constructor(t,n){this.state=rne(),this.writer=t,this.ttfb=n}onToolStart(t){one(this.state,t)}onToolResult(t,n){ine(this.state,t,n,this.writer)}onSubagentEvent(t,n){sne(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function ane(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function lne(e){return e.received?{}:{turnStartedAt:e.startedAt}}function cne(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function une(e,t=process.stdout,n){if(!Fe()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new jE(e,n)))}ue();$();var AUe=3e3;async function dne(e,t){if(!e)return t;let n=Date.now();if(n-t<AUe)return t;try{let r=e();r instanceof Promise&&await r}catch(r){Ue()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}$();ue();mt();cs();var CUe="Keep waiting \u2014 auto-resume in progress",pne="Switch model / provider (type /model after)",_Ue="Stop waiting";async function mne(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:CUe,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Sn(r,{header:p,options:[d,pne,_Ue],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===pne&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{Ue()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{Ue()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(pL({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}Zk();async function fne(e,t,n,r,o="summary",i,s){let a=P8(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=ane(l);une(i,process.stdout,c),Gu(process.stdout,Uf(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,S,w=!1,k=!1,E={abort:null},T=0,R=[],I=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,x=()=>{let W=r.subagentControl;W?.hasPromotableForeground()&&nne(W,_,r.onQueuedUserMessage).then(({jobs:G,flushedText:j,flushedPreview:K})=>{let Q=(i??{fn:console.log}).fn;for(let P of G)Q(m.dim(` \u2192 subagent backgrounded as ${P.jobId}: ${P.label}`));j!==void 0&&Q(m.dim(` \u2192 queued message sent to this turn: ${tne(K??j)}`))}).catch(()=>{})},_=r.getCompositor?r.getCompositor():null,M=()=>new yd({out:bd(i),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch(W=>{Ue()&&console.error(" "+m.error("session.interrupt() failed:"),W)})},...r.subagentControl?{onBackground:x}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},..._?{compositor:_}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...lne(c)}),D=M(),F=async()=>{if(!h){h=!0;try{await D.dispose()}catch{}}},U=async()=>{await D.arm();let W=D.getCompositor();if(i&&W){let G=W;i.fn=j=>G.commitAbove(j),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(W),r.setInterruptNotifier?.(G=>D.setInterrupting(G)),r.rearmStatus?.()};try{_?_.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{w=!0,D.setSoftStopping(!0),t.interrupt().catch(N=>{Ue()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),N)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(N=>{Ue()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),N)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch(P=>{Ue()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),P)})}),await U(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(x);let{fileBlocks:W,warnings:G}=ene(e.text,{rootDir:process.cwd()});for(let P of G)(i??{fn:console.log}).fn(m.dim(` @-file: ${P}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let j=W.length>0||e.attachments.length>0?await Zte(e.text,e.attachments,void 0,W,t.sessionId):e.text,K=t.sendMessageStream(j);if(await Dc((P,N)=>{D.process(P,N),N&&c.plainHooks?.onSubagentEvent(P,N)},async()=>{for await(let P of K){if(w||k)break;let N=cne(c,P,f);if(P.type==="chunk"&&P.chunk.type==="content"?(u=p?Vte(u,P.chunk.content):u+P.chunk.content,p=!1,f=!0):P.type==="message"&&!f&&(u=P.message.content),P.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let Y=P.chunk,te={toolName:Y.toolName,toolUseId:Y.toolUseId,input:Y.toolInput,...Y.toolInputRaw!==void 0&&{inputRaw:Y.toolInputRaw}};I.set(Y.toolUseId,te),R.push(te),c.plainHooks?.onToolStart(Y)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let Y=P.chunk;d=u.length,p=!0;let te=I.get(Y.toolUseId);te&&(te.result=Y.content,te.isError=Y.isError,I.delete(Y.toolUseId)),c.plainHooks?.onToolResult(Y,te?.toolName),T=await dne(r.onContextProgress,T)}if(P.type==="paused"){await mne({event:P,session:t,borrowedCompositor:_,pickerRef:E,completionWriter:i,disposeRendererOnce:F,setPausedState:r.setPausedState,onPauseInterrupt:()=>{k=!0}});continue}if(P.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let Y=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,R.length=0,I.clear(),b=!1,S=void 0,g=!1,D=M(),h=!1,await U(),(i??{fn:console.log}).fn(m.success(Y));continue}if(P.type==="error"){await F(),ql(Nl(P.error)),g=!0;continue}D.process(P),N&&(c.plainHooks?.onFirstContent(process.stdout),D.notifyFirstContent()),P.type==="done"&&(b=!0,S=P.metadata)}}),await F(),w){let P=i?i.fn:console.log,N=_?_.getPendingCount():0,Y=N>0?` \xB7 ${N} queued`:"";P(m.warning(`\u23F8 Stopped${Y} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),P("")}if(k){let P=i?i.fn:console.log;P(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(b&&!w&&!k){Na(n,a,u,S,R),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),Ku(process.stdout),B6(process.stdout,"afk: turn complete");let P=Y=>{i?i.fn(Y):console.log(Y)},N=UE(u);if(N){P(Yte(N,{durationMs:S?.durationMs,totalCostUsd:S?.totalCostUsd,toolCount:R.length})),P("");let Y=c7(R);if(r.onTerminalState)try{r.onTerminalState(N,{doneHasCorroboratingEvidence:Y})}catch{}if(n.permissionMode==="autonomous"){let te=N.kind==="done"&&sm().verifyDone===!0&&!Y;d7(N,void 0,{unverified:te})}}if(ZD(S,n,P),r.onAfterTurn){let Y=r.onAfterTurn();Y instanceof Promise&&await Y.catch(()=>{})}}}catch(W){await F(),g||ql(Nl(W))}finally{await F(),Gu(process.stdout,Uf(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),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}Ji();fp();var IUe=5e3,PUe=3,MUe="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function OUe(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(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function gne(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async _=>{Ue()&&(h=YT(_)),await gg(e.session.current),Ue()&&(b=dO())}).catch(()=>{});let S=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,w,k=!1,E=!1,T,R,I,C=(()=>{let _=parseInt(e.options.maxTurns,10);return _>0?_:void 0})(),x=0;g.onInjectable=()=>{x>=PUe||!o.isAwaitingInput()||!o.bufferIsEmpty()||n.pendingSteerRead||(x++,Ku(process.stdout),S={text:MUe,attachments:[]},o.abortPendingRead())};try{for(n.steerReadLine=async _=>{let M=()=>o.abortPendingRead({clearBuffer:!0});if(_?.addEventListener("abort",M,{once:!0}),_?.aborted)return"";try{return(await o.readLine({promptFn:()=>"Steer the agent \u2192 ",onEscape:M})).text}finally{_?.removeEventListener("abort",M)}};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let P of b)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),b=[]}let _=f.drainNotifications();for(let{job:P,result:N}of _){let Y=N.errorReason===void 0?"\u2713":"\u2717",te=N.errorReason==="abort"?"killed":N.errorReason==="timeout"?"timed out":N.errorReason==="signal-killed"?"killed by signal":`exit ${N.exitCode??0}`,Pe=Math.max(0,Math.round(N.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${Y} [${P.id}] ${te} \xB7 ${Pe}s \xB7 `)+P.command)}let M=g.drainNotifications();for(let{job:P}of M){let N=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",Y=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,te=re(P.label,60);e.replRenderer.writeLine(m.dim(` ${N} [${P.jobId}] subagent ${P.status} \xB7 ${Y}s \xB7 `)+te)}let D=l.renderIfChanged(e.stats.sessionId);if(D.length>0){for(let P of D)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let F,U,W=n.pendingSteerRead;if(W){let P=await W;n.pendingSteerRead===W&&(n.pendingSteerRead=null),P?.trim()&&(n.pendingSteerText=P)}if(n.pendingSteerText&&(S={text:n.pendingSteerText,attachments:[]},n.pendingSteerText=null),S===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,S={text:P.message,attachments:[]})}if(S!==void 0){let P=S;S=void 0;let N=Cd(e.stats.permissionMode),Y=Wa({buffer:P.text,promptText:N,isTTY:!!process.stdout.isTTY,attachmentSummary:rd([...P.attachments])});e.replRenderer.writeLine(Y),F=P.text.trim(),U=P.attachments}else{let P=w;w=void 0;let N=await o.readLine({promptFn:()=>Cd(e.stats.permissionMode),...P!==void 0?{initialBuffer:P}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{DE(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});F=N.text.trim(),U=N.attachments}if(!F&&U.length===0)continue;if(F.startsWith("!")){let P=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(k||(k=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(F))){e.statusLine.rearm();continue}}let G=!1;if(F.startsWith("/")){let P=await H6(F,e.slashCtx,U);if(P.handled){if(P.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((F==="/clear"||F.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){S={text:P.result.message,attachments:U??[]},e.statusLine.rearm();continue}if(P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="prefill"){w=P.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}G=!0}a.push(F),await OUe(e,F);let j=F;if(G){let P=LM(F);if(P){let N=P.name.replace(/^\//,"").split(":").pop()??"";if(N&&sO(N)){let Y={skillName:N,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},te=e.session.current.sessionId,Pe=rl(te),ie=Date.now();B(`[afk trace] preflight.start commandName=${N}`);let Te=!1,Ke=await nl(Y,{cwd:e.stats.cwd??process.cwd(),artifactDir:Pe},Dn=>{Ue()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${N}) failed: `)+(Dn instanceof Error?Dn.message:String(Dn)))});Te=Ke!==null,B(`[afk trace] preflight.end commandName=${N} durationMs=${Date.now()-ie} success=${Te}`),j=cO(Ke?.manifestBlock,F)}}}let K=f.drainInjections();K.length>0&&(j=K+j);let Q=g.drainInjections();if(Q.length>0&&(j=Q+j),T!==void 0&&(j=T+`
|
|
1992
1992
|
|
|
1993
1993
|
`+j,T=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:j,sessionId:e.stats.sessionId},N=await e.hookRegistry.dispatch(P);N.injectContext&&(j=N.injectContext+j)}catch(P){if(P instanceof xe){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(P.reason?m.dim(`: ${ae(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Fr){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(R=void 0,I=void 0,SL(),TL(),await fne({text:j,attachments:U},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onQueuedUserMessage(P){await t.appendQueuedUser(P)},async onTurnComplete(P,N){if(await t.appendTurn(P,N),e.stats.sessionId)try{Yi(e.stats)}catch(Y){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(Y instanceof Error?Y.message:String(Y))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(Zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,N)=>{p?.push(P),R=P.kind,I=N?.doneHasCorroboratingEvidence},setActiveCompositor:P=>{n.activeCompositor=P,P===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Zn(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(P,N)=>{c.repaint(P),u?.onStage(P,N)}}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Cd(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},...I!==void 0?{doneHasCorroboratingEvidence:I}:{}},void 0,IUe);P.injectContext&&P.injectContext.trim().length>0&&(T=P.injectContext)}catch(P){if(P instanceof Mt)throw P;P instanceof Fr?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):P instanceof xe?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(P.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(P))}}}finally{n.steerReadLine=null,n.pendingSteerRead=null,n.pendingSteerText=null}}function DUe(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 hne(e,t,n,r){let o=await lte(),i=new OE({rl:e.rl,history:o,statusLine:e.statusLine}),s=DUe(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await Ite(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=zte(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await gne(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.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)}}Qp();Tc();import{execFile as $Ue}from"node:child_process";import{dirname as FUe,isAbsolute as LUe,resolve as NUe}from"node:path";import{promisify as BUe}from"node:util";var yne=BUe($Ue),UUe=3e3,jUe=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function HUe(){let t=(await yne("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=LUe(t)?t:NUe(process.cwd(),t);return FUe(n)}async function bne(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await HUe()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),UUe)});try{let o=qn({execFile:yne,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=>jUe.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Vh();Qp();import{promises as WUe}from"node:fs";import{dirname as KUe,join as vne}from"node:path";import{randomBytes as GUe}from"node:crypto";var qUe=["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(`
|
|
1994
|
-
`),Sne=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,t$=30,zUe=1024,VUe=8e3,YUe="haiku";async function JUe(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=eje(n,zUe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??VUe),s=t.signal?tje([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ql({token:t.token,model:t.model??YUe,system:qUe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=XUe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=KUe(t.worktreePath);return await QUe(l,c)}function XUe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Sne.test(t)&&t.length<=t$)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>t$)break;o=s}return Sne.test(o)?o:null}async function QUe(e,t){if(!await ZUe(vne(t,e)))return e;let n=GUe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,t$-5)}-${n}`}async function ZUe(e){try{return await WUe.access(e),!0}catch{return!1}}function eje(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 tje(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 kne(e){let t,n,r=vne(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await JUe(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=`${eb(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return wne(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 wne(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 wne(e,t){e&&e.setCwd(t),nje(t)}function nje(e){try{process.chdir(e)}catch{}}bt();At();Fl();so();H();import{spawn as Ene}from"child_process";import{existsSync as Rne,mkdirSync as aje,readFileSync as xne,unlinkSync as Tne,writeFileSync as Ane}from"fs";import{get as lje}from"https";import{join as Cne}from"path";import{readFileSync as rje}from"fs";import{dirname as oje,join as ije}from"path";import{fileURLToPath as sje}from"url";function co(){try{return"5.158.
|
|
1994
|
+
`),Sne=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,t$=30,zUe=1024,VUe=8e3,YUe="haiku";async function JUe(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=eje(n,zUe),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??VUe),s=t.signal?tje([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ql({token:t.token,model:t.model??YUe,system:qUe,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=XUe(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=KUe(t.worktreePath);return await QUe(l,c)}function XUe(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Sne.test(t)&&t.length<=t$)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>t$)break;o=s}return Sne.test(o)?o:null}async function QUe(e,t){if(!await ZUe(vne(t,e)))return e;let n=GUe(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,t$-5)}-${n}`}async function ZUe(e){try{return await WUe.access(e),!0}catch{return!1}}function eje(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 tje(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 kne(e){let t,n,r=vne(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await JUe(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=`${eb(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return wne(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 wne(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 wne(e,t){e&&e.setCwd(t),nje(t)}function nje(e){try{process.chdir(e)}catch{}}bt();At();Fl();so();H();import{spawn as Ene}from"child_process";import{existsSync as Rne,mkdirSync as aje,readFileSync as xne,unlinkSync as Tne,writeFileSync as Ane}from"fs";import{get as lje}from"https";import{join as Cne}from"path";import{readFileSync as rje}from"fs";import{dirname as oje,join as ije}from"path";import{fileURLToPath as sje}from"url";function co(){try{return"5.158.1"}catch{}try{let e=oje(sje(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(rje(ije(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}$();L();var cje=64*1024,uje=10800*1e3,dje=800,pje=3600*1e3,mje="update-check.json",fje="pending-update.json";function n$(){return Cne(Rs(),mje)}function Fg(){return Cne(Rs(),fje)}function r$(){let e=Rs();Rne(e)||aje(e,{recursive:!0})}function _ne(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 Ine(){try{let e=xne(n$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Pne(){try{r$();let e=`
|
|
1995
1995
|
const https = require('https');
|
|
1996
1996
|
const fs = require('fs');
|
|
1997
1997
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|