agent-afk 5.15.1 → 5.15.3
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 -3
- package/dist/index.mjs +179 -179
- package/dist/telegram.mjs +205 -204
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -855,7 +855,8 @@ Don't refuse the flow; just clarify where the wizard runs.
|
|
|
855
855
|
|
|
856
856
|
Be terse and operational. The user is doing one-time setup; they want it done, not narrated. Confirm each step in one line, don't over-explain. Use \`\u2713\` for success, \`\u2717\` for failure, and code fences for any command they should run.
|
|
857
857
|
`}}});function an(e,t){return t?!0:(e.audience??"public")==="public"}function ht(e){ru.set(e.name,e)}function Ge(e){let t=ru.get(e);if(t)return t;let n=Array.from(ru.keys()).sort(),r=n.length>0?`
|
|
858
|
-
Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${e}${r}`)}function En(){return Array.from(ru.keys()).sort()}function Rg(e){return En().filter(t=>an(Ge(t),e))}var ru,Tt=P(()=>{"use strict";ru=new Map});function SU(e){if(typeof e=="string")return e;if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch{return String(e)}}var ou,Ok=P(()=>{"use strict";Ne();ou=class{nodes=new Map;traceWriter;constructor(t){this.traceWriter=t}register(t,n){this.nodes.has(t)||this.nodes.set(t,{controller:n,children:new Set,listeners:new Set,cascading:!1})}has(t){return this.nodes.has(t)}getController(t){return this.nodes.get(t)?.controller}childrenOf(t){let n=this.nodes.get(t);return n?Array.from(n.children):[]}linkChild(t,n){let r=this.nodes.get(t),o=this.nodes.get(n);if(!r)throw new Error(`AbortGraph: parent ${t} not registered`);if(!o)throw new Error(`AbortGraph: child ${n} not registered`);if(o.parentId=t,r.children.add(n),r.controller.signal.aborted){o.controller.signal.aborted||(o.cascading=!0,o.controller.abort(r.controller.signal.reason));return}r.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);!s||s.parentId!==t||s.controller.signal.aborted||(s.cascading=!0,s.controller.abort(r.controller.signal.reason))},{once:!0}),o.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);if(!s||s.parentId!==t||s.cascading)return;let i=this.nodes.get(t);if(!i)return;let a={parentId:t,childId:n,reason:s.controller.signal.reason};for(let l of i.listeners)try{l(a)}catch{}},{once:!0})}onChildAborted(t,n){let r=this.nodes.get(t);if(!r)throw new Error(`AbortGraph: ${t} not registered`);return r.listeners.add(n),()=>{r.listeners.delete(n)}}abort(t,n,r="user_signal"){let o=this.nodes.get(t);if(!o||o.controller.signal.aborted)return;let s=[],i=[...o.children],a=new Set;for(;i.length;){let l=i.shift();if(a.has(l))continue;a.add(l);let c=this.nodes.get(l);if(c){c.cascading=!0,s.push(l);for(let u of c.children)i.push(u)}}fk(this.traceWriter,{origin:r,cascadedTo:s,...n!==void 0?{reason:SU(n)}:{}}),o.controller.abort(n);for(let l of s){let c=this.nodes.get(l);c&&!c.controller.signal.aborted&&c.controller.abort(n)}}dispose(t){let n=this.nodes.get(t);if(n){n.parentId&&this.nodes.get(n.parentId)?.children.delete(t);for(let r of n.children){let o=this.nodes.get(r);o&&(o.parentId=void 0)}this.nodes.delete(t)}}}});async function iu(e,t,n={}){if(!Number.isFinite(t)||t<=0)return e;let r,o=new Promise((s,i)=>{r=setTimeout(()=>{let a=n.label?` (${n.label})`:"",l=new Gt(`Operation timed out after ${t}ms${a}`,t);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),i(l)},t)});try{return await Promise.race([e,o])}finally{r!==void 0&&clearTimeout(r)}}var su,Cg,au=P(()=>{"use strict";vt();su=0,Cg=5e3});function vU(e,t,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new Tn(n,t)))},t);i.unref(),Promise.resolve(e).then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}function kU(e){return e.continue===!1||e.decision==="block"}function Ag(e,t){if(e?.aborted){let n=e.reason,r=`aborted during ${t}${n?`: ${String(n)}`:""}`;throw new ut(r)}}function $k(){return new _g}var Co,Tn,_g,Da=P(()=>{"use strict";vt();Co=3e4;Tn=class extends Error{constructor(n,r){super(`hook handler timed out after ${r}ms during ${n}`);this.hookEvent=n;this.timeoutMs=r;this.name="HookHandlerTimeoutError"}hookEvent;timeoutMs;code="HOOK_HANDLER_TIMEOUT"},_g=class{handlers=new Map;register(t,n,r={}){let o=this.handlers.get(t);o||(o=[],this.handlers.set(t,o));let s={handler:n,options:r};return o.push(s),()=>{let i=this.handlers.get(t);if(!i)return;let a=i.indexOf(s);a>=0&&i.splice(a,1)}}count(t){return this.handlers.get(t)?.length??0}async dispatch(t,n,r=Co){Ag(n,t.event);let o=this.handlers.get(t.event);if(!o||o.length===0)return{};let s=o.slice(),i={};for(let a of s){Ag(n,t.event);let l;try{let
|
|
858
|
+
Available skills: ${n.join(", ")}`:"";throw new Error(`Skill not found: ${e}${r}`)}function En(){return Array.from(ru.keys()).sort()}function Rg(e){return En().filter(t=>an(Ge(t),e))}var ru,Tt=P(()=>{"use strict";ru=new Map});function SU(e){if(typeof e=="string")return e;if(e instanceof Error)return e.message;try{return JSON.stringify(e)}catch{return String(e)}}var ou,Ok=P(()=>{"use strict";Ne();ou=class{nodes=new Map;traceWriter;constructor(t){this.traceWriter=t}register(t,n){this.nodes.has(t)||this.nodes.set(t,{controller:n,children:new Set,listeners:new Set,cascading:!1})}has(t){return this.nodes.has(t)}getController(t){return this.nodes.get(t)?.controller}childrenOf(t){let n=this.nodes.get(t);return n?Array.from(n.children):[]}linkChild(t,n){let r=this.nodes.get(t),o=this.nodes.get(n);if(!r)throw new Error(`AbortGraph: parent ${t} not registered`);if(!o)throw new Error(`AbortGraph: child ${n} not registered`);if(o.parentId=t,r.children.add(n),r.controller.signal.aborted){o.controller.signal.aborted||(o.cascading=!0,o.controller.abort(r.controller.signal.reason));return}r.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);!s||s.parentId!==t||s.controller.signal.aborted||(s.cascading=!0,s.controller.abort(r.controller.signal.reason))},{once:!0}),o.controller.signal.addEventListener("abort",()=>{let s=this.nodes.get(n);if(!s||s.parentId!==t||s.cascading)return;let i=this.nodes.get(t);if(!i)return;let a={parentId:t,childId:n,reason:s.controller.signal.reason};for(let l of i.listeners)try{l(a)}catch{}},{once:!0})}onChildAborted(t,n){let r=this.nodes.get(t);if(!r)throw new Error(`AbortGraph: ${t} not registered`);return r.listeners.add(n),()=>{r.listeners.delete(n)}}abort(t,n,r="user_signal"){let o=this.nodes.get(t);if(!o||o.controller.signal.aborted)return;let s=[],i=[...o.children],a=new Set;for(;i.length;){let l=i.shift();if(a.has(l))continue;a.add(l);let c=this.nodes.get(l);if(c){c.cascading=!0,s.push(l);for(let u of c.children)i.push(u)}}fk(this.traceWriter,{origin:r,cascadedTo:s,...n!==void 0?{reason:SU(n)}:{}}),o.controller.abort(n);for(let l of s){let c=this.nodes.get(l);c&&!c.controller.signal.aborted&&c.controller.abort(n)}}dispose(t){let n=this.nodes.get(t);if(n){n.parentId&&this.nodes.get(n.parentId)?.children.delete(t);for(let r of n.children){let o=this.nodes.get(r);o&&(o.parentId=void 0)}this.nodes.delete(t)}}}});async function iu(e,t,n={}){if(!Number.isFinite(t)||t<=0)return e;let r,o=new Promise((s,i)=>{r=setTimeout(()=>{let a=n.label?` (${n.label})`:"",l=new Gt(`Operation timed out after ${t}ms${a}`,t);n.controller&&!n.controller.signal.aborted&&n.controller.abort(l),i(l)},t)});try{return await Promise.race([e,o])}finally{r!==void 0&&clearTimeout(r)}}var su,Cg,au=P(()=>{"use strict";vt();su=0,Cg=5e3});function vU(e,t,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new Tn(n,t)))},t);i.unref(),Promise.resolve(e).then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}function kU(e){return e.continue===!1||e.decision==="block"}function Ag(e,t){if(e?.aborted){let n=e.reason,r=`aborted during ${t}${n?`: ${String(n)}`:""}`;throw new ut(r)}}function $k(){return new _g}var Co,Tn,_g,Da=P(()=>{"use strict";vt();Co=3e4;Tn=class extends Error{constructor(n,r){super(`hook handler timed out after ${r}ms during ${n}`);this.hookEvent=n;this.timeoutMs=r;this.name="HookHandlerTimeoutError"}hookEvent;timeoutMs;code="HOOK_HANDLER_TIMEOUT"},_g=class{handlers=new Map;register(t,n,r={}){let o=this.handlers.get(t);o||(o=[],this.handlers.set(t,o));let s={handler:n,options:r};return o.push(s),()=>{let i=this.handlers.get(t);if(!i)return;let a=i.indexOf(s);a>=0&&i.splice(a,1)}}count(t){return this.handlers.get(t)?.length??0}async dispatch(t,n,r=Co){Ag(n,t.event);let o=this.handlers.get(t.event);if(!o||o.length===0)return{};let s=o.slice(),i={};for(let a of s){Ag(n,t.event);let l;try{let u=a.handler(t,n);l=!a.options.longRunning&&r>0&&Number.isFinite(r)?await vU(u,r,t.event):await u}catch(u){throw u instanceof Tn?u:new me(`hook handler threw during ${t.event}`,t.event,u instanceof Error?u.message:String(u),{cause:u})}if(Ag(n,t.event),kU(l))throw new me(`hook handler blocked ${t.event}${l.reason?`: ${l.reason}`:""}`,t.event,l.reason);let c=[i.injectContext,l.injectContext].filter(u=>typeof u=="string"&&u.length>0).join(`
|
|
859
|
+
`);i={...i,...l,...c.length>0?{injectContext:c}:{}}}return i}}});async function xn(e,t,n,r){if(!e)return;if(r.kind==="blocked"){await on(e,{hookEvent:t,decision:"block",...r.err.reason!==void 0?{reason:r.err.reason}:{},...t==="PreToolUse"&&n.toolName!==void 0?{blockedTool:n.toolName}:{}});return}let o=r.decision;await on(e,{hookEvent:t,decision:o.decision,...o.reason!==void 0?{reason:o.reason}:{},...o.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(o.injectContext,"utf8")}:{}})}async function Dk(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await xn(n.traceWriter,"SubagentStart",{},{kind:"decision",decision:r})}catch(r){throw r instanceof me&&await xn(n.traceWriter,"SubagentStart",{},{kind:"blocked",err:r}),r}}function EU(e,t,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new Tn(n,t)))},t);i.unref(),e.then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}async function Fk(e,t,n={}){if(!e)return{};try{let r=await EU(e.dispatch(t,n.signal,Co),Co,"SubagentStop");return await xn(n.traceWriter,"SubagentStop",{},{kind:"decision",decision:r}),r}catch(r){return r instanceof Tn?(console.warn(`[afk] SubagentStop hook timed out after ${Co}ms (subagentId=${t.subagentId}): ${r.message}`),n.onError?.(r),{}):(r instanceof me&&await xn(n.traceWriter,"SubagentStop",{},{kind:"blocked",err:r}),r instanceof me||r instanceof ut?(W(`SubagentStop hook swallowed ${r.name}: ${r.message}`),n.onError?.(r),{}):(W(`SubagentStop hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r))),{}))}}async function Pg(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await xn(n.traceWriter,"PreToolUse",{toolName:t.toolName},{kind:"decision",decision:r})}catch(r){throw r instanceof me&&await xn(n.traceWriter,"PreToolUse",{toolName:t.toolName},{kind:"blocked",err:r}),r}}async function Lk(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await xn(n.traceWriter,"PostToolUse",{toolName:t.toolName},{kind:"decision",decision:r})}catch(r){if(r instanceof me&&await xn(n.traceWriter,"PostToolUse",{toolName:t.toolName},{kind:"blocked",err:r}),r instanceof me||r instanceof ut){W(`PostToolUse hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}W(`PostToolUse hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}async function Nk(e,t,n={}){if(e)try{let r=await e.dispatch(t,n.signal);await xn(n.traceWriter,"PostToolUseFailure",{toolName:t.toolName},{kind:"decision",decision:r})}catch(r){if(r instanceof me&&await xn(n.traceWriter,"PostToolUseFailure",{toolName:t.toolName},{kind:"blocked",err:r}),r instanceof me||r instanceof ut){W(`PostToolUseFailure hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}W(`PostToolUseFailure hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var lu=P(()=>{"use strict";Pe();vt();Da();Ne()});import{mkdir as TU,writeFile as xU}from"fs/promises";import{dirname as RU,join as CU}from"path";function AU(){return CU(Mt(),"routing-decisions.jsonl")}function _U(e){let t={surface:"afk"};for(let[n,r]of Object.entries(e))r!==void 0&&(t[n]=r);return t}async function We(e){if(!(v.VITEST||v.NODE_ENV==="test"))try{let t=AU();await TU(RU(t),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r=JSON.stringify({ts:n,..._U(e)})+`
|
|
859
860
|
`;await xU(t,r,{flag:"a"})}catch{}}var Qn=P(()=>{"use strict";J();q()});import{AsyncLocalStorage as PU}from"node:async_hooks";function js(e,t){return Bk.run(e,t)}function Jt(){return Bk.getStore()}var Bk,er=P(()=>{"use strict";Bk=new PU});function Uk(){return $k()}function cu(e,t){return e??t}var uu=P(()=>{"use strict";Da()});function Ig(e,t){return t?.allowedTools?t.allowedTools.includes(e)?{allowed:!0}:{allowed:!1,reason:`Tool "${e}" is not in the configured allowlist`}:{allowed:!0}}function du(e,t){return jk(e,t)}function pu(e,t){return jk(e,t)}function jk(e,t){if(!e?.allowedTools||t.length===0)return e;let n=new Set(e.allowedTools),r=!1;for(let o of t)n.has(o)||(n.add(o),r=!0);return r?{...e,allowedTools:[...n]}:e}var mu=P(()=>{"use strict"});function mj(e){return e.replace(/'[^']*'/g," ").replace(/"(?:[^"\\]|\\.)*"/g,t=>/\$\(|`/.test(t)?t:" ")}function gu(e){if(typeof e!="string"||e.trim().length===0)return{mutating:!1};let t=e.replace(LU," ");for(let s of dj)if(s.re.test(t))return{mutating:!0,reason:s.reason};let n=e.match(nj)?.[1];if(n&&rj.test(n))return{mutating:!0,reason:"interpreter one-liner file write (`-c`/`-e`)"};let r=mj(e);for(let s of pj)if(s.re.test(r))return{mutating:!0,reason:s.reason};let o=r.replace(cj," ").replace(lj," ").replace(/&(>>?)/g,"$1");return uj.test(o)?{mutating:!0,reason:"output redirection to a file (`>`/`>>`)"}:{mutating:!1}}var IU,MU,OU,$U,DU,FU,LU,NU,BU,UU,jU,HU,WU,KU,GU,qU,zU,fu,JU,VU,YU,XU,ZU,QU,ej,tj,nj,rj,oj,sj,ij,aj,lj,cj,uj,dj,pj,Mg=P(()=>{"use strict";IU=/\bgit\b[^|;&]*\s(commit|push|pull|merge|rebase|reset|checkout|switch|restore|cherry-pick|revert|am|apply|clean|add|rm|mv|init)\b/i,MU=/\bgit\b[^|;&]*\s+tag\s+-/i,OU=/\bgit\b[^|;&]*\s+branch\s+-[dDmM]\b/i,$U=/\bgit\b[^|;&]*\s+remote\s+(add|remove|rm|set-url|rename)\b/i,DU=/\bgit\b[^|;&]*\s+worktree\s+(remove|prune|move|lock|unlock)\b/i,FU=/\bgit\b[^|;&]*\s+stash\b(?!\s+(list|show)\b)/i,LU=/\bstash@\{[^}]*\}/gi,NU=/\bgit\s+config\b[^|;&]*\s(--add|--unset|--unset-all|--replace-all|--rename-section|--remove-section|--edit|-e)\b/i,BU=/\bgit\s+config\s+(?:--(?:global|system|local|worktree)\s+|(?:--file|-f)\s+\S+\s+)*[\w][\w.-]*\s+\S/i,UU=/\bgh\s+\w[\w-]*\s+(create|merge|close|edit|delete|comment|review|reopen|sync|fork|clone|ready)\b/i,jU=/\bgh\s+api\b.*(-X|--method)\s+(POST|PUT|PATCH|DELETE)\b/i,HU=/\bgh\s+api\b.*(\s-f\b|\s-F\b|--field\b)/i,WU=/\bgh\s+(secret|variable|workflow|release|run|cache|ssh-key|gpg-key)\s+(set|run|rerun|cancel|upload|delete|enable|disable)\b/i,KU=/\|\s*(sh|bash|zsh|dash)\b/i,GU=/\b(rm|rmdir|unlink|mv|cp|mkdir|touch|dd|truncate|tee|sponge|ln|chmod|chown|chgrp|shred|rsync)\b/i,qU=/\bfind\b[^|;&]*\s-delete\b/i,zU=/\bfind\b[^|;&]*\s-exec\s+['"]?\s*(rm|rmdir|unlink|mv|cp|dd|truncate|shred|tee|chmod|chown|chgrp|install|patch)\b/i,fu=String.raw`(?:^|[\n;|&(]|\$\()\s*`,JU=new RegExp(fu+String.raw`patch\b`,"i"),VU=new RegExp(fu+String.raw`install\b`,"i"),YU=new RegExp(fu+String.raw`(?:source\b|\.\s+\S)`,"i"),XU=/\btar\s+-?[a-zA-Z]*[cxruA][a-zA-Z]*\b/i,ZU=new RegExp(fu+String.raw`unzip\b`,"i"),QU=/\bcpio\b[^|;&]*\s-[a-zA-Z]*i\b/i,ej=/\bsed\b[^|;&]*\s-[a-zA-Z]*i\b/i,tj=/\bperl\b[^|;&]*\s-[a-zA-Z]*i\b/i,nj=/\b(?:python3?|nodejs|node|bun|ruby|perl|php)\b[^|;&]*?\s-(?:c|e)\b\s*("(?:[^"\\]|\\.)*"|'[^']*'|`[^`]*`)/i,rj=/open\s*\([^)]*,\s*['"][wax]|writeFileSync|writeFile\b|appendFileSync|appendFile\b|createWriteStream|File\.(?:write|delete)\b|IO\.write\b|FileUtils\.|\bBun\.write\b|os\.remove\b|shutil\.\w|\.write_text\b|\.write_bytes\b/i,oj=/\b(npm|pnpm|yarn|pip|pip3|brew|cargo|go|apt|apt-get|gem|poetry|bundle|composer)\s+(install|add|remove|uninstall|i|ci|up|update|upgrade|dlx|get|require)\b/i,sj=/\b(curl|wget)\b[^|;&]*\s(-o\b|-O\b|--output\b)/i,ij=/\bcurl\b[^|;&]*\s-X\s+(POST|PUT|PATCH|DELETE)\b/i,aj=/\bcurl\b[^|;&]*\s(-d\b|--data\b|-F\b|--form\b)/i,lj=/(\d*&?>>?\s*\/dev\/null|\d*>&\d+|&>\s*\/dev\/null|&>>\s*\/dev\/null)/gi,cj=/\$\(\(.*?\)\)/g,uj=/(?<![=<>-])>>?(?!&)/,dj=[{re:IU,reason:"git repository mutation"},{re:MU,reason:"git tag create/delete"},{re:OU,reason:"git branch delete/rename"},{re:$U,reason:"git remote mutation"},{re:FU,reason:"git stash mutation (only `stash list`/`stash show` allowed)"},{re:NU,reason:"git config write flag (only reads allowed)"},{re:BU,reason:"git config set (`<key> <value>`; only reads allowed)"},{re:UU,reason:"gh write operation"},{re:jU,reason:"gh api write method (POST/PUT/PATCH/DELETE)"},{re:HU,reason:"gh api field payload (-f/-F/--field)"},{re:WU,reason:"gh extended write operation (secret/variable/workflow/run/cache)"},{re:DU,reason:"git worktree mutation (remove/prune/move)"},{re:ej,reason:"sed in-place edit (-i)"},{re:tj,reason:"perl in-place edit (-i)"},{re:oj,reason:"package install/modify"},{re:sj,reason:"curl/wget output-to-file"},{re:ij,reason:"curl write method (POST/PUT/PATCH/DELETE)"},{re:aj,reason:"curl data/form payload"},{re:zU,reason:"find -exec with mutating verb"}],pj=[{re:KU,reason:"pipe-to-shell (RCE via piped interpreter)"},{re:GU,reason:"filesystem mutation"},{re:qU,reason:"find -delete (file removal)"},{re:JU,reason:"patch (applies a diff to files)"},{re:VU,reason:"install (writes files)"},{re:YU,reason:"source/dot-source executes a script"},{re:XU,reason:"tar create/extract/append/update (writes files/archive)"},{re:ZU,reason:"unzip (writes files)"},{re:QU,reason:"cpio extract (-i mode writes files)"}]});var fj,gj,hj,yj,bj,wj,Sj,vj,kj,Ao,_o,Po,Ej,Tj,xj,Rj,Cj,Aj,_j,Pj,Ij,Mj,Oj,$j,Dj,tr,Rn,jle,nr=P(()=>{"use strict";fj={name:"bash",category:"shell",concurrencySafe:!1,description:"Execute a shell command and return its stdout and stderr. Use for running programs, installing packages, git operations, and any task that requires a shell. Commands run in the user's default shell. Long-running commands should use timeout_ms. Output is capped at ~100KB; excess is truncated with a notice.",input_schema:{type:"object",properties:{command:{type:"string",description:"The shell command to execute."},timeout_ms:{type:"number",description:"Optional timeout in milliseconds (default 120000, max 600000). The command is killed if it exceeds this duration."}},required:["command"]}},gj={name:"read_file",category:"read",concurrencySafe:!0,description:"Read a file from the filesystem. Returns the file content with line numbers. Use offset and limit to read specific sections of large files. When the read returns a partial view, the response ends with a `... (showing lines X-Y of Z [\u2014 pass offset=N to continue])` annotation indicating the full file size and how to continue. Binary files are detected and rejected. Missing files return an error.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-based). Defaults to 1."},limit:{type:"number",description:"Maximum number of lines to read. Defaults to 2000."}},required:["file_path"]}},hj={name:"write_file",category:"write",concurrencySafe:!1,description:"Write content to a file, creating it if it does not exist or overwriting if it does. Parent directories are created automatically. Prefer edit_file for modifying existing files \u2014 use write_file only for new files or complete rewrites.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to write."},content:{type:"string",description:"The full content to write to the file."}},required:["file_path","content"]}},yj={name:"edit_file",category:"write",concurrencySafe:!1,description:"Perform an exact string replacement in a file. Finds old_string and replaces it with new_string. The edit fails if old_string is not found or matches multiple locations (unless replace_all is true). Always use read_file first to verify the exact content before editing.",input_schema:{type:"object",properties:{file_path:{type:"string",description:"Absolute path to the file to edit."},old_string:{type:"string",description:"The exact string to find and replace. Must match file content exactly."},new_string:{type:"string",description:"The replacement string."},replace_all:{type:"boolean",description:"If true, replace all occurrences. If false (default), fail when multiple matches exist."}},required:["file_path","old_string","new_string"]}},bj={name:"glob",category:"read",concurrencySafe:!0,description:'Find files matching a glob pattern. Returns matching file paths, capped at 500 results. Use for discovering files before reading them. Patterns follow standard glob syntax (e.g., "src/**/*.ts", "*.json").',input_schema:{type:"object",properties:{pattern:{type:"string",description:'Glob pattern to match (e.g., "src/**/*.ts").'},path:{type:"string",description:"Base directory to search from. Defaults to the current working directory."}},required:["pattern"]}},wj={name:"grep",category:"read",concurrencySafe:!0,description:"Search file contents for lines matching a pattern. Returns matches in file:line:content format. Runs `grep -rn` in basic-regex (BRE) mode by default, where `|` is a LITERAL pipe \u2014 not alternation; set extended: true for extended-regex (ERE) alternation. A no-match result on a pattern containing `|` is often a false negative \u2014 re-read the returned hint. Output is capped to prevent overflow. Use for finding symbols, strings, or patterns across the codebase.",input_schema:{type:"object",properties:{pattern:{type:"string",description:"Search pattern. Basic regex (BRE) by default: `|` `+` `?` `(` `)` `{` `}` are LITERAL characters. Set extended: true for extended regex (ERE) where `|` means alternation."},path:{type:"string",description:"Directory or file to search. Defaults to current working directory."},include:{type:"string",description:'File glob to restrict search (e.g., "*.ts"). Passed as --include to grep.'},extended:{type:"boolean",description:"Use extended regex (ERE, `grep -E`) so `|` is alternation and `+ ? ( ) { }` are metacharacters. Default false (BRE \u2014 those characters match literally)."}},required:["pattern"]}},Sj={name:"list_directory",category:"read",concurrencySafe:!0,description:"List the contents of a directory. Returns file and subdirectory names with type annotations (directories end with /). Use for exploring project structure.",input_schema:{type:"object",properties:{path:{type:"string",description:"Absolute path to the directory to list."}},required:["path"]}},vj={name:"send_telegram",category:"web",concurrencySafe:!1,riskClass:"caution",description:"Send a Telegram message to the operator. Use to surface terminal-state notifications, blocking questions, or important status updates when the user is away from keyboard (AFK). The message is delivered through the same Telegram bot the operator uses to drive this session. By default the message goes to your primary chat (the first private chat in `AFK_TELEGRAM_ALLOWED_CHAT_IDS`, or `AFK_TELEGRAM_PRIMARY_CHAT_ID` if set); set `telegram.notify` in afk.config.json to broadcast to all allowed chats or target a custom set.\n\nPlain text only \u2014 Telegram's 4096-character limit per message is enforced. Returns an error if Telegram is not configured (missing `TELEGRAM_BOT_TOKEN` or empty allowlist) so the tool is safe to attempt unconditionally.\n\nUse sparingly: this is a real push notification to a human. Reserve for terminal states (Done/Blocked/Asking) and material progress, not running commentary. When running inside the Telegram bot, prefer replying normally \u2014 your response already reaches the operator through the bot. Use this tool only from CLI or daemon sessions.",input_schema:{type:"object",properties:{message:{type:"string",description:"Plain-text message body to send to the operator. Max 4096 characters (Telegram API limit). Must be non-empty."}},required:["message"]}},kj={name:"web_scrape",category:"web",concurrencySafe:!0,description:'Scrape a web page or run a web search and return text content suitable for reasoning over. Three modes:\n\n- `markdown` (default): fetches the URL and extracts the main content as clean markdown (Readability + Turndown). Handles JS-rendered pages: if the plain fetch yields thin content, it escalates to a headless-browser render and re-extracts. Use this for articles, docs, blog posts, and most "I want to read this page" cases. No API key required (the render fallback needs the Playwright chromium binary \u2014 `pnpm exec playwright install chromium`).\n- `raw`: GETs the URL directly with no transformation. Use for JSON APIs, robots.txt, RSS, plain-text endpoints, or when you need the literal bytes. No API key required.\n- `search`: runs a web search and returns ranked markdown results. Use when you need to FIND a URL, not read one. Provide `query` instead of `url`. Requires `EXA_API_KEY` (free tier at https://exa.ai); the handler returns a clear error if it is unset.\n\nOutputs are capped at `max_bytes` UTF-8 bytes (default 1MB, ceiling 10MB) and the request is aborted after `timeout_ms` (default 30000, ceiling 120000).',input_schema:{type:"object",properties:{mode:{type:"string",enum:["markdown","raw","search"],description:'Fetch mode. Defaults to "markdown".'},url:{type:"string",description:"Absolute http(s) URL. Required for markdown and raw modes. Ignored in search mode."},query:{type:"string",description:"Search query string. Required for search mode. Ignored otherwise."},timeout_ms:{type:"number",description:"Request timeout in milliseconds (default 30000, clamped to 120000)."},max_bytes:{type:"number",description:"Maximum UTF-8 bytes returned. Content beyond this is truncated with a marker. Default 1000000, clamped to 10000000."}},required:[]}},Ao={name:"agent",category:"subagent",concurrencySafe:!0,description:`Dispatch an independent subagent with its own context window and tool access. Use for tasks that protect the main session's context: codebase exploration, multi-file inspection, repo search, verification, debugging, failing-test investigation, PR review, parallel hypothesis testing, independent re-derivation of a claim, audit work, stale-path detection, feature-wiring checks, and any research-shaped investigation.
|
|
860
861
|
|
|
861
862
|
Parallelize: dispatch multiple \`agent\` calls in a single tool-use turn to run independent investigations concurrently.
|
|
@@ -1078,7 +1079,7 @@ ${o}`;return s.includes("already checked out")||s.includes("is already used by w
|
|
|
1078
1079
|
Effective base URL: ${r}`)),r}return t}function VH(){if(ch!==void 0)return ch;if(!YE){let o=[za(process.cwd(),".env"),St(),Fv()];for(let s of o)uh(s)&&zH({path:s,override:!1});YE=!0}let e={},t=v.AFK_MODEL??v.CLAUDE_MODEL;if(t){let o=t.toLowerCase();e.model=wg(o)?o:t}if(se(t)==="anthropic-direct"){let o=dh();o!==void 0&&(e.apiKey=o)}let r=v.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=v.AFK_LOCAL_API_KEY||"local"),v.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(v.AFK_MAX_TOKENS,10)),v.AFK_TEMPERATURE&&(e.temperature=parseFloat(v.AFK_TEMPERATURE)),v.AFK_SYSTEM_PROMPT&&(e.systemPrompt=v.AFK_SYSTEM_PROMPT),v.AFK_AUTO_ROUTING){let o=v.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return v.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=JH(v.AFK_OPENAI_BASE_URL)),ch=e,e}function ph(){if(Vs!==void 0)return Vs;let e=[za(process.cwd(),"afk.config.json"),Kt(),Dc()];for(let t of e)if(uh(t))try{let n=ZE(t,"utf-8"),r=JSON.parse(n),o={},s=wk(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=wg(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(u=>typeof u=="number"&&Number.isFinite(u));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!==za(process.cwd(),"afk.config.json")){let i=Ga(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=sh(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(ih(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 Vs={config:o,sourcePath:t,modelsPartial:s},Vs}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return Vs={config:{},sourcePath:void 0,modelsPartial:{}},Vs}function YH(){if(Ys!==void 0)return Ys.value;let e=[za(process.cwd(),"AFK.md"),za(Le(),"AFK.md")];for(let t of e)if(uh(t))try{let n=ZE(t,"utf-8").trim();if(n.length>0)return Ys={value:{content:n,path:t}},Ys.value}catch{}return Ys={value:null},Ys.value}function $u(){return ph().config.telegram??{}}function Xs(){return ph().config.permissionMode??QE}function It(e){let t=VH(),{config:n,sourcePath:r,modelsPartial:o}=ph(),s={...qa,...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=YH();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??qa.model,maxTokens:s.maxTokens??qa.maxTokens,temperature:s.temperature??qa.temperature,updatePolicy:s.updatePolicy??qa.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??QE,...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??hg(o);if(Xc(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 qa,QE,YE,ch,XE,Vs,Ys,Ft=P(()=>{"use strict";Zn();sn();it();q();zs();Ka();J();ur();qa={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},QE="bypassPermissions",YE=!1;XE=new Set});function XH(e,t){return t!==void 0&&Number.isFinite(t)&&t!==0?t:e.find(r=>r>0)??e[0]}function ZH(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=XH(n,t.primaryChatId);return o!==void 0?[o]:[]}function QH(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 eW(e){if(!e)return;let t=e.trim().toLowerCase();return t==="primary"||t==="broadcast"||t==="custom"?t:void 0}function tW(){let e=$u().notify??{},t=e.mode??eW(v.AFK_TELEGRAM_NOTIFY_MODE),n=e.primaryChatId??QH(v.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...t!==void 0?{mode:t}:{},...n!==void 0?{primaryChatId:n}:{},...e.targets!==void 0?{targets:e.targets}:{}}}function Zs(){let e=ME(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return ZH(e,tW())}var Du=P(()=>{"use strict";OE();Ft();J()});function mh(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(`
|
|
1079
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 eT(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),nW(t)||(t=t.replace(/<\/?[bis]>/g,"")),t}function nW(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 tT=P(()=>{"use strict"});var fh={};xc(fh,{push:()=>Qs,pushIfConfigured:()=>An,pushMarkdown:()=>nT});async function Qs(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??rW}/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 nT(e){let t=eT(e.text),n=mh(t),r={ok:!0,status:200};for(let o of n)if(r=await Qs({...e,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?Qs({...e}):r;return r}async function An(e,t={}){let n=v.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=Zs();if(r.length===0)return null;let o=mh(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 nT(l):await Qs({...l,...t.parseMode!==void 0?{parseMode:t.parseMode}:{}}))}return s}var rW,Nr=P(()=>{"use strict";Du();tT();J();rW="https://api.telegram.org"});function oW(e=Qs){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>rT)return{content:`Invalid input: message exceeds Telegram's ${rT}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=Zs();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 rT,oT,sT=P(()=>{"use strict";J();Nr();Du();rT=4096;oT=oW()});import{JSDOM as sW}from"jsdom";import{Readability as iW}from"@mozilla/readability";import aW from"turndown";function iT(e){return e.replace(/\n{3,}/g,`
|
|
1080
1081
|
|
|
1081
|
-
`).trim()}function lW(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function lT(e,t){let r=new sW(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new iW(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=iT(gh.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=iT(gh.turndown(a));return{title:o,markdown:l,textLength:lW(i),usedFallback:!0}}var aT,gh,cT=P(()=>{"use strict";aT=200,gh=new aW({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});gh.remove(["script","style","noscript","iframe"])});function uW(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 uT(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function dW(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 Fu(e,t,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??uW,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!cW.has(d.status)||u===o)return d;let p=dW(d,i)??uT(u,s,i);W("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=uT(u,s,i);W("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var cW,hh=P(()=>{"use strict";Pe();cW=new Set([429,502,503,504])});import{readFileSync as pW}from"node:fs";import{join as mW}from"path";function fW(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function dT(e,t){return fW(t).test(e)}function yW(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(gW.has(t))return!0;if(hW.has(t))return!1}return!1}function pT(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function bW(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 mT(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ra(t),t}function wW(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function SW(e){try{return pW(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function vW(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=mT(t.defaultProfile)),n}function fT(e){let t=e?.env??v,n=e?.readFileSync??SW,r=e?.surface??t.AGENT_SURFACE,o=yW(t.AFK_BROWSER_HEADLESS,r),s=pT(t.AFK_BROWSER_ALLOWED_DOMAINS),i=pT(t.AFK_BROWSER_BLOCKED_DOMAINS),a=wW(t.AFK_BROWSER_DOM_SNAPSHOTS),l=bW(t.AFK_BROWSER_BACKEND),c=mT(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():mW(rn(),"browser.json"),m=n(p);if(m===void 0)return u;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=vW(u,g);return h.configPath=p,h}function yh(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(dT(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>dT(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var gW,hW,bh=P(()=>{"use strict";J();q();gW=new Set(["daemon","subagent","telegram","afk"]),hW=new Set(["repl","interactive","cli"])});import $o from"node:fs";import Lu from"node:path";import{randomBytes as kW}from"node:crypto";import{chromium as EW}from"playwright";function TW(){try{return"5.15.1"}catch{}try{let e=Lu.resolve(import.meta.dirname,"../../../package.json"),t=$o.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var xW,Nu,gT=P(()=>{"use strict";q();Pe();xW=TW(),Nu=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=EW.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(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}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/${xW}`}}loadStorageState(t){let n=Ca(t);try{if(!$o.existsSync(n))return;let r=JSON.parse($o.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=Ca(t);if(!$o.existsSync(r))return;let o=await n.storageState(),s=Lu.join(Lu.dirname(r),`.${Lu.basename(r)}.${process.pid}.${kW(4).toString("hex")}.tmp`);$o.writeFileSync(s,JSON.stringify(o),{mode:384}),$o.chmodSync(s,384),$o.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 RW}from"crypto";function wh(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of CW)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function hT(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&AW.test(e.label))}function yT(e){return RW("sha256").update(e,"utf8").digest("hex").slice(0,8)}function bT(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var CW,AW,Ja=P(()=>{"use strict";CW=[{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}];AW=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as _W}from"node:crypto";function PW(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function IW(e,t,n){return`el_${_W("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function MW(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function wT(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function vT(e,t){let n=e.role??"",r=e.name??"";ST.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])vT(s,t)}async function OW(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 u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},kT).catch(()=>[])}async function $W(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 u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},kT).catch(()=>[])}function DW(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Bu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=DW(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=OW(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],vT(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await $W(e)).filter(L=>ST.has(L.role??"")));let S=new Map;for(let I of p){let L=wT(I.name),N=S.get(L);(!N||N.bbox.w===0&&I.bbox.w>0)&&S.set(L,I)}let w=b.map(I=>({ax:I,dom:S.get(wT(I.name??""))})),k=r?w:w.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,L)=>{let N=I.dom?.bbox.y??0,F=L.dom?.bbox.y??0;if(N!==F)return N-F;let U=I.dom?.bbox.x??0,H=L.dom?.bbox.x??0;return U-H}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=k.slice(0,n).map((I,L)=>{let N=I.ax.role??"generic",F=I.ax.name??"",U=IW(N,F,L),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},D=I.dom?.type??null,C=null;I.ax.value!==void 0&&I.ax.value!==null&&(C=String(I.ax.value)),I.ax.checked!==void 0&&(C=String(I.ax.checked)),hT({role:N,kind:D})&&(C="[redacted]");let B={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(B.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(B.selected=I.ax.selected),I.ax.expanded!==void 0&&(B.expanded=I.ax.expanded);let M;I.dom?.testId?M=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(M=`#${I.dom.id}`);let j={id:U,role:N,label:PW(F),kind:D,value:C,state:B,bbox:H};return M!==void 0&&(j.selector=M),j}),A="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?A="loading":I==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="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 E=MW(m),O=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:O,url:g,title:h,textSummary:E,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var ST,kT,ET=P(()=>{"use strict";Ja();ST=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kT="a[href], button, input, select, textarea, [role], [tabindex], label"});async function TT(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")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let 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 Sh(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>TT(e,s)))).filter(o=>o!==null)}async function FW(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 vh(e,t,n){switch(t.kind){case"element_id":return LW(e,t,n);case"selector":return NW(e,t);case"semantic":return BW(e,t)}}async function LW(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 Sh(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function NW(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 Sh(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function BW(e,t){return t.role!==void 0?UW(e,t.text,t.role):jW(e,t.text,t)}async function UW(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 Sh(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function jW(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 u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await FW(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await TT(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let k=0;k<S.length;k++)w=w*31+S.charCodeAt(k)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var xT=P(()=>{"use strict"});import{randomBytes as HW}from"crypto";import{mkdir as WW,stat as KW,writeFile as GW}from"fs/promises";import{join as kh}from"path";import{gzip as qW}from"zlib";import{promisify as zW}from"util";function JW(e){return kh(Cs(e),"browser")}function VW(e){return kh(JW(e),"screenshots")}function YW(){return new Date().toISOString().replace(/[:.]/g,"-")}function XW(){return HW(3).toString("hex")}async function Eh(e,t,n){if(t.length>RT)throw new Error(`writeScreenshotSidecar: buffer exceeds ${RT} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=VW(e);await WW(r,{recursive:!0});let o=`${YW()}-${XW()}-${n}.png`,s=kh(r,o);await GW(s,t);let{size:i}=await KW(s);return{path:s,bytes:i}}var Zde,RT,CT=P(()=>{"use strict";q();Ja();Zde=zW(qW);RT=5*1024*1024});var _T={};xc(_T,{PlaywrightProvider:()=>Th});function AT(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 Th,PT=P(()=>{"use strict";gT();ET();xT();bh();Ja();CT();Th=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Nu(t)}async open(t){let n=yh(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 Bu(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 Bu(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 vh(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${AT(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=wh(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 u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=yh(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,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 Bu(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 u=await vh(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${AT(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Eh(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path: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 Eh(n,o,r);return s}catch{return null}}}});var Fo={};xc(Fo,{__resetBrowserRegistryForTests:()=>nK,browserProviderActive:()=>eK,closeBrowserProvider:()=>xh,getBrowserProvider:()=>QW,peekBrowserProvider:()=>tK});function IT(){Promise.resolve(xh()).then(()=>{process.exit(130)})}function MT(){Promise.resolve(xh()).then(()=>{process.exit(143)})}function OT(){_n=null}function ZW(){Uu||(process.on("SIGINT",IT),process.on("SIGTERM",MT),process.on("exit",OT),Uu=!0)}function $T(){Uu&&(process.removeListener("SIGINT",IT),process.removeListener("SIGTERM",MT),process.removeListener("exit",OT),Uu=!1)}async function QW(e){return _n!==null?_n:(Do!==null||(Do=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(PT(),_T)),n=fT(e),r=new t(n);return ZW(),_n=r,Do=null,r})()),Do)}async function xh(){if(_n===null)return;let e=_n;_n=null,Do=null,$T(),await e.shutdown()}function eK(){return _n!==null}function tK(){return _n}function nK(){_n=null,Do=null,$T()}var _n,Do,Uu,Lo=P(()=>{"use strict";bh();_n=null,Do=null,Uu=!1});function DT(e,t){try{return lT(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function aK(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Lo(),Fo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function FT(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??aK,o=null,s=e,i=null,a=null;try{let c=await Fu(n,e,{headers:iK,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(sK.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(oK.test(u)&&!rK.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=DT(d,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<aT)&&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}),u=DT(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);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 rK,oK,sK,iK,LT=P(()=>{"use strict";cT();hh();Pe();rK=/(text\/html|application\/xhtml\+xml)/i,oK=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,sK=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,iK={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function uK(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(lK,{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),cK),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=Mo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}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 NT(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?uK({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 BT(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1082
|
+
`).trim()}function lW(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function lT(e,t){let r=new sW(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new iW(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=iT(gh.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=iT(gh.turndown(a));return{title:o,markdown:l,textLength:lW(i),usedFallback:!0}}var aT,gh,cT=P(()=>{"use strict";aT=200,gh=new aW({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});gh.remove(["script","style","noscript","iframe"])});function uW(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 uT(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function dW(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 Fu(e,t,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??uW,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!cW.has(d.status)||u===o)return d;let p=dW(d,i)??uT(u,s,i);W("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=uT(u,s,i);W("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var cW,hh=P(()=>{"use strict";Pe();cW=new Set([429,502,503,504])});import{readFileSync as pW}from"node:fs";import{join as mW}from"path";function fW(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function dT(e,t){return fW(t).test(e)}function yW(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(gW.has(t))return!0;if(hW.has(t))return!1}return!1}function pT(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function bW(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 mT(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ra(t),t}function wW(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function SW(e){try{return pW(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function vW(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=mT(t.defaultProfile)),n}function fT(e){let t=e?.env??v,n=e?.readFileSync??SW,r=e?.surface??t.AGENT_SURFACE,o=yW(t.AFK_BROWSER_HEADLESS,r),s=pT(t.AFK_BROWSER_ALLOWED_DOMAINS),i=pT(t.AFK_BROWSER_BLOCKED_DOMAINS),a=wW(t.AFK_BROWSER_DOM_SNAPSHOTS),l=bW(t.AFK_BROWSER_BACKEND),c=mT(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():mW(rn(),"browser.json"),m=n(p);if(m===void 0)return u;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=vW(u,g);return h.configPath=p,h}function yh(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(dT(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>dT(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var gW,hW,bh=P(()=>{"use strict";J();q();gW=new Set(["daemon","subagent","telegram","afk"]),hW=new Set(["repl","interactive","cli"])});import $o from"node:fs";import Lu from"node:path";import{randomBytes as kW}from"node:crypto";import{chromium as EW}from"playwright";function TW(){try{return"5.15.3"}catch{}try{let e=Lu.resolve(import.meta.dirname,"../../../package.json"),t=$o.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var xW,Nu,gT=P(()=>{"use strict";q();Pe();xW=TW(),Nu=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=EW.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(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}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/${xW}`}}loadStorageState(t){let n=Ca(t);try{if(!$o.existsSync(n))return;let r=JSON.parse($o.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=Ca(t);if(!$o.existsSync(r))return;let o=await n.storageState(),s=Lu.join(Lu.dirname(r),`.${Lu.basename(r)}.${process.pid}.${kW(4).toString("hex")}.tmp`);$o.writeFileSync(s,JSON.stringify(o),{mode:384}),$o.chmodSync(s,384),$o.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 RW}from"crypto";function wh(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of CW)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function hT(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&AW.test(e.label))}function yT(e){return RW("sha256").update(e,"utf8").digest("hex").slice(0,8)}function bT(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var CW,AW,Ja=P(()=>{"use strict";CW=[{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}];AW=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as _W}from"node:crypto";function PW(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function IW(e,t,n){return`el_${_W("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function MW(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function wT(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function vT(e,t){let n=e.role??"",r=e.name??"";ST.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])vT(s,t)}async function OW(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 u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},kT).catch(()=>[])}async function $W(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 u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},kT).catch(()=>[])}function DW(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Bu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=DW(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=OW(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],vT(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await $W(e)).filter(L=>ST.has(L.role??"")));let S=new Map;for(let I of p){let L=wT(I.name),N=S.get(L);(!N||N.bbox.w===0&&I.bbox.w>0)&&S.set(L,I)}let w=b.map(I=>({ax:I,dom:S.get(wT(I.name??""))})),k=r?w:w.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,L)=>{let N=I.dom?.bbox.y??0,F=L.dom?.bbox.y??0;if(N!==F)return N-F;let U=I.dom?.bbox.x??0,H=L.dom?.bbox.x??0;return U-H}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=k.slice(0,n).map((I,L)=>{let N=I.ax.role??"generic",F=I.ax.name??"",U=IW(N,F,L),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},D=I.dom?.type??null,C=null;I.ax.value!==void 0&&I.ax.value!==null&&(C=String(I.ax.value)),I.ax.checked!==void 0&&(C=String(I.ax.checked)),hT({role:N,kind:D})&&(C="[redacted]");let B={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(B.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(B.selected=I.ax.selected),I.ax.expanded!==void 0&&(B.expanded=I.ax.expanded);let M;I.dom?.testId?M=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(M=`#${I.dom.id}`);let j={id:U,role:N,label:PW(F),kind:D,value:C,state:B,bbox:H};return M!==void 0&&(j.selector=M),j}),A="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?A="loading":I==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="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 E=MW(m),O=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:O,url:g,title:h,textSummary:E,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var ST,kT,ET=P(()=>{"use strict";Ja();ST=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kT="a[href], button, input, select, textarea, [role], [tabindex], label"});async function TT(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")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let 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 Sh(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>TT(e,s)))).filter(o=>o!==null)}async function FW(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 vh(e,t,n){switch(t.kind){case"element_id":return LW(e,t,n);case"selector":return NW(e,t);case"semantic":return BW(e,t)}}async function LW(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 Sh(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function NW(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 Sh(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function BW(e,t){return t.role!==void 0?UW(e,t.text,t.role):jW(e,t.text,t)}async function UW(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 Sh(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function jW(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 u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await FW(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await TT(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let k=0;k<S.length;k++)w=w*31+S.charCodeAt(k)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var xT=P(()=>{"use strict"});import{randomBytes as HW}from"crypto";import{mkdir as WW,stat as KW,writeFile as GW}from"fs/promises";import{join as kh}from"path";import{gzip as qW}from"zlib";import{promisify as zW}from"util";function JW(e){return kh(Cs(e),"browser")}function VW(e){return kh(JW(e),"screenshots")}function YW(){return new Date().toISOString().replace(/[:.]/g,"-")}function XW(){return HW(3).toString("hex")}async function Eh(e,t,n){if(t.length>RT)throw new Error(`writeScreenshotSidecar: buffer exceeds ${RT} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=VW(e);await WW(r,{recursive:!0});let o=`${YW()}-${XW()}-${n}.png`,s=kh(r,o);await GW(s,t);let{size:i}=await KW(s);return{path:s,bytes:i}}var Zde,RT,CT=P(()=>{"use strict";q();Ja();Zde=zW(qW);RT=5*1024*1024});var _T={};xc(_T,{PlaywrightProvider:()=>Th});function AT(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 Th,PT=P(()=>{"use strict";gT();ET();xT();bh();Ja();CT();Th=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Nu(t)}async open(t){let n=yh(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 Bu(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 Bu(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 vh(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${AT(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=wh(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 u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=yh(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,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 Bu(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 u=await vh(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${AT(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Eh(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path: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 Eh(n,o,r);return s}catch{return null}}}});var Fo={};xc(Fo,{__resetBrowserRegistryForTests:()=>nK,browserProviderActive:()=>eK,closeBrowserProvider:()=>xh,getBrowserProvider:()=>QW,peekBrowserProvider:()=>tK});function IT(){Promise.resolve(xh()).then(()=>{process.exit(130)})}function MT(){Promise.resolve(xh()).then(()=>{process.exit(143)})}function OT(){_n=null}function ZW(){Uu||(process.on("SIGINT",IT),process.on("SIGTERM",MT),process.on("exit",OT),Uu=!0)}function $T(){Uu&&(process.removeListener("SIGINT",IT),process.removeListener("SIGTERM",MT),process.removeListener("exit",OT),Uu=!1)}async function QW(e){return _n!==null?_n:(Do!==null||(Do=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(PT(),_T)),n=fT(e),r=new t(n);return ZW(),_n=r,Do=null,r})()),Do)}async function xh(){if(_n===null)return;let e=_n;_n=null,Do=null,$T(),await e.shutdown()}function eK(){return _n!==null}function tK(){return _n}function nK(){_n=null,Do=null,$T()}var _n,Do,Uu,Lo=P(()=>{"use strict";bh();_n=null,Do=null,Uu=!1});function DT(e,t){try{return lT(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function aK(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Lo(),Fo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function FT(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??aK,o=null,s=e,i=null,a=null;try{let c=await Fu(n,e,{headers:iK,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(sK.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(oK.test(u)&&!rK.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=DT(d,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<aT)&&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}),u=DT(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);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 rK,oK,sK,iK,LT=P(()=>{"use strict";cT();hh();Pe();rK=/(text\/html|application\/xhtml\+xml)/i,oK=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,sK=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,iK={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function uK(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(lK,{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),cK),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=Mo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}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 NT(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?uK({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 BT(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1082
1083
|
|
|
1083
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(`
|
|
1084
1085
|
`).trimEnd()}var lK,cK,UT=P(()=>{"use strict";Oo();lK="https://api.exa.ai/search",cK=10});function bK(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=dK;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,pK)}let a=mK;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,fK)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Rh(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+gK}function wK(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 yK.some(o=>r.includes(o))}function SK(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=bK(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let u=i.signal.reason;return u instanceof Error?u.message:String(u??"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 d;try{d=await Fu(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(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await d.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}return{content:Rh(p,s.maxBytes)}}if(s.mode==="markdown")try{let d=await FT(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return d.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:Rh(d.markdown,s.maxBytes)}}catch(d){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=d instanceof Error?d.message:String(d),m=wK(d)?" (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 u=NT({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let d=await u.search(s.query,{limit:hK,timeoutMs:s.timeoutMs,signal:i.signal});return{content:Rh(BT(s.query,d),s.maxBytes)}}catch(d){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${d instanceof Error?d.message:String(d)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var dK,pK,mK,fK,gK,hK,yK,jT,HT=P(()=>{"use strict";LT();UT();hh();dK=3e4,pK=12e4,mK=1e6,fK=1e7,gK=`
|
|
@@ -2011,7 +2012,7 @@ _ended: ${new Date().toISOString()}_
|
|
|
2011
2012
|
${k}${S}
|
|
2012
2013
|
${w}
|
|
2013
2014
|
${k}`})}return{fileBlocks:a,warnings:l}}async function gD(e,t,n,r,o="summary",s,i){let a=d0(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,u=!1,d=!1,p=!1,m=!1,g,h=!1,b=!1,y={abort:null},S=0,w=3e3,k=[],T=new Map,R=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=()=>{let N=r.subagentControl;N?.hasPromotableForeground()&&N.promoteActiveForeground().then(F=>{for(let U of F)(s??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${U.jobId}: ${U.label}`))}).catch(()=>{})},E=r.getCompositor?r.getCompositor():null,O=()=>new Xi({out:Zi(s),thinkingMode:o,...R?{activeSkillName:R}:{},onCancel:()=>{t.interrupt().catch(N=>{qe()&&console.error(" "+f.error("session.interrupt() failed:"),N)})},...r.subagentControl?{onBackground:A}:{},...i?.history?{history:i.history}:{},...i?.autocompleteState?{autocompleteState:i.autocompleteState}:{},...i?.promptText!==void 0?{promptText:i.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...E?{compositor:E}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=O(),I=async()=>{if(!p){p=!0;try{await _.dispose()}catch{}}},L=async()=>{await _.arm();let N=_.getCompositor();if(s&&N){let F=N;s.fn=U=>F.commitAbove(U)}r.setActiveCompositor?.(N),r.setInterruptNotifier?.(F=>_.setInterrupting(F)),r.rearmStatus?.()};try{E?E.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(C=>{qe()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),C)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(C=>{qe()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),C)})}),await L(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A);let{fileBlocks:N,warnings:F}=fD(e.text,{rootDir:process.cwd()});for(let C of F)(s??{fn:console.log}).fn(f.dim(` @-file: ${C}`));let U=N.length>0||e.attachments.length>0?pD(e.text,e.attachments,void 0,N):e.text,H=t.sendMessageStream(U);if(await js((C,B)=>{_.process(C,B)},async()=>{for await(let C of H){if(h||b)break;if(C.type==="chunk"&&C.chunk.type==="content"?(l+=C.chunk.content,u=!0):C.type==="message"&&!u&&(l=C.message.content),C.type==="stream_retry"&&(l=l.slice(0,c)),C.type==="chunk"&&C.chunk.type==="tool_use_detail"){let B=C.chunk,M={toolName:B.toolName,toolUseId:B.toolUseId,input:B.toolInput,...B.toolInputRaw!==void 0&&{inputRaw:B.toolInputRaw}};T.set(B.toolUseId,M),k.push(M)}else if(C.type==="chunk"&&C.chunk.type==="tool_result"){let B=C.chunk;c=l.length;let M=T.get(B.toolUseId);if(M&&(M.result=B.content,M.isError=B.isError,T.delete(B.toolUseId)),r.onContextProgress){let j=Date.now();if(j-S>=w){S=j;try{let X=r.onContextProgress();X instanceof Promise&&await X}catch(X){qe()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),X)}}}}if(C.type==="paused"){if(r.setPausedState?.(!0),await I(),E&&C.autoResume===!0){let B=new AbortController;y.abort=B;let M=C.resetsAt?C.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,j=M?`Keep waiting \u2014 auto-resumes at ${M}`:"Keep waiting \u2014 auto-resume in progress",X="Switch model / provider (type /model after)",ie="Stop waiting",Z=[f.warning(" \u23F3 Usage limit reached.")+(M?f.dim(` Auto-resumes at ${M}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Xm(E,{header:Z,options:[j,X,ie],signal:B.signal,initialIndex:0}).then(fe=>{if(y.abort=null,!fe)return;let V=fe[0];V===void 0||V===j||(b=!0,V===X&&(s??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(_e=>{qe()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),_e)}))}).catch(fe=>{qe()&&console.error(" "+f.error("picker promise rejected:"),fe)})}else(s??{fn:console.log}).fn(ik({reason:C.reason,...C.resetsAt!==void 0?{resetsAt:C.resetsAt}:{},...C.accountId!==void 0?{accountId:C.accountId}:{},...C.autoResume!==void 0?{autoResume:C.autoResume}:{}}));continue}if(C.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let B=C.hotSwapped&&C.accountId?`\u25B6 Resumed on ${C.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,k.length=0,T.clear(),m=!1,g=void 0,d=!1,_=O(),p=!1,await L(),(s??{fn:console.log}).fn(f.success(B));continue}if(C.type==="error"){await I(),Ms(As(C.error)),d=!0;continue}_.process(C),C.type==="done"&&(m=!0,g=C.metadata)}}),await I(),h){let C=s?s.fn:console.log;C(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),C("")}if(b){let C=s?s.fn:console.log;C(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),C("")}if(m&&!h&&!b){Go(n,a,l,g,k),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Pp(process.stdout);let C=M=>{s?s.fn(M):console.log(M)},B=uD(l);if(B){if(C(dD(B)),C(""),r.onTerminalState)try{r.onTerminalState(B)}catch{}if(n.permissionMode==="autonomous"){let M=B.kind==="done"&&$u().verifyDone===!0&&!LI(k);BI(B,void 0,{unverified:M})}}if(bZ(g,n,C),r.onAfterTurn){let M=r.onAfterTurn();M instanceof Promise&&await M.catch(()=>{})}}}catch(N){await I(),d||Ms(As(N))}finally{await I(),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 bZ(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(he(e.durationMs)),e.totalCostUsd!==void 0&&r.push(lt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(ae(o+s)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Lb(t),a=Lt(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 ~${ae(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 ${ae(a)}`))}n("")}var wZ=5e3;async function SZ(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 hD(e,t,n,r,o,s,i,a){let{contextPane:l,loopStageBar:c,verdictLedger:u,shellPassthrough:d}=i,p=null,m=[];e.session.current.waitForInitialization().then(async y=>{qe()&&(p=Bp(y)),await Im(e.session.current),qe()&&(m=u$())}).catch(()=>{});let g,h=!1,b=!1;for(;;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),m.length>0){for(let E of m)e.replRenderer.writeLine(E);e.replRenderer.writeLine(""),m=[]}let y=d.drainNotifications();for(let{job:E,result:O}of y){let _=O.errorReason===void 0?"\u2713":"\u2717",I=O.errorReason==="abort"?"killed":O.errorReason==="timeout"?"timed out":O.errorReason==="signal-killed"?"killed by signal":`exit ${O.exitCode??0}`,L=Math.max(0,Math.round(O.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${_} [${E.id}] ${I} \xB7 ${L}s \xB7 `)+E.command)}let S=l.renderIfChanged(e.stats.sessionId);if(S.length>0){for(let E of S)e.replRenderer.writeLine(E);e.replRenderer.writeLine("")}let w,k;if(g===void 0){let E=await e.session.current.takePendingPlanExitSeed();E!==void 0&&(g={text:E,attachments:[]})}if(g!==void 0){let E=g;g=void 0;let O=na(e.stats.permissionMode),_=Qo({buffer:E.text,promptText:O,isTTY:!!process.stdout.isTTY,attachmentSummary:Wi([...E.attachments])});e.replRenderer.writeLine(_),w=E.text.trim(),k=E.attachments}else{let E=await o.readLine({promptFn:()=>na(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Zm(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});w=E.text.trim(),k=E.attachments}if(!w&&k.length===0)continue;if(w.startsWith("!")){let E=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!E&&(h||(h=!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 d.dispatch(w))){e.statusLine.rearm();continue}}let T=!1;if(w.startsWith("/")){let E=await _I(w,e.slashCtx,k);if(E.handled){if(E.result==="exit"){e.rl.close();return}if((w==="/clear"||w.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),u.reset()),E.result!==null&&typeof E.result=="object"&&"kind"in E.result&&E.result.kind==="submit"){g={text:E.result.message,attachments:k??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}T=!0}a.push(w),await SZ(e,w);let R=w;if(T){let E=Fb(w);if(E){let O=E.name.replace(/^\//,"").split(":").pop()??"";if(O&&Hw(O)){let _={skillName:O,rawArgs:E.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},I=e.session.current.sessionId,L=ls(I),N=Date.now();W(`[afk trace] preflight.start commandName=${O}`);let F=!1,U=await as(_,{cwd:e.stats.cwd??process.cwd(),artifactDir:L},H=>{qe()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${O}) failed: `)+(H instanceof Error?H.message:String(H)))});F=U!==null,W(`[afk trace] preflight.end commandName=${O} durationMs=${Date.now()-N} success=${F}`),R=Kw(U?.manifestBlock,w)}}}let A=d.drainInjections();if(A.length>0&&(R=A+R),e.hookRegistry)try{let E={event:"UserPromptSubmit",prompt:R,sessionId:e.stats.sessionId},O=await e.hookRegistry.dispatch(E);O.injectContext&&(R=O.injectContext+R)}catch(E){if(E instanceof me){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(E.reason?f.dim(`: ${Mo(E.reason)}`):"")),e.statusLine.rearm();continue}if(E instanceof Tn){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${E.timeoutMs}ms`)),e.statusLine.rearm();continue}throw E}if(await gD({text:R,attachments:k},e.session.current,e.stats,{setInFlight(E){n.turnInFlight=E},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(E){await t.appendUser(E)},async onTurnComplete(E,O){if(await t.appendTurn(E,O),e.stats.sessionId)try{Nn(e.stats)}catch(_){b||(b=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(_ instanceof Error?_.message:String(_))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:E=>u?.push(E),setActiveCompositor:E=>{n.activeCompositor=E},setInterruptNotifier:E=>{n.notifyInterrupting=E},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:E=>o.setBackgroundHandler(E),setSoftStopHandler:s,setPausedState:E=>o.setPausedState(E),setPauseInterruptHandler:E=>o.setPauseInterruptHandler(E),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(jn(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:E=>c.repaint(E)}:{}},e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(na(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,wZ)}catch(E){if(E instanceof ut)throw E;E instanceof Tn?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):E instanceof me?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${Mo(E.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(E))}}}function vZ(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 yD(e,t,n,r){let o=await J$(),s=new Ym({rl:e.rl,history:o,statusLine:e.statusLine}),i=vZ(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await eD(e,s,n,t,r,i,{getLoopStageBar:()=>a?.loopStageBar});a=cD(e,n),await hD(e,t,n,r,s,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),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)}}Ka();import{execFile as kZ}from"node:child_process";import{dirname as EZ,isAbsolute as TZ,resolve as xZ}from"node:path";import{promisify as RZ}from"node:util";var bD=RZ(kZ),CZ=3e3,AZ=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function _Z(){let t=(await bD("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=TZ(t)?t:xZ(process.cwd(),t);return EZ(n)}async function wD(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await _Z()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),CZ)});try{let o=Wn({execFile:bD,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=>AZ.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Zc();Ka();import{promises as PZ}from"node:fs";import{dirname as IZ,join as kD}from"node:path";import{randomBytes as MZ}from"node:crypto";var OZ=["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(`
|
|
2014
|
-
`),SD=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pS=30,$Z=1024,DZ=8e3,FZ="haiku";async function LZ(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=jZ(n,$Z),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??DZ),i=t.signal?HZ([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Bs({token:t.token,model:t.model??FZ,system:OZ,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=NZ(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=IZ(t.worktreePath);return await BZ(l,c)}function NZ(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(SD.test(t)&&t.length<=pS)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>pS)break;o=i}return SD.test(o)?o:null}async function BZ(e,t){if(!await UZ(kD(t,e)))return e;let n=MZ(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pS-5)}-${n}`}async function UZ(e){try{return await PZ.access(e),!0}catch{return!1}}function jZ(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 HZ(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 ED(e){let t,n,r=kD(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await LZ(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=`${Pu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return vD(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 vD(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 vD(e,t){e&&e.setCwd(t),WZ(t)}function WZ(e){try{process.chdir(e)}catch{}}Ve();Ft();q();import{spawn as xD}from"child_process";import{existsSync as RD,mkdirSync as JZ,readFileSync as CD,unlinkSync as TD,writeFileSync as VZ}from"fs";import{get as YZ}from"https";import{join as AD}from"path";import{readFileSync as KZ}from"fs";import{dirname as GZ,join as qZ}from"path";import{fileURLToPath as zZ}from"url";function Cr(){try{return"5.15.
|
|
2015
|
+
`),SD=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pS=30,$Z=1024,DZ=8e3,FZ="haiku";async function LZ(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=jZ(n,$Z),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??DZ),i=t.signal?HZ([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Bs({token:t.token,model:t.model??FZ,system:OZ,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=NZ(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=IZ(t.worktreePath);return await BZ(l,c)}function NZ(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(SD.test(t)&&t.length<=pS)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>pS)break;o=i}return SD.test(o)?o:null}async function BZ(e,t){if(!await UZ(kD(t,e)))return e;let n=MZ(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pS-5)}-${n}`}async function UZ(e){try{return await PZ.access(e),!0}catch{return!1}}function jZ(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 HZ(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 ED(e){let t,n,r=kD(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await LZ(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=`${Pu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return vD(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 vD(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 vD(e,t){e&&e.setCwd(t),WZ(t)}function WZ(e){try{process.chdir(e)}catch{}}Ve();Ft();q();import{spawn as xD}from"child_process";import{existsSync as RD,mkdirSync as JZ,readFileSync as CD,unlinkSync as TD,writeFileSync as VZ}from"fs";import{get as YZ}from"https";import{join as AD}from"path";import{readFileSync as KZ}from"fs";import{dirname as GZ,join as qZ}from"path";import{fileURLToPath as zZ}from"url";function Cr(){try{return"5.15.3"}catch{}try{let e=GZ(zZ(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(KZ(qZ(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}J();var XZ=64*1024,ZZ=1440*60*1e3,QZ=3600*1e3,eQ="update-check.json",tQ="pending-update.json";function _D(){return AD(Pc(),eQ)}function lc(){return AD(Pc(),tQ)}function PD(){let e=Pc();RD(e)||JZ(e,{recursive:!0})}function nQ(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 rQ(){try{let e=CD(_D(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function oQ(){try{PD();let e=`
|
|
2015
2016
|
const https = require('https');
|
|
2016
2017
|
const fs = require('fs');
|
|
2017
2018
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|