agent-afk 5.136.0 → 5.137.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/telegram.mjs CHANGED
@@ -120,7 +120,7 @@ ${qp}
120
120
  `,"utf-8")}catch(r){O("WAL append failed (non-fatal):",String(r))}}};RN=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;IN=new Set(["fact","session_start","session_end","supersede"]),CN=new Set(["preference","convention","decision","learning"])});import{existsSync as MN,readFileSync as ON}from"fs";import{join as DN}from"path";function Pw(){let t=DN(Da(),"HOT.md");if(!MN(t))return null;try{let e=ON(t,"utf-8");return e.trim().length>0?e:null}catch{return null}}function Xp(t){let e=Pw();if(!e)return t;let r=`<cross-session-memory>
121
121
  ${e.replace(/<\/?cross-session-memory\b[^>]*>/gi,"")}
122
122
  </cross-session-memory>`;return{...t,hotMemory:r}}var Mw=g(()=>{"use strict";H()});function sn(t){switch(t){case"cli":case"repl":return"cli";case"telegram":return"telegram";case"daemon":return"daemon";case"web":return"web";case"subagent":case"unknown":case void 0:return"unknown"}}function Xa(t){return t==null?"main":"subagent"}function an(t){return(t??0)>0?"subagent":"main"}var Bn=g(()=>{"use strict"});function zp(t,e="cli"){return n=>{if(n.event!=="SessionEnd")return{};if(n.parentSessionId)return{};try{let r=n.sessionId;r&&(t.startSession({session_id:r,surface:e,actor:Xa(n.parentSessionId)}),t.endSession(r,n.reason??"session ended","completed"))}catch{}return{}}}var Ow=g(()=>{"use strict";Bn()});function Fw(t){return FN.has(t)}function za(){return v.AFK_MEMORY_EVIDENCE_GATE==="1"}function Vp(t){return Fw(t)}function Va(t){if(typeof t!="string")return null;let e=t.trim();return e.length>0?e:null}function Lw(t,e){return Fw(t)?Va(e)?"verified":"unverified":"not-applicable"}function Nw(t,e){return e!=="unverified"||t.startsWith(Dw)?t:`${Dw} ${t}`}var FN,Dw,Uw=g(()=>{"use strict";U();FN=new Set(["convention"]),Dw="[unverified]"});function NN(t,e){return e?t.map(n=>{if(n.type!=="fact"||!n.category)return{...n,verification:"not-applicable"};let r=Lw(n.category,n.evidence);return{...n,verification:r,content:Nw(n.content,r)}}):t.map(n=>{let r={...n};return delete r.evidence,delete r.verification,r})}function ls(t,e,n){let r=async i=>{try{let a=UN(i),c=t.search(a.query,{category:a.category,since:a.since,limit:a.limit??10});return{content:JSON.stringify(NN(c,za()))}}catch(a){return{content:`memory_search error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}},o=async i=>{try{let a=$N(i);if(a.target==="hot"){if(a.action!=="set")return{content:'Hot memory only supports action: "set". Use supersede/remove only for facts.',isError:!0};if(!a.content)return{content:'content is required for action: "set"',isError:!0};let c=t.saveHot(a.content),l={saved:!0,target:"hot",usage:{tokens:c.tokens,maxTokens:c.maxTokens,pct:c.pct}};return c.truncated?(l.truncated=!0,l.note='Hot memory exceeded the ~1,500-token cap and was truncated from the end (lowest-priority lines dropped; a sentinel marks the cut). Keep hot memory to a few durable essentials \u2014 move detail to the fact archive with target:"fact".'):c.pct>=Iw*100&&(l.warning=`Hot memory is at ${c.pct}% of the ~1,500-token cap. Move non-essential lines to the fact archive (target:"fact") before it truncates.`),{content:JSON.stringify(l)}}if(a.action==="set"){if(!a.category)return{content:"category is required for fact storage",isError:!0};if(!a.content)return{content:'content is required for action: "set"',isError:!0};let c=a.category,l=Va(a.evidence),u={id:t.storeFact({session_id:e,category:c,content:a.content,source_surface:n??"cli",evidence:l}),action:"set",target:"fact"};return za()&&Vp(c)&&!l&&(u.warning=$w),{content:JSON.stringify(u)}}if(a.action==="supersede"){if(!a.supersedes)return{content:'supersedes (fact ID) is required for action: "supersede"',isError:!0};if(!a.content)return{content:'content is required for action: "supersede"',isError:!0};let c=t.getFact(a.supersedes),l=a.evidence===void 0?void 0:Va(a.evidence),u={id:t.supersedeFact(a.supersedes,a.content,a.category??void 0,l),action:"supersede",target:"fact",supersedes:a.supersedes};if(za()){let p=a.category??c?.category;p&&Vp(p)&&((l===void 0?c?.evidence??null:l)?l===void 0&&(u.warning=LN):u.warning=$w)}return{content:JSON.stringify(u)}}if(a.action==="remove"){if(!a.id)return{content:'id (fact ID) is required for action: "remove"',isError:!0};let c=t.removeFact(a.id);return{content:JSON.stringify({removed:c,action:"remove",target:"fact"})}}return{content:`Unknown action: ${a.action}`,isError:!0}}catch(a){return{content:`memory_update error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}},s=async i=>{try{let a=BN(i);return t.writeProcedure(a.name,a.content,e),{content:JSON.stringify({name:a.name,written:!0})}}catch(a){return{content:`procedure_write error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}};return new Map([["memory_search",r],["memory_update",o],["procedure_write",s]])}function UN(t){if(typeof t!="object"||t===null)throw new Error("Input must be an object");let e=t;if(typeof e.query!="string")throw new Error("query (string) is required");let n={query:e.query};if(e.category!==void 0){if(typeof e.category!="string")throw new Error("category must be a string");let r=["preference","convention","decision","learning"];if(!r.includes(e.category))throw new Error(`category must be one of: ${r.join(", ")}`);n.category=e.category}if(e.since!==void 0){if(typeof e.since!="string")throw new Error("since must be a string (ISO date)");n.since=e.since}if(e.limit!==void 0){if(typeof e.limit!="number"||e.limit<=0)throw new Error("limit must be a positive number");n.limit=e.limit}return n}function $N(t){if(typeof t!="object"||t===null)throw new Error("Input must be an object");let e=t,n=["hot","fact"];if(typeof e.target!="string"||!n.includes(e.target))throw new Error(`target must be one of: ${n.join(", ")}`);let r=["set","supersede","remove"];if(typeof e.action!="string"||!r.includes(e.action))throw new Error(`action must be one of: ${r.join(", ")}`);let o={target:e.target,action:e.action};if(e.content!==void 0){if(typeof e.content!="string")throw new Error("content must be a string");o.content=e.content}if(e.category!==void 0){if(typeof e.category!="string")throw new Error("category must be a string");let s=["preference","convention","decision","learning"];if(!s.includes(e.category))throw new Error(`category must be one of: ${s.join(", ")}`);o.category=e.category}if(e.evidence!==void 0){if(typeof e.evidence!="string")throw new Error("evidence must be a string");o.evidence=e.evidence}if(e.supersedes!==void 0){if(typeof e.supersedes!="number"||e.supersedes<=0)throw new Error("supersedes must be a positive fact ID");o.supersedes=e.supersedes}if(e.id!==void 0){if(typeof e.id!="number"||e.id<=0)throw new Error("id must be a positive fact ID");o.id=e.id}return o}function BN(t){if(typeof t!="object"||t===null)throw new Error("Input must be an object");let e=t;if(typeof e.name!="string")throw new Error("name (string) is required");if(typeof e.content!="string")throw new Error("content (string) is required");return{name:e.name,content:e.content}}var Cr,Bw,Hw,cn,Ja,$w,LN,Jp=g(()=>{"use strict";qa();Uw();Cr={name:"memory_search",category:"read",concurrencySafe:!0,description:'Search cross-session memory for facts and procedures. Returns results ranked by relevance. Use this to recall information from prior sessions. Supports FTS5 match syntax: AND, OR, NOT, "exact phrase", prefix*',input_schema:{type:"object",properties:{query:{type:"string",description:'Search query (supports FTS5 match syntax: AND, OR, NOT, "exact phrase", prefix*)'},category:{type:"string",enum:["preference","convention","decision","learning"],description:"Optional: filter by fact category"},since:{type:"string",description:"Optional: ISO date \u2014 only return facts created after this date"},limit:{type:"number",description:"Max results (default 10)"}},required:["query"]}},Bw={name:"memory_update",category:"write",concurrencySafe:!1,description:'Store a fact in cross-session memory or update hot memory. Hot memory (target: "hot") persists in the system prompt across all future sessions. Facts (target: "fact") are stored in the searchable archive.',input_schema:{type:"object",properties:{target:{type:"string",enum:["hot","fact"],description:'"hot" writes to HOT.md (system prompt), "fact" writes to the searchable archive'},action:{type:"string",enum:["set","supersede","remove"],description:"Operation: set (create/overwrite), supersede (replace while keeping history), remove (delete)"},content:{type:"string",description:"The content to store (for set/supersede)"},category:{type:"string",enum:["preference","convention","decision","learning"],description:"Required for fact target"},evidence:{type:"string",description:'Optional provenance citation backing a codebase fact \u2014 a file:line, commit SHA, or trace-event id. When the evidence gate is enabled, a "convention" fact stored without it is recalled as [unverified]; preferences and reflections never need it.'},supersedes:{type:"number",description:"Fact ID being superseded (for supersede action)"},id:{type:"number",description:"Fact ID to remove (for remove action)"}},required:["target","action"]}},Hw={name:"procedure_write",category:"write",concurrencySafe:!1,description:"Write a reusable procedure to memory. Procedures are markdown files describing how to perform recurring tasks. They persist across sessions and are searchable via memory_search.",input_schema:{type:"object",properties:{name:{type:"string",description:"Procedure name (kebab-case, becomes the filename)"},content:{type:"string",description:"Procedure content (markdown)"}},required:["name","content"]}},cn=[Cr,Bw,Hw],Ja=cn.map(t=>t.name),$w='Stored without evidence \u2014 this codebase fact (category "convention") will be recalled as [unverified]. Supply `evidence` (a file:line, commit SHA, or trace-event id) so future sessions can trust it as ground truth rather than an unverified agent claim.',LN='Superseded without fresh evidence \u2014 the prior citation is carried forward and this codebase fact (category "convention") is still recalled as verified against the OLD evidence, which may not back the changed content. Re-supply `evidence` if the claim changed (or pass an empty string to clear it and recall as [unverified]).'});var xt=g(()=>{"use strict";qa();Mw();Ow();Jp()});function Xe(t,e=4096){if(t.length<=e)return[t];let n=[],r=t;for(;r.length>0;){if(r.length<=e){n.push(r);break}let o=e,s=r.lastIndexOf(`
123
- `,e);if(s>e-500&&s>0)o=s+1;else{let i=r.slice(0,e).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let a=i[i.length-1];if(a){let c=r.lastIndexOf(a,e);c>e-200&&c>0&&(o=c+2)}}else{let a=r.lastIndexOf(" ",e);a>e-100&&a>0&&(o=a+1)}}n.push(r.slice(0,o).trim()),r=r.slice(o).trim()}return n}function ln(t){t=t.replace(/[\x02\x03]/g,"");let e=t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),n=[];e=e.replace(/^ {0,3}```([\w]*)\n([\s\S]*?)```/gm,(o,s,i)=>{let a=n.length;if(i.trim()===""){let c=s?`(empty ${s} block)`:"(empty code block)";n.push(`<i>${c}</i>`)}else n.push(`<pre>${i}</pre>`);return`FENCED${a}`});let r=[];return e=e.replace(/`([^`]+)`/g,(o,s)=>{let i=r.length;return r.push(`<code>${s}</code>`),`CODE${i}`}),e=e.replace(/\*\*([^*]+)\*\*/g,"<b>$1</b>"),e=e.replace(/__([^_]+)__/g,"<b>$1</b>"),e=e.replace(/\*([^*]+)\*/g,"<i>$1</i>"),e=e.replace(/(^|[^\w])_([^_\n]+?)_(?!\w)/gm,"$1<i>$2</i>"),e=e.replace(/~~([^~]+)~~/g,"<s>$1</s>"),e=e.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,s,i)=>'<a href="'+i.replace(/"/g,"&quot;")+'">'+s+"</a>"),e=e.replace(/^#{1,6}\s+/gm,""),eU(e)||(e=e.replace(/<\/?[bis]>/g,"")),e=e.replace(/\x02CODE(\d+)\x03/g,(o,s)=>r[Number(s)]??o),e=e.replace(/\x02FENCED(\d+)\x03/g,(o,s)=>n[Number(s)]??o),e}function eU(t){let e=[],n=/<(\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*>/g,r;for(;(r=n.exec(t))!==null;){let o=(r[2]??"").toLowerCase();if(r[1]==="/"){if(e.pop()!==o)return!1}else e.push(o)}return e.length===0}function qe(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function rS(t){if(t.kind==="unavailable")return t.reason==="no-token"?"\u26A0\uFE0F No Claude subscription token found. Run `claude login` on the host machine, then try /usage again.":`\u26A0\uFE0F Usage unavailable (${t.reason}): ${t.detail}`;let n=[["5-hour",t.fiveHour],["7-day",t.sevenDay],["7-day (Sonnet)",t.sevenDaySonnet],["7-day (Opus)",t.sevenDayOpus]].filter(r=>r[1]!==void 0).map(([r,o])=>{let s=Math.round(o.utilization*100),i=o.resetsAt?` (resets ${o.resetsAt.toLocaleString()})`:"";return` ${r}: ${s}%${i}`});return n.length===0?"\u{1F4CA} Usage: no windows reported.":["\u{1F4CA} Claude subscription usage:",...n].join(`
123
+ `,e-1);if(s>e-500&&s>0)o=s+1;else{let i=r.slice(0,e).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let a=i[i.length-1];if(a){let c=r.lastIndexOf(a,e-1);c>e-200&&c>0&&(o=Math.min(c+a.length,e))}}else{let a=r.lastIndexOf(" ",e-1);a>e-100&&a>0&&(o=a+1)}}n.push(r.slice(0,o)),r=r.slice(o)}return n}function ln(t){t=t.replace(/[\x02\x03]/g,"");let e=t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),n=[];e=e.replace(/^ {0,3}```([\w]*)\n([\s\S]*?)```/gm,(o,s,i)=>{let a=n.length;if(i.trim()===""){let c=s?`(empty ${s} block)`:"(empty code block)";n.push(`<i>${c}</i>`)}else n.push(`<pre>${i}</pre>`);return`FENCED${a}`});let r=[];return e=e.replace(/`([^`]+)`/g,(o,s)=>{let i=r.length;return r.push(`<code>${s}</code>`),`CODE${i}`}),e=e.replace(/\*\*([^*]+)\*\*/g,"<b>$1</b>"),e=e.replace(/__([^_]+)__/g,"<b>$1</b>"),e=e.replace(/\*([^*]+)\*/g,"<i>$1</i>"),e=e.replace(/(^|[^\w])_([^_\n]+?)_(?!\w)/gm,"$1<i>$2</i>"),e=e.replace(/~~([^~]+)~~/g,"<s>$1</s>"),e=e.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,s,i)=>'<a href="'+i.replace(/"/g,"&quot;")+'">'+s+"</a>"),e=e.replace(/^#{1,6}\s+/gm,""),eU(e)||(e=e.replace(/<\/?[bis]>/g,"")),e=e.replace(/\x02CODE(\d+)\x03/g,(o,s)=>r[Number(s)]??o),e=e.replace(/\x02FENCED(\d+)\x03/g,(o,s)=>n[Number(s)]??o),e}function eU(t){let e=[],n=/<(\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*>/g,r;for(;(r=n.exec(t))!==null;){let o=(r[2]??"").toLowerCase();if(r[1]==="/"){if(e.pop()!==o)return!1}else e.push(o)}return e.length===0}function qe(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function rS(t){if(t.kind==="unavailable")return t.reason==="no-token"?"\u26A0\uFE0F No Claude subscription token found. Run `claude login` on the host machine, then try /usage again.":`\u26A0\uFE0F Usage unavailable (${t.reason}): ${t.detail}`;let n=[["5-hour",t.fiveHour],["7-day",t.sevenDay],["7-day (Sonnet)",t.sevenDaySonnet],["7-day (Opus)",t.sevenDayOpus]].filter(r=>r[1]!==void 0).map(([r,o])=>{let s=Math.round(o.utilization*100),i=o.resetsAt?` (resets ${o.resetsAt.toLocaleString()})`:"";return` ${r}: ${s}%${i}`});return n.length===0?"\u{1F4CA} Usage: no windows reported.":["\u{1F4CA} Claude subscription usage:",...n].join(`
124
124
  `)}function af(t,e){return t==="ENOENT"?`\u274C Directory not found: ${e}`:t==="EACCES"?`\u274C Permission denied: ${e}`:`\u274C Unexpected error (${t}): ${e}`}function ms(t){return`\u23F3 Queued (#${t} in line)`}function z(t){return`\u274C Error: ${t instanceof Error?t.message:t}`}function nc(){return"\u26A0\uFE0F An internal error occurred. Please try again."}function oS(t){let e=["\u{1F4CB} Commands:",""," /start \u2014 Show welcome"," /help \u2014 Show this list"," /clear \u2014 Clear conversation history"," /compact \u2014 Summarize older messages"," /model \u2014 Switch Claude model"," /cd \u2014 Change working directory"," /name \u2014 Show or set the session name"," /usage \u2014 Show Claude subscription usage"," /sessions \u2014 List and switch between sessions"," /new \u2014 Start a new session (keeps the current one)"," /watch \u2014 Live-tail a CLI session from this chat"," /unwatch \u2014 Stop watching a session","","Also works from the CLI."];return t&&t.length>0&&e.push("","\u{1F4CB} Session commands (from SDK, when using settingSources):","",...t.map(n=>` /${n.replace(/^\//,"")}`)),e.push("","Just send a message to chat with Claude."),e.join(`
125
125
  `)}function sS(){return`\u{1F44B} Welcome! I'm an agent-afk bot powered by Claude.
126
126
 
@@ -249,7 +249,7 @@ ${o}`,paths:[e,n]}:o!==null?s={content:o,paths:[n]}:r!==null?s={content:r,paths:
249
249
 
250
250
  ${e}`}var pW,Im=g(()=>{"use strict";pW=new Set(["script","style","noscript","template","svg"])});function gW(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 C_(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function hW(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 P_(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??gW,c=n.signal??void 0,l;for(let d=0;d<=o;d++){if(c?.aborted)throw c.reason??new Error("aborted");try{let u=await t(e,n);if(!mW.has(u.status)||d===o)return u;let p=hW(u,i)??C_(d,s,i);O("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,c)}catch(u){if(c?.aborted||(l=u,d===o))throw u;let p=C_(d,s,i);O("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,c)}}throw l??new Error("retryFetch: exhausted without a result")}var mW,M_=g(()=>{"use strict";oe();mW=new Set([429,502,503,504])});import{BlockList as yW,isIP as Pm}from"node:net";import{lookup as bW}from"node:dns/promises";import{Agent as wW}from"undici";function D_(){let t=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return t==="1"||t==="true"}function _W(t){return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1):t}function Cm(t){let e=Pm(t);return e===0?!1:kW.check(t,e===4?"ipv4":"ipv6")}async function F_(t){return bW(t,{all:!0,verbatim:!0})}async function Mm(t,e={}){if(e.allowPrivateHosts??D_())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=_W(n.hostname),o=(a,c)=>`refusing to fetch ${c} \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(Pm(r)!==0)return Cm(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let s=e.lookupFn??F_,i;try{i=await s(r)}catch{return{allowed:!0}}for(let a of i)if(Cm(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function ni(t,e={}){let n=await Mm(t,e);if(!n.allowed)throw new vt(n.reason)}async function rl(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<=O_;i++){await ni(s,o);let a={...n,redirect:"manual",...t===globalThis.fetch&&!(r.allowPrivateHosts??D_())?{dispatcher:AW}:{}},c=await P_(t,s,a,r.retry??{});if(!TW.has(c.status))return c;let l=c.headers.get("location");if(l===null||l.trim()==="")return c;let d;try{d=new URL(l,c.url||s).toString()}catch{return c}await c.body?.cancel().catch(()=>{}),s=d}throw new vt(`too many redirects (>${O_}) starting from ${e}`)}var SW,vW,kW,vt,AW,O_,TW,Om=g(()=>{"use strict";U();M_();SW=[["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]],vW=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],kW=(()=>{let t=new yW;for(let[e,n]of SW)t.addSubnet(e,n,"ipv4");for(let[e,n]of vW)t.addSubnet(e,n,"ipv6");return t})(),vt=class extends Error{constructor(e){super(e),this.name="EgressBlockedError"}};AW=new wW({connect:{lookup(t,e,n){F_(t).then(r=>{let o=r.find(i=>Cm(i.address));if(o!==void 0){n(new vt(`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,Pm(s.address))},r=>n(r,"",0))}}});O_=20,TW=new Set([301,302,303,307,308])});import{readFileSync as EW}from"node:fs";import{join as xW}from"path";function RW(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function L_(t,e){return RW(e).test(t)}function PW(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(IW.has(e))return!0;if(CW.has(e))return!1}return!1}function N_(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function MW(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 U_(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Kp(e),e}function OW(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function DW(t){try{return EW(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function FW(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=U_(e.defaultProfile)),n}function $_(t){let e=t?.env??v,n=t?.readFileSync??DW,r=t?.surface??e.AGENT_SURFACE,o=PW(e.AFK_BROWSER_HEADLESS,r),s=N_(e.AFK_BROWSER_ALLOWED_DOMAINS),i=N_(e.AFK_BROWSER_BLOCKED_DOMAINS),a=OW(e.AFK_BROWSER_DOM_SNAPSHOTS),c=MW(e.AFK_BROWSER_BACKEND),l=U_(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:c,configPath:null,defaultProfile:l},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():xW(Kt(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${p}: ${String(y)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let h=FW(d,m);return h.configPath=p,h}function ol(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(L_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>L_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var IW,CW,sl=g(()=>{"use strict";U();H();IW=new Set(["daemon","subagent","telegram","afk"]),CW=new Set(["repl","interactive","cli"])});import{existsSync as LW,readFileSync as NW}from"node:fs";import{createRequire as UW}from"node:module";import{dirname as $W,join as BW}from"node:path";function j_(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<jW&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function Be(t){let e=j_(t);return H_.some(n=>e.includes(n))}function WW(){try{let e=UW(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(NW(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=BW($W(e),o);return LW(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function ri(){return B_??=WW()??HW,B_}function Dm(t){return t.includes("install chromium")}function it(t,e){let n=j_(t),r=e?.latched===!0?` ${KW}`:"";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: ${ri()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${ri()}). Or pick a different tool.${r}`}function Fm(t,e,n=!1){if(!Be(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
251
251
 
252
- ${it(t,{headless:e,latched:n})}`,{cause:t})}var H_,HW,jW,B_,KW,Lm=g(()=>{"use strict";H_=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],HW="pnpm exec playwright install chromium",jW=4;KW="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 or from"node:fs";import il from"node:path";import{randomBytes as GW}from"node:crypto";import{chromium as qW}from"playwright";function XW(){try{return"5.136.0"}catch{}try{let t=il.resolve(import.meta.dirname,"../../../package.json"),e=or.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var zW,al,W_=g(()=>{"use strict";Lm();H();oe();zW=XW(),al=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=qW.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=Fm(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(c){s=c,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(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,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/${zW}`}}loadStorageState(e){let n=Gp(e);try{if(!or.existsSync(n))return;let r=JSON.parse(or.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Gp(e);if(!or.existsSync(r))return;let o=await n.storageState(),s=il.join(il.dirname(r),`.${il.basename(r)}.${process.pid}.${GW(4).toString("hex")}.tmp`);or.writeFileSync(s,JSON.stringify(o),{mode:384}),or.chmodSync(s,384),or.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as VW}from"crypto";function K_(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&JW.test(t.label))}function G_(t){return VW("sha256").update(t,"utf8").digest("hex").slice(0,8)}function q_(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var JW,cl=g(()=>{"use strict";JW=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as YW}from"node:crypto";function QW(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function ZW(t,e,n){return`el_${YW("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function eK(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function X_(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function V_(t,e){let n=t.role??"",r=t.name??"";z_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])V_(s,e)}async function tK(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(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,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},J_).catch(()=>[])}async function nK(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")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="search"?l="searchbox":l="textbox"}if(!l)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:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},J_).catch(()=>[])}function rK(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function ll(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=rK(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tK(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,h]=await Promise.all([i,a,c,l,d]),y,w=!1;u!==null?(y=[],V_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await nK(t)).filter(P=>z_.has(P.role??"")));let _=new Map;for(let C of p){let P=X_(C.name),q=_.get(P);(!q||q.bbox.w===0&&C.bbox.w>0)&&_.set(P,C)}let E=y.map(C=>({ax:C,dom:_.get(X_(C.name??""))})),k=r?E:E.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);k.sort((C,P)=>{let q=C.dom?.bbox.y??0,M=P.dom?.bbox.y??0;if(q!==M)return q-M;let $=C.dom?.bbox.x??0,L=P.dom?.bbox.x??0;return $-L}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=k.slice(0,n).map((C,P)=>{let q=C.ax.role??"generic",M=C.ax.name??"",$=ZW(q,M,P),L=C.dom?.bbox??{x:0,y:0,w:0,h:0},N=C.dom?.type??null,B=null;C.ax.value!==void 0&&C.ax.value!==null&&(B=String(C.ax.value)),C.ax.checked!==void 0&&(B=String(C.ax.checked)),K_({role:q,kind:N})&&(B="[redacted]");let W={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(W.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(W.selected=C.ax.selected),C.ax.expanded!==void 0&&(W.expanded=C.ax.expanded);let Q;C.dom?.testId?Q=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(Q=`#${C.dom.id}`);let Fe={id:$,role:q,label:QW(M),kind:N,value:B,state:W,bbox:L};return Q!==void 0&&(Fe.selector=Q),Fe}),I="idle";try{let C=await t.evaluate(()=>document.readyState);C==="loading"?I="loading":C==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="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 x=eK(f),S=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:S,url:m,title:h,textSummary:x,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var z_,J_,Y_=g(()=>{"use strict";cl();z_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);J_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Q_(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,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 Nm(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Q_(t,s)))).filter(o=>o!==null)}async function oK(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 c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Um(t,e,n){switch(e.kind){case"element_id":return sK(t,e,n);case"selector":return iK(t,e);case"semantic":return aK(t,e)}}async function sK(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 c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}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 Nm(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function iK(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 Nm(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function aK(t,e){return e.role!==void 0?cK(t,e.text,e.role):lK(t,e.text,e)}async function cK(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 Nm(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function lK(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===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}),c>0&&d.push({loc:s,count:c});let u=await oK(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let w=await Q_(y.locator,y.index);if(w!==null){let _=`${w.role}:${w.label}:${h}`,E=0;for(let k=0;k<_.length;k++)E=E*31+_.charCodeAt(k)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Z_=g(()=>{"use strict"});async function $m(t,e,n,r){let o=t.url();if(o===n)return null;let s=ol(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 eA=g(()=>{"use strict";sl()});import{randomBytes as dK}from"crypto";import{mkdir as uK,stat as pK,writeFile as fK}from"fs/promises";import{join as Bm}from"path";import{gzip as mK}from"zlib";import{promisify as gK}from"util";function hK(t){return Bm(Et(t),"browser")}function yK(t){return Bm(hK(t),"screenshots")}function bK(){return new Date().toISOString().replace(/[:.]/g,"-")}function wK(){return dK(3).toString("hex")}async function Hm(t,e,n){if(e.length>tA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${tA} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=yK(t);await uK(r,{recursive:!0});let o=`${bK()}-${wK()}-${n}.png`,s=Bm(r,o);await fK(s,e);let{size:i}=await pK(s);return{path:s,bytes:i}}var Fse,tA,nA=g(()=>{"use strict";H();cl();Fse=gK(mK);tA=5*1024*1024});var oA={};Np(oA,{PlaywrightProvider:()=>jm});function rA(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 jm,sA=g(()=>{"use strict";W_();Y_();Z_();sl();eA();nA();jm=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new al(e)}async open(e){let n=ol(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 c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await $m(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 ll(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 ll(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 Um(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${rA(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await $m(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await ll(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),l!==null)throw l;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 Um(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${rA(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 Hm(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,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 Hm(n,o,r);return s}catch{return null}}}});var ir={};Np(ir,{__resetBrowserRegistryForTests:()=>AK,browserProviderActive:()=>kK,closeBrowserProvider:()=>Wm,getBrowserProvider:()=>vK,peekBrowserProvider:()=>_K});function iA(){Promise.resolve(Wm()).then(()=>{process.exit(130)})}function aA(){Promise.resolve(Wm()).then(()=>{process.exit(143)})}function cA(){Ft=null}function SK(){dl||(process.on("SIGINT",iA),process.on("SIGTERM",aA),process.on("exit",cA),dl=!0)}function lA(){dl&&(process.removeListener("SIGINT",iA),process.removeListener("SIGTERM",aA),process.removeListener("exit",cA),dl=!1)}async function vK(t){return Ft!==null?Ft:(sr!==null||(sr=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(sA(),oA)),n=$_(t),r=new e(n);return SK(),Ft=r,sr=null,r})()),sr)}async function Wm(){if(Ft===null)return;let t=Ft;Ft=null,sr=null,lA(),await t.shutdown()}function kK(){return Ft!==null}function _K(){return Ft}function AK(){Ft=null,sr=null,lA()}var Ft,sr,dl,ar=g(()=>{"use strict";sl();Ft=null,sr=null,dl=!1});async function dA(t,e){try{return await x_(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function CK(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ar(),ir));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function uA(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??CK,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await rl(n,t,{headers:IK,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(RK.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(xK.test(p)&&!EK.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await dA(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof vt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=Rm({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ni(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ni(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ni(u.finalUrl,o);let p=await dA(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=Rm({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof vt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var EK,xK,RK,IK,pA=g(()=>{"use strict";R_();Im();Om();oe();EK=/(text\/html|application\/xhtml\+xml)/i,xK=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,RK=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,IK={"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 OK(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(PK,{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),MK),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=ee(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function fA(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?OK({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 mA(t,e){if(e.length===0)return`# Search results for "${t}"
252
+ ${it(t,{headless:e,latched:n})}`,{cause:t})}var H_,HW,jW,B_,KW,Lm=g(()=>{"use strict";H_=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],HW="pnpm exec playwright install chromium",jW=4;KW="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 or from"node:fs";import il from"node:path";import{randomBytes as GW}from"node:crypto";import{chromium as qW}from"playwright";function XW(){try{return"5.137.1"}catch{}try{let t=il.resolve(import.meta.dirname,"../../../package.json"),e=or.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var zW,al,W_=g(()=>{"use strict";Lm();H();oe();zW=XW(),al=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=qW.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=Fm(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(c){s=c,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(),c;try{c=await a.goto(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw s??p}if(s!==void 0)throw s;let l=await a.content();if(s!==void 0)throw s;let d=a.url(),u=c!==null?c.status():null;return{html:l,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/${zW}`}}loadStorageState(e){let n=Gp(e);try{if(!or.existsSync(n))return;let r=JSON.parse(or.readFileSync(n,"utf8"));return O("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){O("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Gp(e);if(!or.existsSync(r))return;let o=await n.storageState(),s=il.join(il.dirname(r),`.${il.basename(r)}.${process.pid}.${GW(4).toString("hex")}.tmp`);or.writeFileSync(s,JSON.stringify(o),{mode:384}),or.chmodSync(s,384),or.renameSync(s,r),O("[browser/vault] saved session",{profile:e,file:r})}catch(r){O("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as VW}from"crypto";function K_(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&JW.test(t.label))}function G_(t){return VW("sha256").update(t,"utf8").digest("hex").slice(0,8)}function q_(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var JW,cl=g(()=>{"use strict";JW=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as YW}from"node:crypto";function QW(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function ZW(t,e,n){return`el_${YW("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function eK(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function X_(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function V_(t,e){let n=t.role??"",r=t.name??"";z_.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])V_(s,e)}async function tK(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(),c=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a==="input"?o.type||null:o.getAttribute("type");r.push({name:c,tagName:a,type:l,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},J_).catch(()=>[])}async function nK(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")??"",c=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),l=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?l="checkbox":h==="radio"?l="radio":h==="button"||h==="submit"||h==="reset"?l="button":h==="search"?l="searchbox":l="textbox"}if(!l)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:l,name:c,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},J_).catch(()=>[])}function rK(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function ll(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=rK(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=tK(t),c=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),l=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,h]=await Promise.all([i,a,c,l,d]),y,w=!1;u!==null?(y=[],V_(u,y)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,y=(await nK(t)).filter(P=>z_.has(P.role??"")));let _=new Map;for(let C of p){let P=X_(C.name),q=_.get(P);(!q||q.bbox.w===0&&C.bbox.w>0)&&_.set(P,C)}let E=y.map(C=>({ax:C,dom:_.get(X_(C.name??""))})),k=r?E:E.filter(C=>C.dom?C.dom.bbox.w>0||C.dom.bbox.h>0:!0);k.sort((C,P)=>{let q=C.dom?.bbox.y??0,M=P.dom?.bbox.y??0;if(q!==M)return q-M;let $=C.dom?.bbox.x??0,L=P.dom?.bbox.x??0;return $-L}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=k.slice(0,n).map((C,P)=>{let q=C.ax.role??"generic",M=C.ax.name??"",$=ZW(q,M,P),L=C.dom?.bbox??{x:0,y:0,w:0,h:0},N=C.dom?.type??null,B=null;C.ax.value!==void 0&&C.ax.value!==null&&(B=String(C.ax.value)),C.ax.checked!==void 0&&(B=String(C.ax.checked)),K_({role:q,kind:N})&&(B="[redacted]");let W={disabled:C.ax.disabled??!1};C.ax.checked!==void 0&&(W.checked=C.ax.checked===!0||C.ax.checked==="mixed"),C.ax.selected!==void 0&&(W.selected=C.ax.selected),C.ax.expanded!==void 0&&(W.expanded=C.ax.expanded);let Q;C.dom?.testId?Q=`[data-testid="${C.dom.testId}"]`:C.dom?.id&&(Q=`#${C.dom.id}`);let Fe={id:$,role:q,label:QW(M),kind:N,value:B,state:W,bbox:L};return Q!==void 0&&(Fe.selector=Q),Fe}),I="idle";try{let C=await t.evaluate(()=>document.readyState);C==="loading"?I="loading":C==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="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 x=eK(f),S=`obs_${e.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:S,url:m,title:h,textSummary:x,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:I,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:A}}var z_,J_,Y_=g(()=>{"use strict";cl();z_=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);J_="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Q_(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,c=a.getAttribute("role")??a.tagName.toLowerCase(),l=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:c,label:l,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 Nm(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>Q_(t,s)))).filter(o=>o!==null)}async function oK(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 c=a,l=c.getBoundingClientRect();return`${c.tagName}@${Math.round(l.x)},${Math.round(l.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Um(t,e,n){switch(e.kind){case"element_id":return sK(t,e,n);case"selector":return iK(t,e);case"semantic":return aK(t,e)}}async function sK(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 c=t.locator(r.selector);if(await c.count()===1)return{outcome:"resolved",locator:c}}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 Nm(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function iK(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 Nm(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function aK(t,e){return e.role!==void 0?cK(t,e.text,e.role):lK(t,e.text,e)}async function cK(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 Nm(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function lK(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,c]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+c===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}),c>0&&d.push({loc:s,count:c});let u=await oK(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=u.slice(0,5),f=[];for(let h=0;h<p.length;h++){let y=p[h];if(y===void 0)continue;let w=await Q_(y.locator,y.index);if(w!==null){let _=`${w.role}:${w.label}:${h}`,E=0;for(let k=0;k<_.length;k++)E=E*31+_.charCodeAt(k)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var Z_=g(()=>{"use strict"});async function $m(t,e,n,r){let o=t.url();if(o===n)return null;let s=ol(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 eA=g(()=>{"use strict";sl()});import{randomBytes as dK}from"crypto";import{mkdir as uK,stat as pK,writeFile as fK}from"fs/promises";import{join as Bm}from"path";import{gzip as mK}from"zlib";import{promisify as gK}from"util";function hK(t){return Bm(Et(t),"browser")}function yK(t){return Bm(hK(t),"screenshots")}function bK(){return new Date().toISOString().replace(/[:.]/g,"-")}function wK(){return dK(3).toString("hex")}async function Hm(t,e,n){if(e.length>tA)throw new Error(`writeScreenshotSidecar: buffer exceeds ${tA} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=yK(t);await uK(r,{recursive:!0});let o=`${bK()}-${wK()}-${n}.png`,s=Bm(r,o);await fK(s,e);let{size:i}=await pK(s);return{path:s,bytes:i}}var Fse,tA,nA=g(()=>{"use strict";H();cl();Fse=gK(mK);tA=5*1024*1024});var oA={};Np(oA,{PlaywrightProvider:()=>jm});function rA(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 jm,sA=g(()=>{"use strict";W_();Y_();Z_();sl();eA();nA();jm=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new al(e)}async open(e){let n=ol(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 c=o.url();if(!(a!==null&&(c===""||c==="about:blank"))){let u=await $m(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 ll(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 ll(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 Um(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${rA(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:c}=a,l=null,d=async()=>{switch(e.action){case"click":await c.click({timeout:i});break;case"fill":await c.fill(e.value??"");break;case"press":await c.press(e.value??"");break;case"select":await c.selectOption(e.value??"");break;case"hover":await c.hover({timeout:i});break;case"scroll_to":await c.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await c.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(y){l=y}else l=h}let u=await $m(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||l!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await ll(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),l!==null)throw l;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 Um(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${rA(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 Hm(n,s,"browser_screenshot"),c=0,l=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));c=d.w,l=d.h}catch{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}else{let d=r.viewportSize();c=d?.width??0,l=d?.height??0}return{path:i,bytes:a,width:c,height:l,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 Hm(n,o,r);return s}catch{return null}}}});var ir={};Np(ir,{__resetBrowserRegistryForTests:()=>AK,browserProviderActive:()=>kK,closeBrowserProvider:()=>Wm,getBrowserProvider:()=>vK,peekBrowserProvider:()=>_K});function iA(){Promise.resolve(Wm()).then(()=>{process.exit(130)})}function aA(){Promise.resolve(Wm()).then(()=>{process.exit(143)})}function cA(){Ft=null}function SK(){dl||(process.on("SIGINT",iA),process.on("SIGTERM",aA),process.on("exit",cA),dl=!0)}function lA(){dl&&(process.removeListener("SIGINT",iA),process.removeListener("SIGTERM",aA),process.removeListener("exit",cA),dl=!1)}async function vK(t){return Ft!==null?Ft:(sr!==null||(sr=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(sA(),oA)),n=$_(t),r=new e(n);return SK(),Ft=r,sr=null,r})()),sr)}async function Wm(){if(Ft===null)return;let t=Ft;Ft=null,sr=null,lA(),await t.shutdown()}function kK(){return Ft!==null}function _K(){return Ft}function AK(){Ft=null,sr=null,lA()}var Ft,sr,dl,ar=g(()=>{"use strict";sl();Ft=null,sr=null,dl=!1});async function dA(t,e){try{return await x_(t,e)}catch(n){return O("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function CK(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ar(),ir));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:e.requestGuard})}async function uA(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??CK,o=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{},s=null,i="",a=t,c=null,l=null;try{let u=await rl(n,t,{headers:IK,signal:e.signal},o);c=u.status,a=u.url||t;let p=u.headers.get("content-type")??"";if(u.ok){if(RK.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await u.text();if(xK.test(p)&&!EK.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(i=f,s=await dA(f,a),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(u){if(e.signal.aborted||u instanceof vt||u instanceof Error&&u.message.startsWith("web_scrape markdown mode received binary"))throw u;l=u}if(!(s===null||s.textLength<200)&&s!==null){let u=Rm({html:i,extractedTextLength:s.textLength});return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1,...u!==void 0?{advisory:u}:{}}}try{await ni(t,o);let u=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal,requestGuard:f=>ni(f,o)});u.finalUrl!==t&&/^https?:\/\//i.test(u.finalUrl)&&await ni(u.finalUrl,o);let p=await dA(u.html,u.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(s===null||p.textLength>=s.textLength){let f=Rm({html:u.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:u.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(u){if(e.signal.aborted||u instanceof vt)throw u;if(s===null){let p=u instanceof Error?u.message:String(u),f=l instanceof Error?l.message:`HTTP ${c??"error"}`,m=new Error(`web_scrape could not retrieve ${t}: fetch failed (${f}) and render failed (${p}).`);throw m.cause=u,m}}if(s!==null)return{title:s.title,markdown:s.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${c??"error"}).`)}var EK,xK,RK,IK,pA=g(()=>{"use strict";R_();Im();Om();oe();EK=/(text\/html|application\/xhtml\+xml)/i,xK=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,RK=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,IK={"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 OK(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(PK,{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),MK),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let c="";try{let d=await s.text(),u=ee(d);u&&(c=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let l=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${l}${c}`)}let i;try{i=await s.json()}catch(c){throw new Error(`Exa Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(i.results??[]).slice(0,r).map(c=>({title:(c.title??"").trim()||"(untitled)",url:c.url??"",description:(c.highlights?.[0]??"").trim()})).filter(c=>c.url.length>0)}}}function fA(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?OK({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 mA(t,e){if(e.length===0)return`# Search results for "${t}"
253
253
 
254
254
  (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(`
255
255
  `).trimEnd()}var PK,MK,gA=g(()=>{"use strict";St();PK="https://api.exa.ai/search",MK=10});function ul(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 cr=g(()=>{"use strict";Lm()});function $K(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 c;try{c=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(c.protocol!=="http:"&&c.protocol!=="https:")return{error:`Invalid input: protocol "${c.protocol}" not supported (http/https only)`};o=c.toString()}let i=DK;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,FK)}let a=LK;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,NK)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Km(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:zt(t,e),truncated:!0}}function BK(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=$K(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,c=()=>{a.abort(s.reason)},l,d=()=>{let u=a.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(s.addEventListener("abort",c,{once:!0}),l=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.url!==void 0){let p=await Mm(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 h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await rl(e,i.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${d()}`,isError:!0}:h instanceof vt?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let m=Km(f,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let p=await uA(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=Km(I_(p.markdown,p.advisory),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 vt)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),m=Be(p)&&!Dm(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${ri()}\`)`:"";return{content:`web_scrape markdown error: ${f}${m}`,isError:!0}}let u=fA({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:UK,timeoutMs:i.timeoutMs,signal:a.signal}),f=Km(mA(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{l!==void 0&&clearTimeout(l),s.removeEventListener("abort",c)}}}var DK,FK,LK,NK,UK,hA,yA=g(()=>{"use strict";pA();gA();Om();gn();Im();cr();DK=3e4,FK=12e4,LK=1e5,NK=1e6,UK=10;hA=BK()});import{existsSync as wA,mkdirSync as HK,readFileSync as jK,renameSync as WK,unlinkSync as KK,writeFileSync as GK}from"node:fs";import{dirname as bA,join as qK}from"node:path";import{randomBytes as XK}from"node:crypto";function lr(t){let e=t??Hp();if(!wA(e))return[];try{let n=jK(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 oi(t,e){let n=e??Hp();HK(bA(n),{recursive:!0});let r=qK(bA(n),`.schedules.json.${process.pid}.${XK(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{GK(r,o,"utf-8"),WK(r,n)}catch(s){try{wA(r)&&KK(r)}catch{}throw s}}function SA(t,e){let n=lr(e),r=n.map(c=>c.id),o=zK(t.name),s=VK(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),oi(n,e),a}function vA(t,e){let n=lr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(oi(o,e),!0)}function kA(t,e){return lr(e).find(n=>n.id===t)}function zK(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function VK(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}function _A(t){return{taskId:t.id,command:t.command,trigger:t.trigger??"cron",...t.cron!==void 0?{cronExpression:t.cron}:{},...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{},...t.notifyChat!==void 0?{notifyChat:t.notifyChat}:{}}}var AA=g(()=>{"use strict";H()});import{existsSync as JK,readFileSync as YK}from"node:fs";import{join as QK}from"node:path";async function eo(t,e,n){let r,o;try{let s=QK(pw("default"),"port");if(!JK(s))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=YK(s,"utf-8").trim(),a=ZK(i);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let s=r.includes(":")?`[${r}]`:r,i=await fetch(`http://${s}:${o}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return i.ok?{synced:!0,detail:"synced"}:t==="POST"&&i.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&i.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${i.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function ZK(t){let e=parseInt(t,10);if(String(e)===t&&!Number.isNaN(e))return e<1||e>65535?null:{host:"localhost",port:e};let n=t.lastIndexOf(":");if(n<1)return null;let r=t.slice(0,n),o=t.slice(n+1);if(!/^\d+$/.test(o))return null;let s=parseInt(o,10);return Number.isNaN(s)||s<1||s>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:s}}var Gm,TA=g(()=>{"use strict";H();Gm="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 e1}from"node:fs";import{readFile as t1}from"node:fs/promises";var EA,xA,RA,IA,CA=g(()=>{"use strict";AA();H();TA();EA=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=SA({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 eo("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 eo("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:Gm}})}},xA=async(t,e)=>{let n=lr();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})))}},RA=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=Ca();if(!e1(s))return{content:JSON.stringify([])};let i;try{let l=await t1(s);i=(l.length>1048576?l.subarray(l.length-1048576):l).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-afk",
3
- "version": "5.136.0",
3
+ "version": "5.137.1",
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",