agent-afk 5.20.0 → 5.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +4 -4
- package/dist/index.mjs +3 -3
- package/dist/telegram.mjs +3 -3
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -994,8 +994,8 @@ ${mh}
|
|
|
994
994
|
`).run(l.session_id??null,l.created_at,l.category,l.content,l.source_surface??"cli",l.evidence??null),n++)}else if(a.type==="supersede"){let l=a.data,c,d;if(typeof l.old_content=="string"&&typeof l.old_created_at=="string"){let u;(typeof l.old_session_id<"u"||typeof l.old_category=="string")&&(u=this.db.prepare("SELECT id FROM facts WHERE content = ? AND created_at = ? AND COALESCE(session_id,'') = ? AND category = ?").get(l.old_content,l.old_created_at,l.old_session_id??"",l.old_category??"")),u||(u=this.db.prepare("SELECT id FROM facts WHERE content = ? AND created_at = ?").get(l.old_content,l.old_created_at)),c=u?.id}else typeof l.old_fact_id=="number"&&(c=l.old_fact_id);if(typeof l.new_content=="string"&&typeof l.new_created_at=="string"){let u;(typeof l.new_session_id<"u"||typeof l.new_category=="string")&&(u=this.db.prepare("SELECT id FROM facts WHERE content = ? AND created_at = ? AND COALESCE(session_id,'') = ? AND category = ?").get(l.new_content,l.new_created_at,l.new_session_id??"",l.new_category??"")),u||(u=this.db.prepare("SELECT id FROM facts WHERE content = ? AND created_at = ?").get(l.new_content,l.new_created_at)),d=u?.id}else typeof l.new_fact_id=="number"&&(d=l.new_fact_id);typeof c=="number"&&typeof d=="number"&&(this.db.prepare("UPDATE facts SET superseded_by = ? WHERE id = ? AND superseded_by IS NULL").run(d,c),n++)}}catch(i){W("WAL replay: skipping malformed line:",String(i))}DE(t)}catch(r){W("WAL file unreadable, skipping recovery:",String(r))}return n}close(){this.db.close()}appendWAL(t){let n=en(this.dir,NE);try{H1(n,JSON.stringify(t)+`
|
|
995
995
|
`,"utf-8")}catch(r){W("WAL append failed (non-fatal):",String(r))}}};Q1=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;eH=new Set(["fact","session_start","session_end","supersede"]),tH=new Set(["preference","convention","decision","learning"])});function GE(e){return rH.has(e)}function Wd(){return E.AFK_MEMORY_EVIDENCE_GATE==="1"}function fh(e){return GE(e)}function Kd(e){if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null}function qE(e,t){return GE(e)?Kd(t)?"verified":"unverified":"not-applicable"}function zE(e,t){return t!=="unverified"||e.startsWith(KE)?e:`${KE} ${e}`}var rH,KE,JE=A(()=>{"use strict";V();rH=new Set(["convention"]),KE="[unverified]"});function sH(e,t){return t?e.map(n=>{if(n.type!=="fact"||!n.category)return{...n,verification:"not-applicable"};let r=qE(n.category,n.evidence);return{...n,verification:r,content:zE(n.content,r)}}):e.map(n=>{let r={...n};return delete r.evidence,delete r.verification,r})}function Ja(e,t,n){let r=async i=>{try{let a=iH(i),l=e.search(a.query,{category:a.category,since:a.since,limit:a.limit??10});return{content:JSON.stringify(sH(l,Wd()))}}catch(a){return{content:`memory_search error: ${a instanceof Error?a.message:String(a)}`,isError:!0}}},o=async i=>{try{let a=aH(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 l=e.saveHot(a.content),c={saved:!0,target:"hot",usage:{tokens:l.tokens,maxTokens:l.maxTokens,pct:l.pct}};return l.truncated?(c.truncated=!0,c.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".'):l.pct>=HE*100&&(c.warning=`Hot memory is at ${l.pct}% of the ~1,500-token cap. Move non-essential lines to the fact archive (target:"fact") before it truncates.`),{content:JSON.stringify(c)}}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 l=a.category,c=Kd(a.evidence),u={id:e.storeFact({session_id:t,category:l,content:a.content,source_surface:n??"cli",evidence:c}),action:"set",target:"fact"};return Wd()&&fh(l)&&!c&&(u.warning=VE),{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 l=e.getFact(a.supersedes),c=a.evidence===void 0?void 0:Kd(a.evidence),u={id:e.supersedeFact(a.supersedes,a.content,a.category??void 0,c),action:"supersede",target:"fact",supersedes:a.supersedes};if(Wd()){let p=a.category??l?.category;p&&fh(p)&&((c===void 0?l?.evidence??null:c)?c===void 0&&(u.warning=oH):u.warning=VE)}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 l=e.removeFact(a.id);return{content:JSON.stringify({removed:l,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=lH(i);return e.writeProcedure(a.name,a.content,t),{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 iH(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.query!="string")throw new Error("query (string) is required");let n={query:t.query};if(t.category!==void 0){if(typeof t.category!="string")throw new Error("category must be a string");let r=["preference","convention","decision","learning"];if(!r.includes(t.category))throw new Error(`category must be one of: ${r.join(", ")}`);n.category=t.category}if(t.since!==void 0){if(typeof t.since!="string")throw new Error("since must be a string (ISO date)");n.since=t.since}if(t.limit!==void 0){if(typeof t.limit!="number"||t.limit<=0)throw new Error("limit must be a positive number");n.limit=t.limit}return n}function aH(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e,n=["hot","fact"];if(typeof t.target!="string"||!n.includes(t.target))throw new Error(`target must be one of: ${n.join(", ")}`);let r=["set","supersede","remove"];if(typeof t.action!="string"||!r.includes(t.action))throw new Error(`action must be one of: ${r.join(", ")}`);let o={target:t.target,action:t.action};if(t.content!==void 0){if(typeof t.content!="string")throw new Error("content must be a string");o.content=t.content}if(t.category!==void 0){if(typeof t.category!="string")throw new Error("category must be a string");let s=["preference","convention","decision","learning"];if(!s.includes(t.category))throw new Error(`category must be one of: ${s.join(", ")}`);o.category=t.category}if(t.evidence!==void 0){if(typeof t.evidence!="string")throw new Error("evidence must be a string");o.evidence=t.evidence}if(t.supersedes!==void 0){if(typeof t.supersedes!="number"||t.supersedes<=0)throw new Error("supersedes must be a positive fact ID");o.supersedes=t.supersedes}if(t.id!==void 0){if(typeof t.id!="number"||t.id<=0)throw new Error("id must be a positive fact ID");o.id=t.id}return o}function lH(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.name!="string")throw new Error("name (string) is required");if(typeof t.content!="string")throw new Error("content (string) is required");return{name:t.name,content:t.content}}var Vs,YE,XE,Fr,$o,VE,oH,gh=A(()=>{"use strict";Hd();JE();Vs={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"]}},YE={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"]}},XE={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"]}},Fr=[Vs,YE,XE],$o=Fr.map(e=>e.name),VE='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.',oH='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]).'});function hh(e,t="all"){switch(t){case"self":return{self:e.getSelf()};case"tools":return{tools:e.getTools()};case"subagents":return{subagents:e.getSubagents()};case"workspace":return{workspace:e.getWorkspace()};default:return{self:e.getSelf(),tools:e.getTools(),subagents:e.getSubagents(),workspace:e.getWorkspace()}}}function yh(e){return e==="self"||e==="tools"||e==="subagents"||e==="workspace"||e==="all"?e:"all"}function Ys(e){let n=[`- Working directory: ${e.cwd.replace(/[\r\n]/g," ")}`];n.push(`- Date: ${cH(e.now??new Date,e.timeZone)}`);let r=typeof e.sessionId=="string"&&e.sessionId.length>0?e.sessionId.slice(0,8):null,o=e.surface&&e.surface!=="unknown"?e.surface:null,s=typeof e.depth=="number"?typeof e.maxDepth=="number"?`depth ${e.depth}/${e.maxDepth}`:`depth ${e.depth}`:null,i=[o,s].filter(a=>typeof a=="string");if(r!==null||i.length>0){let a=["- Session:"];r!==null&&a.push(r),i.length>0&&a.push(`(${i.join(", ")})`),n.push(a.join(" "))}if(e.workspace!==void 0&&e.workspace!==null){let a=e.workspace;if(a.branch!==null||a.headSha!==null){let l=a.branch??"(detached)",c=a.headSha!==null?` @ ${a.headSha}`:"",d;a.dirty===null?d="":a.dirty?d=` (${a.dirtyCount!==null?a.dirtyCount:"?"} dirty)`:d=" (clean)",n.push(`- Workspace: ${l}${c}${d}`)}}return`# Environment
|
|
996
996
|
${n.join(`
|
|
997
|
-
`)}`}function cH(e,t){try{let n=t??Intl.DateTimeFormat().resolvedOptions().timeZone??"UTC",r=new Intl.DateTimeFormat("en-CA",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),o=i=>r.find(a=>a.type===i)?.value??"";return`${new Intl.DateTimeFormat("en-US",{timeZone:n,weekday:"long"}).format(e)}, ${o("year")}-${o("month")}-${o("day")} (${n})`}catch{return e.toISOString().slice(0,10)}}var bh=A(()=>{"use strict"});import{spawnSync as dH}from"child_process";function Gd(e,t){try{let
|
|
998
|
-
`).filter(l=>l.trim().length>0);o=a.length>0,s=a.length}
|
|
997
|
+
`)}`}function cH(e,t){try{let n=t??Intl.DateTimeFormat().resolvedOptions().timeZone??"UTC",r=new Intl.DateTimeFormat("en-CA",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),o=i=>r.find(a=>a.type===i)?.value??"";return`${new Intl.DateTimeFormat("en-US",{timeZone:n,weekday:"long"}).format(e)}, ${o("year")}-${o("month")}-${o("day")} (${n})`}catch{return e.toISOString().slice(0,10)}}var bh=A(()=>{"use strict"});import{spawnSync as dH}from"child_process";function Gd(e,t,n=!1){try{let r=dH("git",t,{cwd:e,encoding:"utf8",maxBuffer:4096,shell:!1});if(r.status!==0||r.signal!==null||r.error!==void 0)return null;let o=typeof r.stdout=="string"?r.stdout.trim():null;return o===null?null:o.length>0||n?o:null}catch{return null}}function wh(e){let t=Gd(e,["rev-parse","--short","HEAD"]);if(t===null)return{...uH};let n=Gd(e,["symbolic-ref","--short","HEAD"]),r=Gd(e,["status","--porcelain"],!0),o=!1,s=0;if(r!==null){let a=r.split(`
|
|
998
|
+
`).filter(l=>l.trim().length>0);o=a.length>0,s=a.length}else o=null,s=null;let i=Gd(e,["remote","get-url","origin"]);return{branch:n,headSha:t,dirty:o,dirtyCount:s,remoteUrl:i}}var uH,Sh=A(()=>{"use strict";uH={branch:null,headSha:null,dirty:null,dirtyCount:null,remoteUrl:null}});function Va(e){return{getSelf(){return{sessionId:e.sessionId??null,surface:mH(e.surface),parentSessionId:e.parentSessionId??null,depth:e.depth??null,maxDepth:e.maxDepth??null,phaseRole:e.phaseRole??null,cwd:e.cwd,model:{provider:e.providerName,name:e.modelName},permissionMode:pH(e.permissionMode)}},getTools(){return{enabled:e.getEnabledToolNames(),mcpServers:fH(e.getMcpTools())}},getSubagents(){return e.getSubagents()},getWorkspace(){return wh(e.cwd)}}}function pH(e){switch(e){case"bypassPermissions":case"acceptEdits":case"dontAsk":case"auto":return"elevated";default:return"default"}}function mH(e){switch(e){case"cli":case"repl":case"daemon":case"telegram":case"subagent":return e;default:return"unknown"}}function fH(e){let t=new Map;for(let n of e){if(!n.name.startsWith("mcp__"))continue;let r=n.name.split("__");if(r.length<3)continue;let o=r[1];typeof o!="string"||o.length===0||t.set(o,(t.get(o)??0)+1)}return[...t.entries()].map(([n,r])=>({name:n,toolCount:r})).sort((n,r)=>n.name.localeCompare(r.name))}var ZE=A(()=>{"use strict";Sh()});function Xs(e){return async(t,n)=>{let r=t&&typeof t=="object"?yh(t.view):"all",o=hh(e,r);return{content:JSON.stringify(o)}}}function Ya(e,t){let n=Xs(t),r=e,o=Array.isArray(r.toolDefs)?r.toolDefs:null,s={async execute(i){return i.name==="get_runtime_state"?n(i.input,i.signal):e.execute(i)}};if(o!==null){let i=o.some(a=>a.name==="get_runtime_state");s.toolDefs=i?o:[...o,Pn]}return s}var Pn,lt,qd=A(()=>{"use strict";bh();Pn={name:"get_runtime_state",category:"other",concurrencySafe:!0,description:"Inspect what the runtime knows about this session: identity (sessionId, surface, depth, parent), tool affordances (currently-enabled tool names and MCP server summary), delegation state (active subagent handles, background jobs), and git workspace state (branch, HEAD SHA, dirty count, remote URL). Returns a compact JSON snapshot.\n\nUse when uncertain about: your current nesting depth, whether a tool you want is actually available right now, what MCP servers are wired, whether earlier subagents you dispatched are still running, or what git branch / commit the session started on.\n\nViews:\n- `self` \u2014 identity + model + permissions + cwd only\n- `tools` \u2014 enabled tool names + MCP server summary only\n- `subagents` \u2014 active subagent handles + background jobs only\n- `workspace` \u2014 git state (branch, headSha, dirty, dirtyCount, remoteUrl)\n- `all` \u2014 union of the four above (default)\n\nThis is a read-only, in-memory inspection. It does not probe the file system or network. Fields the runtime does not know (e.g. depth for a top-level session) come back as `null` rather than synthesised defaults.",input_schema:{type:"object",properties:{view:{type:"string",enum:["self","tools","subagents","workspace","all"],description:'Which slice of state to return. Defaults to "all". Use a narrower view when only one slice is needed to keep the response compact.'}},required:[]}},lt=[Pn.name]});import{mkdir as gH,writeFile as vh,unlink as zde,readdir as hH,readFile as kh}from"fs/promises";import{unlinkSync as yH,existsSync as bH}from"fs";import{join as QE}from"path";function zd(e){return QE(Zc(),`${e}.json`)}async function wH(){try{return await gH(Zc(),{recursive:!0}),!0}catch{return!1}}async function Xa(e){try{if(!await wH())return;let n=zd(e.sessionId);await vh(n,JSON.stringify(e,null,2),"utf8")}catch{}}async function Eh(e,t){try{let n=zd(e),r=await kh(n,"utf8"),o=JSON.parse(r);o.afk=t,await vh(n,JSON.stringify(o,null,2),"utf8")}catch{}}async function eT(e,t){try{let n=zd(e),r=await kh(n,"utf8"),o=JSON.parse(r);o.cwd=t,await vh(n,JSON.stringify(o,null,2),"utf8")}catch{}}function ir(e){try{let t=zd(e);bH(t)&&yH(t)}catch{}}async function Th(){let e=Zc(),t;try{t=await hH(e)}catch{return[]}let n=[];for(let r of t){if(!r.endsWith(".json"))continue;let o=QE(e,r);try{let s=await kh(o,"utf8"),i=JSON.parse(s);i!==null&&typeof i=="object"&&"sessionId"in i&&typeof i.sessionId=="string"&&n.push({...i,path:o})}catch{}}return n}var Za=A(()=>{"use strict";K()});var Mn=A(()=>{"use strict";bh();ZE();qd();Sh();Za()});import xh from"path";import{appendFileSync as SH,mkdirSync as vH}from"fs";import{dirname as kH}from"path";import{createHash as EH}from"node:crypto";function xH(e){return TH.has(e)}function AH(e){let t;try{t=JSON.stringify(e.input)??"null"}catch{t=String(e.input)}return EH("sha256").update(e.name).update("\0").update(t).digest("hex")}function CH(e,t){return e.reduce((n,r,o)=>{let s=t(r.name,r.input),i=n[n.length-1];return i&&s&&i.isConcurrencySafe?i.indices.push(o):n.push({isConcurrencySafe:s,indices:[o]}),n},[])}var TH,Zs,RH,_H,Lt,Qa=A(()=>{"use strict";Ce();xt();$d();Cd();Od();Fd();K();Le();Qt();gh();Mn();TH=new Set([...sr,Ft,Mo,Oo,...Fr,Pn].filter(e=>e.concurrencySafe===!0).map(e=>e.name));Zs=8,RH=new Set;_H=8,Lt=class{handlers;schemas;hookRegistry;permissions;canUseTool;subagentExecutor;skillExecutor;composeExecutor;classifier;maxConcurrentSafeCalls;resolveBase;_readRoots;_writeRoots;_allowAll;_env;sessionId;parentSessionId;traceWriter;readOnlyBash;repeatBreaker=null;constructor(t){this.handlers=t.handlers,this.schemas=t.schemas,this.hookRegistry=t.hookRegistry,this.permissions=t.permissions,this.canUseTool=t.canUseTool,this.subagentExecutor=t.subagentExecutor,this.skillExecutor=t.skillExecutor,this.composeExecutor=t.composeExecutor,this.classifier=t.concurrencyClassifier??xH,this.maxConcurrentSafeCalls=typeof t.maxConcurrentSafeCalls=="number"&&Number.isFinite(t.maxConcurrentSafeCalls)&&t.maxConcurrentSafeCalls>=1?Math.floor(t.maxConcurrentSafeCalls):_H,this.resolveBase=t.cwd,this._env=t.env,this.sessionId=t.sessionId,this.parentSessionId=t.parentSessionId,this.traceWriter=t.traceWriter,this.readOnlyBash=t.readOnlyBash===!0,this._allowAll=t.allowAll===!0;let n=t.cwd?[t.cwd]:[];this._readRoots=t.readRoots??n.slice(),this._writeRoots=t.writeRoots??n.slice()}get handlerContext(){return{cwd:this.resolveBase,resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),...this._allowAll?{allowAll:!0}:{},...this._env!==void 0?{env:this._env}:{}}}callHandlerContext(t){return{...this.handlerContext,toolUseId:t.id,...this.traceWriter!==void 0?{traceWriter:this.traceWriter}:{}}}addReadRoot(t,n="slash"){let r=xh.resolve(t);this._readRoots.includes(r)||this._readRoots.push(r),this.appendAuditLog({action:"grant-read",path:r,source:n})}addWriteRoot(t,n="slash"){let r=xh.resolve(t);this._readRoots.includes(r)||this._readRoots.push(r),this._writeRoots.includes(r)||this._writeRoots.push(r),this.appendAuditLog({action:"grant-write",path:r,source:n})}revokeRoot(t,n="slash"){let r=xh.resolve(t);if(r===this.resolveBase)return;let o=this._readRoots.indexOf(r);o!==-1&&this._readRoots.splice(o,1);let s=this._writeRoots.indexOf(r);s!==-1&&this._writeRoots.splice(s,1),this.appendAuditLog({action:"revoke",path:r,source:n})}getGrants(){return{resolveBase:this.resolveBase,readRoots:this._readRoots.slice(),writeRoots:this._writeRoots.slice(),allowAll:this._allowAll}}setAllowAll(t){this._allowAll=t}setResolveBase(t){let n=this.resolveBase;if(n!==t){if(this.resolveBase=t,n!==void 0){let r=this._readRoots.indexOf(n);r!==-1?this._readRoots[r]=t:this._readRoots.includes(t)||this._readRoots.push(t);let o=this._writeRoots.indexOf(n);o!==-1?this._writeRoots[o]=t:this._writeRoots.includes(t)||this._writeRoots.push(t)}else this._readRoots.includes(t)||this._readRoots.push(t),this._writeRoots.includes(t)||this._writeRoots.push(t);this.subagentExecutor?.setCwd(t),this.skillExecutor?.setCwd(t),this.composeExecutor?.setCwd(t)}}appendAuditLog(t){try{let n=Ps();vH(kH(n),{recursive:!0});let r=JSON.stringify({timestamp:new Date().toISOString(),sessionId:this.sessionId??null,action:t.action,path:t.path,source:t.source});SH(n,r+`
|
|
999
999
|
`)}catch{}}get toolDefs(){let t=this.permissions?.allowedTools;if(!t)return this.schemas;let n=new Set(t);return this.schemas.filter(r=>n.has(r.name))}checkReadOnlyBash(t){if(!this.readOnlyBash||t.name!=="bash")return null;let n=t.input,r=typeof n=="object"&&n!==null?n.command:void 0;if(typeof r!="string")return null;let o=Js(r);return o.mutating?{content:`Bash command blocked: read-only skill may not run mutating commands (${o.reason??"mutation detected"}). Allowed: read-only recon (git status/log/diff, ls, cat, find, grep).`,isError:!0,failureClass:"permission-denied"}:null}checkRepeatCircuitBreaker(t){if(RH.has(t.name))return null;let n=AH(t);return this.repeatBreaker!==null&&this.repeatBreaker.fingerprint===n?this.repeatBreaker.count+=1:this.repeatBreaker={fingerprint:n,count:1},this.repeatBreaker.count<Zs?null:{content:`Loop circuit breaker: "${t.name}" has been called ${this.repeatBreaker.count} times in a row with byte-identical input. The result will not change. Stop repeating this call \u2014 reuse the previous result, change the input, try a different tool, or end the turn.`,isError:!0,circuitBreaker:!0}}async runCanUseTool(t){if(!this.canUseTool)return null;let n;try{n=await this.canUseTool(t.name,t.input??{},{signal:t.signal,toolUseID:t.id})}catch(r){return await dn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t.name,reason:`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`}),{content:`Tool "${t.name}" denied by canUseTool (threw): ${r instanceof Error?r.message:String(r)}`,isError:!0,failureClass:"permission-denied"}}return n.behavior==="deny"?(await dn(this.traceWriter,{hookEvent:"PreToolUse",decision:"block",blockedTool:t.name,reason:n.message||`Tool "${t.name}" denied by permission policy`}),{content:n.message||`Tool "${t.name}" denied by permission policy`,isError:!0,failureClass:"permission-denied"}):(n.updatedInput!==void 0&&(t.input=n.updatedInput),null)}async execute(t){if(t.signal.aborted)return{content:"Tool call aborted",isError:!0,failureClass:"abort"};if(this.hookRegistry){let d={event:"PreToolUse",toolName:t.name,input:t.input,...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};try{await ch(this.hookRegistry,d,{signal:t.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(u){if(u instanceof he)return{content:`Tool "${t.name}" blocked by PreToolUse hook: ${u.message}`,isError:!0,failureClass:"hook-block"};throw u}}let n=ph(t.name,this.permissions);if(!n.allowed)return{content:n.reason??`Tool "${t.name}" is not permitted`,isError:!0,failureClass:"permission-denied"};let r=await this.runCanUseTool(t);if(r)return r;let o=this.checkReadOnlyBash(t);if(o)return o;let s=this.checkRepeatCircuitBreaker(t);if(s)return s;if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let d,u=!1,p="";try{d=await this.subagentExecutor.execute(t)}catch(m){u=!0,p=m instanceof Error?m.message:String(m),d={content:`Agent tool error: ${p}`,isError:!0}}return u?this.firePostToolUseFailure(t.name,p,t.signal,t.input):this.firePostToolUse(t.name,d.content,t.signal,t.input),d}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let d,u=!1,p="";try{d=await this.skillExecutor.execute(t)}catch(m){u=!0,p=m instanceof Error?m.message:String(m),d={content:`Skill tool error: ${p}`,isError:!0}}return u?this.firePostToolUseFailure(t.name,p,t.signal,t.input):this.firePostToolUse(t.name,d.content,t.signal,t.input),d}if(t.name==="compose"){let d=await this.executeCompose(t);return this.firePostToolUse(t.name,d.content,t.signal,t.input),d}let i=this.handlers.get(t.name);if(!i)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};let a,l=!1,c="";try{a=await i(t.input,t.signal,this.callHandlerContext(t))}catch(d){l=!0,c=d instanceof Error?d.message:String(d),a={content:`Tool execution error: ${c}`,isError:!0}}return l?this.firePostToolUseFailure(t.name,c,t.signal,t.input):this.firePostToolUse(t.name,a.content,t.signal,t.input),a}async executeBatch(t){if(t.length===0)return[];if(t.length===1)return[await this.execute(t[0])];let n=new Array(t.length),r=new Set;for(let i=0;i<t.length;i++){let a=t[i];if(a.signal.aborted){n[i]={content:"Tool call aborted",isError:!0,failureClass:"abort"},r.add(i);continue}if(this.hookRegistry){let p={event:"PreToolUse",toolName:a.name,input:a.input,...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};try{await ch(this.hookRegistry,p,{signal:a.signal,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}catch(m){if(m instanceof he){n[i]={content:`Tool "${a.name}" blocked by PreToolUse hook: ${m.message}`,isError:!0,failureClass:"hook-block"},r.add(i);continue}throw m}}let l=ph(a.name,this.permissions);if(!l.allowed){n[i]={content:l.reason??`Tool "${a.name}" is not permitted`,isError:!0,failureClass:"permission-denied"},r.add(i);continue}let c=await this.runCanUseTool(a);if(c){n[i]=c,r.add(i);continue}let d=this.checkReadOnlyBash(a);if(d){n[i]=d,r.add(i);continue}let u=this.checkRepeatCircuitBreaker(a);if(u){n[i]=u,r.add(i);continue}}let o=t.map((i,a)=>({call:i,originalIndex:a})).filter((i,a)=>!r.has(a));if(o.length===0)return n;let s=CH(o.map(i=>i.call),this.classifier);for(let i of s)if(i.isConcurrencySafe){let a=await zs(i.indices,this.maxConcurrentSafeCalls,async l=>{let{call:c,originalIndex:d}=o[l];return c.signal.aborted?{result:{content:"Tool call aborted",isError:!0,failureClass:"abort"},originalIndex:d}:{result:await this.executeCore(c),originalIndex:d}});for(let l of a)if(l.status==="fulfilled")n[l.value.originalIndex]=l.value.result;else{let c=l.reason instanceof Error?l.reason.message:String(l.reason),d=i.indices[a.indexOf(l)];n[o[d].originalIndex]={content:`Tool execution error: ${c}`,isError:!0}}}else for(let a of i.indices){let{call:l,originalIndex:c}=o[a];if(l.signal.aborted){n[c]={content:"Tool call aborted",isError:!0,failureClass:"abort"};continue}n[c]=await this.executeCore(l)}return n}async executeCore(t){if(t.name==="agent"){if(!this.subagentExecutor)return{content:"Agent tool is not available in this session configuration",isError:!0};let i,a=!1,l="";try{i=await this.subagentExecutor.execute(t)}catch(c){a=!0,l=c instanceof Error?c.message:String(c),i={content:`Agent tool error: ${l}`,isError:!0}}return a?this.firePostToolUseFailure(t.name,l,t.signal,t.input):this.firePostToolUse(t.name,i.content,t.signal,t.input),i}if(t.name==="skill"){if(!this.skillExecutor)return{content:"Skill tool is not available in this session configuration",isError:!0};let i,a=!1,l="";try{i=await this.skillExecutor.execute(t)}catch(c){a=!0,l=c instanceof Error?c.message:String(c),i={content:`Skill tool error: ${l}`,isError:!0}}return a?this.firePostToolUseFailure(t.name,l,t.signal,t.input):this.firePostToolUse(t.name,i.content,t.signal,t.input),i}if(t.name==="compose"){let i=await this.executeCompose(t);return this.firePostToolUse(t.name,i.content,t.signal,t.input),i}let n=this.handlers.get(t.name);if(!n)return{content:`Unknown tool "${t.name}". Available tools: ${[...this.handlers.keys()].join(", ")}`,isError:!0};let r,o=!1,s="";try{r=await n(t.input,t.signal,this.callHandlerContext(t))}catch(i){o=!0,s=i instanceof Error?i.message:String(i),r={content:`Tool execution error: ${s}`,isError:!0}}return o?this.firePostToolUseFailure(t.name,s,t.signal,t.input):this.firePostToolUse(t.name,r.content,t.signal,t.input),r}async executeCompose(t){if(!this.composeExecutor)return{content:"Compose tool is not available in this session configuration",isError:!0};try{return await this.composeExecutor.execute(t)}catch(n){return{content:`Compose tool error: ${n instanceof Error?n.message:String(n)}`,isError:!0}}}firePostToolUse(t,n,r,o){if(!this.hookRegistry)return;let s={event:"PostToolUse",toolName:t,output:n,...o!==void 0?{input:o}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};xE(this.hookRegistry,s,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(()=>{})}firePostToolUseFailure(t,n,r,o){if(!this.hookRegistry)return;let s={event:"PostToolUseFailure",toolName:t,error:n,...o!==void 0?{input:o}:{},...this.parentSessionId!==void 0?{parentSessionId:this.parentSessionId}:{}};RE(this.hookRegistry,s,{signal:r,...this.traceWriter?{traceWriter:this.traceWriter}:{}}).catch(i=>{W(`firePostToolUseFailure outer catch (tool=${t}): ${String(i)}`)})}}});function UH(e){let t=e.match(IH);if(!t)return null;let n=parseInt(t[1]??"0",10),r=parseInt(t[2]??"0",10),o=t[3]!==void 0?parseInt(t[3],10):void 0;return{runner:"vitest",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function jH(e){let t=e.match(PH);if(!t)return null;let n=parseInt(t[1]??"0",10);return{runner:"jest",passed:parseInt(t[2]??"0",10),failed:n}}function HH(e){let t=e.match(MH);if(!t)return null;if(t[2]!==void 0){let n=parseInt(t[2],10),r=parseInt(t[1]??"0",10);return{runner:"pytest",passed:n,failed:r}}return t[4]!==void 0?{runner:"pytest",passed:parseInt(t[4],10),failed:0}:null}function WH(e){let t=e.match(OH);if(!t)return null;let n=parseInt(t[1]??"0",10),r=e.match($H),o=r?parseInt(r[1]??"0",10):0;return{runner:"mocha",passed:n,failed:o}}function KH(e){let t=[...e.matchAll(DH)];if(t.length===0)return null;let n=0,r=0;for(let o of t)o[1]==="ok"?n++:o[1]==="FAIL"&&r++;return{runner:"go-test",passed:n,failed:r}}function GH(e){let t=e.match(FH);if(!t)return null;let n=parseInt(t[1]??"0",10),r=parseInt(t[2]??"0",10),o=t[3]!==void 0?parseInt(t[3],10):void 0;return{runner:"cargo",passed:n,failed:r,...o!==void 0?{skipped:o}:{}}}function qH(e){let t=e.match(LH);if(!t)return null;let n=parseInt(t[1]??"0",10),r=parseInt(t[2]??"0",10);return{runner:"rspec",passed:n-r,failed:r}}function zH(e){let t=e.match(NH);if(t)return{runner:"phpunit",passed:parseInt(t[1]??"0",10),failed:0};let n=e.match(BH);if(n){let r=parseInt(n[1]??"0",10),o=parseInt(n[2]??"0",10);return{runner:"phpunit",passed:r-o,failed:o}}return null}function Rh(e){return UH(e)??jH(e)??HH(e)??WH(e)??KH(e)??GH(e)??qH(e)??zH(e)??null}var IH,PH,MH,OH,$H,DH,FH,LH,NH,BH,tT=A(()=>{"use strict";IH=/Tests\s+(\d+)\s+passed(?:\s*\|\s*(\d+)\s+failed)?(?:\s*\|\s*(\d+)\s+skipped)?/,PH=/Tests:\s+(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*\d+\s+total/,MH=/={3,}\s*(?:(\d+)\s+failed,\s*)?(\d+)\s+passed(?:,\s*(\d+)\s+warning)?.*in\s+[\d.]+s\s*={3,}|={3,}\s*(\d+)\s+passed.*in\s+[\d.]+s\s*={3,}/,OH=/(\d+)\s+passing/,$H=/(\d+)\s+failing/,DH=/^(ok|FAIL)\s+\S+\s+[\d.]+s/gm,FH=/test result: (?:ok|FAILED)\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/,LH=/(\d+) examples?, (\d+) failures?/,NH=/OK \((\d+) tests?/,BH=/Tests:\s*(\d+)[^]*?Failures:\s*(\d+)/});function Do(e){return e.replace(nT,"").replace(JH," ").trim()}function ar(e){return e.replace(nT,"")}var nT,JH,Fo=A(()=>{"use strict";nT=/\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1B[P^_X][^\x1B]*\x1B\\|\x1B\[[0-?]*[ -/]*[@-~]|\x9B[0-?]*[ -/]*[@-~]|\x1B[@-_]/g,JH=/[\x00-\x1F\x7F-\x9F]/g});import{statSync as VH}from"node:fs";function el(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.code==="ENOENT"&&typeof t.syscall=="string"&&t.syscall.startsWith("spawn")}function Ah(e){if(e===void 0)return!1;try{return VH(e),!1}catch{return!0}}function tl(e,t){let n=e instanceof Error?e.message:typeof e?.message=="string"?String(e.message):String(e);return el(e)&&Ah(t)?`working directory does not exist: ${t} (deleted worktree?) \u2014 underlying: ${n}`:n}var Jd=A(()=>{"use strict"});import{spawn as YH}from"child_process";function XH(e){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let t=e;if(typeof t.command!="string")throw new Error('Input must have a "command" field of type string');let n=12e4;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number")throw new Error("timeout_ms must be a number");if(t.timeout_ms<0||t.timeout_ms>6e5)throw new Error("timeout_ms must be between 0 and 600000");n=t.timeout_ms}return{command:t.command,timeout_ms:n}}function Vd(e,t){let n=!1;function r(){n||e==="bypassPermissions"&&(n=!0,console.warn("[security] bash handler: shell=true with bypassPermissions \u2014 all shell metacharacters are interpreted without confirmation. Migrate to execFile to eliminate this risk (tracked: C4)."))}return async(o,s,i)=>{let{command:a,timeout_ms:l}=XH(o);return s.aborted?{content:"Command aborted",isError:!0}:(r(),new Promise(c=>{let d=!1;function u(v){d||(d=!0,clearTimeout(m),s.removeEventListener("abort",S),c(v))}let p=YH(a,{shell:!0,detached:!0,stdio:["ignore","pipe","pipe"],...(i?.resolveBase??i?.cwd??t)!==void 0?{cwd:i?.resolveBase??i?.cwd??t}:{},...i?.env!==void 0?{env:{...process.env,...i.env}}:{}});p.unref();let m=setTimeout(()=>{p.pid!==void 0&&process.kill(-p.pid,"SIGKILL"),u({content:`Command timed out after ${l}ms`,isError:!0})},l),g="",h="",b=1e5,y=0,w=!1;function k(v){if(w||d||y<b)return;w=!0,console.warn(`[bash] overflow kill: stream=${v} totalBytes=${y} command="${a}"`),He({event:"tool.overflow_kill",tool:"bash",total_bytes:y,stream:v}),p.kill("SIGKILL");let C=(g+h).trimEnd();C=ar(C);let _=Rh(C)??void 0;C.length>b&&(C=C.slice(0,b)),C+=`
|
|
1000
1000
|
[output truncated \u2014 exceeded 100KB]`,u({content:C,truncated:!0,..._!==void 0?{testResult:_}:{}})}p.stdout.on("data",v=>{let C=b-y,_=v.length<=C?v:v.subarray(0,Math.max(0,C));y+=_.length,g+=_.toString("utf8"),k("stdout")}),p.stderr.on("data",v=>{let C=b-y,_=v.length<=C?v:v.subarray(0,Math.max(0,C));y+=_.length,h+=_.toString("utf8"),k("stderr")});let S=()=>{p.pid!==void 0&&process.kill(-p.pid,"SIGKILL"),u({content:"Command aborted",isError:!0})};s.addEventListener("abort",S),s.aborted&&S(),p.on("close",v=>{if(s.aborted){u({content:"Command aborted",isError:!0});return}if(v!==null&&v!==0){let B=h.trimEnd()||g.trimEnd();u({content:`Command exited with code ${v}${B?`
|
|
1001
1001
|
`+B:""}`,isError:!0});return}if(w)return;let C=(g+h).trimEnd();C=ar(C);let _=Rh(C)??void 0,I=!1;C.length>b&&(C=C.slice(0,b)+`
|
|
@@ -1079,7 +1079,7 @@ ${o}`;return s.includes("already checked out")||s.includes("is already used by w
|
|
|
1079
1079
|
Effective base URL: ${r}`)),r}return t}function tK(){if(Wh!==void 0)return Wh;if(!jT){let o=[il(process.cwd(),".env"),Tt(),Tk()];for(let s of o)Kh(s)&&QW({path:s,override:!1});jT=!0}let e={},t=E.AFK_MODEL??E.CLAUDE_MODEL;if(t){let o=t.toLowerCase();e.model=Zg(o)?o:t}if(re(t)==="anthropic-direct"){let o=Gh();o!==void 0&&(e.apiKey=o)}let r=E.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=E.AFK_LOCAL_API_KEY||"local"),E.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(E.AFK_MAX_TOKENS,10)),E.AFK_TEMPERATURE&&(e.temperature=parseFloat(E.AFK_TEMPERATURE)),E.AFK_SYSTEM_PROMPT&&(e.systemPrompt=E.AFK_SYSTEM_PROMPT),E.AFK_AUTO_ROUTING){let o=E.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return E.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=eK(E.AFK_OPENAI_BASE_URL)),Wh=e,e}function qh(){if(ni!==void 0)return ni;let e=[il(process.cwd(),"afk.config.json"),Jt(),nd()];for(let t of e)if(Kh(t))try{let n=WT(t,"utf-8"),r=JSON.parse(n),o={},s=iE(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=Zg(i)?i:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),typeof r.permissionMode=="string"){let i=r.permissionMode;(i==="default"||i==="plan"||i==="autonomous"||i==="bypassPermissions")&&(o.permissionMode=i)}if(r.autoRouting&&typeof r.autoRouting=="object"){let i={};typeof r.autoRouting.interactive=="boolean"&&(i.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(i.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(i.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(i.daemon=r.autoRouting.daemon),o.autoRouting=i}if(r.daemon&&typeof r.daemon=="object"){let i={};typeof r.daemon.task=="string"&&(i.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(i.taskId=r.daemon.taskId);let a=r.daemon.worktreePrune;a&&typeof a=="object"&&(i.worktreePrune={enabled:typeof a.enabled=="boolean"?a.enabled:!0,cron:typeof a.cron=="string"?a.cron:"0 4 * * *",maxAgeDaysClean:typeof a.maxAgeDaysClean=="number"?a.maxAgeDaysClean:14,maxAgeDaysDirty:typeof a.maxAgeDaysDirty=="number"?a.maxAgeDaysDirty:30,scope:typeof a.scope=="string"?a.scope:"all"}),o.daemon=i}if(r.telegram&&typeof r.telegram=="object"){let i={},a=r.telegram.notify;if(a&&typeof a=="object"){let l={};if((a.mode==="primary"||a.mode==="broadcast"||a.mode==="custom")&&(l.mode=a.mode),typeof a.primaryChatId=="number"&&Number.isFinite(a.primaryChatId)&&(l.primaryChatId=a.primaryChatId),Array.isArray(a.targets)){let c=a.targets.filter(d=>typeof d=="number"&&Number.isFinite(d));c.length>0&&(l.targets=c)}i.notify=l}typeof r.telegram.verifyDone=="boolean"&&(i.verifyDone=r.telegram.verifyDone),o.telegram=i}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.hooks!==null&&typeof r.hooks=="object"&&!Array.isArray(r.hooks)&&(o.hooks=r.hooks),typeof r.enableShellHooks=="boolean"&&(o.enableShellHooks=r.enableShellHooks),t!==il(process.cwd(),"afk.config.json")){let i=ol(r.importFrom);i!==void 0&&(o.importFrom=i)}if(r.interactive&&typeof r.interactive=="object"){let i={};typeof r.interactive.worktreeAutoname=="boolean"&&(i.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(i.worktreeBranchPrefix=Bh(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(Uh(r.interactive.worktreeBase,`${t}#/interactive/worktreeBase`),i.worktreeBase=r.interactive.worktreeBase),typeof r.interactive.suggestGhost=="boolean"&&(i.suggestGhost=r.interactive.suggestGhost),Object.keys(i).length>0&&(o.interactive=i)}return ni={config:o,sourcePath:t,modelsPartial:s},ni}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return ni={config:{},sourcePath:void 0,modelsPartial:{}},ni}function nK(){if(ri!==void 0)return ri.value;let e=[il(process.cwd(),"AFK.md"),il(Oe(),"AFK.md")];for(let t of e)if(Kh(t))try{let n=WT(t,"utf-8").trim();if(n.length>0)return ri={value:{content:n,path:t}},ri.value}catch{}return ri={value:null},ri.value}function ru(){return qh().config.telegram??{}}function oi(){return qh().config.permissionMode??KT}function $t(e){let t=tK(),{config:n,sourcePath:r,modelsPartial:o}=qh(),s={...sl,...t,...n,...e},i;if(t.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=nK();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??sl.model,maxTokens:s.maxTokens??sl.maxTokens,temperature:s.temperature??sl.temperature,updatePolicy:s.updatePolicy??sl.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??KT,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{}},l=e?.models??Vg(o);if(bd(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var sl,KT,jT,Wh,HT,ni,ri,Ut=A(()=>{"use strict";nr();un();tt();K();ei();rl();V();pr();sl={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},KT="bypassPermissions",jT=!1;HT=new Set});function rK(e,t){return t!==void 0&&Number.isFinite(t)&&t!==0?t:e.find(r=>r>0)??e[0]}function oK(e,t={}){let n=[...e],r=t.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(t.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=rK(n,t.primaryChatId);return o!==void 0?[o]:[]}function sK(e){if(!e)return;let t=e.trim();if(!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isFinite(n)&&n!==0?n:void 0}function iK(e){if(!e)return;let t=e.trim().toLowerCase();return t==="primary"||t==="broadcast"||t==="custom"?t:void 0}function aK(){let e=ru().notify??{},t=e.mode??iK(E.AFK_TELEGRAM_NOTIFY_MODE),n=e.primaryChatId??sK(E.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...t!==void 0?{mode:t}:{},...n!==void 0?{primaryChatId:n}:{},...e.targets!==void 0?{targets:e.targets}:{}}}function si(){let e=ET(E.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return oK(e,aK())}var ou=A(()=>{"use strict";TT();Ut();V()});function zh(e,t=4096){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let o=t,s=r.lastIndexOf(`
|
|
1080
1080
|
`,t);if(s>t-500&&s>0)o=s+1;else{let i=r.slice(0,t).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let a=i[i.length-1];if(a){let l=r.lastIndexOf(a,t);l>t-200&&l>0&&(o=l+2)}}else{let a=r.lastIndexOf(" ",t);a>t-100&&a>0&&(o=a+1)}}n.push(r.slice(0,o).trim()),r=r.slice(o).trim()}return n}function GT(e){e=e.replace(/[\x02\x03]/g,"");let t=e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),n=[];t=t.replace(/^ {0,3}```([\w]*)\n([\s\S]*?)```/gm,(o,s,i)=>{let a=n.length;if(i.trim()===""){let l=s?`(empty ${s} block)`:"(empty code block)";n.push(`<i>${l}</i>`)}else n.push(`<pre>${i}</pre>`);return`FENCED${a}`});let r=[];return t=t.replace(/`([^`]+)`/g,(o,s)=>{let i=r.length;return r.push(`<code>${s}</code>`),`CODE${i}`}),t=t.replace(/\*\*([^*]+)\*\*/g,"<b>$1</b>"),t=t.replace(/__([^_]+)__/g,"<b>$1</b>"),t=t.replace(/\*([^*]+)\*/g,"<i>$1</i>"),t=t.replace(/(^|[^\w])_([^_\n]+?)_(?!\w)/gm,"$1<i>$2</i>"),t=t.replace(/~~([^~]+)~~/g,"<s>$1</s>"),t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,s,i)=>'<a href="'+i.replace(/"/g,""")+'">'+s+"</a>"),t=t.replace(/^#{1,6}\s+/gm,""),t=t.replace(/\x02CODE(\d+)\x03/g,(o,s)=>r[Number(s)]??o),t=t.replace(/\x02FENCED(\d+)\x03/g,(o,s)=>n[Number(s)]??o),lK(t)||(t=t.replace(/<\/?[bis]>/g,"")),t}function lK(e){let t=[],n=/<(\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*>/g,r;for(;(r=n.exec(e))!==null;){let o=(r[2]??"").toLowerCase();if(r[1]==="/"){if(t.pop()!==o)return!1}else t.push(o)}return t.length===0}var qT=A(()=>{"use strict"});var Jh={};qc(Jh,{push:()=>ii,pushIfConfigured:()=>On,pushMarkdown:()=>zT});async function ii(e){if(!e.token)throw new Error("push: token is required");if(e.chatId===""||e.chatId==null||e.chatId===0)throw new Error("push: chatId is required");let t=e.fetchImpl??fetch,r=`${e.apiBase??cK}/bot${e.token}/sendMessage`,o={chat_id:e.chatId,text:e.text.slice(0,4096)};e.parseMode&&(o.parse_mode=e.parseMode),e.replyMarkup&&(o.reply_markup=e.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await t(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function zT(e){let t=GT(e.text),n=zh(t),r={ok:!0,status:200};for(let o of n)if(r=await ii({...e,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?ii({...e}):r;return r}async function On(e,t={}){let n=E.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=si();if(r.length===0)return null;let o=zh(e),s=[];for(let i of r)for(let a=0;a<o.length;a++){let l={token:n,chatId:i,text:o[a]??"",...t.replyMarkup!==void 0&&a===0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}};s.push(t.markdown?await zT(l):await ii({...l,...t.parseMode!==void 0?{parseMode:t.parseMode}:{}}))}return s}var cK,Ur=A(()=>{"use strict";ou();qT();V();cK="https://api.telegram.org"});function dK(e=ii){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>JT)return{content:`Invalid input: message exceeds Telegram's ${JT}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=E.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=si();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of i){let c=await e({token:s,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var JT,VT,YT=A(()=>{"use strict";V();Ur();ou();JT=4096;VT=dK()});import{JSDOM as uK}from"jsdom";import{Readability as pK}from"@mozilla/readability";import mK from"turndown";function XT(e){return e.replace(/\n{3,}/g,`
|
|
1081
1081
|
|
|
1082
|
-
`).trim()}function fK(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function QT(e,t){let r=new uK(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new pK(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=XT(Vh.turndown(s.content)),d=(s.title??"").trim()||o,u=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=XT(Vh.turndown(a));return{title:o,markdown:l,textLength:fK(i),usedFallback:!0}}var ZT,Vh,ex=A(()=>{"use strict";ZT=200,Vh=new mK({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Vh.remove(["script","style","noscript","iframe"])});function hK(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(t?.reason??new Error("aborted"))},s=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function tx(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function yK(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function su(e,t,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??hK,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!gK.has(u.status)||d===o)return u;let p=yK(u,i)??tx(d,s,i);W("[web/retryFetch] retrying",{url:t,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=tx(d,s,i);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var gK,Yh=A(()=>{"use strict";Ce();gK=new Set([429,502,503,504])});import{readFileSync as bK}from"node:fs";import{join as wK}from"path";function SK(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function nx(e,t){return SK(t).test(e)}function EK(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(vK.has(t))return!0;if(kK.has(t))return!1}return!1}function rx(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function TK(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function ox(e){let t=e===void 0||e.trim()===""?"default":e.trim();return La(t),t}function xK(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function RK(e){try{return bK(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function AK(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=ox(t.defaultProfile)),n}function sx(e){let t=e?.env??E,n=e?.readFileSync??RK,r=e?.surface??t.AGENT_SURFACE,o=EK(t.AFK_BROWSER_HEADLESS,r),s=rx(t.AFK_BROWSER_ALLOWED_DOMAINS),i=rx(t.AFK_BROWSER_BLOCKED_DOMAINS),a=xK(t.AFK_BROWSER_DOM_SNAPSHOTS),l=TK(t.AFK_BROWSER_BACKEND),c=ox(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():wK(cn(),"browser.json"),m=n(p);if(m===void 0)return d;let g;try{g=JSON.parse(m)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=AK(d,g);return h.configPath=p,h}function Xh(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(nx(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>nx(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var vK,kK,Zh=A(()=>{"use strict";V();K();vK=new Set(["daemon","subagent","telegram","afk"]),kK=new Set(["repl","interactive","cli"])});import Lo from"node:fs";import iu from"node:path";import{randomBytes as CK}from"node:crypto";import{chromium as _K}from"playwright";function IK(){try{return"5.20.0"}catch{}try{let e=iu.resolve(import.meta.dirname,"../../../package.json"),t=Lo.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var PK,au,ix=A(()=>{"use strict";K();Ce();PK=IK(),au=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=_K.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),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(t,i),s}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",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(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${PK}`}}loadStorageState(t){let n=Na(t);try{if(!Lo.existsSync(n))return;let r=JSON.parse(Lo.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Na(t);if(!Lo.existsSync(r))return;let o=await n.storageState(),s=iu.join(iu.dirname(r),`.${iu.basename(r)}.${process.pid}.${CK(4).toString("hex")}.tmp`);Lo.writeFileSync(s,JSON.stringify(o),{mode:384}),Lo.chmodSync(s,384),Lo.renameSync(s,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as MK}from"crypto";function Qh(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of OK)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function ax(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&$K.test(e.label))}function lx(e){return MK("sha256").update(e,"utf8").digest("hex").slice(0,8)}function cx(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var OK,$K,al=A(()=>{"use strict";OK=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];$K=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as DK}from"node:crypto";function FK(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function LK(e,t,n){return`el_${DK("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function NK(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function dx(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function px(e,t){let n=e.role??"",r=e.name??"";ux.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])px(s,t)}async function BK(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),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},mx).catch(()=>[])}async function UK(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let 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 h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),m!==void 0&&(g.checked=m),o.push(g)}return o},mx).catch(()=>[])}function jK(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function lu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=jK(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=BK(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,m,g,h]=await Promise.all([i,a,l,c,d]),b,y=!1;u!==null?(b=[],px(u,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await UK(e)).filter(L=>ux.has(L.role??"")));let w=new Map;for(let x of p){let L=dx(x.name),D=w.get(L);(!D||D.bbox.w===0&&x.bbox.w>0)&&w.set(L,x)}let k=b.map(x=>({ax:x,dom:w.get(dx(x.name??""))})),S=r?k:k.filter(x=>x.dom?x.dom.bbox.w>0||x.dom.bbox.h>0:!0);S.sort((x,L)=>{let D=x.dom?.bbox.y??0,M=L.dom?.bbox.y??0;if(D!==M)return D-M;let U=x.dom?.bbox.x??0,j=L.dom?.bbox.x??0;return U-j}),S.length>200&&o.push("page has 200+ interactive elements; consider scoping");let C=S.slice(0,n).map((x,L)=>{let D=x.ax.role??"generic",M=x.ax.name??"",U=LK(D,M,L),j=x.dom?.bbox??{x:0,y:0,w:0,h:0},O=x.dom?.type??null,R=null;x.ax.value!==void 0&&x.ax.value!==null&&(R=String(x.ax.value)),x.ax.checked!==void 0&&(R=String(x.ax.checked)),ax({role:D,kind:O})&&(R="[redacted]");let F={disabled:x.ax.disabled??!1};x.ax.checked!==void 0&&(F.checked=x.ax.checked===!0||x.ax.checked==="mixed"),x.ax.selected!==void 0&&(F.selected=x.ax.selected),x.ax.expanded!==void 0&&(F.expanded=x.ax.expanded);let $;x.dom?.testId?$=`[data-testid="${x.dom.testId}"]`:x.dom?.id&&($=`#${x.dom.id}`);let H={id:U,role:D,label:FK(M),kind:O,value:R,state:F,bbox:j};return $!==void 0&&(H.selector=$),H}),_="idle";try{let x=await e.evaluate(()=>document.readyState);x==="loading"?_="loading":x==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let I=NK(m),B=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:B,url:g,title:h,textSummary:I,interactive:C,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var ux,mx,fx=A(()=>{"use strict";al();ux=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);mx="a[href], button, input, select, textarea, [role], [tabindex], label"});async function gx(e,t){try{let n=await e.nth(t).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}:${t}`,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 ey(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>gx(e,s)))).filter(o=>o!==null)}async function HK(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)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}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function ty(e,t,n){switch(t.kind){case"element_id":return WK(e,t,n);case"selector":return KK(e,t);case"semantic":return GK(e,t)}}async function WK(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await ey(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function KK(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await ey(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function GK(e,t){return t.role!==void 0?qK(e,t.text,t.role):zK(e,t.text,t)}async function qK(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await ey(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function zK(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{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 HK(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),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await gx(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,k=0;for(let S=0;S<w.length;S++)k=k*31+w.charCodeAt(S)>>>0;m.push({...y,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var hx=A(()=>{"use strict"});import{randomBytes as JK}from"crypto";import{mkdir as VK,stat as YK,writeFile as XK}from"fs/promises";import{join as ny}from"path";import{gzip as ZK}from"zlib";import{promisify as QK}from"util";function eG(e){return ny(Ms(e),"browser")}function tG(e){return ny(eG(e),"screenshots")}function nG(){return new Date().toISOString().replace(/[:.]/g,"-")}function rG(){return JK(3).toString("hex")}async function ry(e,t,n){if(t.length>yx)throw new Error(`writeScreenshotSidecar: buffer exceeds ${yx} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=tG(e);await VK(r,{recursive:!0});let o=`${nG()}-${rG()}-${n}.png`,s=ny(r,o);await XK(s,t);let{size:i}=await YK(s);return{path:s,bytes:i}}var Ume,yx,bx=A(()=>{"use strict";K();al();Ume=QK(ZK);yx=5*1024*1024});var Sx={};qc(Sx,{PlaywrightProvider:()=>oy});function wx(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var oy,vx=A(()=>{"use strict";ix();fx();hx();Zh();al();bx();oy=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new au(t)}async open(t){let n=Xh(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await lu(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,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await lu(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=t.timeoutMs??3e4,a=await ty(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${wx(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=Qh(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout: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(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(b){c=b}else c=h}let u=r.url();if(u!==s){let h=Xh(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await lu(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(t.target!==void 0){let d=await ty(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${wx(t.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:t.fullPage??!1});let{path:i,bytes:a}=await ry(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await ry(n,o,r);return s}catch{return null}}}});var Bo={};qc(Bo,{__resetBrowserRegistryForTests:()=>lG,browserProviderActive:()=>iG,closeBrowserProvider:()=>sy,getBrowserProvider:()=>sG,peekBrowserProvider:()=>aG});function kx(){Promise.resolve(sy()).then(()=>{process.exit(130)})}function Ex(){Promise.resolve(sy()).then(()=>{process.exit(143)})}function Tx(){$n=null}function oG(){cu||(process.on("SIGINT",kx),process.on("SIGTERM",Ex),process.on("exit",Tx),cu=!0)}function xx(){cu&&(process.removeListener("SIGINT",kx),process.removeListener("SIGTERM",Ex),process.removeListener("exit",Tx),cu=!1)}async function sG(e){return $n!==null?$n:(No!==null||(No=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(vx(),Sx)),n=sx(e),r=new t(n);return oG(),$n=r,No=null,r})()),No)}async function sy(){if($n===null)return;let e=$n;$n=null,No=null,xx(),await e.shutdown()}function iG(){return $n!==null}function aG(){return $n}function lG(){$n=null,No=null,xx()}var $n,No,cu,Uo=A(()=>{"use strict";Zh();$n=null,No=null,cu=!1});function Rx(e,t){try{return QT(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function mG(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Uo(),Bo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function Ax(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??mG,o=null,s=e,i=null,a=null;try{let c=await su(n,e,{headers:pG,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(uG.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(dG.test(d)&&!cG.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};o=Rx(u,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<ZT)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=Rx(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var cG,dG,uG,pG,Cx=A(()=>{"use strict";ex();Yh();Ce();cG=/(text\/html|application\/xhtml\+xml)/i,dG=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uG=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,pG={"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 hG(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(fG,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),gG),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=Do(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 _x(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?hG({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function Ix(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1082
|
+
`).trim()}function fK(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function QT(e,t){let r=new uK(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new pK(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=XT(Vh.turndown(s.content)),d=(s.title??"").trim()||o,u=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=XT(Vh.turndown(a));return{title:o,markdown:l,textLength:fK(i),usedFallback:!0}}var ZT,Vh,ex=A(()=>{"use strict";ZT=200,Vh=new mK({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Vh.remove(["script","style","noscript","iframe"])});function hK(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(t?.reason??new Error("aborted"))},s=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function tx(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function yK(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function su(e,t,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??hK,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!gK.has(u.status)||d===o)return u;let p=yK(u,i)??tx(d,s,i);W("[web/retryFetch] retrying",{url:t,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=tx(d,s,i);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var gK,Yh=A(()=>{"use strict";Ce();gK=new Set([429,502,503,504])});import{readFileSync as bK}from"node:fs";import{join as wK}from"path";function SK(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function nx(e,t){return SK(t).test(e)}function EK(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(vK.has(t))return!0;if(kK.has(t))return!1}return!1}function rx(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function TK(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function ox(e){let t=e===void 0||e.trim()===""?"default":e.trim();return La(t),t}function xK(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function RK(e){try{return bK(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function AK(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=ox(t.defaultProfile)),n}function sx(e){let t=e?.env??E,n=e?.readFileSync??RK,r=e?.surface??t.AGENT_SURFACE,o=EK(t.AFK_BROWSER_HEADLESS,r),s=rx(t.AFK_BROWSER_ALLOWED_DOMAINS),i=rx(t.AFK_BROWSER_BLOCKED_DOMAINS),a=xK(t.AFK_BROWSER_DOM_SNAPSHOTS),l=TK(t.AFK_BROWSER_BACKEND),c=ox(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():wK(cn(),"browser.json"),m=n(p);if(m===void 0)return d;let g;try{g=JSON.parse(m)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=AK(d,g);return h.configPath=p,h}function Xh(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(nx(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>nx(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var vK,kK,Zh=A(()=>{"use strict";V();K();vK=new Set(["daemon","subagent","telegram","afk"]),kK=new Set(["repl","interactive","cli"])});import Lo from"node:fs";import iu from"node:path";import{randomBytes as CK}from"node:crypto";import{chromium as _K}from"playwright";function IK(){try{return"5.20.1"}catch{}try{let e=iu.resolve(import.meta.dirname,"../../../package.json"),t=Lo.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var PK,au,ix=A(()=>{"use strict";K();Ce();PK=IK(),au=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=_K.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),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(t,i),s}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",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(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${PK}`}}loadStorageState(t){let n=Na(t);try{if(!Lo.existsSync(n))return;let r=JSON.parse(Lo.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Na(t);if(!Lo.existsSync(r))return;let o=await n.storageState(),s=iu.join(iu.dirname(r),`.${iu.basename(r)}.${process.pid}.${CK(4).toString("hex")}.tmp`);Lo.writeFileSync(s,JSON.stringify(o),{mode:384}),Lo.chmodSync(s,384),Lo.renameSync(s,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as MK}from"crypto";function Qh(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of OK)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function ax(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&$K.test(e.label))}function lx(e){return MK("sha256").update(e,"utf8").digest("hex").slice(0,8)}function cx(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var OK,$K,al=A(()=>{"use strict";OK=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];$K=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as DK}from"node:crypto";function FK(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function LK(e,t,n){return`el_${DK("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function NK(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function dx(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function px(e,t){let n=e.role??"",r=e.name??"";ux.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])px(s,t)}async function BK(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),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},mx).catch(()=>[])}async function UK(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let 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 h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};u!==void 0&&(g.value=u),m!==void 0&&(g.checked=m),o.push(g)}return o},mx).catch(()=>[])}function jK(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function lu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=jK(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=BK(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,p,m,g,h]=await Promise.all([i,a,l,c,d]),b,y=!1;u!==null?(b=[],px(u,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await UK(e)).filter(L=>ux.has(L.role??"")));let w=new Map;for(let x of p){let L=dx(x.name),D=w.get(L);(!D||D.bbox.w===0&&x.bbox.w>0)&&w.set(L,x)}let k=b.map(x=>({ax:x,dom:w.get(dx(x.name??""))})),S=r?k:k.filter(x=>x.dom?x.dom.bbox.w>0||x.dom.bbox.h>0:!0);S.sort((x,L)=>{let D=x.dom?.bbox.y??0,M=L.dom?.bbox.y??0;if(D!==M)return D-M;let U=x.dom?.bbox.x??0,j=L.dom?.bbox.x??0;return U-j}),S.length>200&&o.push("page has 200+ interactive elements; consider scoping");let C=S.slice(0,n).map((x,L)=>{let D=x.ax.role??"generic",M=x.ax.name??"",U=LK(D,M,L),j=x.dom?.bbox??{x:0,y:0,w:0,h:0},O=x.dom?.type??null,R=null;x.ax.value!==void 0&&x.ax.value!==null&&(R=String(x.ax.value)),x.ax.checked!==void 0&&(R=String(x.ax.checked)),ax({role:D,kind:O})&&(R="[redacted]");let F={disabled:x.ax.disabled??!1};x.ax.checked!==void 0&&(F.checked=x.ax.checked===!0||x.ax.checked==="mixed"),x.ax.selected!==void 0&&(F.selected=x.ax.selected),x.ax.expanded!==void 0&&(F.expanded=x.ax.expanded);let $;x.dom?.testId?$=`[data-testid="${x.dom.testId}"]`:x.dom?.id&&($=`#${x.dom.id}`);let H={id:U,role:D,label:FK(M),kind:O,value:R,state:F,bbox:j};return $!==void 0&&(H.selector=$),H}),_="idle";try{let x=await e.evaluate(()=>document.readyState);x==="loading"?_="loading":x==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let I=NK(m),B=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:B,url:g,title:h,textSummary:I,interactive:C,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var ux,mx,fx=A(()=>{"use strict";al();ux=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);mx="a[href], button, input, select, textarea, [role], [tabindex], label"});async function gx(e,t){try{let n=await e.nth(t).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}:${t}`,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 ey(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>gx(e,s)))).filter(o=>o!==null)}async function HK(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)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}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function ty(e,t,n){switch(t.kind){case"element_id":return WK(e,t,n);case"selector":return KK(e,t);case"semantic":return GK(e,t)}}async function WK(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await ey(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function KK(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await ey(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function GK(e,t){return t.role!==void 0?qK(e,t.text,t.role):zK(e,t.text,t)}async function qK(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await ey(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function zK(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{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 HK(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),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await gx(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,k=0;for(let S=0;S<w.length;S++)k=k*31+w.charCodeAt(S)>>>0;m.push({...y,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var hx=A(()=>{"use strict"});import{randomBytes as JK}from"crypto";import{mkdir as VK,stat as YK,writeFile as XK}from"fs/promises";import{join as ny}from"path";import{gzip as ZK}from"zlib";import{promisify as QK}from"util";function eG(e){return ny(Ms(e),"browser")}function tG(e){return ny(eG(e),"screenshots")}function nG(){return new Date().toISOString().replace(/[:.]/g,"-")}function rG(){return JK(3).toString("hex")}async function ry(e,t,n){if(t.length>yx)throw new Error(`writeScreenshotSidecar: buffer exceeds ${yx} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=tG(e);await VK(r,{recursive:!0});let o=`${nG()}-${rG()}-${n}.png`,s=ny(r,o);await XK(s,t);let{size:i}=await YK(s);return{path:s,bytes:i}}var Ume,yx,bx=A(()=>{"use strict";K();al();Ume=QK(ZK);yx=5*1024*1024});var Sx={};qc(Sx,{PlaywrightProvider:()=>oy});function wx(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var oy,vx=A(()=>{"use strict";ix();fx();hx();Zh();al();bx();oy=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new au(t)}async open(t){let n=Xh(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await lu(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,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await lu(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=t.timeoutMs??3e4,a=await ty(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${wx(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=Qh(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout: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(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(b){c=b}else c=h}let u=r.url();if(u!==s){let h=Xh(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await lu(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(t.target!==void 0){let d=await ty(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${wx(t.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:t.fullPage??!1});let{path:i,bytes:a}=await ry(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await ry(n,o,r);return s}catch{return null}}}});var Bo={};qc(Bo,{__resetBrowserRegistryForTests:()=>lG,browserProviderActive:()=>iG,closeBrowserProvider:()=>sy,getBrowserProvider:()=>sG,peekBrowserProvider:()=>aG});function kx(){Promise.resolve(sy()).then(()=>{process.exit(130)})}function Ex(){Promise.resolve(sy()).then(()=>{process.exit(143)})}function Tx(){$n=null}function oG(){cu||(process.on("SIGINT",kx),process.on("SIGTERM",Ex),process.on("exit",Tx),cu=!0)}function xx(){cu&&(process.removeListener("SIGINT",kx),process.removeListener("SIGTERM",Ex),process.removeListener("exit",Tx),cu=!1)}async function sG(e){return $n!==null?$n:(No!==null||(No=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(vx(),Sx)),n=sx(e),r=new t(n);return oG(),$n=r,No=null,r})()),No)}async function sy(){if($n===null)return;let e=$n;$n=null,No=null,xx(),await e.shutdown()}function iG(){return $n!==null}function aG(){return $n}function lG(){$n=null,No=null,xx()}var $n,No,cu,Uo=A(()=>{"use strict";Zh();$n=null,No=null,cu=!1});function Rx(e,t){try{return QT(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function mG(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Uo(),Bo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function Ax(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??mG,o=null,s=e,i=null,a=null;try{let c=await su(n,e,{headers:pG,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(uG.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(dG.test(d)&&!cG.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};o=Rx(u,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<ZT)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=Rx(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var cG,dG,uG,pG,Cx=A(()=>{"use strict";ex();Yh();Ce();cG=/(text\/html|application\/xhtml\+xml)/i,dG=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,uG=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,pG={"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 hG(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(fG,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),gG),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=Do(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 _x(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?hG({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function Ix(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1083
1083
|
|
|
1084
1084
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
1085
1085
|
`).trimEnd()}var fG,gG,Px=A(()=>{"use strict";Fo();fG="https://api.exa.ai/search",gG=10});function TG(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=yG;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(t.timeout_ms,bG)}let a=wG;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,SG)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function iy(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+vG}function xG(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return EG.some(o=>r.includes(o))}function RG(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=TG(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let d=i.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let u;try{u=await su(t,s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(m){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await u.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}return{content:iy(p,s.maxBytes)}}if(s.mode==="markdown")try{let u=await Ax(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:iy(u.markdown,s.maxBytes)}}catch(u){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=u instanceof Error?u.message:String(u),m=xG(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${m}`,isError:!0}}let d=_x({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(s.query,{limit:kG,timeoutMs:s.timeoutMs,signal:i.signal});return{content:iy(Ix(s.query,u),s.maxBytes)}}catch(u){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var yG,bG,wG,SG,vG,kG,EG,Mx,Ox=A(()=>{"use strict";Cx();Px();Yh();yG=3e4,bG=12e4,wG=1e6,SG=1e7,vG=`
|
|
@@ -2041,7 +2041,7 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
|
|
|
2041
2041
|
${S}${w}
|
|
2042
2042
|
${k}
|
|
2043
2043
|
${S}`})}return{fileBlocks:a,warnings:l}}async function fF(e,t,n,r,o="summary",s,i){let a=mO(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,d=!1,u=!1,p=!1,m=!1,g,h=!1,b=!1,y={abort:null},w=0,k=3e3,S=[],v=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,_=()=>{let D=r.subagentControl;D?.hasPromotableForeground()&&D.promoteActiveForeground().then(M=>{for(let U of M)(s??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${U.jobId}: ${U.label}`))}).catch(()=>{})},I=r.getCompositor?r.getCompositor():null,B=()=>new aa({out:la(s),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch(D=>{Ge()&&console.error(" "+f.error("session.interrupt() failed:"),D)})},...r.subagentControl?{onBackground:_}:{},...i?.history?{history:i.history}:{},...i?.autocompleteState?{autocompleteState:i.autocompleteState}:{},...i?.promptText!==void 0?{promptText:i.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...I?{compositor:I}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),P=B(),x=async()=>{if(!p){p=!0;try{await P.dispose()}catch{}}},L=async()=>{await P.arm();let D=P.getCompositor();if(s&&D){let M=D;s.fn=U=>M.commitAbove(U)}r.setActiveCompositor?.(D),r.setInterruptNotifier?.(M=>P.setInterrupting(M)),r.rearmStatus?.()};try{I?I.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(F=>{Ge()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),F)});let R=r.subagentControl;R?.hasActiveForeground()&&R.cancelActiveForeground().catch(F=>{Ge()&&console.error(" "+f.error("soft-stop cancelActiveForeground() failed:"),F)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(R=>{Ge()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),R)})}),await L(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(_);let{fileBlocks:D,warnings:M}=mF(e.text,{rootDir:process.cwd()});for(let R of M)(s??{fn:console.log}).fn(f.dim(` @-file: ${R}`));let U=D.length>0||e.attachments.length>0?uF(e.text,e.attachments,void 0,D):e.text,j=t.sendMessageStream(U);if(await qs((R,F)=>{P.process(R,F)},async()=>{for await(let R of j){if(h||b)break;if(R.type==="chunk"&&R.chunk.type==="content"?(l+=R.chunk.content,d=!0):R.type==="message"&&!d&&(l=R.message.content),R.type==="stream_retry"&&(l=l.slice(0,c)),R.type==="chunk"&&R.chunk.type==="tool_use_detail"){let F=R.chunk,$={toolName:F.toolName,toolUseId:F.toolUseId,input:F.toolInput,...F.toolInputRaw!==void 0&&{inputRaw:F.toolInputRaw}};v.set(F.toolUseId,$),S.push($)}else if(R.type==="chunk"&&R.chunk.type==="tool_result"){let F=R.chunk;c=l.length;let $=v.get(F.toolUseId);if($&&($.result=F.content,$.isError=F.isError,v.delete(F.toolUseId)),r.onContextProgress){let H=Date.now();if(H-w>=k){w=H;try{let Y=r.onContextProgress();Y instanceof Promise&&await Y}catch(Y){Ge()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),Y)}}}}if(R.type==="paused"){if(r.setPausedState?.(!0),await x(),I&&R.autoResume===!0){let F=new AbortController;y.abort=F;let $=R.resetsAt?R.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,H=$?`Keep waiting \u2014 auto-resumes at ${$}`:"Keep waiting \u2014 auto-resume in progress",Y="Switch model / provider (type /model after)",te="Stop waiting",ne=[f.warning(" \u23F3 Usage limit reached.")+($?f.dim(` Auto-resumes at ${$}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Mf(I,{header:ne,options:[H,Y,te],signal:F.signal,initialIndex:0}).then(Z=>{if(y.abort=null,!Z)return;let z=Z[0];z===void 0||z===H||(b=!0,z===Y&&(s??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(_e=>{Ge()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),_e)}))}).catch(Z=>{Ge()&&console.error(" "+f.error("picker promise rejected:"),Z)})}else(s??{fn:console.log}).fn(zk({reason:R.reason,...R.resetsAt!==void 0?{resetsAt:R.resetsAt}:{},...R.accountId!==void 0?{accountId:R.accountId}:{},...R.autoResume!==void 0?{autoResume:R.autoResume}:{}}));continue}if(R.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let F=R.hotSwapped&&R.accountId?`\u25B6 Resumed on ${R.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,S.length=0,v.clear(),m=!1,g=void 0,u=!1,P=B(),p=!1,await L(),(s??{fn:console.log}).fn(f.success(F));continue}if(R.type==="error"){await x(),Ls(Os(R.error)),u=!0;continue}P.process(R),R.type==="done"&&(m=!0,g=R.metadata)}}),await x(),h){let R=s?s.fn:console.log;R(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),R("")}if(b){let R=s?s.fn:console.log;R(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),R("")}if(m&&!h&&!b){Yo(n,a,l,g,S),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),pm(process.stdout);let R=$=>{s?s.fn($):console.log($)},F=cF(l);if(F){if(R(dF(F)),R(""),r.onTerminalState)try{r.onTerminalState(F)}catch{}if(n.permissionMode==="autonomous"){let $=F.kind==="done"&&ru().verifyDone===!0&&!BM(S);jM(F,void 0,{unverified:$})}}if(nee(g,n,R),r.onAfterTurn){let $=r.onAfterTurn();$ instanceof Promise&&await $.catch(()=>{})}}}catch(D){await x(),u||Ls(Os(D))}finally{await x(),s&&(s.fn=s.idleFn),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),y.abort?.abort(),y.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function nee(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(fe(e.durationMs)),e.totalCostUsd!==void 0&&r.push(dt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(le(o+s)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Aw(t),a=jt(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${le(l)} tok \u2014 model output may be silently truncated`))}else if(i>.5){let l=i>.8?f.error:f.warning;n(l(` context ${Math.round(i*100)}% used of ${le(a)}`))}n("")}var ree=5e3;async function oee(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(f.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function gF(e,t,n,r,o,s,i,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:p}=i,m=null,g=[];e.session.current.waitForInitialization().then(async w=>{Ge()&&(m=vm(w)),await pf(e.session.current),Ge()&&(g=lD())}).catch(()=>{});let h,b=!1,y=!1;for(;;){if(m&&(e.replRenderer.writeLine(m),e.replRenderer.writeLine(""),m=null),g.length>0){for(let x of g)e.replRenderer.writeLine(x);e.replRenderer.writeLine(""),g=[]}let w=u.drainNotifications();for(let{job:x,result:L}of w){let D=L.errorReason===void 0?"\u2713":"\u2717",M=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,U=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${D} [${x.id}] ${M} \xB7 ${U}s \xB7 `)+x.command)}let k=p.drainNotifications();for(let{job:x}of k){let L=x.status==="completed"?"\u2713":x.status==="failed"?"\u2717":"\u2298",D=x.endedAt!==void 0?Math.max(0,Math.round((x.endedAt-x.startedAt)/100)/10):0,M=x.label.length>60?`${x.label.slice(0,60)}\u2026`:x.label;e.replRenderer.writeLine(f.dim(` ${L} [${x.jobId}] subagent ${x.status} \xB7 ${D}s \xB7 `)+M)}let S=l.renderIfChanged(e.stats.sessionId);if(S.length>0){for(let x of S)e.replRenderer.writeLine(x);e.replRenderer.writeLine("")}let v,C;if(h===void 0){let x=await e.session.current.takePendingPlanExitSeed();x!==void 0&&(h={text:x,attachments:[]})}if(h!==void 0){let x=h;h=void 0;let L=pa(e.stats.permissionMode),D=os({buffer:x.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:Qi([...x.attachments])});e.replRenderer.writeLine(D),v=x.text.trim(),C=x.attachments}else{let x=await o.readLine({promptFn:()=>pa(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Of(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});v=x.text.trim(),C=x.attachments}if(!v&&C.length===0)continue;if(v.startsWith("!")){let x=/^(0|false|off|no)$/i.test(E.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!x&&(b||(b=!0,e.replRenderer.writeLine(f.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(v))){e.statusLine.rearm();continue}}let _=!1;if(v.startsWith("/")){let x=await IM(v,e.slashCtx,C);if(x.handled){if(x.result==="exit"){e.rl.close();return}if((v==="/clear"||v.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),d.reset()),x.result!==null&&typeof x.result=="object"&&"kind"in x.result&&x.result.kind==="submit"){h={text:x.result.message,attachments:C??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}_=!0}a.push(v),await oee(e,v);let I=v;if(_){let x=Rw(v);if(x){let L=x.name.replace(/^\//,"").split(":").pop()??"";if(L&&_S(L)){let D={skillName:L,rawArgs:x.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,U=ms(M),j=Date.now();W(`[afk trace] preflight.start commandName=${L}`);let O=!1,R=await ps(D,{cwd:e.stats.cwd??process.cwd(),artifactDir:U},F=>{Ge()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${L}) failed: `)+(F instanceof Error?F.message:String(F)))});O=R!==null,W(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-j} success=${O}`),I=PS(R?.manifestBlock,v)}}}let B=u.drainInjections();B.length>0&&(I=B+I);let P=p.drainInjections();if(P.length>0&&(I=P+I),e.hookRegistry)try{let x={event:"UserPromptSubmit",prompt:I,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(x);L.injectContext&&(I=L.injectContext+I)}catch(x){if(x instanceof he){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(x.reason?f.dim(`: ${Do(x.reason)}`):"")),e.statusLine.rearm();continue}if(x instanceof _n){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${x.timeoutMs}ms`)),e.statusLine.rearm();continue}throw x}if(await fF({text:I,attachments:C},e.session.current,e.stats,{setInFlight(x){n.turnInFlight=x},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(x){await t.appendUser(x)},async onTurnComplete(x,L){if(await t.appendTurn(x,L),e.stats.sessionId)try{Kn(e.stats)}catch(D){y||(y=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(D instanceof Error?D.message:String(D))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:x=>d?.push(x),setActiveCompositor:x=>{n.activeCompositor=x},setInterruptNotifier:x=>{n.notifyInterrupting=x},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:x=>o.setBackgroundHandler(x),setSoftStopHandler:s,setPausedState:x=>o.setPausedState(x),setPauseInterruptHandler:x=>o.setPauseInterruptHandler(x),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(zn(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:x=>c.repaint(x)}:{}},e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(pa(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,ree)}catch(x){if(x instanceof ft)throw x;x instanceof _n?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):x instanceof he?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${Do(x.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(x))}}}function see(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function hF(e,t,n,r){let o=await qD(),s=new Pf({rl:e.rl,history:o,statusLine:e.statusLine}),i=see(E.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await ZD(e,s,n,t,r,i,{getLoopStageBar:()=>a?.loopStageBar});a=lF(e,n),await gF(e,t,n,r,s,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await s.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}rl();ai();import{execFile as iee}from"node:child_process";import{dirname as aee,isAbsolute as lee,resolve as cee}from"node:path";import{promisify as dee}from"node:util";var yF=dee(iee),uee=3e3,pee=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function mee(){let t=(await yF("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=lee(t)?t:cee(process.cwd(),t);return aee(n)}async function bF(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await mee()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),uee)});try{let o=rn({execFile:yF,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),s=await Promise.race([o,r]);if(s==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let i=s;return i.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:i.candidates.filter(c=>pee.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}wd();rl();import{promises as fee}from"node:fs";import{dirname as gee,join as vF}from"node:path";import{randomBytes as hee}from"node:crypto";var yee=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
2044
|
-
`),wF=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,ev=30,bee=1024,wee=8e3,See="haiku";async function vee(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=xee(n,bee),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??wee),i=t.signal?Ree([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Ws({token:t.token,model:t.model??See,system:yee,user:r,maxTokens:32,signal:i})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=kee(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=gee(t.worktreePath);return await Eee(l,c)}function kee(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(wF.test(t)&&t.length<=ev)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>ev)break;o=i}return wF.test(o)?o:null}async function Eee(e,t){if(!await Tee(vF(t,e)))return e;let n=hee(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,ev-5)}-${n}`}async function Tee(e){try{return await fee.access(e),!0}catch{return!1}}function xee(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Ree(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function kF(e){let t,n,r=vF(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await vee(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${Qd(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return SF(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return SF(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function SF(e,t){e&&e.setCwd(t),Aee(t)}function Aee(e){try{process.chdir(e)}catch{}}Ze();Ut();K();import{spawn as TF}from"child_process";import{existsSync as xF,mkdirSync as Mee,readFileSync as RF,unlinkSync as EF,writeFileSync as Oee}from"fs";import{get as $ee}from"https";import{join as AF}from"path";import{readFileSync as Cee}from"fs";import{dirname as _ee,join as Iee}from"path";import{fileURLToPath as Pee}from"url";function Cr(){try{return"5.20.
|
|
2044
|
+
`),wF=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,ev=30,bee=1024,wee=8e3,See="haiku";async function vee(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=xee(n,bee),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??wee),i=t.signal?Ree([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Ws({token:t.token,model:t.model??See,system:yee,user:r,maxTokens:32,signal:i})}catch(u){let p=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=kee(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=gee(t.worktreePath);return await Eee(l,c)}function kee(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(wF.test(t)&&t.length<=ev)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>ev)break;o=i}return wF.test(o)?o:null}async function Eee(e,t){if(!await Tee(vF(t,e)))return e;let n=hee(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,ev-5)}-${n}`}async function Tee(e){try{return await fee.access(e),!0}catch{return!1}}function xee(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function Ree(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function kF(e){let t,n,r=vF(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await vee(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${Qd(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return SF(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return SF(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function SF(e,t){e&&e.setCwd(t),Aee(t)}function Aee(e){try{process.chdir(e)}catch{}}Ze();Ut();K();import{spawn as TF}from"child_process";import{existsSync as xF,mkdirSync as Mee,readFileSync as RF,unlinkSync as EF,writeFileSync as Oee}from"fs";import{get as $ee}from"https";import{join as AF}from"path";import{readFileSync as Cee}from"fs";import{dirname as _ee,join as Iee}from"path";import{fileURLToPath as Pee}from"url";function Cr(){try{return"5.20.1"}catch{}try{let e=_ee(Pee(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Cee(Iee(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}V();var Dee=64*1024,Fee=1440*60*1e3,Lee=3600*1e3,Nee="update-check.json",Bee="pending-update.json";function CF(){return AF(Xc(),Nee)}function _c(){return AF(Xc(),Bee)}function _F(){let e=Xc();xF(e)||Mee(e,{recursive:!0})}function Uee(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),s=n(t).split(".").map(Number),i=Math.max(o.length,s.length);for(let a=0;a<i;a++){let l=o[a]??0,c=s[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function jee(){try{let e=RF(CF(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Hee(){try{_F();let e=`
|
|
2045
2045
|
const https = require('https');
|
|
2046
2046
|
const fs = require('fs');
|
|
2047
2047
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|