agent-afk 5.84.10 → 5.84.12
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 +440 -440
- package/dist/index.mjs +1 -1
- package/dist/telegram.mjs +2 -2
- package/package.json +1 -1
package/dist/telegram.mjs
CHANGED
|
@@ -865,7 +865,7 @@ Retrying it verbatim will fail the same way. Fix the underlying cause, change th
|
|
|
865
865
|
|
|
866
866
|
`).trim()}function UD(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function Ow(t,e){let{JSDOM:n,Readability:r,turndown:o}=await $D(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=Mw(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=Mw(o.turndown(d));return{title:a,markdown:u,textLength:UD(c),usedFallback:!0}}var Xu,Dw=y(()=>{"use strict";Xu=null});function HD(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function Fw(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function jD(t,e){let n=t.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,e)}async function Lw(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??HD,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await t(e,n);if(!BD.has(u.status)||d===o)return u;let p=jD(u,i)??Fw(d,s,i);F("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=Fw(d,s,i);F("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var BD,Nw=y(()=>{"use strict";fe();BD=new Set([429,502,503,504])});import{BlockList as WD,isIP as Zu}from"node:net";import{lookup as KD}from"node:dns/promises";import{Agent as GD}from"undici";function Uw(){let t=k.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function VD(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function Qu(t){let e=Zu(t);return e===0?!1:JD.check(t,e===4?"ipv4":"ipv6")}async function Bw(t){return KD(t,{all:!0,verbatim:!0})}async function ep(t,e={}){if(e.allowPrivateHosts??Uw())return{allowed:!0};let n;try{n=new URL(t)}catch{return{allowed:!1,reason:`"${t}" 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=VD(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(Zu(r)!==0)return Qu(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??Bw,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(Qu(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function No(t,e={}){let n=await ep(t,e);if(!n.allowed)throw new it(n.reason)}async function Ca(t,e,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},s=e;for(let i=0;i<=$w;i++){await No(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??Uw())?{dispatcher:YD}:{}},l=await Lw(t,s,a,r.retry??{});if(!XD.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let d;try{d=new URL(c,l.url||s).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),s=d}throw new it(`too many redirects (>${$w}) starting from ${e}`)}var qD,zD,JD,it,YD,$w,XD,tp=y(()=>{"use strict";N();Nw();qD=[["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]],zD=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],JD=(()=>{let t=new WD;for(let[e,n]of qD)t.addSubnet(e,n,"ipv4");for(let[e,n]of zD)t.addSubnet(e,n,"ipv6");return t})(),it=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};YD=new GD({connect:{lookup(t,e,n){Bw(t).then(r=>{let o=r.find(i=>Qu(i.address));if(o!==void 0){n(new it(`refusing to connect to ${t} (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 s=r[0];if(s===void 0){n(new Error(`DNS lookup returned no addresses for ${t}`),"",0);return}n(null,s.address,Zu(s.address))},r=>n(r,"",0))}}});$w=20,XD=new Set([301,302,303,307,308])});import{readFileSync as QD}from"node:fs";import{join as ZD}from"path";function eF(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function Hw(t,e){return eF(e).test(t)}function rF(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(tF.has(e))return!0;if(nF.has(e))return!1}return!1}function jw(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function oF(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function Ww(t){let e=t===void 0||t.trim()===""?"default":t.trim();return ad(e),e}function sF(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function iF(t){try{return QD(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function aF(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Ww(e.defaultProfile)),n}function Kw(t){let e=t?.env??k,n=t?.readFileSync??iF,r=t?.surface??e.AGENT_SURFACE,o=rF(e.AFK_BROWSER_HEADLESS,r),s=jw(e.AFK_BROWSER_ALLOWED_DOMAINS),i=jw(e.AFK_BROWSER_BLOCKED_DOMAINS),a=sF(e.AFK_BROWSER_DOM_SNAPSHOTS),l=oF(e.AFK_BROWSER_BACKEND),c=Ww(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():ZD(_t(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(h){throw new Error(`Failed to parse browser config at ${p}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=aF(d,m);return g.configPath=p,g}function Ia(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if(Hw(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>Hw(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var tF,nF,Pa=y(()=>{"use strict";N();j();tF=new Set(["daemon","subagent","telegram","afk"]),nF=new Set(["repl","interactive","cli"])});import{existsSync as lF,readFileSync as cF}from"node:fs";import{createRequire as dF}from"node:module";import{dirname as uF,join as pF}from"node:path";function zw(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<mF&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function Me(t){let e=zw(t);return qw.some(n=>e.includes(n))}function gF(){try{let e=dF(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(cF(e,"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 s=pF(uF(e),o);return lF(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function $o(){return Gw??=gF()??fF,Gw}function np(t){return t.includes("install chromium")}function et(t,e){let n=zw(t),r=e?.latched===!0?` ${hF}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.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: ${$o()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${$o()}). Or pick a different tool.${r}`}function rp(t,e,n=!1){if(!Me(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
|
|
867
867
|
|
|
868
|
-
${et(t,{headless:e,latched:n})}`,{cause:t})}var qw,fF,mF,Gw,hF,op=y(()=>{"use strict";qw=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],fF="pnpm exec playwright install chromium",mF=4;hF="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 Fn from"node:fs";import Ma from"node:path";import{randomBytes as yF}from"node:crypto";import{chromium as bF}from"playwright";function wF(){try{return"5.84.10"}catch{}try{let t=Ma.resolve(import.meta.dirname,"../../../package.json"),e=Fn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var SF,Oa,Jw=y(()=>{"use strict";op();j();fe();SF=wF(),Oa=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}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=bF.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=rp(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){s=l,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let c=await a.content();if(s!==void 0)throw s;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);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(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),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 e=[...this.sessions.keys()];if(await Promise.all(e.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/${SF}`}}loadStorageState(e){let n=ld(e);try{if(!Fn.existsSync(n))return;let r=JSON.parse(Fn.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=ld(e);if(!Fn.existsSync(r))return;let o=await n.storageState(),s=Ma.join(Ma.dirname(r),`.${Ma.basename(r)}.${process.pid}.${yF(4).toString("hex")}.tmp`);Fn.writeFileSync(s,JSON.stringify(o),{mode:384}),Fn.chmodSync(s,384),Fn.renameSync(s,r),F("[browser/vault] saved session",{profile:e,file:r})}catch(r){F("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as vF}from"crypto";function Vw(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&kF.test(t.label))}function Yw(t){return vF("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Xw(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var kF,Da=y(()=>{"use strict";kF=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as EF}from"node:crypto";function AF(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function _F(t,e,n){return`el_${EF("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function TF(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Qw(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function eS(t,e){let n=t.role??"",r=t.name??"";Zw.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])eS(s,e)}async function xF(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},tS).catch(()=>[])}async function RF(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},tS).catch(()=>[])}function CF(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Fa(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=CF(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=xF(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],eS(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await RF(t)).filter(L=>Zw.has(L.role??"")));let v=new Map;for(let I of p){let L=Qw(I.name),q=v.get(L);(!q||q.bbox.w===0&&I.bbox.w>0)&&v.set(L,I)}let A=h.map(I=>({ax:I,dom:v.get(Qw(I.name??""))})),E=r?A:A.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);E.sort((I,L)=>{let q=I.dom?.bbox.y??0,D=L.dom?.bbox.y??0;if(q!==D)return q-D;let B=I.dom?.bbox.x??0,$=L.dom?.bbox.x??0;return B-$}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=E.slice(0,n).map((I,L)=>{let q=I.ax.role??"generic",D=I.ax.name??"",B=_F(q,D,L),$=I.dom?.bbox??{x:0,y:0,w:0,h:0},P=I.dom?.type??null,O=null;I.ax.value!==void 0&&I.ax.value!==null&&(O=String(I.ax.value)),I.ax.checked!==void 0&&(O=String(I.ax.checked)),Vw({role:q,kind:P})&&(O="[redacted]");let H={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(H.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(H.selected=I.ax.selected),I.ax.expanded!==void 0&&(H.expanded=I.ax.expanded);let Y;I.dom?.testId?Y=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(Y=`#${I.dom.id}`);let ee={id:B,role:q,label:AF(D),kind:P,value:O,state:H,bbox:$};return Y!==void 0&&(ee.selector=Y),ee}),R="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?R="loading":I==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=TF(f),x=`obs_${e.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:x,url:m,title:g,textSummary:S,interactive:_,status:{httpStatus:e.httpStatus??null,loadingState:R,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:C}}var Zw,tS,nS=y(()=>{"use strict";Da();Zw=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);tS="a[href], button, input, select, textarea, [role], [tabindex], label"});async function rS(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>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 sp(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>rS(t,s)))).filter(o=>o!==null)}async function IF(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function ip(t,e,n){switch(e.kind){case"element_id":return PF(t,e,n);case"selector":return MF(t,e);case"semantic":return OF(t,e)}}async function PF(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await sp(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function MF(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await sp(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function OF(t,e){return e.role!==void 0?DF(t,e.text,e.role):FF(t,e.text,e)}async function DF(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await sp(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function FF(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await IF(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await rS(h.locator,h.index);if(w!==null){let v=`${w.role}:${w.label}:${g}`,A=0;for(let E=0;E<v.length;E++)A=A*31+v.charCodeAt(E)>>>0;f.push({...w,id:`el_${A.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var oS=y(()=>{"use strict"});async function ap(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ia(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var sS=y(()=>{"use strict";Pa()});import{randomBytes as LF}from"crypto";import{mkdir as NF,stat as $F,writeFile as UF}from"fs/promises";import{join as lp}from"path";import{gzip as BF}from"zlib";import{promisify as HF}from"util";function jF(t){return lp(ti(t),"browser")}function WF(t){return lp(jF(t),"screenshots")}function KF(){return new Date().toISOString().replace(/[:.]/g,"-")}function GF(){return LF(3).toString("hex")}async function cp(t,e,n){if(e.length>iS)throw new Error(`writeScreenshotSidecar: buffer exceeds ${iS} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=WF(t);await NF(r,{recursive:!0});let o=`${KF()}-${GF()}-${n}.png`,s=lp(r,o);await UF(s,e);let{size:i}=await $F(s);return{path:s,bytes:i}}var d8,iS,aS=y(()=>{"use strict";j();Da();d8=HF(BF);iS=5*1024*1024});var cS={};ed(cS,{PlaywrightProvider:()=>dp});function lS(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var dp,dS=y(()=>{"use strict";Jw();nS();oS();Pa();sS();aS();dp=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Oa(e)}async open(e){let n=Ia(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await ap(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Fa(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,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),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Fa(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,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),s=r.url(),i=e.timeoutMs??3e4,a=await ip(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${lS(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await ap(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Fa(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,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),s;if(e.target!==void 0){let d=await ip(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${lS(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await cp(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);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(e){let n=this.sessions.get(e);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(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await cp(n,o,r);return s}catch{return null}}}});var Nn={};ed(Nn,{__resetBrowserRegistryForTests:()=>YF,browserProviderActive:()=>JF,closeBrowserProvider:()=>up,getBrowserProvider:()=>zF,peekBrowserProvider:()=>VF});function uS(){Promise.resolve(up()).then(()=>{process.exit(130)})}function pS(){Promise.resolve(up()).then(()=>{process.exit(143)})}function fS(){St=null}function qF(){La||(process.on("SIGINT",uS),process.on("SIGTERM",pS),process.on("exit",fS),La=!0)}function mS(){La&&(process.removeListener("SIGINT",uS),process.removeListener("SIGTERM",pS),process.removeListener("exit",fS),La=!1)}async function zF(t){return St!==null?St:(Ln!==null||(Ln=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(dS(),cS)),n=Kw(t),r=new e(n);return qF(),St=r,Ln=null,r})()),Ln)}async function up(){if(St===null)return;let t=St;St=null,Ln=null,mS(),await t.shutdown()}function JF(){return St!==null}function VF(){return St}function YF(){St=null,Ln=null,mS()}var St,Ln,La,$n=y(()=>{"use strict";Pa();St=null,Ln=null,La=!1});async function gS(t,e){try{return await Ow(t,e)}catch(n){return F("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function nL(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>($n(),Nn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function hS(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??nL,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i=t,a=null,l=null;try{let d=await Ca(n,t,{headers:tL,signal:e.signal},o);a=d.status,i=d.url||t;let u=d.headers.get("content-type")??"";if(d.ok){if(eL.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if(ZF.test(u)&&!QF.test(u))return{title:"",markdown:p.trim(),finalUrl:i,usedRender:!1};if(s=await gS(p,i),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(d){if(e.signal.aborted||d instanceof it||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(s===null||s.textLength<200)&&s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};try{await No(t,o);let d=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:p=>No(p,o)});d.finalUrl!==t&&/^https?:\/\//i.test(d.finalUrl)&&await No(d.finalUrl,o);let u=await gS(d.html,d.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||u.textLength>=s.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(e.signal.aborted||d instanceof it)throw d;if(s===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${t}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${a??"error"}).`)}var QF,ZF,eL,tL,yS=y(()=>{"use strict";Dw();tp();fe();QF=/(text\/html|application\/xhtml\+xml)/i,ZF=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,eL=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,tL={"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 sL(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(rL,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),oL),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=hr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.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 bS(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?sL({apiKey:t.exaApiKey,fetchFn:t.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 wS(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
868
|
+
${et(t,{headless:e,latched:n})}`,{cause:t})}var qw,fF,mF,Gw,hF,op=y(()=>{"use strict";qw=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],fF="pnpm exec playwright install chromium",mF=4;hF="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 Fn from"node:fs";import Ma from"node:path";import{randomBytes as yF}from"node:crypto";import{chromium as bF}from"playwright";function wF(){try{return"5.84.12"}catch{}try{let t=Ma.resolve(import.meta.dirname,"../../../package.json"),e=Fn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var SF,Oa,Jw=y(()=>{"use strict";op();j();fe();SF=wF(),Oa=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}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=bF.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=rp(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){s=l,await a.abort("blockedbyclient")}});let i=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",i,{once:!0});try{let a=await o.newPage(),l;try{l=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let c=await a.content();if(s!==void 0)throw s;let d=a.url(),u=l!==null?l.status():null;return{html:c,finalUrl:d,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);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(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),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 e=[...this.sessions.keys()];if(await Promise.all(e.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/${SF}`}}loadStorageState(e){let n=ld(e);try{if(!Fn.existsSync(n))return;let r=JSON.parse(Fn.readFileSync(n,"utf8"));return F("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){F("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=ld(e);if(!Fn.existsSync(r))return;let o=await n.storageState(),s=Ma.join(Ma.dirname(r),`.${Ma.basename(r)}.${process.pid}.${yF(4).toString("hex")}.tmp`);Fn.writeFileSync(s,JSON.stringify(o),{mode:384}),Fn.chmodSync(s,384),Fn.renameSync(s,r),F("[browser/vault] saved session",{profile:e,file:r})}catch(r){F("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as vF}from"crypto";function Vw(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&kF.test(t.label))}function Yw(t){return vF("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Xw(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var kF,Da=y(()=>{"use strict";kF=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as EF}from"node:crypto";function AF(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function _F(t,e,n){return`el_${EF("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function TF(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Qw(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function eS(t,e){let n=t.role??"",r=t.name??"";Zw.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])eS(s,e)}async function xF(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},tS).catch(()=>[])}async function RF(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},tS).catch(()=>[])}function CF(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function Fa(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=CF(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=xF(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],eS(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await RF(t)).filter(L=>Zw.has(L.role??"")));let v=new Map;for(let I of p){let L=Qw(I.name),q=v.get(L);(!q||q.bbox.w===0&&I.bbox.w>0)&&v.set(L,I)}let A=h.map(I=>({ax:I,dom:v.get(Qw(I.name??""))})),E=r?A:A.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);E.sort((I,L)=>{let q=I.dom?.bbox.y??0,D=L.dom?.bbox.y??0;if(q!==D)return q-D;let B=I.dom?.bbox.x??0,$=L.dom?.bbox.x??0;return B-$}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=E.slice(0,n).map((I,L)=>{let q=I.ax.role??"generic",D=I.ax.name??"",B=_F(q,D,L),$=I.dom?.bbox??{x:0,y:0,w:0,h:0},P=I.dom?.type??null,O=null;I.ax.value!==void 0&&I.ax.value!==null&&(O=String(I.ax.value)),I.ax.checked!==void 0&&(O=String(I.ax.checked)),Vw({role:q,kind:P})&&(O="[redacted]");let H={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(H.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(H.selected=I.ax.selected),I.ax.expanded!==void 0&&(H.expanded=I.ax.expanded);let Y;I.dom?.testId?Y=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(Y=`#${I.dom.id}`);let ee={id:B,role:q,label:AF(D),kind:P,value:O,state:H,bbox:$};return Y!==void 0&&(ee.selector=Y),ee}),R="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?R="loading":I==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=TF(f),x=`obs_${e.observationCounter.toString(36)}`,C=new Date().toISOString();return{observationId:x,url:m,title:g,textSummary:S,interactive:_,status:{httpStatus:e.httpStatus??null,loadingState:R,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:C}}var Zw,tS,nS=y(()=>{"use strict";Da();Zw=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);tS="a[href], button, input, select, textarea, [role], [tabindex], label"});async function rS(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>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 sp(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>rS(t,s)))).filter(o=>o!==null)}async function IF(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function ip(t,e,n){switch(e.kind){case"element_id":return PF(t,e,n);case"selector":return MF(t,e);case"semantic":return OF(t,e)}}async function PF(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await sp(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function MF(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await sp(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function OF(t,e){return e.role!==void 0?DF(t,e.text,e.role):FF(t,e.text,e)}async function DF(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await sp(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function FF(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await IF(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await rS(h.locator,h.index);if(w!==null){let v=`${w.role}:${w.label}:${g}`,A=0;for(let E=0;E<v.length;E++)A=A*31+v.charCodeAt(E)>>>0;f.push({...w,id:`el_${A.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var oS=y(()=>{"use strict"});async function ap(t,e,n,r){let o=t.url();if(o===n)return null;let s=Ia(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var sS=y(()=>{"use strict";Pa()});import{randomBytes as LF}from"crypto";import{mkdir as NF,stat as $F,writeFile as UF}from"fs/promises";import{join as lp}from"path";import{gzip as BF}from"zlib";import{promisify as HF}from"util";function jF(t){return lp(ti(t),"browser")}function WF(t){return lp(jF(t),"screenshots")}function KF(){return new Date().toISOString().replace(/[:.]/g,"-")}function GF(){return LF(3).toString("hex")}async function cp(t,e,n){if(e.length>iS)throw new Error(`writeScreenshotSidecar: buffer exceeds ${iS} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=WF(t);await NF(r,{recursive:!0});let o=`${KF()}-${GF()}-${n}.png`,s=lp(r,o);await UF(s,e);let{size:i}=await $F(s);return{path:s,bytes:i}}var d8,iS,aS=y(()=>{"use strict";j();Da();d8=HF(BF);iS=5*1024*1024});var cS={};ed(cS,{PlaywrightProvider:()=>dp});function lS(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var dp,dS=y(()=>{"use strict";Jw();nS();oS();Pa();sS();aS();dp=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new Oa(e)}async open(e){let n=Ia(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await ap(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await Fa(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,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),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Fa(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,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),s=r.url(),i=e.timeoutMs??3e4,a=await ip(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${lS(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await ap(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Fa(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal,requestGuard:e.requestGuard})}async screenshot(e){let{sessionId:n}=e,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),s;if(e.target!==void 0){let d=await ip(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${lS(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await cp(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);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(e){let n=this.sessions.get(e);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(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await cp(n,o,r);return s}catch{return null}}}});var Nn={};ed(Nn,{__resetBrowserRegistryForTests:()=>YF,browserProviderActive:()=>JF,closeBrowserProvider:()=>up,getBrowserProvider:()=>zF,peekBrowserProvider:()=>VF});function uS(){Promise.resolve(up()).then(()=>{process.exit(130)})}function pS(){Promise.resolve(up()).then(()=>{process.exit(143)})}function fS(){St=null}function qF(){La||(process.on("SIGINT",uS),process.on("SIGTERM",pS),process.on("exit",fS),La=!0)}function mS(){La&&(process.removeListener("SIGINT",uS),process.removeListener("SIGTERM",pS),process.removeListener("exit",fS),La=!1)}async function zF(t){return St!==null?St:(Ln!==null||(Ln=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(dS(),cS)),n=Kw(t),r=new e(n);return qF(),St=r,Ln=null,r})()),Ln)}async function up(){if(St===null)return;let t=St;St=null,Ln=null,mS(),await t.shutdown()}function JF(){return St!==null}function VF(){return St}function YF(){St=null,Ln=null,mS()}var St,Ln,La,$n=y(()=>{"use strict";Pa();St=null,Ln=null,La=!1});async function gS(t,e){try{return await Ow(t,e)}catch(n){return F("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function nL(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>($n(),Nn));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function hS(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??nL,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i=t,a=null,l=null;try{let d=await Ca(n,t,{headers:tL,signal:e.signal},o);a=d.status,i=d.url||t;let u=d.headers.get("content-type")??"";if(d.ok){if(eL.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let p=await d.text();if(ZF.test(u)&&!QF.test(u))return{title:"",markdown:p.trim(),finalUrl:i,usedRender:!1};if(s=await gS(p,i),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(d){if(e.signal.aborted||d instanceof it||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;l=d}if(!(s===null||s.textLength<200)&&s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};try{await No(t,o);let d=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:p=>No(p,o)});d.finalUrl!==t&&/^https?:\/\//i.test(d.finalUrl)&&await No(d.finalUrl,o);let u=await gS(d.html,d.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||u.textLength>=s.textLength)return{title:u.title,markdown:u.markdown,finalUrl:d.finalUrl,usedRender:!0}}catch(d){if(e.signal.aborted||d instanceof it)throw d;if(s===null){let u=d instanceof Error?d.message:String(d),p=l instanceof Error?l.message:`HTTP ${a??"error"}`,f=new Error(`web_scrape could not retrieve ${t}: fetch failed (${p}) and render failed (${u}).`);throw f.cause=d,f}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${a??"error"}).`)}var QF,ZF,eL,tL,yS=y(()=>{"use strict";Dw();tp();fe();QF=/(text\/html|application\/xhtml\+xml)/i,ZF=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,eL=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,tL={"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 sL(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(rL,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),oL),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=hr(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.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 bS(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?sL({apiKey:t.exaApiKey,fetchFn:t.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 wS(t,e){if(e.length===0)return`# Search results for "${t}"
|
|
869
869
|
|
|
870
870
|
(no results)`;let n=[`# Search results for "${t}"`,""];return e.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(`
|
|
871
871
|
`).trimEnd()}var rL,oL,SS=y(()=>{"use strict";kn();rL="https://api.exa.ai/search",oL=10});function Na(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var Un=y(()=>{"use strict";op()});function uL(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.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,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(e.url)}catch{return{error:`Invalid input: "${e.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 i=iL;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,aL)}let a=lL;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,cL)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function pp(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:Mt(t,e),truncated:!0}}function pL(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env,r=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{};return async(o,s)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let i=uL(o);if("error"in i)return{content:i.error,isError:!0};if(s.aborted){let u=s.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(s.reason)},c,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await ep(i.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(i.mode==="raw"){let p;try{let g={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await Ca(e,i.url,g,r)}catch(g){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:g instanceof it?{content:`web_scrape blocked: ${g.message}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let m=pp(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await hS(i.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:i.timeoutMs,signal:a.signal,...t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let f=pp(p.markdown,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${d()}`,isError:!0};if(p instanceof it)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=Me(p)&&!np(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${$o()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=bS({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in u)return{content:u.error,isError:!0};try{let p=await u.search(i.query,{limit:dL,timeoutMs:i.timeoutMs,signal:a.signal}),f=pp(wS(i.query,p),i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),s.removeEventListener("abort",l)}}}var iL,aL,lL,cL,dL,vS,kS=y(()=>{"use strict";yS();SS();tp();Cn();Un();iL=3e4,aL=12e4,lL=1e5,cL=1e6,dL=10;vS=pL()});import{existsSync as AS,mkdirSync as fL,readFileSync as mL,renameSync as gL,unlinkSync as hL,writeFileSync as yL}from"node:fs";import{dirname as ES,join as bL}from"node:path";import{randomBytes as wL}from"node:crypto";function Ar(t){let e=t??od();if(!AS(e))return[];try{let n=mL(e,"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 ${e}: ${r}`),[]}}function $a(t,e){let n=e??od();fL(ES(n),{recursive:!0});let r=bL(ES(n),`.schedules.json.${process.pid}.${wL(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{yL(r,o,"utf-8"),gL(r,n)}catch(s){try{AS(r)&&hL(r)}catch{}throw s}}function _S(t,e){let n=Ar(e),r=n.map(l=>l.id),o=SL(t.name),s=vL(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),$a(n,e),a}function TS(t,e){let n=Ar(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:($a(o,e),!0)}function xS(t,e){return Ar(e).find(n=>n.id===t)}function SL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function vL(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}var RS=y(()=>{"use strict";j()});import{existsSync as kL,readFileSync as EL}from"node:fs";import{join as AL}from"node:path";async function Uo(t,e,n){let r;try{let o=AL(kg("default"),"port");if(!kL(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=EL(o,"utf-8").trim();if(r=parseInt(s,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:t==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var fp,CS=y(()=>{"use strict";j();fp="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 _L}from"node:fs";import{readFile as TL}from"node:fs/promises";var IS,PS,MS,OS,DS=y(()=>{"use strict";RS();j();CS();IS=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;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 s=_S({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}),i=s.enabled?await Uo("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await Uo("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:fp}})}},PS=async(t,e)=>{let n=Ar();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})))}},MS=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;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,s=Js();if(!_L(s))return{content:JSON.stringify([])};let i;try{let c=await TL(s);i=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
|
|
@@ -1223,7 +1223,7 @@ The sub-agent that just finished returned output that reads like **decision-driv
|
|
|
1223
1223
|
Single-pass sub-agent reports are prone to confident hallucination \u2014 polished output that falls apart on re-derivation. Before acting on these conclusions, consider dispatching \`/shadow-verify\`. Independent verifiers will re-derive the 2\u20133 most load-bearing claims from scratch (without seeing the original reasoning) and flag any that don't hold up.
|
|
1224
1224
|
|
|
1225
1225
|
Skip when: the findings are purely exploratory, the sub-agent ran inside an already-verifying orchestrator, the user is about to dismiss the report, or the stakes are low (read-only Q&A).`,f1=c1.map(t=>new RegExp(`(?:^|-)${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}(?:-|$)`,"i"));function m1(t){return t?f1.some(e=>e.test(t)):!1}function g1(t){return u1.some(e=>e.test(t))}function h1(t){let e=0;for(let n of d1)n.test(t)&&e++;return e}function kR(){let t=!1,e=new Set;return n=>{if(n.event==="Stop")return t=!1,{};if(n.event!=="SubagentStop")return{};let r=n.lastMessage??"";return r.length<600?{}:m1(n.agentType)?{}:g1(r)?{}:h1(r)<2?{}:t||e.has(n.subagentId)?{}:(t=!0,e.add(n.subagentId),{injectContext:p1})}}bn();Ro();var ER=300,y1="ask_question gate: no interactive operator is attached to this surface (no elicitation handler \u2014 daemon/scheduled/one-shot run), so the question cannot be answered now. The operator has been notified asynchronously. Do not re-ask or wait. Choose the most reasonable interpretation, state the assumption explicitly in your final report for async review, and proceed. If no safe assumption exists and the next action would be irreversible, end the turn with a Blocked terminal state naming exactly what the operator must supply.";function b1(t){xo(t).catch(()=>{})}function AR(t={}){let e=t.hasHandler??(()=>He.hasHandler()),n=t.notify??b1;return function(o){if(o.event!=="PreToolUse")return{};if(o.toolName!=="ask_question")return{};if(e())return{};try{let i=(typeof o.input=="object"&&o.input!==null?String(o.input.question??""):"").trim(),a=i.length<=ER?i:`${i.slice(0,ER)}\u2026(truncated)`;n(`\u{1F514} AFK question (auto-gated; agent proceeds on a stated assumption):
|
|
1226
|
-
`+(a!==""?a:"(question text unavailable)"))}catch{}return{decision:"block",reason:y1}}}var w1="safe-destruct observe-only: destructive-command attempt",S1=[{id:"rm-recursive-force",re:/\brm\s+-(?=[a-z]*r)(?=[a-z]*f)[a-z]+/i},{id:"rm-recursive-force-split",re:/\brm\s+-[a-z]*r[a-z]*\s+-[a-z]*f|\brm\s+-[a-z]*f[a-z]*\s+-[a-z]*r/i},{id:"rm-recursive-force-long",re:/\brm\s+[^|&;\n]*--recursive\b[^|&;\n]*--force\b|\brm\s+[^|&;\n]*--force\b[^|&;\n]*--recursive\b/i},{id:"rm-no-preserve-root",re:/\brm\b[^|&;\n]*--no-preserve-root\b/i},{id:"git-reset-hard",re:/\bgit\s+reset\s+--hard\b/i},{id:"git-clean-force",re:/\bgit\s+clean\s+-[a-z]*f|\bgit\s+clean\s+[^|&;\n]*--force\b/i},{id:"git-push-force",re:/\bgit\s+push\b[^|&;\n]*--force\b|\bgit\s+push\b[^|&;\n]*(?<![\w-])-f\b/i},{id:"git-branch-force-delete",re:/\bgit\s+branch\s+[^|&;\n]*-D\b/},{id:"dd-to-device",re:/\bof=\/dev\/(?!null\b|zero\b|random\b|urandom\b|stdout\b|stderr\b|tty\b)\S/i},{id:"mkfs",re:/\bmkfs(\.\w+)?\b/i},{id:"redirect-to-block-device",re:/>\s*\/dev\/(sd|nvme|hd|disk|mmcblk|vd)\w*/i},{id:"find-delete",re:/\bfind\b[^|&;\n]*-delete\b|\bfind\b[^|&;\n]*-exec\s+rm\b/i},{id:"shred",re:/\bshred\b/i},{id:"sql-drop-truncate-delete",re:/\b(drop\s+(table|database|schema|index)\b|truncate\s+table\b|delete\s+from\b)/i},{id:"docker-destructive",re:/\bdocker\s+(system\s+prune|volume\s+(rm|prune)|image\s+prune|container\s+prune|network\s+prune)\b|\bdocker\b[^|&;\n]*\brmi?\s+[^|&;\n]*-f/i},{id:"kubectl-delete",re:/\bkubectl\s+delete\b/i},{id:"terraform-destroy",re:/\bterraform\s+destroy\b/i}];function v1(t){if(!t)return[];let e=[];for(let{id:n,re:r}of S1)r.test(t)&&e.push(n);return e}function _R(){return function(e){if(e.event!=="PreToolUse")return{};if(e.toolName!=="bash")return{};let n=e.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=v1(r);return o.length===0?{}:{decision:"approve",reason:`${w1} [${o.join(", ")}]`}}}var k1="release-boundary observe-only: publish/deploy/sync-boundary command",E1=[{id:"npm-publish",re:/\bnpm\s+publish\b/i},{id:"pnpm-publish",re:/\bpnpm\s+publish\b/i},{id:"yarn-publish",re:/\byarn\s+(?:npm\s+)?publish\b/i},{id:"cargo-publish",re:/\bcargo\s+publish\b/i},{id:"pypi-twine-upload",re:/\btwine\s+upload\b/i},{id:"poetry-publish",re:/\bpoetry\s+publish\b/i},{id:"gem-push",re:/\bgem\s+push\b/i},{id:"docker-push",re:/\bdocker\s+(?:image\s+)?push\b/i},{id:"gh-release-create",re:/\bgh\s+release\s+create\b/i},{id:"terraform-apply",re:/\bterraform\s+apply\b/i},{id:"kubectl-apply",re:/\bkubectl\s+apply\b/i},{id:"git-push-mirror",re:/\bgit\s+push\b[^|&;\n]*--mirror\b/i},{id:"git-push-tags",re:/\bgit\s+push\b[^|&;\n]*--(?:tags|follow-tags)\b/i}];function A1(t){if(!t)return[];let e=[];for(let{id:n,re:r}of E1)r.test(t)&&e.push(n);return e}function TR(){return function(e){if(e.event!=="PreToolUse")return{};if(e.toolName!=="bash")return{};let n=e.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=A1(r);return o.length===0?{}:{decision:"approve",reason:`${k1} [${o.join(", ")}]`}}}xt();Rl();Ru();function xR(t){return function(n){if(n.event!=="PreToolUse")return{};if(n.parentSessionId)return{};if(t()!=="plan")return{};let{toolName:r}=n;if(xl(r)==="write")return{decision:"block",reason:`plan mode: ${r} is refused. Use /plan off to exit plan mode.`};if(r==="worktree"){let o=typeof n.input=="object"&&n.input!==null?String(n.input.action??""):"";if(o!=="list")return{decision:"block",reason:`plan mode: worktree "${o}" is refused (mutates the worktree registry). Only action "list" is allowed in plan mode. Use /plan off to act.`}}if(r==="bash"){let o=typeof n.input=="object"&&n.input!==null?String(n.input.command??""):"",s=ba(o);if(s.mutating)return{decision:"block",reason:`plan mode: bash refused \u2014 command looks state-mutating (${s.reason??"mutation detected"}). Read-only investigation (git status/log/diff, ls, cat, grep, find) is allowed. Use /plan off to act.`}}return{}}}import Vr from"path";vr();Rl();import RR from"path";var _1=["rm -rf","rm ","sudo","eval ","chmod","chown","git push --force","git push -f","git reset --hard","mkfs","fdisk","diskutil eraseDisk","dd if=","dd of=","| sh","| bash","|sh","|bash"],T1=["git push","git reset","git commit","git stash drop","git stash clear","npm install","pnpm install","yarn","pip install","apt ","apt-get ","brew install","tee "," > "," >> ","mv ","cp ","mkdir","touch","pnpm build","tsc ","eslint --fix"],x1=["pnpm test","vitest","jest","pytest","cargo test","go test","git status","git log","git diff","git show","ls ","cat ","head ","tail ","find ","grep ","echo ","printf "];function R1(t){return typeof t=="object"&&t!==null&&"command"in t?String(t.command??""):typeof t=="string"?t:""}function C1(t){if(typeof t!="object"||t===null)return"";let e=t;return typeof e.file_path=="string"?e.file_path:typeof e.path=="string"?e.path:""}function I1(t){for(let e of _1)if(t.includes(e))return"high";for(let e of T1)if(t.includes(e))return"medium";for(let e of x1)if(t.includes(e))return"safe";return"medium"}function P1(t,e){if(!t)return"safe";let n=ge(RR.resolve(e.cwd,t)),r=Bu();for(let o of r)if(n===o||n.startsWith(o+"/"))return"high";if(n.includes("/.git/"))return"high";if(e.workspaceRoot!==void 0){let o=ge(e.workspaceRoot);if(RR.relative(o,n).startsWith(".."))return"high"}return n.includes("/node_modules/")?"medium":"safe"}var M1=new Set(["delete","drop","remove","destroy","truncate","purge","wipe","write","create","update","insert","upsert","patch","rename","exec","execute","run","eval","send","push","publish","deploy","post","merge","rollback","reset","terminate","provision","scale","disable","charge","refund","revoke"]);function O1(t){return t.split("__").slice(1).join("__").split(/[_-]+/).filter(Boolean)}function CR(t,e,n){let r=t.toLowerCase();if(r==="bash"){let o=R1(e);return I1(o)}if(r==="write_file"||r==="edit_file"){let o=C1(e);return P1(o,n)}if(xl(t)==="read")return"safe";if(r==="send_telegram")return"medium";if(r.startsWith("mcp__"))return O1(r).some(s=>M1.has(s))?"high":"medium";if(r==="create_schedule"||r==="cancel_schedule")return"high";if(r==="worktree"){let o=typeof e=="object"&&e!==null?e:{},s=typeof o.action=="string"?o.action:"";return s==="list"?"safe":s==="remove"&&o.force===!0?"high":"medium"}return r==="browser_act"||r==="browser_open"||r==="web_scrape"?"medium":"safe"}bn();Q();Sm();_u();vr();import Um from"path";import{lstatSync as D1}from"fs";import{spawnSync as F1}from"child_process";var L1=new Set(["node_modules","dist","build",".next","coverage",".cache","__pycache__",".turbo",".parcel-cache","out","target"]),N1=/[*?$`(){};|&<>'"
|
|
1226
|
+
`+(a!==""?a:"(question text unavailable)"))}catch{}return{decision:"block",reason:y1}}}var w1="safe-destruct observe-only: destructive-command attempt",S1=[{id:"rm-recursive-force",re:/\brm\s+-(?=[a-z]*r)(?=[a-z]*f)[a-z]+/i},{id:"rm-recursive-force-split",re:/\brm\s+-[a-z]*r[a-z]*\s+-[a-z]*f|\brm\s+-[a-z]*f[a-z]*\s+-[a-z]*r/i},{id:"rm-recursive-force-long",re:/\brm\s+[^|&;\n]*--recursive\b[^|&;\n]*--force\b|\brm\s+[^|&;\n]*--force\b[^|&;\n]*--recursive\b/i},{id:"rm-no-preserve-root",re:/\brm\b[^|&;\n]*--no-preserve-root\b/i},{id:"git-reset-hard",re:/\bgit\s+reset\s+--hard\b/i},{id:"git-clean-force",re:/\bgit\s+clean\s+-[a-z]*f|\bgit\s+clean\s+[^|&;\n]*--force\b/i},{id:"git-push-force",re:/\bgit\s+push\b[^|&;\n]*--force\b|\bgit\s+push\b[^|&;\n]*(?<![\w-])-f\b/i},{id:"git-branch-force-delete",re:/\bgit\s+branch\s+[^|&;\n]*-D\b/},{id:"dd-to-device",re:/\bof=\/dev\/(?!null\b|zero\b|random\b|urandom\b|stdout\b|stderr\b|tty\b)\S/i},{id:"mkfs",re:/\bmkfs(\.\w+)?\b/i},{id:"redirect-to-block-device",re:/>\s*\/dev\/(sd|nvme|hd|disk|mmcblk|vd)\w*/i},{id:"find-delete",re:/\bfind\b[^|&;\n]*-delete\b|\bfind\b[^|&;\n]*-exec\s+rm\b/i},{id:"shred",re:/\bshred\b/i},{id:"sql-drop-truncate-delete",re:/\b(drop\s+(table|database|schema|index)\b|truncate\s+table\b|delete\s+from\b)/i},{id:"docker-destructive",re:/\bdocker\s+(system\s+prune|volume\s+(rm|prune)|image\s+prune|container\s+prune|network\s+prune)\b|\bdocker\b[^|&;\n]*\brmi?\s+[^|&;\n]*-f/i},{id:"kubectl-delete",re:/\bkubectl\s+delete\b/i},{id:"terraform-destroy",re:/\bterraform\s+destroy\b/i}];function v1(t){if(!t)return[];let e=[];for(let{id:n,re:r}of S1)r.test(t)&&e.push(n);return e}function _R(){return function(e){if(e.event!=="PreToolUse")return{};if(e.toolName!=="bash")return{};let n=e.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=v1(r);return o.length===0?{}:{decision:"approve",reason:`${w1} [${o.join(", ")}]`}}}var k1="release-boundary observe-only: publish/deploy/sync-boundary command",E1=[{id:"npm-publish",re:/\bnpm\s+publish\b/i},{id:"pnpm-publish",re:/\bpnpm\s+publish\b/i},{id:"yarn-publish",re:/\byarn\s+(?:npm\s+)?publish\b/i},{id:"cargo-publish",re:/\bcargo\s+publish\b/i},{id:"pypi-twine-upload",re:/\btwine\s+upload\b/i},{id:"poetry-publish",re:/\bpoetry\s+publish\b/i},{id:"gem-push",re:/\bgem\s+push\b/i},{id:"docker-push",re:/\bdocker\s+(?:image\s+)?push\b/i},{id:"gh-release-create",re:/\bgh\s+release\s+create\b/i},{id:"terraform-apply",re:/\bterraform\s+apply\b/i},{id:"kubectl-apply",re:/\bkubectl\s+apply\b/i},{id:"git-push-mirror",re:/\bgit\s+push\b[^|&;\n]*--mirror\b/i},{id:"git-push-tags",re:/\bgit\s+push\b[^|&;\n]*--(?:tags|follow-tags)\b/i}];function A1(t){if(!t)return[];let e=[];for(let{id:n,re:r}of E1)r.test(t)&&e.push(n);return e}function TR(){return function(e){if(e.event!=="PreToolUse")return{};if(e.toolName!=="bash")return{};let n=e.input,r=typeof n?.command=="string"?n.command:"";if(!r)return{};let o=A1(r);return o.length===0?{}:{decision:"approve",reason:`${k1} [${o.join(", ")}]`}}}xt();Rl();Ru();function xR(t){return function(n){if(n.event!=="PreToolUse")return{};if(n.parentSessionId)return{};if(t()!=="plan")return{};let{toolName:r}=n;if(xl(r)==="write")return{decision:"block",reason:`plan mode: ${r} is refused. Use /plan off to exit plan mode.`};if(r==="worktree"){let o=typeof n.input=="object"&&n.input!==null?String(n.input.action??""):"";if(o!=="list")return{decision:"block",reason:`plan mode: worktree "${o}" is refused (mutates the worktree registry). Only action "list" is allowed in plan mode. Use /plan off to act.`}}if(r==="bash"){let o=typeof n.input=="object"&&n.input!==null?String(n.input.command??""):"",s=ba(o);if(s.mutating)return{decision:"block",reason:`plan mode: bash refused \u2014 command looks state-mutating (${s.reason??"mutation detected"}). Read-only investigation (git status/log/diff, ls, cat, grep, find) is allowed. Use /plan off to act.`}}return{}}}import Vr from"path";vr();Rl();import RR from"path";var _1=["rm -rf","rm ","sudo","eval ","chmod","chown","git push --force","git push -f","git reset --hard","mkfs","fdisk","diskutil eraseDisk","dd if=","dd of=","| sh","| bash","|sh","|bash"],T1=["git push","git reset","git commit","git stash drop","git stash clear","npm install","pnpm install","yarn","pip install","apt ","apt-get ","brew install","tee "," > "," >> ","mv ","cp ","mkdir","touch","pnpm build","tsc ","eslint --fix"],x1=["pnpm test","vitest","jest","pytest","cargo test","go test","git status","git log","git diff","git show","ls ","cat ","head ","tail ","find ","grep ","echo ","printf "];function R1(t){return typeof t=="object"&&t!==null&&"command"in t?String(t.command??""):typeof t=="string"?t:""}function C1(t){if(typeof t!="object"||t===null)return"";let e=t;return typeof e.file_path=="string"?e.file_path:typeof e.path=="string"?e.path:""}function I1(t){for(let e of _1)if(t.includes(e))return"high";for(let e of T1)if(t.includes(e))return"medium";for(let e of x1)if(t.includes(e))return"safe";return"medium"}function P1(t,e){if(!t)return"safe";let n=ge(RR.resolve(e.cwd,t)),r=Bu();for(let o of r)if(n===o||n.startsWith(o+"/"))return"high";if(n.includes("/.git/"))return"high";if(e.workspaceRoot!==void 0){let o=ge(e.workspaceRoot);if(RR.relative(o,n).startsWith(".."))return"high"}return n.includes("/node_modules/")?"medium":"safe"}var M1=new Set(["delete","drop","remove","destroy","truncate","purge","wipe","write","create","update","insert","upsert","patch","rename","exec","execute","run","eval","send","push","publish","deploy","post","merge","rollback","reset","terminate","provision","scale","disable","charge","refund","revoke"]);function O1(t){return t.split("__").slice(1).join("__").split(/[_-]+/).filter(Boolean)}function CR(t,e,n){let r=t.toLowerCase();if(r==="bash"){let o=R1(e);return I1(o)}if(r==="write_file"||r==="edit_file"){let o=C1(e);return P1(o,n)}if(xl(t)==="read")return"safe";if(r==="send_telegram")return"medium";if(r.startsWith("mcp__"))return O1(r).some(s=>M1.has(s))?"high":"medium";if(r==="create_schedule"||r==="cancel_schedule")return"high";if(r==="worktree"){let o=typeof e=="object"&&e!==null?e:{},s=typeof o.action=="string"?o.action:"";return s==="list"?"safe":s==="remove"&&o.force===!0?"high":"medium"}return r==="browser_act"||r==="browser_open"||r==="web_scrape"?"medium":"safe"}bn();Q();Sm();_u();vr();import Um from"path";import{lstatSync as D1}from"fs";import{spawnSync as F1}from"child_process";var L1=new Set(["node_modules","dist","build",".next","coverage",".cache","__pycache__",".turbo",".parcel-cache","out","target"]),N1=/[*?$`(){};|&<>'"\\\r\n]/;function $1(t){return t==="--recursive"?!0:t.startsWith("--")?!1:/^-[A-Za-z]+$/.test(t)&&/[rR]/.test(t)}function U1(t){if(!/^rm\b/.test(t)||N1.test(t))return null;let e=t.trim().split(/\s+/),n=[],r=!1,o=!1;for(let s of e.slice(1)){if(!o&&s==="--"){o=!0;continue}if(!o&&s.startsWith("-")){$1(s)&&(r=!0);continue}n.push(s)}return n.length===0?null:{targets:n,recursive:r}}function B1(t,e){try{return D1(t).isDirectory()?F1("git",["check-ignore","--quiet","--",t],{cwd:e,stdio:"ignore"}).status===0:!1}catch(n){return n.code==="ENOENT"}}function IR(t,e,n){let r=U1(t);if(r===null||!r.recursive)return!1;let o=ge(n);for(let s of r.targets){if(s==="/"||s==="."||s===".."||s==="~"||s.startsWith("~/")||s==="$HOME"||s.startsWith("$HOME/")||s===".git"||s.startsWith(".git/"))return!1;let i=ge(Um.resolve(e,s));if(i===o||!i.startsWith(o+Um.sep)||!L1.has(Um.basename(i))||!B1(i,o))return!1}return!0}var H1=3e5,PR=300;function MR(t,e,n,r){let o=r?.approvalTimeoutMs??H1,s=r?.promptForApproval??!0,i=r?.traceWriter,a=r?.sessionId,l=r?.route??((d,u)=>He.route(d,u));async function c(d,u,p,f){let m=Date.now(),g=j1(d,u),h=new AbortController,w=()=>h.abort();p&&(p.aborted?h.abort():p.addEventListener("abort",w,{once:!0}));let v=Symbol("afk-approval-timeout"),A,E,T=new Promise(x=>{E=()=>{A||(A=setTimeout(()=>{h.abort(),x(v)},o),A.unref?.())}});function _(x,C){let I=Date.now()-m,L=x.decision==="block";return Ve(i,{hookEvent:"PreToolUse",...L?{decision:"block"}:{},...L&&x.reason!==void 0?{reason:x.reason}:{},...L?{blockedTool:d}:{},durationMs:I,approvalOutcome:C}),x}let R;try{let x=f??a;R=await Promise.race([l(g,{signal:h.signal,onActive:E,...x!==void 0?{sessionId:x}:{}}),T])}finally{A&&clearTimeout(A),p&&p.removeEventListener("abort",w)}if(R===v)return _($s(d,`no approval arrived within ${Math.round(o/1e3)}s`),"timeout");if(R.action!=="accept")return _($s(d,R.action==="cancel"?"the operator cancelled the approval prompt":"no operator approval was available"),R.action==="cancel"?"cancel":"decline");let S=String(R.content?.choice??"").toLowerCase();return S==="approve"?_({},"approved"):S==="deny"?_($s(d,"the operator denied it"),"denied"):_($s(d,"the approval prompt returned an unrecognised choice"),"unrecognised")}return function(u,p){if(u.event!=="PreToolUse")return{};if(t()!=="autonomous")return{};let{toolName:f}=u,m=Date.now();if(f==="send_telegram")return{};let g=n?.()??e??process.cwd(),h=u.cwd,w=h??g,A=(h!==void 0?K1(h,g):void 0)??g,E=CR(f,u.input,{cwd:w,workspaceRoot:A});if(E==="high"&&f==="bash"){let T=typeof u.input=="object"&&u.input!==null&&"command"in u.input?String(u.input.command??""):"";if(T&&IR(T,w,A))return Ve(i,{hookEvent:"PreToolUse",blockedTool:f,durationMs:Date.now()-m,approvalOutcome:"carve-out"}),{}}if(E!=="high")return{};if(u.parentSessionId!==void 0||!s){let T=$s(f,"AFK mode runs autonomously without a human watching");return Ve(i,{hookEvent:"PreToolUse",decision:"block",...T.reason!==void 0?{reason:T.reason}:{},blockedTool:f,durationMs:Date.now()-m,approvalOutcome:"hard-block"}),T}return c(f,u.input,p,u.sessionId)}}function j1(t,e){let n=W1(e);return{serverName:"agent-afk",message:`AFK: \`${t}\` is high-risk / irreversible and AFK mode runs unattended. Approve this single call?`+(n?`
|
|
1227
1227
|
|
|
1228
1228
|
Input: ${n}`:""),mode:"form",title:"AFK high-risk approval",requestedSchema:{type:"object",properties:{choice:{type:"string",title:"Approve this high-risk operation?",enum:["approve","deny"],description:"'approve' runs this single call. 'deny' refuses it (the model gets an error and should push an Asking summary or take a safe path)."}},required:["choice"]}}}function W1(t){let e;try{e=typeof t=="string"?t:JSON.stringify(t)}catch{e=String(t)}return e?(e=wm(e),e.length>PR?`${e.slice(0,PR)}\u2026 [truncated]`:e):""}function $s(t,e){return{decision:"block",reason:`AFK mode: ${t} is refused \u2014 this op is high-risk or irreversible, and ${e}. Push an Asking summary to Telegram (send_telegram) and stop, or have the operator run /afk off and take over.`}}function K1(t,e){let n=Vr.resolve(t),r=Vr.resolve(e);if(n===r)return r;let o=Vr.relative(r,n);if(o!==""&&!o.startsWith("..")&&!Vr.isAbsolute(o))return yr(n)??n;let s=yr(r),i=yr(n);if(s!==void 0&&i!==void 0&&Vr.dirname(s)===Vr.dirname(i))return i}be();Rn();import{mkdirSync as z1,rmSync as J1,writeFileSync as V1}from"fs";import{join as Bm}from"path";de();ha();function G1(t){let e=new Set;for(let a of t.nodes){if(e.has(a.id))throw new Error(`Duplicate node ID: ${a.id}`);e.add(a.id)}let n=new Set;for(let a of t.edges){if(!e.has(a.from))throw new Error(`Edge references non-existent node: ${a.from}`);if(!e.has(a.to))throw new Error(`Edge references non-existent node: ${a.to}`);let l=`${a.from}->${a.to}`;if(n.has(l))throw new Error(`Duplicate edge: ${a.from} -> ${a.to}`);n.add(l)}let r=OR(t),o=new Map(r.inDegree),s=[];for(let[a,l]of o)l===0&&s.push(a);let i=0;for(;s.length>0;){let a=s.shift();i+=1;for(let l of r.downstream.get(a)??[]){let c=o.get(l)-1;o.set(l,c),c===0&&s.push(l)}}if(i!==e.size)throw new Error("Cycle detected in DAG")}function OR(t){let e=new Map,n=new Map,r=new Map;for(let o of t.nodes)e.set(o.id,new Set),n.set(o.id,new Set),r.set(o.id,0);for(let o of t.edges)e.get(o.from).add(o.to),n.get(o.to).add(o.from),r.set(o.to,r.get(o.to)+1);return{downstream:e,upstream:n,inDegree:r}}function q1(t,e,n){let r=[t];for(;r.length>0;){let o=r.shift();for(let s of e.get(o)??[])n.has(s)||(n.add(s),r.push(s))}}async function DR(t,e,n={}){if(t.nodes.length===0)return{outputs:{},failed:[],skipped:[]};G1(t);let{failFast:r=!0,nodeTimeoutMs:o,maxConcurrency:s=8}=n,i=o!==void 0&&Number.isFinite(o)&&o>0,a=OR(t),l=new Map(t.nodes.map(h=>[h.id,h])),c={},d=[],u=new Set,p=new Set,f=new Map(a.inDegree),m=new AbortController,g=()=>{m.signal.aborted||m.abort(e.reason)};e.aborted?m.abort(e.reason):e.addEventListener("abort",g,{once:!0});try{for(;!m.signal.aborted;){let h=[];for(let[v,A]of f)A===0&&!p.has(v)&&!u.has(v)&&h.push(v);if(h.length===0)break;let w=await br(h,s,async v=>{let A=l.get(v),E=new AbortController,T=()=>{E.signal.aborted||E.abort(m.signal.reason)};m.signal.aborted?E.abort(m.signal.reason):m.signal.addEventListener("abort",T,{once:!0});let _;i&&!E.signal.aborted&&(_=setTimeout(()=>{E.signal.aborted||E.abort(new Ie(`DAG node "${v}" exceeded nodeTimeoutMs of ${o}ms`,o))},o));let R={};for(let S of a.upstream.get(v)??[])R[S]=c[S];try{let S=await A.run(R,E.signal);return{id:v,result:S}}finally{_!==void 0&&clearTimeout(_),m.signal.removeEventListener("abort",T)}});for(let v=0;v<w.length;v++){let A=w[v];if(A.status==="fulfilled"){let{id:E,result:T}=A.value;c[E]=T,p.add(E),f.delete(E);for(let _ of a.downstream.get(E)??[])f.set(_,f.get(_)-1)}else{let E=A.reason instanceof Error?A.reason:new Error(String(A.reason)),T=h[v];d.push({id:T,error:E}),p.add(T),f.delete(T),q1(T,a.downstream,u),r&&m.abort("fail-fast")}}}}finally{e.removeEventListener("abort",g)}return{outputs:c,failed:d,skipped:Array.from(u)}}Ce();de();async function FR(t){let{manager:e,parentSession:n,nodes:r,edges:o,failFast:s,nodeTimeoutMs:i}=t,a=n.abortSignal??new AbortController().signal,l=r.map(c=>({id:c.id,async run(d,u){let p=await e.forkSubagent({parent:{sessionId:n.sessionId},config:{model:c.model??"sonnet",systemPrompt:c.systemPrompt,...c.canUseTool!==void 0?{canUseTool:c.canUseTool}:{},...c.cwd!==void 0?{cwd:c.cwd}:{},...c.readRoots!==void 0?{readRoots:c.readRoots}:{},...c.writeRoots!==void 0?{writeRoots:c.writeRoots}:{},...c.apiKey!==void 0?{apiKey:c.apiKey}:{},...c.maxToolUseIterations!==void 0?{maxToolUseIterations:c.maxToolUseIterations}:{}},idPrefix:c.idPrefix??`dag-${c.id}`,...c.outputSchema!==void 0?{outputSchema:c.outputSchema}:{},agentType:c.agentType??c.idPrefix??`dag-${c.id}`,...c.parentId!==void 0?{parentId:c.parentId}:{}}),f=()=>{p.cancel().catch(()=>{})};u.aborted?p.cancel().catch(()=>{}):u.addEventListener("abort",f,{once:!0});try{if(u.aborted)throw new DOMException("Aborted","AbortError");let m=c.promptBuilder(d),g=await p.runToResult(m);if(g.status!=="succeeded"){let w,v=u.reason;throw v instanceof Ie?w=new Error(`Subagent ${c.id} aborted: ${v.message}`,g.error?{cause:g.error}:{}):w=g.error??new Error(`Subagent ${c.id} ${g.status}`),PE(w,{partialOutput:g.partialOutput,subagentId:g.id})}if(g.output!==void 0)return g.output;let h=g.message?.content;return typeof h=="string"?Br(h,g.stopReason):h}finally{u.removeEventListener("abort",f),await p.teardown().catch(()=>{})}}}));return DR({nodes:l,edges:o},a,{failFast:s,nodeTimeoutMs:i})}ke();ht();un();Tn();j();var LR=1e3,qc=36e5,NR=1,$R=1e3;function Y1(t){if(typeof t!="object"||t===null)throw new Error("Compose tool input must be an object");let e=t,n=e.nodes;if(!Array.isArray(n)||n.length===0)throw new Error('Compose tool requires a non-empty "nodes" array');let r=20;if(n.length>r)throw new Error(`Compose tool supports at most ${r} nodes (got ${n.length}). Split into multiple compose calls for larger workloads.`);let o=[],s=new Set;for(let m of n){if(typeof m!="object"||m===null)throw new Error("Each node must be an object");let g=m,h=g.id;if(typeof h!="string"||h.trim().length===0)throw new Error('Each node must have a non-empty "id" string');if(!/^[A-Za-z0-9_-]+$/.test(h)){let A=h.replace(/[\x00-\x1f\x7f]/g,"?").slice(0,32);throw new Error(`Node id "${A}" must match /^[A-Za-z0-9_-]+$/ (alphanumeric, underscore, hyphen)`)}if(s.has(h))throw new Error(`Duplicate node ID: ${h}`);s.add(h);let w=g.prompt;if(typeof w!="string"||w.trim().length===0)throw new Error(`Node "${h}" must have a non-empty "prompt" string`);let v;if(g.model!==void 0){if(typeof g.model!="string")throw new Error(`Node "${h}" model must be a string`);v=g.model}o.push({id:h,prompt:w,model:v})}let i;if(e.edges!==void 0){if(!Array.isArray(e.edges))throw new Error('"edges" must be an array');i=[];for(let m of e.edges){if(typeof m!="object"||m===null)throw new Error("Each edge must be an object");let g=m;if(typeof g.from!="string"||typeof g.to!="string")throw new Error('Each edge must have "from" and "to" strings');if(!s.has(g.from))throw new Error(`Edge references non-existent node: ${g.from}`);if(!s.has(g.to))throw new Error(`Edge references non-existent node: ${g.to}`);i.push({from:g.from,to:g.to})}}let a;if(e.fail_fast!==void 0){if(typeof e.fail_fast!="boolean")throw new Error('"fail_fast" must be a boolean');a=e.fail_fast}let l=[],c;if(e.node_timeout_ms!==void 0){let m=e.node_timeout_ms;if(typeof m!="number"||!Number.isFinite(m)||m<=0)throw new Error('"node_timeout_ms" must be a positive finite number (milliseconds)');if(m<LR)throw new Error(`"node_timeout_ms" must be at least ${LR}ms (got ${m}). Sub-second timeouts are almost always a unit mistake.`);c=Math.min(qc,m),m>qc&&l.push(`node_timeout_ms clamped: requested ${m}ms exceeds the maximum ${qc}ms; using ${qc}ms.`)}let d="max_tool_rounds_per_node",u="max_tool_calls_per_node",p=e[d]!==void 0?d:u;e[d]!==void 0&&e[u]!==void 0?l.push(`both "${d}" and the deprecated "${u}" were supplied; using "${d}" and ignoring the deprecated key.`):e[u]!==void 0&&l.push(`"${u}" is deprecated \u2014 use "${d}". The unit is tool-use ROUNDS (a round with N parallel calls costs 1), and spending the budget now triggers a tools-stripped wind-down round instead of cancelling the node.`);let f;if(e[p]!==void 0){let m=e[p];if(typeof m!="number"||!Number.isFinite(m)||m<=0)throw new Error(`"${p}" must be a positive finite number`);if(!Number.isInteger(m))throw new Error(`"${p}" must be an integer (got ${m}). Tool-use rounds are discrete events; fractional budgets are not meaningful.`);if(m<NR)throw new Error(`"${p}" must be at least ${NR}`);if(m>$R)throw new Error(`"${p}" must be at most ${$R} (got ${m}). A larger budget no longer constrains useful work.`);f=m}return{parsed:{nodes:o,edges:i,fail_fast:a,node_timeout_ms:c,max_tool_rounds_per_node:f},warnings:l}}var Us=8e3,UR=500,BR=4e3;function X1(t){if(t==null)return;let e=typeof t=="string"?t:JSON.stringify(t);if(e.length!==0)return e.length>BR?e.slice(0,BR)+`
|
|
1229
1229
|
\u2026 (truncated)`:e}function Q1(t,e,n,r){try{let o=Bm(_e(),t,"compose",e);z1(o,{recursive:!0});let s=Bm(o,`${n}.txt`);return V1(s,r,"utf8"),s}catch{return}}function Z1(t,e){let n=[],r=[];for(let[o,s]of Object.entries(t.outputs)){let i=typeof s=="string"?s:s!=null?JSON.stringify(s):"(no output)",a;if(i.length>Us){let l=Q1(e.sessionId,e.callId,o,i);r.push({nodeId:o,emittedChars:Us,totalChars:i.length,...l!==void 0?{spillPath:l}:{}});let c=l!==void 0?`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-afk",
|
|
3
|
-
"version": "5.84.
|
|
3
|
+
"version": "5.84.12",
|
|
4
4
|
"description": "Open-source coding-agent harness you can actually change — own the loop (prompts, gates, routing, skills, terminal states), use any model, run long tasks while you're away.",
|
|
5
5
|
"main": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|