agent-afk 5.82.5 → 5.82.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/telegram.mjs CHANGED
@@ -815,7 +815,7 @@ ${e}`:[{type:"text",text:n},...e]}getInputStreamRef(){return{pushUserMessage:e=>
815
815
  `);i={...i,...l,...c.length>0?{injectContext:c}:{}}}return i}}});async function dt(t,e,n,r){if(!t)return;if(r.kind==="blocked"){await Qe(t,{hookEvent:e,decision:"block",...r.err.reason!==void 0?{reason:r.err.reason}:{},...e==="PreToolUse"&&n.toolName!==void 0?{blockedTool:n.toolName}:{}});return}let o=r.decision;await Qe(t,{hookEvent:e,decision:o.decision,...o.reason!==void 0?{reason:o.reason}:{},...o.injectContext!==void 0?{injectedContextBytes:Buffer.byteLength(o.injectContext,"utf8")}:{}})}async function Py(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await dt(n.traceWriter,"SubagentStart",{},{kind:"decision",decision:r})}catch(r){throw r instanceof Z&&await dt(n.traceWriter,"SubagentStart",{},{kind:"blocked",err:r}),r}}function hI(t,e,n){return new Promise((r,o)=>{let s=!1,i=setTimeout(()=>{s||(s=!0,o(new bn(n,e)))},e);i.unref(),t.then(a=>{s||(s=!0,clearTimeout(i),r(a))},a=>{s||(s=!0,clearTimeout(i),o(a))})})}async function My(t,e,n={}){if(!t)return{};try{let r=await hI(t.dispatch(e,n.signal,wn),wn,"SubagentStop");return await dt(n.traceWriter,"SubagentStop",{},{kind:"decision",decision:r}),r}catch(r){return r instanceof bn?(console.warn(`[afk] SubagentStop hook timed out after ${wn}ms (subagentId=${e.subagentId}): ${r.message}`),n.onError?.(r),{}):(r instanceof Z&&await dt(n.traceWriter,"SubagentStop",{},{kind:"blocked",err:r}),r instanceof Z||r instanceof $e?(U(`SubagentStop hook swallowed ${r.name}: ${r.message}`),n.onError?.(r),{}):(U(`SubagentStop hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r))),{}))}}async function Wd(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await dt(n.traceWriter,"PreToolUse",{toolName:e.toolName},{kind:"decision",decision:r})}catch(r){throw r instanceof Z&&await dt(n.traceWriter,"PreToolUse",{toolName:e.toolName},{kind:"blocked",err:r}),r}}async function Oy(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await dt(n.traceWriter,"PostToolUse",{toolName:e.toolName},{kind:"decision",decision:r})}catch(r){if(r instanceof Z&&await dt(n.traceWriter,"PostToolUse",{toolName:e.toolName},{kind:"blocked",err:r}),r instanceof Z||r instanceof $e){U(`PostToolUse hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}U(`PostToolUse hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}async function Dy(t,e,n={}){if(t)try{let r=await t.dispatch(e,n.signal);await dt(n.traceWriter,"PostToolUseFailure",{toolName:e.toolName},{kind:"decision",decision:r})}catch(r){if(r instanceof Z&&await dt(n.traceWriter,"PostToolUseFailure",{toolName:e.toolName},{kind:"blocked",err:r}),r instanceof Z||r instanceof $e){U(`PostToolUseFailure hook swallowed ${r.name}: ${r.message}`),n.onError?.(r);return}U(`PostToolUseFailure hook unexpected error: ${String(r)}`),n.onError?.(r instanceof Error?r:new Error(String(r)))}}var Vi=b(()=>{"use strict";fe();le();Ji();ne()});import{mkdir as yI,writeFile as bI}from"fs/promises";import{dirname as wI,join as SI}from"path";function vI(){return SI(bt(),"routing-decisions.jsonl")}function kI(t){let e={surface:"afk"};for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}async function ie(t){if(!(_.VITEST||_.NODE_ENV==="test"))try{let e=vI();await yI(wI(e),{recursive:!0});let n=new Date().toISOString().split(".")[0]+"Z",r=JSON.stringify({ts:n,...kI(t)})+`
816
816
  `;await bI(e,r,{flag:"a"})}catch{}}var ut=b(()=>{"use strict";W();z()});import{AsyncLocalStorage as _I}from"node:async_hooks";function Ly(t,e){return Fy.run(t,e)}function Ze(){return Fy.getStore()}var Fy,Sn=b(()=>{"use strict";Fy=new _I});import{promises as Ny}from"node:fs";import{join as AI,resolve as EI,sep as Gd}from"node:path";function go(t){let e=EI(t),n=e.indexOf(Kd);if(n===-1)return;let o=e.slice(n+Kd.length).split(Gd)[0];if(o)return e.slice(0,n+Kd.length)+o}async function $y(t){let e=go(t);if(e===void 0)return;let n=AI(e,TI);try{let r={};try{r=JSON.parse(await Ny.readFile(n,"utf-8"))}catch{r={owner:"agent"}}r.pid=process.pid,r.createdAt=new Date().toISOString(),await Ny.writeFile(n,JSON.stringify(r,null,2),"utf-8")}catch{}}var TI,Kd,qd=b(()=>{"use strict";TI=".afk-worktree-meta.json",Kd=`${Gd}.afk-worktrees${Gd}`});import{execFile as xI}from"node:child_process";import{promisify as RI}from"node:util";import jt from"node:path";function PI(t){let e=jt.resolve(t),n=`${jt.sep}.afk-worktrees${jt.sep}`,r=e.indexOf(n);if(!(r<=0))return e.slice(0,r)}async function Uy(t,e=II){if(!(t===void 0||t===""))try{let{stdout:n}=await e("git",["-C",t,"rev-parse","--git-common-dir","--show-toplevel"]),r=n.split(`
817
817
  `).map(c=>c.trim()),o=r[0],s=r[1];if(!o||!s)return;let i=jt.isAbsolute(o)?o:jt.resolve(t,o),a=jt.resolve(jt.dirname(i)),l=jt.resolve(s);return a===l?void 0:a}catch(n){let r=PI(t);if(r!==void 0)return U(`[worktree-read-root] git rev-parse failed for cwd=${t}; recovered main root lexically as ${r} (afk worktree layout) \u2014 ${n instanceof Error?n.message:String(n)}`),r;U(`[worktree-read-root] git rev-parse failed for cwd=${t}; child confined to worktree only \u2014 ${n instanceof Error?n.message:String(n)}`);return}}var CI,II,By=b(()=>{"use strict";fe();CI=RI(xI),II=(t,e)=>CI(t,e)});import vn from"path";function MI(t){let e=vn.resolve(t??process.cwd());return vn.parse(e).root||vn.sep}function Wt(t,e){if(t!==void 0)return ho({parentReadRoots:t.parentReadRoots,parentCwd:t.parentCwd,childCwd:e})}function ho(t){let{parentReadRoots:e,parentCwd:n,childCwd:r,worktreeMainRoot:o,afkStateRoot:s}=t,i=r!==void 0&&r!==""?vn.resolve(r):void 0;if(e===void 0&&n===void 0)return i!==void 0?[MI(i)]:void 0;let a=e??(n!==void 0?[n]:[]),l=new Set;i!==void 0&&l.add(i);for(let c of a)c!==void 0&&c!==""&&l.add(vn.resolve(c));if(o!==void 0&&o!==""&&l.add(vn.resolve(o)),s!==void 0&&s!==""&&l.add(vn.resolve(s)),l.size!==0&&!(l.size===1&&i!==void 0&&l.has(i)))return[...l]}var kn=b(()=>{"use strict"});function Hy(){return Iy()}function Yi(t,e){return t??e}var Xi=b(()=>{"use strict";Ji()});function zd(t,e){return e?.allowedTools?e.allowedTools.includes(t)?{allowed:!0}:{allowed:!1,reason:`Tool "${t}" is not in the configured allowlist`}:{allowed:!0}}function Qi(t,e){return jy(t,e)}function Zi(t,e){return jy(t,e)}function jy(t,e){if(!t?.allowedTools||e.length===0)return t;let n=new Set(t.allowedTools),r=!1;for(let o of e)n.has(o)||(n.add(o),r=!0);return r?{...t,allowedTools:[...n]}:t}var ea=b(()=>{"use strict"});async function ar(t,e,n){let r=new Array(t.length),o=Math.min(Math.max(1,Math.floor(e)),t.length),s=0,i=[];for(let a=0;a<o;a++)i.push((async()=>{for(;s<t.length;){let l=s++;try{r[l]={status:"fulfilled",value:await n(t[l])}}catch(c){r[l]={status:"rejected",reason:c}}}})());return await Promise.all(i),r}var ta=b(()=>{"use strict"});function lP(t){return t.replace(/'[^']*'/g," ").replace(/"(?:[^"\\]|\\.)*"/g,e=>/\$\(|`/.test(e)?e:" ")}function Jd(t){return(t.split("/").pop()??t).replace(/^\\+/,"")}function Ky(t){let e=[],n=[],r=[],o="",s=!1,i=()=>{s&&(r.push(o),o="",s=!1)},a=()=>{i(),r.length>0&&(e.push(r),r=[])},l=u=>{let p=u,f=1,m="";for(;p<t.length&&f>0;){let g=t[p];if(g==="(")f++;else if(g===")"&&(f--,f===0)){p++;break}m+=g,p++}return n.push(m),p},c=0,d=t.length;for(;c<d;){let u=t[c];if(u==="'"){for(s=!0,c++;c<d&&t[c]!=="'";)o+=t[c],c++;c++;continue}if(u==='"'){for(s=!0,c++;c<d&&t[c]!=='"';)if(t[c]==="$"&&t[c+1]==="(")c=l(c+2);else if(t[c]==="`"){c++;let p="";for(;c<d&&t[c]!=="`";)p+=t[c],c++;c++,n.push(p)}else o+=t[c],c++;c++;continue}if(u==="`"){i(),c++;let p="";for(;c<d&&t[c]!=="`";)p+=t[c],c++;c++,n.push(p);continue}if(u==="$"&&t[c+1]==="("){i(),c=l(c+2);continue}if(u===";"||u===`
818
- `||u==="&"||u==="|"||u==="("||u===")"){a(),c++;continue}if(u===" "||u===" "||u==="\r"){i(),c++;continue}o+=u,s=!0,c++}a();for(let u of n)for(let p of Ky(u))e.push(p);return e}function pP(t,e){let n=[...t],r=0,o=n[r];for((o==="export"||o==="local"||o==="declare")&&r++;r<n.length;){let s=/^([A-Za-z_]\w*)=(.*)$/.exec(n[r]);if(s===null)break;e.set(s[1],s[2]),r++}for(let s=0;r<n.length&&s<12;s++){let i=n[r],a=/^\$\{?([A-Za-z_]\w*)\}?$/.exec(i);if(a!==null){let c=e.get(a[1]);if(c!==void 0){let d=c.split(/\s+/).filter(Boolean);n=[...n.slice(0,r),...d,...n.slice(r+1)];continue}}let l=Jd(i);if(!cP.has(l))break;if(r++,l==="env")for(;r<n.length;){let c=n[r],d=/^([A-Za-z_]\w*)=(.*)$/.exec(c);if(d!==null){e.set(d[1],d[2]),r++;continue}if(!c.startsWith("-"))break;r++,dP.has(c)&&r<n.length&&r++}else if(l==="xargs")for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,uP.has(c)&&r<n.length&&r++}else if(l==="timeout"){for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,(c==="-k"||c==="--kill-after"||c==="-s"||c==="--signal")&&r<n.length&&r++}r<n.length&&/^[\d.]+[smhd]?$/.test(n[r])&&r++}else if(l==="nice")for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,c==="-n"&&r<n.length&&r++}else for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,(c==="-u"||c==="--user")&&r<n.length&&r++}}return r>=n.length?null:{command:n[r],argv:n.slice(r+1)}}function gP(t){let e=0;for(;e<t.length;){let n=t[e];if(fP.has(n)){e+=2;continue}if(!n.startsWith("-"))break;e++}return{sub:t[e],rest:t.slice(e+1)}}function Gy(t){if(t.includes("--help")||t.includes("-h"))return null;let{sub:e,rest:n}=gP(t);if(e===void 0||e==="help"||e==="config")return null;if(mP.has(e))return"git repository mutation";let r=n[0]??"";switch(e){case"tag":return r.startsWith("-")?"git tag create/delete":null;case"branch":return/^-[dDmMcC]/.test(r)||/^--(delete|move|copy|force)/.test(r)?"git branch delete/rename":null;case"remote":return["add","remove","rm","set-url","rename"].includes(r)?"git remote mutation":null;case"worktree":return["remove","prune","move","lock","unlock"].includes(r)?"git worktree mutation (remove/prune/move)":null;case"stash":return r==="list"||r==="show"?null:"git stash mutation (only `stash list`/`stash show` allowed)";default:return null}}function yP(t){if((t.command.split("/").pop()??t.command)!=="curl")return!1;for(let n=0;n<t.argv.length;n++){let r=t.argv[n];if((r==="-X"||r==="--request")&&hP.test(t.argv[n+1]??"")||/^-X(POST|PUT|PATCH|DELETE)$/i.test(r)||/^--request=(POST|PUT|PATCH|DELETE)$/i.test(r))return!0}return!1}function Wy(t){for(let e=0;e<t.length-1;e++)if(Jd(t[e])==="git"){let n=Gy(t.slice(e+1));if(n!==null)return n}return null}function bP(t){let e=new Map;for(let n of Ky(t)){let r=pP(n,e);if(r===null){let i=Wy(n);if(i!==null)return i;continue}let o=Jd(r.command);if(o==="git"){let i=Gy(r.argv);if(i!==null)return i;continue}if(o==="curl"&&yP(r))return"curl write method (POST/PUT/PATCH/DELETE)";let s=Wy(n);if(s!==null)return s}return null}function ra(t){if(typeof t!="string"||t.trim().length===0)return{mutating:!1};for(let s of iP)if(s.re.test(t))return{mutating:!0,reason:s.reason};let e=t.match(XI)?.[1];if(e&&QI.test(e))return{mutating:!0,reason:"interpreter one-liner file write (`-c`/`-e`)"};let n=bP(t);if(n!==null)return{mutating:!0,reason:n};let r=lP(t);for(let s of aP)if(s.re.test(r))return{mutating:!0,reason:s.reason};let o=r.replace(oP," ").replace(rP," ").replace(/&(>>?)/g,"$1");return sP.test(o)?{mutating:!0,reason:"output redirection to a file (`>`/`>>`)"}:{mutating:!1}}var OI,DI,FI,LI,NI,$I,UI,BI,HI,jI,na,WI,KI,GI,qI,zI,JI,VI,YI,XI,QI,ZI,eP,tP,nP,rP,oP,sP,iP,aP,cP,dP,uP,fP,mP,hP,Vd=b(()=>{"use strict";OI=/\bgit\s+config\b[^|;&]*\s(--add|--unset|--unset-all|--replace-all|--rename-section|--remove-section|--edit|-e)\b/i,DI=/\bgit\s+config\s+(?:--(?:global|system|local|worktree)\s+|(?:--file|-f)\s+\S+\s+)*[\w][\w.-]*\s+\S/i,FI=/\bgh\s+\w[\w-]*\s+(create|merge|close|edit|delete|comment|review|reopen|sync|fork|clone|ready)\b/i,LI=/\bgh\s+api\b.*(-X|--method)\s+(POST|PUT|PATCH|DELETE)\b/i,NI=/\bgh\s+api\b.*(\s-f\b|\s-F\b|--field\b)/i,$I=/\bgh\s+(secret|variable|workflow|release|run|cache|ssh-key|gpg-key)\s+(set|run|rerun|cancel|upload|delete|enable|disable)\b/i,UI=/\|\s*(sh|bash|zsh|dash|ksh|mksh|csh|tcsh|fish|ash|python3?|node|nodejs|perl|ruby|php|bun)\b/i,BI=/\b(rm|rmdir|unlink|mv|cp|mkdir|touch|dd|truncate|tee|sponge|ln|chmod|chown|chgrp|shred|rsync)\b/i,HI=/\bfind\b[^|;&]*\s-delete\b/i,jI=/\bfind\b[^|;&]*\s-exec\s+['"]?\s*(rm|rmdir|unlink|mv|cp|dd|truncate|shred|tee|chmod|chown|chgrp|install|patch)\b/i,na=String.raw`(?:^|[\n;|&(]|\$\()\s*`,WI=new RegExp(na+String.raw`patch\b`,"i"),KI=new RegExp(na+String.raw`install\b`,"i"),GI=new RegExp(na+String.raw`(?:source\b|\.\s+\S)`,"i"),qI=/\btar\s+-?[a-zA-Z]*[cxruA][a-zA-Z]*\b/i,zI=new RegExp(na+String.raw`unzip\b`,"i"),JI=/\bcpio\b[^|;&]*\s-[a-zA-Z]*i\b/i,VI=/\bsed\b[^|;&]*\s-[a-zA-Z]*i\b/i,YI=/\bperl\b[^|;&]*\s-[a-zA-Z]*i\b/i,XI=/\b(?:python3?|nodejs|node|bun|ruby|perl|php)\b[^|;&]*?\s-(?:c|e)\b\s*("(?:[^"\\]|\\.)*"|'[^']*'|`[^`]*`)/i,QI=/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|os\.system\b|os\.popen\b|\bsubprocess\.|\bDeno\.(?:write|writeFile|writeTextFile|remove)\b|shutil\.\w|\.write_text\b|\.write_bytes\b/i,ZI=/\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,eP=/\b(curl|wget)\b[^|;&]*\s(-o\b|-O\b|--output\b)/i,tP=/\bcurl\b[^|;&]*\s-X\s+(POST|PUT|PATCH|DELETE)\b/i,nP=/\bcurl\b[^|;&]*\s(-d\b|--data\b|-F\b|--form\b)/i,rP=/(\d*&?>>?\s*\/dev\/null|\d*>&\d+|&>\s*\/dev\/null|&>>\s*\/dev\/null)/gi,oP=/\$\(\(.*?\)\)/g,sP=/(?<![=<>-])>>?(?!&)/,iP=[{re:DI,reason:"git config set (`<key> <value>`; only reads allowed)"},{re:jI,reason:"find -exec with mutating verb"}],aP=[{re:UI,reason:"pipe-to-shell (RCE via piped interpreter)"},{re:BI,reason:"filesystem mutation"},{re:HI,reason:"find -delete (file removal)"},{re:WI,reason:"patch (applies a diff to files)"},{re:KI,reason:"install (writes files)"},{re:GI,reason:"source/dot-source executes a script"},{re:qI,reason:"tar create/extract/append/update (writes files/archive)"},{re:zI,reason:"unzip (writes files)"},{re:JI,reason:"cpio extract (-i mode writes files)"},{re:OI,reason:"git config write flag (only reads allowed)"},{re:FI,reason:"gh write operation"},{re:LI,reason:"gh api write method (POST/PUT/PATCH/DELETE)"},{re:NI,reason:"gh api field payload (-f/-F/--field)"},{re:$I,reason:"gh extended write operation (secret/variable/workflow/run/cache)"},{re:VI,reason:"sed in-place edit (-i)"},{re:YI,reason:"perl in-place edit (-i)"},{re:ZI,reason:"package install/modify"},{re:eP,reason:"curl/wget output-to-file"},{re:tP,reason:"curl write method (POST/PUT/PATCH/DELETE)"},{re:nP,reason:"curl data/form payload"}];cP=new Set(["env","xargs","command","sudo","nice","time","timeout","nohup","stdbuf","busybox","eval"]);dP=new Set(["-u","--unset","-C","--chdir","-S","--split-string"]),uP=new Set(["-a","--arg-file","-E","--eof","-I","--replace","-i","-L","--max-lines","-l","-n","--max-args","-P","--max-procs","-s","--max-chars","-d","--delimiter","--process-slot-var"]);fP=new Set(["-c","-C","--git-dir","--work-tree","--namespace","--exec-path","--config-env"]),mP=new Set(["commit","push","pull","merge","rebase","reset","checkout","switch","restore","cherry-pick","revert","am","apply","clean","add","rm","mv","init"]);hP=/^(POST|PUT|PATCH|DELETE)$/i});function wP(t,e){if(t.length<=e)return t;let n=e;for(;n>0&&(t[n]&192)===128;)n--;return t.subarray(0,n)}function SP(t,e){if(t.length<=e)return t;let n=t.length-e;for(;n<t.length&&(t[n]&192)===128;)n++;return t.subarray(n)}function Et(t,e){let n=Buffer.from(t,"utf8");if(n.length<=e)return t;let r=Math.max(0,e-vP),o=Math.ceil(r/2),s=r-o,i=wP(n,o),a=SP(n,s),c=`
818
+ `||u==="&"||u==="|"||u==="("||u===")"){a(),c++;continue}if(u===" "||u===" "||u==="\r"){i(),c++;continue}o+=u,s=!0,c++}a();for(let u of n)for(let p of Ky(u))e.push(p);return e}function pP(t,e){let n=[...t],r=0,o=n[r];for((o==="export"||o==="local"||o==="declare")&&r++;r<n.length;){let s=/^([A-Za-z_]\w*)=(.*)$/.exec(n[r]);if(s===null)break;e.set(s[1],s[2]),r++}for(let s=0;r<n.length&&s<12;s++){let i=n[r],a=/^\$\{?([A-Za-z_]\w*)\}?$/.exec(i);if(a!==null){let c=e.get(a[1]);if(c!==void 0){let d=c.split(/\s+/).filter(Boolean);n=[...n.slice(0,r),...d,...n.slice(r+1)];continue}}let l=Jd(i);if(!cP.has(l))break;if(r++,l==="env")for(;r<n.length;){let c=n[r],d=/^([A-Za-z_]\w*)=(.*)$/.exec(c);if(d!==null){e.set(d[1],d[2]),r++;continue}if(!c.startsWith("-"))break;r++,dP.has(c)&&r<n.length&&r++}else if(l==="xargs")for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,uP.has(c)&&r<n.length&&r++}else if(l==="timeout"){for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,(c==="-k"||c==="--kill-after"||c==="-s"||c==="--signal")&&r<n.length&&r++}r<n.length&&/^[\d.]+[smhd]?$/.test(n[r])&&r++}else if(l==="nice")for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,c==="-n"&&r<n.length&&r++}else for(;r<n.length&&n[r].startsWith("-");){let c=n[r];r++,(c==="-u"||c==="--user")&&r<n.length&&r++}}return r>=n.length?null:{command:n[r],argv:n.slice(r+1)}}function gP(t){let e=0;for(;e<t.length;){let n=t[e];if(fP.has(n)){e+=2;continue}if(!n.startsWith("-"))break;e++}return{sub:t[e],rest:t.slice(e+1)}}function Gy(t){if(t.includes("--help")||t.includes("-h"))return null;let{sub:e,rest:n}=gP(t);if(e===void 0||e==="help"||e==="config")return null;if(mP.has(e))return"git repository mutation";let r=n[0]??"";switch(e){case"tag":return r.startsWith("-")?"git tag create/delete":null;case"branch":return/^-[dDmMcC]/.test(r)||/^--(delete|move|copy|force)/.test(r)?"git branch delete/rename":null;case"remote":return["add","remove","rm","set-url","rename"].includes(r)?"git remote mutation":null;case"worktree":return["add","remove","prune","move","lock","unlock"].includes(r)?"git worktree mutation (add/remove/prune/move)":null;case"stash":return r==="list"||r==="show"?null:"git stash mutation (only `stash list`/`stash show` allowed)";default:return null}}function yP(t){if((t.command.split("/").pop()??t.command)!=="curl")return!1;for(let n=0;n<t.argv.length;n++){let r=t.argv[n];if((r==="-X"||r==="--request")&&hP.test(t.argv[n+1]??"")||/^-X(POST|PUT|PATCH|DELETE)$/i.test(r)||/^--request=(POST|PUT|PATCH|DELETE)$/i.test(r))return!0}return!1}function Wy(t){for(let e=0;e<t.length-1;e++)if(Jd(t[e])==="git"){let n=Gy(t.slice(e+1));if(n!==null)return n}return null}function bP(t){let e=new Map;for(let n of Ky(t)){let r=pP(n,e);if(r===null){let i=Wy(n);if(i!==null)return i;continue}let o=Jd(r.command);if(o==="git"){let i=Gy(r.argv);if(i!==null)return i;continue}if(o==="curl"&&yP(r))return"curl write method (POST/PUT/PATCH/DELETE)";let s=Wy(n);if(s!==null)return s}return null}function ra(t){if(typeof t!="string"||t.trim().length===0)return{mutating:!1};for(let s of iP)if(s.re.test(t))return{mutating:!0,reason:s.reason};let e=t.match(XI)?.[1];if(e&&QI.test(e))return{mutating:!0,reason:"interpreter one-liner file write (`-c`/`-e`)"};let n=bP(t);if(n!==null)return{mutating:!0,reason:n};let r=lP(t);for(let s of aP)if(s.re.test(r))return{mutating:!0,reason:s.reason};let o=r.replace(oP," ").replace(rP," ").replace(/&(>>?)/g,"$1");return sP.test(o)?{mutating:!0,reason:"output redirection to a file (`>`/`>>`)"}:{mutating:!1}}var OI,DI,FI,LI,NI,$I,UI,BI,HI,jI,na,WI,KI,GI,qI,zI,JI,VI,YI,XI,QI,ZI,eP,tP,nP,rP,oP,sP,iP,aP,cP,dP,uP,fP,mP,hP,Vd=b(()=>{"use strict";OI=/\bgit\s+config\b[^|;&]*\s(--add|--unset|--unset-all|--replace-all|--rename-section|--remove-section|--edit|-e)\b/i,DI=/\bgit\s+config\s+(?:--(?:global|system|local|worktree)\s+|(?:--file|-f)\s+\S+\s+)*[\w][\w.-]*\s+\S/i,FI=/\bgh\s+\w[\w-]*\s+(create|merge|close|edit|delete|comment|review|reopen|sync|fork|clone|ready)\b/i,LI=/\bgh\s+api\b.*(-X|--method)\s+(POST|PUT|PATCH|DELETE)\b/i,NI=/\bgh\s+api\b.*(\s-f\b|\s-F\b|--field\b)/i,$I=/\bgh\s+(secret|variable|workflow|release|run|cache|ssh-key|gpg-key)\s+(set|run|rerun|cancel|upload|delete|enable|disable)\b/i,UI=/\|\s*(sh|bash|zsh|dash|ksh|mksh|csh|tcsh|fish|ash|python3?|node|nodejs|perl|ruby|php|bun)\b/i,BI=/\b(rm|rmdir|unlink|mv|cp|mkdir|touch|dd|truncate|tee|sponge|ln|chmod|chown|chgrp|shred|rsync)\b/i,HI=/\bfind\b[^|;&]*\s-delete\b/i,jI=/\bfind\b[^|;&]*\s-exec\s+['"]?\s*(rm|rmdir|unlink|mv|cp|dd|truncate|shred|tee|chmod|chown|chgrp|install|patch)\b/i,na=String.raw`(?:^|[\n;|&(]|\$\()\s*`,WI=new RegExp(na+String.raw`patch\b`,"i"),KI=new RegExp(na+String.raw`install\b`,"i"),GI=new RegExp(na+String.raw`(?:source\b|\.\s+\S)`,"i"),qI=/\btar\s+-?[a-zA-Z]*[cxruA][a-zA-Z]*\b/i,zI=new RegExp(na+String.raw`unzip\b`,"i"),JI=/\bcpio\b[^|;&]*\s-[a-zA-Z]*i\b/i,VI=/\bsed\b[^|;&]*\s-[a-zA-Z]*i\b/i,YI=/\bperl\b[^|;&]*\s-[a-zA-Z]*i\b/i,XI=/\b(?:python3?|nodejs|node|bun|ruby|perl|php)\b[^|;&]*?\s-(?:c|e)\b\s*("(?:[^"\\]|\\.)*"|'[^']*'|`[^`]*`)/i,QI=/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|os\.system\b|os\.popen\b|\bsubprocess\.|\bDeno\.(?:write|writeFile|writeTextFile|remove)\b|shutil\.\w|\.write_text\b|\.write_bytes\b/i,ZI=/\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,eP=/\b(curl|wget)\b[^|;&]*\s(-o\b|-O\b|--output\b)/i,tP=/\bcurl\b[^|;&]*\s-X\s+(POST|PUT|PATCH|DELETE)\b/i,nP=/\bcurl\b[^|;&]*\s(-d\b|--data\b|-F\b|--form\b)/i,rP=/(\d*&?>>?\s*\/dev\/null|\d*>&\d+|&>\s*\/dev\/null|&>>\s*\/dev\/null)/gi,oP=/\$\(\(.*?\)\)/g,sP=/(?<![=<>-])>>?(?!&)/,iP=[{re:DI,reason:"git config set (`<key> <value>`; only reads allowed)"},{re:jI,reason:"find -exec with mutating verb"}],aP=[{re:UI,reason:"pipe-to-shell (RCE via piped interpreter)"},{re:BI,reason:"filesystem mutation"},{re:HI,reason:"find -delete (file removal)"},{re:WI,reason:"patch (applies a diff to files)"},{re:KI,reason:"install (writes files)"},{re:GI,reason:"source/dot-source executes a script"},{re:qI,reason:"tar create/extract/append/update (writes files/archive)"},{re:zI,reason:"unzip (writes files)"},{re:JI,reason:"cpio extract (-i mode writes files)"},{re:OI,reason:"git config write flag (only reads allowed)"},{re:FI,reason:"gh write operation"},{re:LI,reason:"gh api write method (POST/PUT/PATCH/DELETE)"},{re:NI,reason:"gh api field payload (-f/-F/--field)"},{re:$I,reason:"gh extended write operation (secret/variable/workflow/run/cache)"},{re:VI,reason:"sed in-place edit (-i)"},{re:YI,reason:"perl in-place edit (-i)"},{re:ZI,reason:"package install/modify"},{re:eP,reason:"curl/wget output-to-file"},{re:tP,reason:"curl write method (POST/PUT/PATCH/DELETE)"},{re:nP,reason:"curl data/form payload"}];cP=new Set(["env","xargs","command","sudo","nice","time","timeout","nohup","stdbuf","busybox","eval"]);dP=new Set(["-u","--unset","-C","--chdir","-S","--split-string"]),uP=new Set(["-a","--arg-file","-E","--eof","-I","--replace","-i","-L","--max-lines","-l","-n","--max-args","-P","--max-procs","-s","--max-chars","-d","--delimiter","--process-slot-var"]);fP=new Set(["-c","-C","--git-dir","--work-tree","--namespace","--exec-path","--config-env"]),mP=new Set(["commit","push","pull","merge","rebase","reset","checkout","switch","restore","cherry-pick","revert","am","apply","clean","add","rm","mv","init","clone"]);hP=/^(POST|PUT|PATCH|DELETE)$/i});function wP(t,e){if(t.length<=e)return t;let n=e;for(;n>0&&(t[n]&192)===128;)n--;return t.subarray(0,n)}function SP(t,e){if(t.length<=e)return t;let n=t.length-e;for(;n<t.length&&(t[n]&192)===128;)n++;return t.subarray(n)}function Et(t,e){let n=Buffer.from(t,"utf8");if(n.length<=e)return t;let r=Math.max(0,e-vP),o=Math.ceil(r/2),s=r-o,i=wP(n,o),a=SP(n,s),c=`
819
819
 
820
820
  \u2026 [${n.length-i.length-a.length} bytes truncated: showing first ${i.length} + last ${a.length} of ${n.length}] \u2026
821
821
 
@@ -857,7 +857,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
857
857
 
858
858
  `).trim()}function SO(t){return(t?.textContent??"").replace(/\s+/g," ").trim().length}async function Fb(t,e){let{JSDOM:n,Readability:r,turndown:o}=await wO(),i=new n(t,{url:e}).window.document,a=(i.title??"").trim(),l=(()=>{try{let p=i.cloneNode(!0);return new r(p).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let p=Db(o.turndown(l.content)),f=(l.title??"").trim()||a,m=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:p,textLength:m,usedFallback:!1}}let c=i.body,d=c?.innerHTML??"",u=Db(o.turndown(d));return{title:a,markdown:u,textLength:SO(c),usedFallback:!0}}var vu,Lb=b(()=>{"use strict";vu=null});function kO(t,e){return new Promise((n,r)=>{if(e?.aborted){r(e.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(e?.reason??new Error("aborted"))},s=setTimeout(()=>{e?.removeEventListener("abort",o),n()},t);e?.addEventListener("abort",o,{once:!0})})}function Nb(t,e,n){let r=Math.min(e*2**t,n);return Math.round(Math.random()*r)}function _O(t,e){let n=t.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,e)}async function fa(t,e,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??kO,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await t(e,n);if(!vO.has(u.status)||d===o)return u;let p=_O(u,i)??Nb(d,s,i);U("[web/retryFetch] retrying",{url:e,attempt:d,status:u.status,waitMs:p}),await u.body?.cancel().catch(()=>{}),await a(p,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let p=Nb(d,s,i);U("[web/retryFetch] retrying after error",{url:e,attempt:d,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var vO,ku=b(()=>{"use strict";fe();vO=new Set([429,502,503,504])});import{readFileSync as AO}from"node:fs";import{join as EO}from"path";function TO(t){let n=t.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function $b(t,e){return TO(e).test(t)}function CO(t,e){if(t!==void 0){let n=t.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(e!==void 0){if(xO.has(e))return!0;if(RO.has(e))return!1}return!1}function Ub(t){return t===void 0||t.trim()===""?[]:t.split(",").map(e=>e.trim().toLowerCase()).filter(e=>e.length>0)}function IO(t){if(t===void 0||t===""||t==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${t}`)}function Bb(t){let e=t===void 0||t.trim()===""?"default":t.trim();return Lc(e),e}function PO(t){if(t===void 0)return!1;let e=t.trim().toLowerCase();return e==="1"||e==="true"||e==="yes"}function MO(t){try{return AO(t,"utf8")}catch(e){if(e.code==="ENOENT")return;throw e}}function OO(t,e){let n={...t};if(typeof e.headless=="boolean"&&(n.headless=e.headless),Array.isArray(e.allowedDomains)&&(n.allowedDomains=e.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(e.blockedDomains)&&(n.blockedDomains=e.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof e.domSnapshots=="boolean"&&(n.domSnapshots=e.domSnapshots),e.backend==="playwright")n.backend="playwright";else if(e.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(e.backend)}`);return typeof e.defaultProfile=="string"&&(n.defaultProfile=Bb(e.defaultProfile)),n}function Hb(t){let e=t?.env??_,n=t?.readFileSync??MO,r=t?.surface??e.AGENT_SURFACE,o=CO(e.AFK_BROWSER_HEADLESS,r),s=Ub(e.AFK_BROWSER_ALLOWED_DOMAINS),i=Ub(e.AFK_BROWSER_BLOCKED_DOMAINS),a=PO(e.AFK_BROWSER_DOM_SNAPSHOTS),l=IO(e.AFK_BROWSER_BACKEND),c=Bb(e.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=e.AFK_BROWSER_CONFIG,p=u!==void 0&&u.trim()!==""?u.trim():EO(wt(),"browser.json"),f=n(p);if(f===void 0)return d;let m;try{m=JSON.parse(f)}catch(h){throw new Error(`Failed to parse browser config at ${p}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${p} must be a JSON object`);let g=OO(d,m);return g.configPath=p,g}function ma(t,e){let n;try{n=new URL(t).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${t}`}}for(let r of e.blockedDomains)if($b(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return e.allowedDomains.length>0&&!e.allowedDomains.some(o=>$b(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var xO,RO,ga=b(()=>{"use strict";W();z();xO=new Set(["daemon","subagent","telegram","afk"]),RO=new Set(["repl","interactive","cli"])});import{existsSync as DO,readFileSync as FO}from"node:fs";import{createRequire as LO}from"node:module";import{dirname as NO,join as $O}from"node:path";function Kb(t){if(typeof t=="string")return t;let e=[],n=t;for(let r=0;r<BO&&n instanceof Error;r++)e.push(n.message),n=n.cause;return e.length>0?e.join(" | "):String(t)}function Ie(t){let e=Kb(t);return Wb.some(n=>e.includes(n))}function HO(){try{let e=LO(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(FO(e,"utf8"));if(typeof n!="object"||n===null)return;let r=n.bin,o=typeof r=="string"?r:typeof r=="object"&&r!==null?r.playwright:void 0;if(typeof o!="string"||o.length===0)return;let s=$O(NO(e),o);return DO(s)?`node ${/\s/.test(s)?`"${s}"`:s} install chromium`:void 0}catch{return}}function To(){return jb??=HO()??UO,jb}function _u(t){return t.includes("install chromium")}function Xe(t,e){let n=Kb(t),r=e?.latched===!0?` ${jO}`:"";if(n.includes("Executable doesn't exist")){let o="";return e?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":e?.headless===!1&&(o=" This launch was headed, which needs the full `chromium-*` build \u2014 the headless shell alone does not satisfy it."),`browser tools require the Playwright chromium binary. Install via: ${To()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${To()}). Or pick a different tool.${r}`}function Au(t,e,n=!1){if(!Ie(t))return t;let r=t instanceof Error?t.message:String(t);return new Error(`${r}
859
859
 
860
- ${Xe(t,{headless:e,latched:n})}`,{cause:t})}var Wb,UO,BO,jb,jO,Eu=b(()=>{"use strict";Wb=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],UO="pnpm exec playwright install chromium",BO=4;jO="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Rn from"node:fs";import ha from"node:path";import{randomBytes as WO}from"node:crypto";import{chromium as KO}from"playwright";function GO(){try{return"5.82.5"}catch{}try{let t=ha.resolve(import.meta.dirname,"../../../package.json"),e=Rn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var qO,ya,Gb=b(()=>{"use strict";Eu();z();fe();qO=GO(),ya=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=KO.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Au(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{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(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${qO}`}}loadStorageState(e){let n=Nc(e);try{if(!Rn.existsSync(n))return;let r=JSON.parse(Rn.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Nc(e);if(!Rn.existsSync(r))return;let o=await n.storageState(),s=ha.join(ha.dirname(r),`.${ha.basename(r)}.${process.pid}.${WO(4).toString("hex")}.tmp`);Rn.writeFileSync(s,JSON.stringify(o),{mode:384}),Rn.chmodSync(s,384),Rn.renameSync(s,r),U("[browser/vault] saved session",{profile:e,file:r})}catch(r){U("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as zO}from"crypto";function qb(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&JO.test(t.label))}function zb(t){return zO("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Jb(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var JO,ba=b(()=>{"use strict";JO=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as VO}from"node:crypto";function YO(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function XO(t,e,n){return`el_${VO("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function QO(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Vb(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Xb(t,e){let n=t.role??"",r=t.name??"";Yb.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Xb(s,e)}async function ZO(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Qb).catch(()=>[])}async function e0(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Qb).catch(()=>[])}function t0(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function wa(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=t0(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=ZO(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],Xb(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await e0(t)).filter(N=>Yb.has(N.role??"")));let v=new Map;for(let I of p){let N=Vb(I.name),j=v.get(N);(!j||j.bbox.w===0&&I.bbox.w>0)&&v.set(N,I)}let E=h.map(I=>({ax:I,dom:v.get(Vb(I.name??""))})),k=r?E:E.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,N)=>{let j=I.dom?.bbox.y??0,C=N.dom?.bbox.y??0;if(j!==C)return j-C;let $=I.dom?.bbox.x??0,L=N.dom?.bbox.x??0;return $-L}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=k.slice(0,n).map((I,N)=>{let j=I.ax.role??"generic",C=I.ax.name??"",$=XO(j,C,N),L=I.dom?.bbox??{x:0,y:0,w:0,h:0},P=I.dom?.type??null,O=null;I.ax.value!==void 0&&I.ax.value!==null&&(O=String(I.ax.value)),I.ax.checked!==void 0&&(O=String(I.ax.checked)),qb({role:j,kind:P})&&(O="[redacted]");let H={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(H.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(H.selected=I.ax.selected),I.ax.expanded!==void 0&&(H.expanded=I.ax.expanded);let F;I.dom?.testId?F=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(F=`#${I.dom.id}`);let B={id:$,role:j,label:YO(C),kind:P,value:O,state:H,bbox:L};return F!==void 0&&(B.selector=F),B}),x="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?x="loading":I==="interactive"?x="navigating":x="idle"}catch{x="navigating"}x!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=QO(f),R=`obs_${e.observationCounter.toString(36)}`,M=new Date().toISOString();return{observationId:R,url:m,title:g,textSummary:S,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:x,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:M}}var Yb,Qb,Zb=b(()=>{"use strict";ba();Yb=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Qb="a[href], button, input, select, textarea, [role], [tabindex], label"});async function ew(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Tu(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>ew(t,s)))).filter(o=>o!==null)}async function n0(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function xu(t,e,n){switch(e.kind){case"element_id":return r0(t,e,n);case"selector":return o0(t,e);case"semantic":return s0(t,e)}}async function r0(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Tu(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function o0(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Tu(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function s0(t,e){return e.role!==void 0?i0(t,e.text,e.role):a0(t,e.text,e)}async function i0(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Tu(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function a0(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await n0(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await ew(h.locator,h.index);if(w!==null){let v=`${w.role}:${w.label}:${g}`,E=0;for(let k=0;k<v.length;k++)E=E*31+v.charCodeAt(k)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var tw=b(()=>{"use strict"});async function Ru(t,e,n,r){let o=t.url();if(o===n)return null;let s=ma(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var nw=b(()=>{"use strict";ga()});import{randomBytes as l0}from"crypto";import{mkdir as c0,stat as d0,writeFile as u0}from"fs/promises";import{join as Cu}from"path";import{gzip as p0}from"zlib";import{promisify as f0}from"util";function m0(t){return Cu(js(t),"browser")}function g0(t){return Cu(m0(t),"screenshots")}function h0(){return new Date().toISOString().replace(/[:.]/g,"-")}function y0(){return l0(3).toString("hex")}async function Iu(t,e,n){if(e.length>rw)throw new Error(`writeScreenshotSidecar: buffer exceeds ${rw} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=g0(t);await c0(r,{recursive:!0});let o=`${h0()}-${y0()}-${n}.png`,s=Cu(r,o);await u0(s,e);let{size:i}=await d0(s);return{path:s,bytes:i}}var VY,rw,ow=b(()=>{"use strict";z();ba();VY=f0(p0);rw=5*1024*1024});var iw={};Cc(iw,{PlaywrightProvider:()=>Pu});function sw(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Pu,aw=b(()=>{"use strict";Gb();Zb();tw();ga();nw();ow();Pu=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new ya(e)}async open(e){let n=ma(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await Ru(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await wa(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await wa(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await xu(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${sw(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await Ru(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await wa(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await xu(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${sw(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Iu(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Iu(n,o,r);return s}catch{return null}}}});var In={};Cc(In,{__resetBrowserRegistryForTests:()=>k0,browserProviderActive:()=>S0,closeBrowserProvider:()=>Mu,getBrowserProvider:()=>w0,peekBrowserProvider:()=>v0});function lw(){Promise.resolve(Mu()).then(()=>{process.exit(130)})}function cw(){Promise.resolve(Mu()).then(()=>{process.exit(143)})}function dw(){gt=null}function b0(){Sa||(process.on("SIGINT",lw),process.on("SIGTERM",cw),process.on("exit",dw),Sa=!0)}function uw(){Sa&&(process.removeListener("SIGINT",lw),process.removeListener("SIGTERM",cw),process.removeListener("exit",dw),Sa=!1)}async function w0(t){return gt!==null?gt:(Cn!==null||(Cn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(aw(),iw)),n=Hb(t),r=new e(n);return b0(),gt=r,Cn=null,r})()),Cn)}async function Mu(){if(gt===null)return;let t=gt;gt=null,Cn=null,uw(),await t.shutdown()}function S0(){return gt!==null}function v0(){return gt}function k0(){gt=null,Cn=null,uw()}var gt,Cn,Sa,Pn=b(()=>{"use strict";ga();gt=null,Cn=null,Sa=!1});async function pw(t,e){try{return await Fb(t,e)}catch(n){return U("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function R0(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Pn(),In));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function fw(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??R0,o=null,s=t,i=null,a=null;try{let c=await fa(n,t,{headers:x0,redirect:"follow",signal:e.signal});i=c.status,s=c.url||t;let d=c.headers.get("content-type")??"";if(c.ok){if(T0.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(E0.test(d)&&!A0.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};if(o=await pw(u,s),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(c){if(e.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=await pw(c.html,c.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(e.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var A0,E0,T0,x0,mw=b(()=>{"use strict";Lb();ku();fe();A0=/(text\/html|application\/xhtml\+xml)/i,E0=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,T0=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,x0={"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 P0(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(C0,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),I0),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=ir(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function gw(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?P0({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function hw(t,e){if(e.length===0)return`# Search results for "${t}"
860
+ ${Xe(t,{headless:e,latched:n})}`,{cause:t})}var Wb,UO,BO,jb,jO,Eu=b(()=>{"use strict";Wb=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],UO="pnpm exec playwright install chromium",BO=4;jO="This session already latched the failure, so browser tools keep fast-failing with this same error \u2014 after installing, call browser_close once to retry."});import Rn from"node:fs";import ha from"node:path";import{randomBytes as WO}from"node:crypto";import{chromium as KO}from"playwright";function GO(){try{return"5.82.7"}catch{}try{let t=ha.resolve(import.meta.dirname,"../../../package.json"),e=Rn.readFileSync(t,"utf8"),n=JSON.parse(e);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var qO,ya,Gb=b(()=>{"use strict";Eu();z();fe();qO=GO(),ya=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(e){this.config=e}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(e){this.launchFailure={error:e}}async ensureBrowser(){if(this.browser!==void 0&&this.browser.isConnected())return this.browser;if(this.launchFailure!==void 0)throw this.launchFailure.error;return this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=KO.launch({headless:this.config.headless}).then(e=>(this.browser=e,this.launchPromise=void 0,this.clearLaunchFailure(),e)).catch(e=>{this.launchPromise=void 0;let n=Au(e,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(e){let n=this.sessions.get(e);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(e,i),s}async ensurePage(e){let n=this.sessions.get(e);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(e);let r=this.sessions.get(e);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${e}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(e){return this.sessions.get(e)?.page}async renderHtml(e,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{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(e,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(e){return this.sessions.get(e)?.consoleErrors??0}getLastHttpStatus(e){return this.sessions.get(e)?.lastHttpStatus??null}hasOpenDialog(e){return this.sessions.get(e)?.openDialog!==void 0}async dismissDialog(e,n=!0){let r=this.sessions.get(e);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(e){this.clearLaunchFailure();let n=this.sessions.get(e);n!==void 0&&(this.sessions.delete(e),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let e=[...this.sessions.keys()];if(await Promise.all(e.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${qO}`}}loadStorageState(e){let n=Nc(e);try{if(!Rn.existsSync(n))return;let r=JSON.parse(Rn.readFileSync(n,"utf8"));return U("[browser/vault] restored session",{profile:e,file:n}),r}catch(r){U("[browser/vault] ignoring unreadable vault",{profile:e,file:n,err:r});return}}async saveStorageState(e,n){try{let r=Nc(e);if(!Rn.existsSync(r))return;let o=await n.storageState(),s=ha.join(ha.dirname(r),`.${ha.basename(r)}.${process.pid}.${WO(4).toString("hex")}.tmp`);Rn.writeFileSync(s,JSON.stringify(o),{mode:384}),Rn.chmodSync(s,384),Rn.renameSync(s,r),U("[browser/vault] saved session",{profile:e,file:r})}catch(r){U("[browser/vault] save failed",{profile:e,err:r})}}}});import{createHash as zO}from"crypto";function qb(t){return!!(t.role==="textbox"&&t.kind==="password"||t.label&&JO.test(t.label))}function zb(t){return zO("sha256").update(t,"utf8").digest("hex").slice(0,8)}function Jb(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:e.slice(0,77)+"..."}var JO,ba=b(()=>{"use strict";JO=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as VO}from"node:crypto";function YO(t){return t?t.replace(/\s+/g," ").trim().slice(0,200):""}function XO(t,e,n){return`el_${VO("sha256").update(`${t}:${e}:${n}`).digest("hex").slice(0,6)}`}function QO(t){let e=t.replace(/\s+/g," ").trim(),n=4e3;return e.length<=n?e:e.slice(0,n)+"\u2026[truncated]"}function Vb(t){return t.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Xb(t,e){let n=t.role??"",r=t.name??"";Yb.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&e.push(t);for(let s of t.children??[])Xb(s,e)}async function ZO(t){return t.evaluate(e=>{let n=Array.from(document.querySelectorAll(e)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let d=window.getComputedStyle(i);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},Qb).catch(()=>[])}async function e0(t){return t.evaluate(e=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(e)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let g=s.type;g==="checkbox"?c="checkbox":g==="radio"?c="radio":g==="button"||g==="submit"||g==="reset"?c="button":g==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in s?s.value:void 0,u=d!==void 0?String(d):void 0,p=s.disabled??!1,f=i==="input"?s.checked:void 0,m={role:c,name:l,disabled:p};u!==void 0&&(m.value=u),f!==void 0&&(m.checked=f),o.push(m)}return o},Qb).catch(()=>[])}function t0(t){let n=t.accessibility;return n!==null&&typeof n=="object"?n:null}async function wa(t,e){let n=e.maxElements??80,r=e.includeHidden??!1,o=[],s=t0(t),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=ZO(t),l=t.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(t.url()),d=t.title().catch(()=>""),[u,p,f,m,g]=await Promise.all([i,a,l,c,d]),h,w=!1;u!==null?(h=[],Xb(u,h)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,h=(await e0(t)).filter(N=>Yb.has(N.role??"")));let v=new Map;for(let I of p){let N=Vb(I.name),j=v.get(N);(!j||j.bbox.w===0&&I.bbox.w>0)&&v.set(N,I)}let E=h.map(I=>({ax:I,dom:v.get(Vb(I.name??""))})),k=r?E:E.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,N)=>{let j=I.dom?.bbox.y??0,C=N.dom?.bbox.y??0;if(j!==C)return j-C;let $=I.dom?.bbox.x??0,L=N.dom?.bbox.x??0;return $-L}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let T=k.slice(0,n).map((I,N)=>{let j=I.ax.role??"generic",C=I.ax.name??"",$=XO(j,C,N),L=I.dom?.bbox??{x:0,y:0,w:0,h:0},P=I.dom?.type??null,O=null;I.ax.value!==void 0&&I.ax.value!==null&&(O=String(I.ax.value)),I.ax.checked!==void 0&&(O=String(I.ax.checked)),qb({role:j,kind:P})&&(O="[redacted]");let H={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(H.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(H.selected=I.ax.selected),I.ax.expanded!==void 0&&(H.expanded=I.ax.expanded);let F;I.dom?.testId?F=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(F=`#${I.dom.id}`);let B={id:$,role:j,label:YO(C),kind:P,value:O,state:H,bbox:L};return F!==void 0&&(B.selector=F),B}),x="idle";try{let I=await t.evaluate(()=>document.readyState);I==="loading"?x="loading":I==="interactive"?x="navigating":x="idle"}catch{x="navigating"}x!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let S=QO(f),R=`obs_${e.observationCounter.toString(36)}`,M=new Date().toISOString();return{observationId:R,url:m,title:g,textSummary:S,interactive:T,status:{httpStatus:e.httpStatus??null,loadingState:x,hasDialog:e.hasDialog??!1,consoleErrors:e.consoleErrors??0},warnings:o,screenshotPath:e.screenshotPath??null,capturedAt:M}}var Yb,Qb,Zb=b(()=>{"use strict";ba();Yb=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);Qb="a[href], button, input, select, textarea, [role], [tabindex], label"});async function ew(t,e){try{let n=await t.nth(e).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${e}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Tu(t,e){let n=Math.min(e,5);return(await Promise.all(Array.from({length:n},(o,s)=>ew(t,s)))).filter(o=>o!==null)}async function n0(t){let e=new Set,n=[];for(let{loc:r,count:o}of t)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}e.has(i)||(e.add(i),n.push({key:i,locator:r,index:s}))}return n}async function xu(t,e,n){switch(e.kind){case"element_id":return r0(t,e,n);case"selector":return o0(t,e);case"semantic":return s0(t,e)}}async function r0(t,e,n){let r=n.get(e.elementId);if(r===void 0)return{outcome:"not_found",query:e};if(r.selector!==void 0){let l=t.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=t.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:e};if(s===1)return{outcome:"resolved",locator:o};let i=await Tu(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function o0(t,e){let n=t.locator(e.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:e};if(r===1)return{outcome:"resolved",locator:n};let o=await Tu(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${e.selector}]`},candidates:o}}async function s0(t,e){return e.role!==void 0?i0(t,e.text,e.role):a0(t,e.text,e)}async function i0(t,e,n){let r=t.getByRole(n,{name:e}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:e,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Tu(r,o);return{outcome:"ambiguous_target",query:{text:e,role:n},candidates:s}}async function a0(t,e,n){let r=t.getByRole("button",{name:e}),o=t.getByRole("link",{name:e}),s=t.getByLabel(e,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let d=[];i>0&&d.push({loc:r,count:i}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:s,count:l});let u=await n0(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let g=u[0];return g===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:g.locator.nth(g.index)}}let p=u.slice(0,5),f=[];for(let g=0;g<p.length;g++){let h=p[g];if(h===void 0)continue;let w=await ew(h.locator,h.index);if(w!==null){let v=`${w.role}:${w.label}:${g}`,E=0;for(let k=0;k<v.length;k++)E=E*31+v.charCodeAt(k)>>>0;f.push({...w,id:`el_${E.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:e},candidates:f}}var tw=b(()=>{"use strict"});async function Ru(t,e,n,r){let o=t.url();if(o===n)return null;let s=ma(o,e);if(s.allowed)return null;try{await t.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:s.reason}}var nw=b(()=>{"use strict";ga()});import{randomBytes as l0}from"crypto";import{mkdir as c0,stat as d0,writeFile as u0}from"fs/promises";import{join as Cu}from"path";import{gzip as p0}from"zlib";import{promisify as f0}from"util";function m0(t){return Cu(js(t),"browser")}function g0(t){return Cu(m0(t),"screenshots")}function h0(){return new Date().toISOString().replace(/[:.]/g,"-")}function y0(){return l0(3).toString("hex")}async function Iu(t,e,n){if(e.length>rw)throw new Error(`writeScreenshotSidecar: buffer exceeds ${rw} byte cap (received ${e.length} bytes). Refusing to write oversized screenshot.`);let r=g0(t);await c0(r,{recursive:!0});let o=`${h0()}-${y0()}-${n}.png`,s=Cu(r,o);await u0(s,e);let{size:i}=await d0(s);return{path:s,bytes:i}}var VY,rw,ow=b(()=>{"use strict";z();ba();VY=f0(p0);rw=5*1024*1024});var iw={};Cc(iw,{PlaywrightProvider:()=>Pu});function sw(t){switch(t.kind){case"semantic":return t.role!==void 0?`semantic('${t.text}', role='${t.role}')`:`semantic('${t.text}')`;case"element_id":return`element_id(${t.elementId})`;case"selector":return`selector(${t.selector})`}}var Pu,aw=b(()=>{"use strict";Gb();Zb();tw();ga();nw();ow();Pu=class{name="playwright";config;launcher;sessions=new Map;constructor(e){this.config=e,this.launcher=new ya(e)}async open(e){let n=ma(e.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:e.url,reason:n.reason};let{sessionId:r}=e,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(e.url,{timeout:e.timeoutMs??3e4,waitUntil:e.waitFor??"load"})}catch(u){a=u}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let u=await Ru(o,this.config,e.url,()=>this.close({sessionId:r}));if(u!==null)return u}(e.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let d=await wa(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,d.interactive,d.url,d.title,"browser_open"),a!==null)throw a;return d}async observe(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;e.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await wa(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:e.includeHidden,maxElements:e.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=e.timeoutMs??3e4,a=await xu(r,e.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${sw(e.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(e.action){case"click":await l.click({timeout:i});break;case"fill":await l.fill(e.value??"");break;case"press":await l.press(e.value??"");break;case"select":await l.selectOption(e.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await d()}catch(g){if(g instanceof Error&&/navigation|net::ERR/i.test(g.message))try{await d()}catch(h){c=h}else c=g}let u=await Ru(r,this.config,s,()=>this.close({sessionId:n}));if(u!==null)return u;let p=null;(e.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await wa(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),m=`browser_act:${e.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,m),c!==null)throw c;return f}async render(e){return this.launcher.renderHtml(e.url,{timeoutMs:e.timeoutMs??3e4,waitUntil:e.waitFor??"load",signal:e.signal})}async screenshot(e){let{sessionId:n}=e,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(e.target!==void 0){let d=await xu(r,e.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${sw(e.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await d.locator.screenshot()}else s=await r.screenshot({fullPage:e.fullPage??!1});let{path:i,bytes:a}=await Iu(n,s,"browser_screenshot"),l=0,c=0;if(e.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(e){throw new Error("browser_extract not implemented in Phase 1")}async close(e){await this.launcher.closeSession(e.sessionId),this.sessions.delete(e.sessionId)}describe(e){let n=this.sessions.get(e);if(n===void 0)return null;let r=this.launcher.getPage(e);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(e){let n=this.sessions.get(e);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(e,r),r}updateSessionFromObservation(e,n,r,o,s){e.knownElements=new Map(n.map(i=>[i.id,i])),e.currentUrl=r,e.currentTitle=o,e.lastAction=s,e.lastActionAt=new Date().toISOString()}async captureScreenshot(e,n,r){try{let o=await e.screenshot({fullPage:!1}),{path:s}=await Iu(n,o,r);return s}catch{return null}}}});var In={};Cc(In,{__resetBrowserRegistryForTests:()=>k0,browserProviderActive:()=>S0,closeBrowserProvider:()=>Mu,getBrowserProvider:()=>w0,peekBrowserProvider:()=>v0});function lw(){Promise.resolve(Mu()).then(()=>{process.exit(130)})}function cw(){Promise.resolve(Mu()).then(()=>{process.exit(143)})}function dw(){gt=null}function b0(){Sa||(process.on("SIGINT",lw),process.on("SIGTERM",cw),process.on("exit",dw),Sa=!0)}function uw(){Sa&&(process.removeListener("SIGINT",lw),process.removeListener("SIGTERM",cw),process.removeListener("exit",dw),Sa=!1)}async function w0(t){return gt!==null?gt:(Cn!==null||(Cn=(async()=>{let{PlaywrightProvider:e}=await Promise.resolve().then(()=>(aw(),iw)),n=Hb(t),r=new e(n);return b0(),gt=r,Cn=null,r})()),Cn)}async function Mu(){if(gt===null)return;let t=gt;gt=null,Cn=null,uw(),await t.shutdown()}function S0(){return gt!==null}function v0(){return gt}function k0(){gt=null,Cn=null,uw()}var gt,Cn,Sa,Pn=b(()=>{"use strict";ga();gt=null,Cn=null,Sa=!1});async function pw(t,e){try{return await Fb(t,e)}catch(n){return U("[web/scrape] extraction failed",{url:e,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function R0(t,e){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Pn(),In));return(await n()).render({url:t,timeoutMs:e.timeoutMs,signal:e.signal})}async function fw(t,e){let n=e.fetchFn??globalThis.fetch,r=e.renderFn??R0,o=null,s=t,i=null,a=null;try{let c=await fa(n,t,{headers:x0,redirect:"follow",signal:e.signal});i=c.status,s=c.url||t;let d=c.headers.get("content-type")??"";if(c.ok){if(T0.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(E0.test(d)&&!A0.test(d))return{title:"",markdown:u.trim(),finalUrl:s,usedRender:!1};if(o=await pw(u,s),e.signal.aborted)throw e.signal.reason??new Error("aborted")}}catch(c){if(e.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<200)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(t,{timeoutMs:e.timeoutMs,signal:e.signal}),d=await pw(c.html,c.finalUrl);if(e.signal.aborted)throw e.signal.reason??new Error("aborted");if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(e.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${t}: fetch failed (${u}) and render failed (${d}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${t} (HTTP ${i??"error"}).`)}var A0,E0,T0,x0,mw=b(()=>{"use strict";Lb();ku();fe();A0=/(text\/html|application\/xhtml\+xml)/i,E0=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,T0=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,x0={"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 P0(t){let e=t.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await e(C0,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":t.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),I0),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let d=await s.text(),u=ir(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function gw(t){return t.exaApiKey!==void 0&&t.exaApiKey.trim()!==""?P0({apiKey:t.exaApiKey,fetchFn:t.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function hw(t,e){if(e.length===0)return`# Search results for "${t}"
861
861
 
862
862
  (no results)`;let n=[`# Search results for "${t}"`,""];return e.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
863
863
  `).trimEnd()}var C0,I0,yw=b(()=>{"use strict";hn();C0="https://api.exa.ai/search",I0=10});function va(t){if(t instanceof Error&&t.name==="TimeoutError")return"timeout";let e=t instanceof Error?t.message:String(t);return/Timeout\s+\d+\s*ms exceeded/i.test(e)?"timeout":void 0}var Mn=b(()=>{"use strict";Eu()});function N0(t){if(!t||typeof t!="object")return{error:"Invalid input: expected an object"};let e=t,n=e.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof e.query!="string"||e.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=e.query}else{if(typeof e.url!="string"||e.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(e.url)}catch{return{error:`Invalid input: "${e.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=M0;if(e.timeout_ms!==void 0){if(typeof e.timeout_ms!="number"||!Number.isFinite(e.timeout_ms)||e.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(e.timeout_ms,O0)}let a=D0;if(e.max_bytes!==void 0){if(typeof e.max_bytes!="number"||!Number.isFinite(e.max_bytes)||e.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(e.max_bytes,F0)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Ou(t,e){return Buffer.byteLength(t,"utf8")<=e?{content:t,truncated:!1}:{content:Et(t,e),truncated:!0}}function $0(t={}){let e=t.fetchFn??globalThis.fetch,n=t.env??process.env;return async(r,o)=>{if(typeof e!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=N0(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let d=i.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let u;try{u=await fa(e,s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(m){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await u.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}let f=Ou(p,s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let u=await fw(s.url,{fetchFn:e,renderFn:t.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});if(u.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let p=Ou(u.markdown,s.maxBytes);return{content:p.content,...p.truncated?{truncated:!0}:{}}}catch(u){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=u instanceof Error?u.message:String(u),f=Ie(u)&&!_u(p)?` (the render fallback needs the optional Playwright browser \u2014 run \`${To()}\`)`:"";return{content:`web_scrape markdown error: ${p}${f}`,isError:!0}}let d=gw({exaApiKey:n.EXA_API_KEY,fetchFn:e});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(s.query,{limit:L0,timeoutMs:s.timeoutMs,signal:i.signal}),p=Ou(hw(s.query,u),s.maxBytes);return{content:p.content,...p.truncated?{truncated:!0}:{}}}catch(u){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var M0,O0,D0,F0,L0,bw,ww=b(()=>{"use strict";mw();yw();ku();cr();Mn();M0=3e4,O0=12e4,D0=1e5,F0=1e6,L0=10;bw=$0()});import{existsSync as vw,mkdirSync as U0,readFileSync as B0,renameSync as H0,unlinkSync as j0,writeFileSync as W0}from"node:fs";import{dirname as Sw,join as K0}from"node:path";import{randomBytes as G0}from"node:crypto";function fr(t){let e=t??Oc();if(!vw(e))return[];try{let n=B0(e,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${e}: ${r}`),[]}}function ka(t,e){let n=e??Oc();U0(Sw(n),{recursive:!0});let r=K0(Sw(n),`.schedules.json.${process.pid}.${G0(4).toString("hex")}.tmp`),o=JSON.stringify(t,null,2);try{W0(r,o,"utf-8"),H0(r,n)}catch(s){try{vw(r)&&j0(r)}catch{}throw s}}function kw(t,e){let n=fr(e),r=n.map(l=>l.id),o=q0(t.name),s=z0(o,r),i=new Date().toISOString(),a={...t,notifyOn:t.notifyOn??"failure",id:s,createdAt:i,updatedAt:i};return n.push(a),ka(n,e),a}function _w(t,e){let n=fr(e),r=n.length,o=n.filter(s=>s.id!==t);return o.length===r?!1:(ka(o,e),!0)}function Aw(t,e){return fr(e).find(n=>n.id===t)}function q0(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function z0(t,e){if(!e.includes(t))return t;let n=2;for(;e.includes(`${t}-${n}`);)n+=1;return`${t}-${n}`}var Ew=b(()=>{"use strict";z()});import{existsSync as J0,readFileSync as V0}from"node:fs";import{join as Y0}from"node:path";async function xo(t,e,n){let r;try{let o=Y0(Em("default"),"port");if(!J0(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=V0(o,"utf-8").trim();if(r=parseInt(s,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${e}`,{method:t,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:t==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:t==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var Du,Tw=b(()=>{"use strict";z();Du="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as X0}from"node:fs";import{readFile as Q0}from"node:fs/promises";var xw,Rw,Cw,Iw,Pw=b(()=>{"use strict";Ew();z();Tw();xw=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let s=kw({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),i=s.enabled?await xo("POST","/tasks",{taskId:s.id,command:s.command,cron:s.cron,trigger:s.trigger,notifyOn:s.notifyOn,...s.notifyChat!==void 0?{notifyChat:s.notifyChat}:{}}):await xo("DELETE",`/tasks/${s.id}`);return{content:JSON.stringify({id:s.id,name:s.name,cron:s.cron,enabled:s.enabled,daemonSynced:i.synced,syncDetail:i.detail,...i.synced?{}:{syncNote:Du}})}},Rw=async(t,e)=>{let n=fr();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},Cw=async(t,e)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected object",isError:!0};let n=t;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,s=Fs();if(!X0(s))return{content:JSON.stringify([])};let i;try{let c=await Q0(s);i=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=i.split(`
@@ -1108,7 +1108,7 @@ ${e}`:s,a=new Q({parentAbortSignal:n?.abortSignal,...r?.traceWriter!==void 0?{tr
1108
1108
  `),0}let r=0;for(let o of n){if(!o.isDirectory()||o.name.startsWith("_")||o.name.startsWith("."))continue;let s;try{s=p$(q_(t,o.name,"SKILL.md"),"utf-8")}catch(c){let d=c;d.code!=="ENOENT"&&process.stderr.write(`[afk] skipping skill ${o.name}: ${d.message}
1109
1109
  `);continue}let i=m$(s,o.name);if(!i)continue;i.dir=q_(t,o.name);let l={name:h$(i.name,e),description:i.description,handler:g$(i),origin:e};i.argumentHint&&(l.argumentHint=i.argumentHint),i.flags&&i.flags.length>0&&(l.flags=i.flags),i.context!=="fork"&&(l.context="load",l.loadBody=i.body.replace(/\$\{?SKILL_ROOT\}?/g,()=>i.dir)),Ce(l),r++}return r}var z_,pf=b(()=>{"use strict";z();lt();G_();be();z_=1024});var J_=b(()=>{"use strict";m_();g_();B_();H_();j_();pf()});import{isAbsolute as y$,resolve as b$}from"path";import{pathToFileURL as w$}from"url";async function Y_(t,e={}){let n=e.importer??(r=>import(r));for(let r of t){if(r.main===void 0)continue;let o=y$(r.main)?r.main:b$(r.path,r.main);if(!V_.has(o)){V_.add(o);try{let i=(await n(w$(o).href))?.default;typeof i=="function"&&await i(e.pluginApi)}catch(s){e.onError?.(r,s)}}}}var V_,X_=b(()=>{"use strict";V_=new Set});import{existsSync as S$,readFileSync as v$}from"fs";import{join as k$}from"path";function Q_(t){let e=k$(t,".claude-plugin","plugin.json");if(!S$(e))return{name:null,version:null};try{let n=JSON.parse(v$(e,"utf8"));return{name:typeof n.name=="string"&&n.name.trim()?n.name.trim():null,version:typeof n.version=="string"&&n.version.trim()?n.version.trim():null}}catch{return{name:null,version:null}}}var Z_=b(()=>{"use strict"});import{z as D}from"zod";var ls,_$,A$,ff,eA,tA,nA,rA,cs,Hl=b(()=>{"use strict";ls=1,_$=D.object({toolName:D.string(),toolUseId:D.string().optional(),input:D.string().optional(),inputRaw:D.string().optional(),result:D.string().optional(),isError:D.boolean().optional()}).passthrough(),A$=D.object({user:D.string().default(""),assistant:D.string().default(""),timestamp:D.number().optional(),toolEvents:D.array(_$).optional()}).passthrough(),ff=D.object({sessionId:D.string().optional(),name:D.string().optional(),source:D.enum(["cli","telegram"]).optional(),telegramChatId:D.number().optional(),model:D.string(),startedAt:D.number(),savedAt:D.number(),totalTurns:D.number(),totalCostUsd:D.number().optional(),totalTokens:D.number().optional(),totalDurationMs:D.number().optional(),turns:D.array(A$).default([]),forkedFrom:D.string().optional(),forkedAt:D.number().optional()}).passthrough(),eA=D.enum(["fully_achieved","partially_achieved","not_achieved","aborted"]),tA=D.enum(["not_persisted","persisted","unknown"]),nA=D.object({tool:D.string(),label:D.string().optional()}),rA=D.object({files_written:D.number().int(),files_edited:D.number().int(),bash_commands:D.number().int(),commits:D.number().int(),mutated:D.boolean()}),cs=D.object({facet_version:D.number().int(),session_id:D.string(),source:D.enum(["cli","telegram","unknown"]),model:D.string(),derived_at:D.string(),derived_from:D.literal("afk-session"),source_session_path:D.string(),source_session_mtime_ms:D.number(),subagent_persistence:tA,start_time:D.string(),end_time:D.string(),duration_minutes:D.number(),underlying_goal:D.string(),first_prompt:D.string(),goal_categories:D.record(D.string(),D.number()),session_type:D.string(),brief_summary:D.string(),total_turns:D.number().int(),user_message_count:D.number().int(),assistant_message_count:D.number().int(),tool_counts:D.record(D.string(),D.number()),commands:D.array(D.string()),skills:D.array(D.string()),subagents:D.array(nA),tool_errors:D.number().int(),tool_error_categories:D.record(D.string(),D.number()),friction_counts:D.record(D.string(),D.number()),friction_detail:D.string(),outcome:eA,primary_success:D.string(),world_changes:rA,decisions:D.array(D.string()),evidence_pointers:D.array(D.string())}).passthrough()});import{basename as E$}from"path";function P$(t){if(t)try{let e=JSON.parse(t);return e&&typeof e=="object"?e:void 0}catch{return}}function jl(t){return typeof t=="string"?t:void 0}function Wl(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}function M$(t){return t.replace(/[-_]+/g," ").trim()}function O$(t,e){return sA.test(t)?"slash_command":e==="telegram"?"chat":"task"}function D$(t){let e=new Map,n=[];for(let r of t)r.toolUseId===void 0?n.push(r):e.set(r.toolUseId,r);return[...e.values(),...n]}function ds(t,e={}){let n=t.turns??[],r=D$(n.flatMap(L=>L.toolEvents??[])),o={},s={},i=[],a=[],l=[],c=0,d=0,u=0,p=0,f=0;for(let L of r){let P=L.toolName;o[P]=(o[P]??0)+1,L.isError===!0&&(c+=1,s[P]=(s[P]??0)+1);let O=P$(L.inputRaw??L.input);if(P==="write_file"&&(d+=1),P==="edit_file"&&(u+=1),P==="bash"){p+=1;let H=jl(O?.command)??L.input;H&&I$.test(H)&&(f+=1)}if(x$.has(P)){let H=jl(O?.file_path);H&&!l.includes(H)&&l.length<C$&&l.push(H)}if(T$.has(P)){let H;P==="skill"?(H=jl(O?.name),H&&!a.includes(H)&&a.push(H)):P==="agent"?H=jl(O?.id_prefix):H="compose",i.push(H?{tool:P,label:H}:{tool:P})}}let m=n[0]?.user??"",g=t.source??"cli",h=O$(m,g),w=[];for(let L of n){let O=sA.exec(L.user??"")?.[1];O&&!w.includes(O)&&w.push(O)}let v=n.filter(L=>(L.user??"").trim().length>0).length,E=n.filter(L=>(L.assistant??"").trim().length>0).length,k=[...n].reverse().find(L=>(L.assistant??"").trim().length>0)?.assistant??"",A;n.length===0?A="aborted":k.trim().length===0?A="partially_achieved":A="fully_achieved";let x=A==="fully_achieved"||A==="partially_achieved"?Wl(k||m||h,160)||h:"none",S=c>0?`${c} tool error(s): ${Object.entries(s).map(([L,P])=>`${L}\xD7${P}`).join(", ")}`:"",R=t.name?M$(t.name):Wl(m,80),M=Wl(k||m,R$),I=Wl(R?`${R} \u2014 ${M}`:M,400)||"empty session",N=t.sessionId??(e.sourceSessionPath?E$(e.sourceSessionPath,".json"):"unknown"),j=t.totalDurationMs&&t.totalDurationMs>0?t.totalDurationMs:Math.max(0,t.savedAt-t.startedAt),C=e.sourceSessionPath?[...l,e.sourceSessionPath]:l,$={facet_version:ls,session_id:N,source:g==="telegram"?"telegram":"cli",model:t.model,derived_at:(e.derivedAt??new Date).toISOString(),derived_from:"afk-session",source_session_path:e.sourceSessionPath??"",source_session_mtime_ms:e.sourceSessionMtimeMs??t.savedAt,subagent_persistence:"not_persisted",start_time:new Date(t.startedAt).toISOString(),end_time:new Date(t.savedAt).toISOString(),duration_minutes:Number((j/6e4).toFixed(2)),underlying_goal:m.slice(0,oA),first_prompt:m.slice(0,oA),goal_categories:{[h]:1},session_type:h,brief_summary:I,total_turns:n.length,user_message_count:v,assistant_message_count:E,tool_counts:o,commands:w,skills:a,subagents:i,tool_errors:c,tool_error_categories:s,friction_counts:{...s},friction_detail:S,outcome:A,primary_success:x,world_changes:{files_written:d,files_edited:u,bash_commands:p,commits:f,mutated:d>0||u>0||f>0},decisions:[],evidence_pointers:C};return cs.parse($)}var T$,x$,oA,R$,C$,I$,sA,mf=b(()=>{"use strict";Hl();T$=new Set(["agent","compose","skill"]),x$=new Set(["read_file","write_file","edit_file"]),oA=1e3,R$=240,C$=50,I$=/\bgit\s+commit(?![\w-])/,sA=/^\s*\/([a-zA-Z][\w-]*)/});import{existsSync as Kl,mkdirSync as F$,readFileSync as iA,readdirSync as L$,renameSync as N$,statSync as $$,writeFileSync as U$}from"fs";import{basename as B$,dirname as H$,join as aA}from"path";function lA(t,e){return Hs(t),aA(e,`${t}.json`)}function j$(t,e){return Hs(t),aA(e,`${t}.json`)}function Gl(t,e=_e()){let n=lA(t,e);if(Kl(n))try{let r=JSON.parse(iA(n,"utf8")),o=ff.safeParse(r);return o.success?o.data:void 0}catch{return}}function W$(t){if(Kl(t))try{let e=JSON.parse(iA(t,"utf8")),n=cs.safeParse(e);return n.success?n.data:void 0}catch{return}}function K$(t,e){F$(H$(t),{recursive:!0});let n=`${t}.${process.pid}.tmp`;U$(n,`${JSON.stringify(e,null,2)}
1110
1110
  `,"utf8"),N$(n,t)}function G$(t,e){return t.facet_version===ls&&t.source_session_mtime_ms===e}function gf(t,e={}){let n=e.sessionsDir??_e(),r=e.cacheDir??hm(),o=lA(t,n);if(!Kl(o))return;let s=$$(o).mtimeMs,i=j$(t,r);if(!e.force){let c=W$(i);if(c&&G$(c,s))return c}let a=Gl(t,n);if(!a)return;let l=ds(a,{sourceSessionPath:o,sourceSessionMtimeMs:s});return K$(i,l),l}function hf(t={}){let e=t.sessionsDir??_e();return Kl(e)?L$(e).filter(n=>n.endsWith(".json")).map(n=>B$(n,".json")):[]}var cA=b(()=>{"use strict";z();mf();Hl()});var dA=b(()=>{"use strict";Hl();mf();cA()});import{readFileSync as q$}from"node:fs";import{join as z$}from"node:path";function ul(t,e){let n=os(t,e),r=e?.excludeName,o=r!==void 0&&r.length>0?n.filter(i=>i.name!==r&&!i.name.endsWith(`:${r}`)):n;if(o.length===0)return"";let s=[];for(let i of o){let a=i.argumentHint?`${i.argumentHint}`:"",l=a?`- \`${i.name} ${a}\`: ${i.description}`:`- ${i.name}: ${i.description}`;s.push(l),i.whenToUse&&s.push(` When to use: ${i.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either dispatches one or more context-isolated subagents (delegation \u2014 preserves the main session's context) or loads its instructions directly into your current context (`load` mode). Calling `skill` is the entry point for both; the executor picks the mode per skill. Prefer a skill over inline investigation when the task shape matches.","",...s].join(`
1111
- `)}function os(t,e){let n=[],r=new Set,o=_.AFK_INTERNAL==="1",s=lo(ao());as(Ls(),"user"),Kh("project"),as(bm(e?.cwd),"project");for(let{dir:a,origin:l}of s.skillRoots)as(a,l);for(let a of Md()){let l=At(a);Pd(l,o)&&(n.push({name:a,description:l.description,source:l.origin==="user"?"user":l.origin==="project"?"project":l.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:l.argumentHint,whenToUse:l.whenToUse}),r.add(a))}let i=t??ql(e);for(let a of i){if(a.type!=="local")continue;let l=Bp(a.path);for(let c of l)!c.name||r.has(c.name)||Pd({audience:c.audience},o)&&(n.push({name:c.name,description:c.description??`Skill from plugin at ${a.path}`,source:"plugin"}),r.add(c.name))}return n}function ss(t,e){let n=new Map,r=t??ql(e);for(let o of r){if(o.type!=="local")continue;let s=Bp(o.path);for(let i of s)i.name&&i.body&&i.body.length>0&&!n.has(i.name)&&n.set(i.name,{body:i.body,pluginPath:o.path,...i.allowedTools!==void 0?{allowedTools:i.allowedTools}:{},...i.context!==void 0?{context:i.context}:{},...i.readOnly===!0?{readOnly:!0}:{},...i.model!==void 0?{model:i.model}:{}})}return n}function uA(t){let e=t??ql(),n=[],r=new Set;for(let o of e){if(o.type!=="local")continue;let s=Q_(o.path).name;if(s!==null)for(let i of _l(z$(o.path,"agents"))){let a;try{a=q$(i,"utf8")}catch{continue}let l=$n(a);if(l===void 0)continue;let c=`${s}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${s}`,filePath:i,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function ql(t){return[...Pt(wm(t?.cwd)),...Pt(),...Pt(vm()),...lo(ao()).pluginRoots.flatMap(({dir:e,binary:n})=>Pt(e,{trustAll:!0,sourceEnabled:_h(n)}))]}async function pA(){await Y_(ql(),{pluginApi:{registerSkill:Ce,listSkills:Md,getSkill:At,loadSkillPrompts:ce,env:_,SubagentManager:Q,describeFailure:ke,discoverPluginSkillBodies:ss,getAgentFrameworkDir:bt,getSkillsDir:Ls,getSessionsDir:_e,getOrDeriveFacet:gf,listSessionIds:hf,deriveSessionFacet:ds,loadStoredSession:Gl}})}var Vt=b(()=>{"use strict";J_();lt();ze();pf();Nl();X_();es();Z_();ts();Yp();be();Te();dA();z();W();xi()});function dl(){try{let t=os();return Promise.resolve(t.map(e=>{let n={name:e.name,description:e.description};return e.argumentHint&&(n.argumentHint=e.argumentHint),n}))}catch{return Promise.resolve([])}}var Ip=b(()=>{"use strict";Vt()});function zl(t){if(t.length===0)return;let e=t[t.length-1];if(!e||e.role!=="assistant"||typeof e.content=="string")return;let n=e.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};t.push(o)}var yf=b(()=>{"use strict"});function fA(t){return{messages:t.initialMessages?[...t.initialMessages]:[],currentModel:t.model,requestedModel:t.requestedModel??t.model,currentPermissionMode:t.permissionMode,userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:t.autoCompactThreshold}}var mA=b(()=>{"use strict"});function V$(t,e,n,r,o){let s=J$.get(t);if(!s)return;let i=1e6,l=Math.max(0,e-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,f=r/i*u;return l+c+p+f}function gA(t,e,n){if(!t)return{stopReason:e??null};let r={inputTokens:t.input_tokens,outputTokens:t.output_tokens,stopReason:e??null};if(t.cache_read_input_tokens!=null&&(r.cachedInputTokens=t.cache_read_input_tokens),t.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=t.cache_creation_input_tokens),r.totalTokens=(t.input_tokens??0)+(t.output_tokens??0),n){let o=V$(n,t.input_tokens??0,t.output_tokens??0,t.cache_read_input_tokens??0,t.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var J$,hA=b(()=>{"use strict";rp();J$=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5}],["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]])});function Y$(t){let e=t.trim();if(e.length===0)return{};try{return JSON.parse(e)}catch{return{}}}function X$(t,e,n){let r=[],o=[];for(let a of t)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:Y$(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:e,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*yA(t,e){let n=[],r=null,o=null,s=!1,i=!!_.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let a of t){switch(i&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="redacted_thinking"?n[a.index]={kind:"redacted_thinking",data:l.data}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:e.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:e.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:e.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:e.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}i&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(a){i&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}if(!s&&r===null){yield{kind:"event",event:{type:"error",error:new it("the model stream ended without a terminal message (no message_stop and no stop_reason): the response was cut off mid-stream, typically an intermediary closing the connection. The turn is incomplete.")}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:X$(n,r,o)}}var bA=b(()=>{"use strict";W();le()});function SA(){let t=_.AFK_MODEL_TTFB_TIMEOUT_MS;if(t===void 0||t.trim()==="")return wA;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?wA:e}function vA(t,e){if(e<=0)return{signal:t,timedOut:()=>!1,firstByteSeen:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([t,n.signal]),o=!1,s=!1,i=setTimeout(()=>{o=!0,n.abort(new Error(Q$))},e);i.unref();let a=()=>{s||(s=!0,clearTimeout(i))};return{signal:r,timedOut:()=>o,firstByteSeen:a,dispose:a}}var wA,Q$,kA=b(()=>{"use strict";W();wA=18e4;Q$="model_ttfb_timeout"});import{randomUUID as Z$}from"node:crypto";function eU(t){let{name:e,description:n,input_schema:r}=t;return{name:e,...n!==void 0?{description:n}:{},input_schema:r}}function rU(t){if(!("status"in t))return!1;let e=t.status;return e===529||e===503}function _A(t){if(t===null||typeof t!="object")return!1;let e=t;if(e.status===529||e.status===503)return!0;let n=e.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}async function oU(t,e,n,r,o){for(let s=0;;s++){if(s>0){let i=EA*Math.pow(2,s-1);if(await Ct(i,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(t.messages.create(e,{headers:n,signal:r}))}catch(i){if(r.aborted)throw i;let a=i instanceof Error?i:new Error(String(i));if(rU(a)&&s<bf)continue;throw a}}}async function*AA(t,e){Y(t.traceWriter,{phase:"rate_limit",durationMs:Date.now()-e,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:t.model}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId}}async function*sU(t,e){let n=e.throttleQueue;if(!n)return await t;n.resetAttempts();let r=Symbol("create-done"),o=!1,s=t.then(i=>(o=!0,i),i=>{throw o=!0,i});for(;;){for(let a of n.takeAll())yield{type:"rate_limit",sessionId:e.ctx.sessionId,status:a.status,attempt:a.attempt,...a.retryAfterMs!==void 0?{retryAfterMs:a.retryAfterMs}:{}};if(o)return await s;await Promise.race([s.then(()=>r,()=>r),n.waitForItem().then(()=>{})])}}async function*wf(t){let e=il(t.maxToolUseIterations),n={stopReason:null},r=0,o=0,s=!1,i=0,a=0,l=SA(),c=!1,d=Z$(),u=Date.now(),p=g=>({...g,durationMs:Date.now()-u});Y(t.traceWriter,{phase:"loop_start"});let f=t.signal.aborted?Date.now():null,m=()=>{f===null&&(f=Date.now())};t.traceWriter&&!t.signal.aborted&&t.signal.addEventListener("abort",m,{once:!0});try{for(;;){if(t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let g=to({baseUrl:t.baseUrl})?sh(t.messages,no()):t.messages,h={model:t.model,max_tokens:t.maxTokens,messages:g,stream:!0,...t.system!==null?{system:t.system}:{},...t.tools!==null&&t.tools.length>0&&!s?{tools:t.tools.map(eU)}:{},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{output_config:{effort:t.effort}}:{}},w=Date.now(),v=vA(t.signal,l),E=!1,k;try{k=yield*sU(oU(t.client,h,t.headers,v.signal,t.signal),t)}catch(C){if(v.timedOut()&&!t.signal.aborted&&!c)v.dispose(),E=!0;else{if(v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let $=C instanceof Error?C:new Error(String(C));$.message.includes("thinking")&&iU(t.messages,$),yield{type:"error",error:$};return}}if(E){yield*AA(t,w),c=!0;continue}let A=null,T=!1,x=!1,S=!1,R=!1;try{_.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let C of yA(_r(k,t.signal),t.ctx))if(!R&&(C.kind==="turn-result"||C.event.type!=="error")&&(R=!0,v.firstByteSeen(),Y(t.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-w,resolvedModel:t.model})),_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",C.kind,C.kind==="event"?C.event.type:""),C.kind==="event"){if(C.event.type==="error"){if(v.timedOut()&&!t.signal.aborted&&!c&&!R){E=!0;break}if(_A(C.event.error)&&i<bf&&!t.signal.aborted){x=!0;break}if(t.signal.aborted)break;if(C.event.error instanceof it&&a<tU&&!t.signal.aborted){S=!0;break}yield C.event,T=!0;break}yield C.event}else{A=C.result;break}_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",A?"set":"null")}catch(C){if(v.timedOut()&&!t.signal.aborted&&!c&&!R)v.dispose(),E=!0;else{if(v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let $=C instanceof Error?C:new Error(String(C));if(_A($)&&i<bf&&!t.signal.aborted)x=!0;else{yield{type:"error",error:$};return}}}if(v.dispose(),E){yield*AA(t,w),c=!0;continue}if(x){if(i+=1,Y(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:i}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await Ct(EA*Math.pow(2,i-1),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}continue}if(S){if(a+=1,Y(t.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:a}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await Ct(nU*Math.pow(2,a-1),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}continue}if(i=0,a=0,c=!1,T){t.signal.aborted&&(yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId});return}if(A===null){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let M=gA(A.usage,A.stopReason,t.model);if(n=Po(n,M),n.contextWindowTokens=(M.inputTokens??0)+(M.outputTokens??0)+(M.cachedInputTokens??0)+(M.cacheCreationTokens??0),t.onUsageProgress?.(n),A.stopReason!=="tool_use"){if(A.stopReason==="refusal"){yield{type:"assistant.message",text:A.text.length>0?A.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:t.ctx.sessionId},yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}A.text.length>0&&(yield{type:"assistant.message",text:A.text,sessionId:t.ctx.sessionId},A.text.length<=200&&(yield{type:"suggestion",suggestion:A.text,sessionId:t.ctx.sessionId}));let C=A.assistantBlocks.filter($=>$.type!=="tool_use");C.length>0&&t.messages.push({role:"assistant",content:C}),yield{type:"turn.completed",usage:p(s?{...n,stopReason:Jt}:n),sessionId:t.ctx.sessionId};return}let I=t.messages.length;t.messages.push({role:"assistant",content:A.assistantBlocks});try{o+=A.toolUseBlocks.length;let C=[],$=new Map;for(let F of A.toolUseBlocks){C.push({id:F.id,name:F.name,input:F.input,signal:t.signal});let B=Date.now();$.set(F.id,B),Yn(t.traceWriter,rl({toolUseId:F.id,name:F.name,input:F.input,subagentId:t.subagentId})),yield{type:"tool.use.start",toolUseId:F.id,toolName:F.name,toolInput:Ln(F.name,F.input),toolInputRaw:nl(F.input),sessionId:t.ctx.sessionId}}if(t.signal.aborted){let F=C.map(B=>({type:"tool_result",tool_use_id:B.id,content:"Tool call aborted",is_error:!0}));t.messages.push({role:"user",content:F}),yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let L;if(t.toolDispatcher.executeBatch)try{L=await t.toolDispatcher.executeBatch(C)}catch(F){L=C.map(()=>({content:`Tool batch execution failed: ${F instanceof Error?F.message:String(F)}`,isError:!0}))}else{L=[];for(let F of C){if(t.signal.aborted){L.push({content:"Tool call aborted",isError:!0});continue}try{L.push(await t.toolDispatcher.execute(F))}catch(B){let G=B instanceof Error?B.message:String(B);L.push({content:`Tool execution threw: ${G}`,isError:!0})}}}let P=[];for(let F=0;F<C.length;F++){let B=C[F],G=L[F],de=$.get(B.id),re=typeof de=="number"?Date.now()-de:0,ue=G.truncated===!0||G.content.includes("[output truncated");Yn(t.traceWriter,ol({toolUseId:B.id,name:B.name,result:G,truncated:ue,durationMs:re,subagentId:t.subagentId})),yield{type:"tool.output",toolUseId:B.id,toolName:B.name,content:G.content,...G.isError===!0?{isError:!0}:{},...ue?{truncated:!0}:{},...G.incomplete===!0?{incomplete:!0}:{},...G.incompleteReason?{incompleteReason:G.incompleteReason}:{},...typeof G.batchIndex=="number"&&typeof G.batchSize=="number"?{batchIndex:G.batchIndex,batchSize:G.batchSize}:{},sessionId:t.ctx.sessionId},G.render?.diff&&(yield{type:"tool.diff",toolUseId:B.id,diff:G.render.diff,sessionId:t.ctx.sessionId});let{content:xe,isError:Dt,image:te}=G,se=te!==void 0?[{type:"image",source:{type:"base64",media_type:te.mediaType,data:te.data}},...xe.length>0?[{type:"text",text:xe}]:[]]:xe;P.push({type:"tool_result",tool_use_id:B.id,content:se,...Dt===!0?{is_error:!0}:{}})}let O={role:"user",content:P};t.messages.push(O);let H=L.find(F=>F.failureClass===ur);if(H){yield{type:"error",error:new Kn(H.content)};return}}catch(C){throw t.messages.splice(I),C}r+=1;let N=A.toolUseBlocks[A.toolUseBlocks.length-1],j=N?`${N.name}${Ln(N.name,N.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:d,description:"Working",summary:`round ${r}: ${j}`,lastToolName:N?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-u},sessionId:t.ctx.sessionId},s){yield{type:"turn.completed",usage:p({...n,stopReason:Jt}),sessionId:t.ctx.sessionId};return}if(al(r,e)){let C=t.messages[t.messages.length-1];C!==void 0&&C.role==="user"&&Array.isArray(C.content)&&C.content.push({type:"text",text:sl}),s=!0;continue}}}finally{t.signal.removeEventListener("abort",m),f!==null&&t.signal.reason==="interrupted"&&Y(t.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-f,metadata:{provider:"anthropic-direct"}}),Y(t.traceWriter,{phase:"loop_end",durationMs:Date.now()-u})}}function iU(t,e){try{let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let a=s[i];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",e.message),console.error(`[afk] messages.length=${t.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var bf,EA,tU,nU,TA=b(()=>{"use strict";hA();vi();bA();le();Ya();ne();Ap();W();ll();kA();tl();Jo();Ep();la();le();Jo();bf=3,EA=5e3,tU=2,nU=1e3});var xA=b(()=>{"use strict";Xn()});import{randomUUID as aU}from"node:crypto";var RA,lU,cU,dU,uU,pU,Jl,CA=b(()=>{"use strict";TA();an();vi();yi();xA();ll();ne();RA=7200*1e3,lU=3,cU=12e4,dU=5e3,uU=1e3,pU=60*1e3,Jl=class{_client;_authMode;initSessionId;baseUrl;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(e){this._client=e.client,this._authMode=e.authMode,this.initSessionId=e.initSessionId,this.baseUrl=e.baseUrl,this.tokenRefresher=e.tokenRefresher,this.autoResumeOnUsageLimit=e.autoResumeOnUsageLimit}get client(){return this._client}rotateHeaders(){return Ut(this._authMode,this.initSessionId,aU(),void 0,Si({...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{}}))}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let e=Ue(),n=null;try{if(this.refreshPromise)n=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{n=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{return this.refreshPromise=null,null}if(!n)return null;this._client=n;let r=Ue();return{accountId:Zr(r??""),swapped:e!==r}}async*turnWithRetries(e,n){yield*this.turnWithUsageLimitRetry(e,n)}async*turnWithUsageLimitRetry(e,n){let r=null,o=null,s=!1,i=0;for(;;){let u,p=!1;for await(let g of this.turnWithAuthRetry(e,n)){if(g.type==="error"){let h=hi(g.error);if(h&&h.kind==="oauth-limit"){o=h.resetsAt,r=g;break}if(h&&h.kind==="oauth-limit-no-ts"){s=!0,r=g;break}if(h&&h.kind==="rate-limit-transient"&&i<lU){p=!0,u=h.retryAfterMs;break}}yield g}if(!p)break;if(i+=1,n()||e.signal.aborted)return;let m=Math.min(u??dU,cU)+Math.floor(Math.random()*uU);if(Y(e.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:i,waitMs:m}}),await Ct(m,e.signal),n()||e.signal.aborted)return;e.headers=this.rotateHeaders()}if(!r)return;if(s){let u=Zr(Ue()??"");if(yield{type:"paused",reason:"usage-limit",accountId:u,autoResume:this.autoResumeOnUsageLimit},Y(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!1,autoResume:this.autoResumeOnUsageLimit}}),!this.autoResumeOnUsageLimit){yield r;return}let p=Date.now(),f=!1;for(;;){let m;if(this.usageLimitWaitPromise)m="aborted";else{this.usageLimitWaitPromise=Vg({signal:e.signal,retryAfterMs:pU});try{m=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(m==="aborted")return;let g=u;if(m==="hot-swap"){let w=await this.forceClientRefresh();w&&(e.client=this._client,g=w.accountId)}e.headers=this.rotateHeaders();let h=null;for await(let w of this.turnWithAuthRetry(e,n)){if(!f&&w.type==="error"){let v=hi(w.error);if(v&&(v.kind==="oauth-limit"||v.kind==="oauth-limit-no-ts")){h=w;break}}f||(yield{type:"resumed",hotSwapped:m==="hot-swap",accountId:g},Y(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-p,metadata:{source:"retry-layer",hotSwapped:m==="hot-swap"}}),f=!0),yield w}if(!h)return;if(Date.now()-p>RA){yield h;return}}}if(!o)return;if(o.getTime()-Date.now()>RA){yield r;return}let a=Zr(Ue()??""),l=Date.now();if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},Y(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!0,autoResume:this.autoResumeOnUsageLimit,resetsAt:o.toISOString()}}),!this.autoResumeOnUsageLimit){yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Jg({resetsAt:o,signal:e.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let d=a;if(c==="hot-swap"){let u=await this.forceClientRefresh();u&&(e.client=this._client,d=u.accountId)}e.headers=this.rotateHeaders(),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:d},Y(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-l,metadata:{source:"retry-layer",hotSwapped:c==="hot-swap"}}),yield*this.turnWithAuthRetry(e,n)}async*turnWithAuthRetry(e,n){let r=null;for await(let s of wf(e)){if(n())return;if(s.type==="error"&&this.isRetryableAuth(s.error)){r=s;break}yield s}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}e.client=this._client,e.headers=this.rotateHeaders(),yield*wf(e)}isRetryableAuth(e){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in e&&e.status===401}}});function fU(t){if(t.role!=="user")return!1;let e=t.content;if(typeof e=="string")return!0;if(!Array.isArray(e))return!1;for(let n of e)if(n.type==="tool_result")return!1;return!0}function mU(t){let n=[(t.role==="user"?"User":"Assistant")+":"];if(typeof t.content=="string")n.push(t.content);else if(Array.isArray(t.content))for(let r of t.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let s=r.name??"unknown",i=FA(r.input);n.push(`[tool call: ${s} ${i}]`)}else if(o==="tool_result"){let s=r.content;n.push(`[tool result: ${LA(s)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
1111
+ `)}function os(t,e){let n=[],r=new Set,o=_.AFK_INTERNAL==="1",s=lo(ao());as(Ls(),"user"),Kh("project"),as(bm(e?.cwd),"project");for(let{dir:a,origin:l}of s.skillRoots)as(a,l);for(let a of Md()){let l=At(a);Pd(l,o)&&(n.push({name:a,description:l.description,source:l.origin==="user"?"user":l.origin==="project"?"project":l.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:l.argumentHint,whenToUse:l.whenToUse}),r.add(a))}let i=t??ql(e);for(let a of i){if(a.type!=="local")continue;let l=Bp(a.path);for(let c of l)!c.name||r.has(c.name)||Pd({audience:c.audience},o)&&(n.push({name:c.name,description:c.description??`Skill from plugin at ${a.path}`,source:"plugin"}),r.add(c.name))}return n}function ss(t,e){let n=new Map,r=t??ql(e);for(let o of r){if(o.type!=="local")continue;let s=Bp(o.path);for(let i of s)i.name&&i.body&&i.body.length>0&&!n.has(i.name)&&n.set(i.name,{body:i.body,pluginPath:o.path,...i.allowedTools!==void 0?{allowedTools:i.allowedTools}:{},...i.context!==void 0?{context:i.context}:{},...i.readOnly===!0?{readOnly:!0}:{},...i.model!==void 0?{model:i.model}:{}})}return n}function uA(t){let e=t??ql(),n=[],r=new Set;for(let o of e){if(o.type!=="local")continue;let s=Q_(o.path).name;if(s!==null)for(let i of _l(z$(o.path,"agents"))){let a;try{a=q$(i,"utf8")}catch{continue}let l=$n(a);if(l===void 0)continue;let c=`${s}:${l.name}`;r.has(c)||(r.add(c),n.push({name:c,definition:l.definition,source:`plugin:${s}`,filePath:i,...l.bashReadOnly===!0?{bashReadOnly:!0}:{},...l.ignoredKeys!==void 0?{ignoredKeys:l.ignoredKeys}:{}}))}}return n}function ql(t){return[...Pt(wm(t?.cwd)),...Pt(),...Pt(vm()),...lo(ao()).pluginRoots.flatMap(({dir:e,binary:n})=>Pt(e,{trustAll:!0,sourceEnabled:_h(n)}))]}async function pA(){await Y_(ql(),{pluginApi:{registerSkill:Ce,listSkills:Md,getSkill:At,loadSkillPrompts:ce,env:_,SubagentManager:Q,describeFailure:ke,discoverPluginSkillBodies:ss,getAgentFrameworkDir:bt,getSkillsDir:Ls,getSessionsDir:_e,getOrDeriveFacet:gf,listSessionIds:hf,deriveSessionFacet:ds,loadStoredSession:Gl}})}var Vt=b(()=>{"use strict";J_();lt();ze();pf();Nl();X_();es();Z_();ts();Yp();be();Te();dA();z();W();xi()});function dl(){try{let t=os();return Promise.resolve(t.map(e=>{let n={name:e.name,description:e.description};return e.argumentHint&&(n.argumentHint=e.argumentHint),n}))}catch{return Promise.resolve([])}}var Ip=b(()=>{"use strict";Vt()});function zl(t){if(t.length===0)return;let e=t[t.length-1];if(!e||e.role!=="assistant"||typeof e.content=="string")return;let n=e.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};t.push(o)}var yf=b(()=>{"use strict"});function fA(t){return{messages:t.initialMessages?[...t.initialMessages]:[],currentModel:t.model,requestedModel:t.requestedModel??t.model,currentPermissionMode:t.permissionMode,userSystem:t.userSystem,toolDispatcher:t.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:t.autoCompactThreshold}}var mA=b(()=>{"use strict"});function V$(t,e,n,r,o){let s=J$.get(t);if(!s)return;let i=1e6,l=Math.max(0,e-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,d=s.cacheWritePerMTok??s.inputPerMTok*1.25,u=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*d,f=r/i*u;return l+c+p+f}function gA(t,e,n){if(!t)return{stopReason:e??null};let r={inputTokens:t.input_tokens,outputTokens:t.output_tokens,stopReason:e??null};if(t.cache_read_input_tokens!=null&&(r.cachedInputTokens=t.cache_read_input_tokens),t.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=t.cache_creation_input_tokens),r.totalTokens=(t.input_tokens??0)+(t.output_tokens??0),n){let o=V$(n,t.input_tokens??0,t.output_tokens??0,t.cache_read_input_tokens??0,t.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var J$,hA=b(()=>{"use strict";rp();J$=new Map([["claude-sonnet-5",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-5",{inputPerMTok:5,outputPerMTok:25,cacheWritePerMTok:6.25,cacheReadPerMTok:.5}],["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]])});function Y$(t){let e=t.trim();if(e.length===0)return{};try{return JSON.parse(e)}catch{return{}}}function X$(t,e,n){let r=[],o=[];for(let a of t)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:Y$(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:e,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*yA(t,e){let n=[],r=null,o=null,s=!1,i=!!_.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let a of t){switch(i&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="redacted_thinking"?n[a.index]={kind:"redacted_thinking",data:l.data}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:e.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:e.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:e.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:e.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}i&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(a){i&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}if(!s&&r===null){yield{kind:"event",event:{type:"error",error:new it("the model stream ended without a terminal message (no message_stop and no stop_reason): the response was cut off mid-stream, typically an intermediary closing the connection. The turn is incomplete.")}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:X$(n,r,o)}}var bA=b(()=>{"use strict";W();le()});function SA(){let t=_.AFK_MODEL_TTFB_TIMEOUT_MS;if(t===void 0||t.trim()==="")return wA;let e=Number.parseInt(t,10);return!Number.isFinite(e)||e<0?wA:e}function vA(t,e){if(e<=0)return{signal:t,timedOut:()=>!1,firstByteSeen:()=>{},dispose:()=>{}};let n=new AbortController,r=AbortSignal.any([t,n.signal]),o=!1,s=!1,i=setTimeout(()=>{o=!0,n.abort(new Error(Q$))},e);i.unref();let a=()=>{s||(s=!0,clearTimeout(i))};return{signal:r,timedOut:()=>o,firstByteSeen:a,dispose:a}}var wA,Q$,kA=b(()=>{"use strict";W();wA=18e4;Q$="model_ttfb_timeout"});import{randomUUID as Z$}from"node:crypto";function eU(t){let{name:e,description:n,input_schema:r}=t;return{name:e,...n!==void 0?{description:n}:{},input_schema:r}}function rU(t){if(!("status"in t))return!1;let e=t.status;return e===529||e===503}function _A(t){if(t===null||typeof t!="object")return!1;let e=t;if(e.status===529||e.status===503)return!0;let n=e.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}async function oU(t,e,n,r,o){for(let s=0;;s++){if(s>0){let i=EA*Math.pow(2,s-1);if(await Ct(i,o),o.aborted)throw new Error("aborted")}try{return await Promise.resolve(t.messages.create(e,{headers:n,signal:r}))}catch(i){if(r.aborted)throw i;let a=i instanceof Error?i:new Error(String(i));if(rU(a)&&s<bf)continue;throw a}}}async function*AA(t,e){Y(t.traceWriter,{phase:"ttfb_timeout",durationMs:Date.now()-e,metadata:{reason:"ttfb-timeout",source:"first-byte",resolvedModel:t.model}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId}}async function*sU(t,e){let n=e.throttleQueue;if(!n)return await t;n.resetAttempts();let r=Symbol("create-done"),o=!1,s=t.then(i=>(o=!0,i),i=>{throw o=!0,i});for(;;){for(let a of n.takeAll())yield{type:"rate_limit",sessionId:e.ctx.sessionId,status:a.status,attempt:a.attempt,...a.retryAfterMs!==void 0?{retryAfterMs:a.retryAfterMs}:{}};if(o)return await s;await Promise.race([s.then(()=>r,()=>r),n.waitForItem().then(()=>{})])}}async function*wf(t){let e=il(t.maxToolUseIterations),n={stopReason:null},r=0,o=0,s=!1,i=0,a=0,l=SA(),c=!1,d=Z$(),u=Date.now(),p=g=>({...g,durationMs:Date.now()-u});Y(t.traceWriter,{phase:"loop_start"});let f=t.signal.aborted?Date.now():null,m=()=>{f===null&&(f=Date.now())};t.traceWriter&&!t.signal.aborted&&t.signal.addEventListener("abort",m,{once:!0});try{for(;;){if(t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let g=to({baseUrl:t.baseUrl})?sh(t.messages,no()):t.messages,h={model:t.model,max_tokens:t.maxTokens,messages:g,stream:!0,...t.system!==null?{system:t.system}:{},...t.tools!==null&&t.tools.length>0&&!s?{tools:t.tools.map(eU)}:{},...t.thinking!==void 0?{thinking:t.thinking}:{},...t.effort!==void 0?{output_config:{effort:t.effort}}:{}},w=Date.now(),v=vA(t.signal,l),E=!1,k;try{k=yield*sU(oU(t.client,h,t.headers,v.signal,t.signal),t)}catch(C){if(v.timedOut()&&!t.signal.aborted&&!c)v.dispose(),E=!0;else{if(v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let $=C instanceof Error?C:new Error(String(C));$.message.includes("thinking")&&iU(t.messages,$),yield{type:"error",error:$};return}}if(E){yield*AA(t,w),c=!0;continue}let A=null,T=!1,x=!1,S=!1,R=!1;try{_.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let C of yA(_r(k,t.signal),t.ctx))if(!R&&(C.kind==="turn-result"||C.event.type!=="error")&&(R=!0,v.firstByteSeen(),Y(t.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-w,resolvedModel:t.model})),_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",C.kind,C.kind==="event"?C.event.type:""),C.kind==="event"){if(C.event.type==="error"){if(v.timedOut()&&!t.signal.aborted&&!c&&!R){E=!0;break}if(_A(C.event.error)&&i<bf&&!t.signal.aborted){x=!0;break}if(t.signal.aborted)break;if(C.event.error instanceof it&&a<tU&&!t.signal.aborted){S=!0;break}yield C.event,T=!0;break}yield C.event}else{A=C.result;break}_.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",A?"set":"null")}catch(C){if(v.timedOut()&&!t.signal.aborted&&!c&&!R)v.dispose(),E=!0;else{if(v.dispose(),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let $=C instanceof Error?C:new Error(String(C));if(_A($)&&i<bf&&!t.signal.aborted)x=!0;else{yield{type:"error",error:$};return}}}if(v.dispose(),E){yield*AA(t,w),c=!0;continue}if(x){if(i+=1,Y(t.traceWriter,{phase:"rate_limit",metadata:{reason:"overloaded",source:"mid-stream",attempt:i}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await Ct(EA*Math.pow(2,i-1),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}continue}if(S){if(a+=1,Y(t.traceWriter,{phase:"rate_limit",metadata:{reason:"stream-incomplete",source:"mid-stream",attempt:a}}),yield{type:"stream.retry",sessionId:t.ctx.sessionId},await Ct(nU*Math.pow(2,a-1),t.signal),t.signal.aborted){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}continue}if(i=0,a=0,c=!1,T){t.signal.aborted&&(yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId});return}if(A===null){yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let M=gA(A.usage,A.stopReason,t.model);if(n=Po(n,M),n.contextWindowTokens=(M.inputTokens??0)+(M.outputTokens??0)+(M.cachedInputTokens??0)+(M.cacheCreationTokens??0),t.onUsageProgress?.(n),A.stopReason!=="tool_use"){if(A.stopReason==="refusal"){yield{type:"assistant.message",text:A.text.length>0?A.text:`The model stopped with a content-safety refusal (stop_reason: "refusal") and returned no output. This is Anthropic's safety system declining the request \u2014 not an afk error. Because the flagged context stays in the conversation, follow-up messages will likely be refused the same way; rephrase the request or start a fresh session to continue.`,sessionId:t.ctx.sessionId},yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}A.text.length>0&&(yield{type:"assistant.message",text:A.text,sessionId:t.ctx.sessionId},A.text.length<=200&&(yield{type:"suggestion",suggestion:A.text,sessionId:t.ctx.sessionId}));let C=A.assistantBlocks.filter($=>$.type!=="tool_use");C.length>0&&t.messages.push({role:"assistant",content:C}),yield{type:"turn.completed",usage:p(s?{...n,stopReason:Jt}:n),sessionId:t.ctx.sessionId};return}let I=t.messages.length;t.messages.push({role:"assistant",content:A.assistantBlocks});try{o+=A.toolUseBlocks.length;let C=[],$=new Map;for(let F of A.toolUseBlocks){C.push({id:F.id,name:F.name,input:F.input,signal:t.signal});let B=Date.now();$.set(F.id,B),Yn(t.traceWriter,rl({toolUseId:F.id,name:F.name,input:F.input,subagentId:t.subagentId})),yield{type:"tool.use.start",toolUseId:F.id,toolName:F.name,toolInput:Ln(F.name,F.input),toolInputRaw:nl(F.input),sessionId:t.ctx.sessionId}}if(t.signal.aborted){let F=C.map(B=>({type:"tool_result",tool_use_id:B.id,content:"Tool call aborted",is_error:!0}));t.messages.push({role:"user",content:F}),yield{type:"turn.completed",usage:p(n),sessionId:t.ctx.sessionId};return}let L;if(t.toolDispatcher.executeBatch)try{L=await t.toolDispatcher.executeBatch(C)}catch(F){L=C.map(()=>({content:`Tool batch execution failed: ${F instanceof Error?F.message:String(F)}`,isError:!0}))}else{L=[];for(let F of C){if(t.signal.aborted){L.push({content:"Tool call aborted",isError:!0});continue}try{L.push(await t.toolDispatcher.execute(F))}catch(B){let G=B instanceof Error?B.message:String(B);L.push({content:`Tool execution threw: ${G}`,isError:!0})}}}let P=[];for(let F=0;F<C.length;F++){let B=C[F],G=L[F],de=$.get(B.id),re=typeof de=="number"?Date.now()-de:0,ue=G.truncated===!0||G.content.includes("[output truncated");Yn(t.traceWriter,ol({toolUseId:B.id,name:B.name,result:G,truncated:ue,durationMs:re,subagentId:t.subagentId})),yield{type:"tool.output",toolUseId:B.id,toolName:B.name,content:G.content,...G.isError===!0?{isError:!0}:{},...ue?{truncated:!0}:{},...G.incomplete===!0?{incomplete:!0}:{},...G.incompleteReason?{incompleteReason:G.incompleteReason}:{},...typeof G.batchIndex=="number"&&typeof G.batchSize=="number"?{batchIndex:G.batchIndex,batchSize:G.batchSize}:{},sessionId:t.ctx.sessionId},G.render?.diff&&(yield{type:"tool.diff",toolUseId:B.id,diff:G.render.diff,sessionId:t.ctx.sessionId});let{content:xe,isError:Dt,image:te}=G,se=te!==void 0?[{type:"image",source:{type:"base64",media_type:te.mediaType,data:te.data}},...xe.length>0?[{type:"text",text:xe}]:[]]:xe;P.push({type:"tool_result",tool_use_id:B.id,content:se,...Dt===!0?{is_error:!0}:{}})}let O={role:"user",content:P};t.messages.push(O);let H=L.find(F=>F.failureClass===ur);if(H){yield{type:"error",error:new Kn(H.content)};return}}catch(C){throw t.messages.splice(I),C}r+=1;let N=A.toolUseBlocks[A.toolUseBlocks.length-1],j=N?`${N.name}${Ln(N.name,N.input)}`:"unknown";if(yield{type:"progress",progress:{taskId:d,description:"Working",summary:`round ${r}: ${j}`,lastToolName:N?.name,totalTokens:n.totalTokens??0,toolUses:o,durationMs:Date.now()-u},sessionId:t.ctx.sessionId},s){yield{type:"turn.completed",usage:p({...n,stopReason:Jt}),sessionId:t.ctx.sessionId};return}if(al(r,e)){let C=t.messages[t.messages.length-1];C!==void 0&&C.role==="user"&&Array.isArray(C.content)&&C.content.push({type:"text",text:sl}),s=!0;continue}}}finally{t.signal.removeEventListener("abort",m),f!==null&&t.signal.reason==="interrupted"&&Y(t.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-f,metadata:{provider:"anthropic-direct"}}),Y(t.traceWriter,{phase:"loop_end",durationMs:Date.now()-u})}}function iU(t,e){try{let n=[];for(let r=0;r<t.length;r++){let o=t[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let a=s[i];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",e.message),console.error(`[afk] messages.length=${t.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var bf,EA,tU,nU,TA=b(()=>{"use strict";hA();vi();bA();le();Ya();ne();Ap();W();ll();kA();tl();Jo();Ep();la();le();Jo();bf=3,EA=5e3,tU=2,nU=1e3});var xA=b(()=>{"use strict";Xn()});import{randomUUID as aU}from"node:crypto";var RA,lU,cU,dU,uU,pU,Jl,CA=b(()=>{"use strict";TA();an();vi();yi();xA();ll();ne();RA=7200*1e3,lU=3,cU=12e4,dU=5e3,uU=1e3,pU=60*1e3,Jl=class{_client;_authMode;initSessionId;baseUrl;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(e){this._client=e.client,this._authMode=e.authMode,this.initSessionId=e.initSessionId,this.baseUrl=e.baseUrl,this.tokenRefresher=e.tokenRefresher,this.autoResumeOnUsageLimit=e.autoResumeOnUsageLimit}get client(){return this._client}rotateHeaders(){return Ut(this._authMode,this.initSessionId,aU(),void 0,Si({...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{}}))}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let e=Ue(),n=null;try{if(this.refreshPromise)n=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{n=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{return this.refreshPromise=null,null}if(!n)return null;this._client=n;let r=Ue();return{accountId:Zr(r??""),swapped:e!==r}}async*turnWithRetries(e,n){yield*this.turnWithUsageLimitRetry(e,n)}async*turnWithUsageLimitRetry(e,n){let r=null,o=null,s=!1,i=0;for(;;){let u,p=!1;for await(let g of this.turnWithAuthRetry(e,n)){if(g.type==="error"){let h=hi(g.error);if(h&&h.kind==="oauth-limit"){o=h.resetsAt,r=g;break}if(h&&h.kind==="oauth-limit-no-ts"){s=!0,r=g;break}if(h&&h.kind==="rate-limit-transient"&&i<lU){p=!0,u=h.retryAfterMs;break}}yield g}if(!p)break;if(i+=1,n()||e.signal.aborted)return;let m=Math.min(u??dU,cU)+Math.floor(Math.random()*uU);if(Y(e.traceWriter,{phase:"rate_limit",metadata:{reason:"retry-after",source:"retry-layer",attempt:i,waitMs:m}}),await Ct(m,e.signal),n()||e.signal.aborted)return;e.headers=this.rotateHeaders()}if(!r)return;if(s){let u=Zr(Ue()??"");if(yield{type:"paused",reason:"usage-limit",accountId:u,autoResume:this.autoResumeOnUsageLimit},Y(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!1,autoResume:this.autoResumeOnUsageLimit}}),!this.autoResumeOnUsageLimit){yield r;return}let p=Date.now(),f=!1;for(;;){let m;if(this.usageLimitWaitPromise)m="aborted";else{this.usageLimitWaitPromise=Vg({signal:e.signal,retryAfterMs:pU});try{m=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(m==="aborted")return;let g=u;if(m==="hot-swap"){let w=await this.forceClientRefresh();w&&(e.client=this._client,g=w.accountId)}e.headers=this.rotateHeaders();let h=null;for await(let w of this.turnWithAuthRetry(e,n)){if(!f&&w.type==="error"){let v=hi(w.error);if(v&&(v.kind==="oauth-limit"||v.kind==="oauth-limit-no-ts")){h=w;break}}f||(yield{type:"resumed",hotSwapped:m==="hot-swap",accountId:g},Y(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-p,metadata:{source:"retry-layer",hotSwapped:m==="hot-swap"}}),f=!0),yield w}if(!h)return;if(Date.now()-p>RA){yield h;return}}}if(!o)return;if(o.getTime()-Date.now()>RA){yield r;return}let a=Zr(Ue()??""),l=Date.now();if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:a,autoResume:this.autoResumeOnUsageLimit},Y(e.traceWriter,{phase:"usage_limit_pause",metadata:{reason:"usage-limit",source:"retry-layer",hasResetTimestamp:!0,autoResume:this.autoResumeOnUsageLimit,resetsAt:o.toISOString()}}),!this.autoResumeOnUsageLimit){yield r;return}let c;if(this.usageLimitWaitPromise)c=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=Jg({resetsAt:o,signal:e.signal});try{c=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(c==="aborted")return;let d=a;if(c==="hot-swap"){let u=await this.forceClientRefresh();u&&(e.client=this._client,d=u.accountId)}e.headers=this.rotateHeaders(),yield{type:"resumed",hotSwapped:c==="hot-swap",accountId:d},Y(e.traceWriter,{phase:"usage_limit_resume",durationMs:Date.now()-l,metadata:{source:"retry-layer",hotSwapped:c==="hot-swap"}}),yield*this.turnWithAuthRetry(e,n)}async*turnWithAuthRetry(e,n){let r=null;for await(let s of wf(e)){if(n())return;if(s.type==="error"&&this.isRetryableAuth(s.error)){r=s;break}yield s}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}e.client=this._client,e.headers=this.rotateHeaders(),yield*wf(e)}isRetryableAuth(e){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in e&&e.status===401}}});function fU(t){if(t.role!=="user")return!1;let e=t.content;if(typeof e=="string")return!0;if(!Array.isArray(e))return!1;for(let n of e)if(n.type==="tool_result")return!1;return!0}function mU(t){let n=[(t.role==="user"?"User":"Assistant")+":"];if(typeof t.content=="string")n.push(t.content);else if(Array.isArray(t.content))for(let r of t.content){let o=r.type;if(o==="text"&&"text"in r)n.push(r.text);else if(o==="tool_use"){let s=r.name??"unknown",i=FA(r.input);n.push(`[tool call: ${s} ${i}]`)}else if(o==="tool_result"){let s=r.content;n.push(`[tool result: ${LA(s)}]`)}else o==="image"?n.push("[image]"):o==="document"&&n.push("[document]")}return n.join(`
1112
1112
  `)}function gU(t){let e=0;if(typeof t.content=="string")e+=t.content.length;else if(Array.isArray(t.content))for(let n of t.content){let r=n.type;r==="text"&&"text"in n?e+=n.text.length:r==="tool_use"?e+=FA(n.input).length:r==="tool_result"&&(e+=LA(n.content).length)}return e}function hU(t){if(typeof t=="string")return Fn(t);if(Array.isArray(t)){let e=0;for(let n of t)n.type==="text"&&"text"in n&&(e+=Fn(n.text));return e}return 0}function yU(t){if(typeof t=="string")return vr(t);if(Array.isArray(t)){for(let e of t)if(e.type==="text"&&"text"in e)return vr(e.text)}return!1}function IA(t,e){return qa(t,bU,e??{})}function PA(t,e,n,r){return fp(t,e,Vl,n,r)}function MA(t,e,n){let r=mp(t,Vl);return{model:e,max_tokens:n,system:Ho,messages:[{role:"user",content:Ko(r)}],stream:!0}}function OA(t,e,n){return gp(t,e,n,Vl)}function DA(t,e,n){return hp(t,e,n,Vl)}function FA(t){try{let e=JSON.stringify(t);return e.length>240?e.slice(0,237)+"...":e}catch{return"{}"}}function LA(t){if(typeof t=="string")return t.length>320?t.slice(0,317)+"...":t;if(Array.isArray(t)){let e=[];for(let r of t)r.type==="text"&&"text"in r&&e.push(r.text);let n=e.join(" ");return n.length>320?n.slice(0,317)+"...":n}return""}var Vl,bU,NA=b(()=>{"use strict";Go();Vl={isFreshUserTurn:fU,renderMessage:mU,buildPreamble(t){return[{role:"user",content:jo+`
1113
1113
 
1114
1114
  `+t},{role:"assistant",content:Wo}]},countChars:gU};bU={listToolResults(t){let e=[];for(let n of t){if(n.role!=="user"||!Array.isArray(n.content))continue;let r=n.content;for(let o of r){if(o.type!=="tool_result")continue;let s=o;e.push({byteLength:hU(s.content),isPlaceholder:yU(s.content),clear(i){s.content=i}})}}return e}}});import{randomUUID as wU}from"node:crypto";async function UA(t){let{state:e,abort:n,retry:r,initSessionId:o,traceWriter:s}=t,i=e.messages.length;if(e.closed)return{compacted:!1,reason:"session-closed",messagesBefore:i,messagesAfter:i};if(!n.isIdle())return{compacted:!1,reason:"turn-in-flight",messagesBefore:i,messagesAfter:i};let a=_U(),l=Uo(rt(e.lastUsage??{}),Dn(e.requestedModel)),c=PA(e.messages,a,l,AU());if(c<0)return $A(e,i,"history-too-short");if(c===0)return $A(e,i,"nothing-to-summarize");let d=e.messages.slice(0,c),u=TU(),p=MA(d,u,kU),f=n.begin(),m;try{if(f.signal.aborted)return{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i};let v=Ut(r.authMode,o,wU()),E=r.client,k=await Promise.resolve(E.messages.create(p,{headers:v,signal:f.signal}));m=await xU(k)}catch(v){return f.signal.aborted?{compacted:!1,reason:"aborted",messagesBefore:i,messagesAfter:i}:{compacted:!1,reason:"summarization-failed: "+(v instanceof Error?v.message:String(v)),messagesBefore:i,messagesAfter:i}}finally{n.clear(f)}if(m.trim().length===0)return{compacted:!1,reason:"empty-summary",messagesBefore:i,messagesAfter:i};let g=DA(e.messages,c,m),h=OA(e.messages,c,m);e.messages.splice(0,e.messages.length,...h);let w=e.messages.length;return gi(s,{trigger:"manual",preCompactionMessages:d,summary:m,keptTailCount:i-c,keepLastNConfig:a,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:g}),{compacted:!0,messagesBefore:i,messagesAfter:w,tokensSavedEstimate:g}}function _U(){let t=_.AFK_COMPACT_KEEP_LAST_TURNS;if(t!==void 0&&t.length>0){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return SU}function AU(){let t=_.AFK_COMPACT_SHRINK_FRACTION;if(t!==void 0&&t.length>0){let e=Number.parseFloat(t);if(Number.isFinite(e)&&e>0&&e<1)return e}return Sr}function $A(t,e,n){let r=EU(),{blocksCleared:o,bytesReclaimed:s}=IA(t.messages,r);return o>0?{compacted:!1,reason:"microcompacted",messagesBefore:e,messagesAfter:t.messages.length,microcompaction:{blocksCleared:o,bytesReclaimed:s}}:{compacted:!1,reason:n,messagesBefore:e,messagesAfter:e}}function EU(){return kr(_.AFK_MICROCOMPACT_TOOL_RESULT_BYTES,_.AFK_MICROCOMPACT_KEEP_LAST)}function TU(){let t=_.AFK_COMPACT_MODEL;return t!==void 0&&t.length>0?we(t)??t:vU}async function xU(t){let e="";for await(let n of t)if(n.type==="content_block_delta"){let r=n.delta;r.type==="text_delta"&&typeof r.text=="string"&&(e+=r.text)}return e}var SU,vU,kU,BA=b(()=>{"use strict";an();NA();Go();Bo();hr();ne();Ge();W();SU=2,vU="claude-haiku-4-5-20251001",kU=1024});function Sf(t){if(typeof t=="string")return t;let e=[];for(let n of t)n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join(" ")}function jA(t){return t.role!=="user"?!1:Sf(t.content).trim().length>0}function RU(t){let e=t.replace(/\s+/g," ").trim();return e.length<=HA?e:e.slice(0,HA-1)+"\u2026"}function WA(t){let e=[];for(let n=0;n<t.length;n++){let r=t[n];r&&jA(r)&&e.push({turnIndex:n,preview:RU(Sf(r.content))})}return e.reverse()}function KA(t,e){let{state:n,abort:r}=t,o=n.messages.length;if(n.closed)return{rewound:!1,reason:"session-closed",messagesBefore:o,messagesAfter:o};if(!r.isIdle())return{rewound:!1,reason:"turn-in-flight",messagesBefore:o,messagesAfter:o};if(!Number.isInteger(e)||e<0||e>=o)return{rewound:!1,reason:"invalid-target",messagesBefore:o,messagesAfter:o};let s=n.messages[e];if(!s||!jA(s))return{rewound:!1,reason:"invalid-target",messagesBefore:o,messagesAfter:o};let i=Sf(s.content);return n.messages.splice(e),zl(n.messages),{rewound:!0,reloadText:i,messagesBefore:o,messagesAfter:n.messages.length}}var HA,GA=b(()=>{"use strict";yf();HA=72});var qA=b(()=>{"use strict";Bo()});import{randomUUID as zA}from"node:crypto";var CU,Yl,JA=b(()=>{"use strict";eo();an();vi();ah();lh();gn();Ip();hr();Ge();yf();mA();up();CA();BA();GA();qA();le();CU=[{value:"claude-sonnet-5",displayName:"Claude Sonnet 5",description:"Latest balanced Claude \u2014 recommended default"},{value:"claude-opus-5",displayName:"Claude Opus 5",description:"Highest-capability Claude for agentic coding"},{value:"claude-haiku-4-5-20251001",displayName:"Claude Haiku 4.5",description:"Fastest, cheapest Claude"}],Yl=class{initSessionId;promptStream;maxTokens;tools;systemPrefix;thinking;effort;baseUrl;maxToolUseIterations;traceWriter;subagentId;state;abort;retry;cwdDependentsFactory;onPermissionMode;mcpManager;hookRegistry;throttleQueue;constructor(e){this.initSessionId=e.sessionId??zA(),this.promptStream=e.promptStream,this.maxTokens=e.maxTokens,this.tools=e.tools,this.systemPrefix=e.systemPrefix,this.thinking=e.thinking,e.effort!==void 0&&(this.effort=e.effort),e.baseUrl!==void 0&&(this.baseUrl=e.baseUrl),e.maxToolUseIterations!==void 0&&(this.maxToolUseIterations=e.maxToolUseIterations),this.traceWriter=e.traceWriter,e.subagentId!==void 0&&(this.subagentId=e.subagentId),this.cwdDependentsFactory=e.cwdDependentsFactory,this.onPermissionMode=e.onPermissionMode,this.mcpManager=e.mcpManager,e.hookRegistry!==void 0&&(this.hookRegistry=e.hookRegistry),e.throttleQueue!==void 0&&(this.throttleQueue=e.throttleQueue),this.retry=new Jl({client:e.client,authMode:e.authMode,initSessionId:this.initSessionId,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.tokenRefresher?{tokenRefresher:e.tokenRefresher}:{},autoResumeOnUsageLimit:e.autoResumeOnUsageLimit??!0}),this.state=fA({model:e.model,...e.requestedModel!==void 0?{requestedModel:e.requestedModel}:{},permissionMode:e.permissionMode??"default",userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,...e.initialMessages?{initialMessages:e.initialMessages}:{},...e.autoCompactThreshold!==void 0?{autoCompactThreshold:e.autoCompactThreshold}:{}}),this.abort=new wr}async*[Symbol.asyncIterator](){yield{type:"session.init",info:{sessionId:this.initSessionId,model:this.state.currentModel,permissionMode:this.state.currentPermissionMode,cwd:process.cwd(),tools:[],slashCommands:[],skills:[],plugins:[],mcpServers:this.mcpManager?.getServerStates().map(r=>({name:r.serverName,status:r.status}))??[],apiKeySource:this.retry.authMode,version:"anthropic-direct-v1"}};let n=this.promptStream[Symbol.asyncIterator]();try{for(;!this.state.closed;){let r=await Promise.race([n.next(),this.abort.closedPromise]);if(r==="__closed__")break;let o=r;if(o.done)break;let s=o.value,i=this.abort.begin();if(i.signal.aborted){this.abort.clear(i);return}zl(this.state.messages),this.state.messages.push({role:"user",content:s.content});let a=this.composeSystem(),l=Ut(this.retry.authMode,this.initSessionId,zA(),this.effort!==void 0,Si({...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{}})),c={client:this.retry.client,messages:this.state.messages,system:a,tools:this.state.currentPermissionMode==="plan"?this.tools:this.tools?.filter(u=>u.name!==qe)??null,toolDispatcher:this.state.toolDispatcher,model:this.state.currentModel,maxTokens:this.maxTokens,headers:l,signal:i.signal,ctx:{sessionId:this.initSessionId},...this.thinking!==void 0?{thinking:this.thinking}:{},...this.effort!==void 0?{effort:this.effort}:{},...this.baseUrl!==void 0?{baseUrl:this.baseUrl}:{},...this.maxToolUseIterations!==void 0?{maxToolUseIterations:this.maxToolUseIterations}:{},...this.traceWriter?{traceWriter:this.traceWriter}:{},...this.subagentId!==void 0?{subagentId:this.subagentId}:{},...this.throttleQueue?{throttleQueue:this.throttleQueue}:{},onUsageProgress:u=>{this.state.lastUsage=u}},d=!1;try{for await(let u of this.retry.turnWithRetries(c,()=>this.state.closed)){if(this.state.closed)return;u.type==="turn.completed"&&(this.state.lastUsage=u.usage,this.abort.clear(i)),(u.type==="turn.completed"||u.type==="error")&&(d=!0),yield u}}catch(u){if(this.state.closed)return;if(i.signal.aborted){this.abort.clear(i),d||(yield this.makeInterruptedTurnEvent());continue}yield{type:"error",error:u instanceof Error?u:new Error(String(u))};return}finally{this.abort.clear(i)}if(this.state.closed)return;if(i.signal.aborted){d||(yield this.makeInterruptedTurnEvent());continue}if(this.state.autoCompactThreshold!==void 0&&!this.state.closed){let u=this.state.lastUsage,p=Dn(this.state.requestedModel);if(u!==null&&p>0){let f=rt(u);if($o(f,p,this.state.autoCompactThreshold))try{this.hookRegistry&&await this.hookRegistry.dispatch({event:"PreCompact",sessionId:this.initSessionId,trigger:"auto"}),await this.compact()}catch(m){if(!(m instanceof Z))throw m}}}}}catch(r){yield{type:"error",error:r instanceof Error?r:new Error(String(r))}}finally{try{await n.return?.()}catch{}}}composeSystem(){let e=this.systemPrefix,n=this.state.userSystem,r=[];e&&e.length>0&&r.push(...e),n&&n.length>0&&r.push({type:"text",text:n});let o=dd(this.state.currentPermissionMode);o!==null&&r.push(o);let s=pd(this.state.currentPermissionMode);return s!==null&&r.push(s),r.length===0?null:to({baseUrl:this.baseUrl})?oh(r,no()):r}async interrupt(){this.abort.requestAbort("interrupted")}makeInterruptedTurnEvent(){return{type:"turn.completed",usage:{stopReason:"interrupted",resultSubtype:"interrupted",isError:!1},sessionId:this.initSessionId}}async setModel(e){e!==void 0&&e.length>0&&(this.state.requestedModel=e,this.state.currentModel=we(e)??e)}async setPermissionMode(e){this.state.currentPermissionMode=e;let n=at(e);this.state.toolDispatcher.setAllowAll?.(n),this.onPermissionMode?.(e)}setCwd(e){if(this.state.toolDispatcher.setResolveBase?.(e),!this.cwdDependentsFactory)return;let{userSystem:n,dispatcher:r}=this.cwdDependentsFactory(e);this.state.userSystem=n,this.state.toolDispatcher=r}async supportedCommands(){return dl()}async supportedModels(){return CU.map(e=>({...e}))}async supportedAgents(){return[]}async getContextUsage(){let e=this.state.lastUsage,n=Oo(this.state.requestedModel),r;if(e&&n>0){let i=rt(e);r=Math.min(100,Math.max(0,i/n*100))}let{totalTokens:o,apiUsage:s}=No(e);return{tools:[],agents:[],isAutoCompactEnabled:this.state.autoCompactThreshold!==void 0,apiUsage:s,totalTokens:o,...r!==void 0?{percentage:r}:{},maxTokens:n}}async mcpServerStatus(){return this.mcpManager?this.mcpManager.getServerStates().map(e=>({name:e.serverName,status:e.status})):[]}async accountInfo(){return{subscriptionType:this.retry.authMode==="oauth"?"claude-subscription":"api-key"}}async reauth(){return this.retry.forceClientRefresh()}async rewindFiles(e,n){return{canRewind:!1,error:"anthropic-direct provider does not support file checkpoint rewind"}}async compact(){return UA({state:this.state,abort:this.abort,retry:this.retry,initSessionId:this.initSessionId,...this.traceWriter?{traceWriter:this.traceWriter}:{}})}listRewindTargets(){return WA(this.state.messages)}async rewindConversation(e){return KA({state:this.state,abort:this.abort},e)}close(){this.state.closed=!0,this.abort.requestAbort("closed"),this.abort.markClosed()}}});function vf(t,e){let n=Ba(e),r=t.maxOutputTokens;if(typeof r=="number"&&Number.isFinite(r)&&r>0){let o=Math.floor(r);if(o>n){let s=`max:${e}:${o}`;return Xl.has(s)||(Xl.add(s),console.warn(`[afk] maxOutputTokens ${o} exceeds the ${e} output ceiling (${n}); clamping to ${n}.`)),n}return o}return n}function VA(t){if(!t||t.length===0)return;let e=[];for(let n of t)n.user.length>0&&e.push({role:"user",content:n.user}),n.assistant.length>0&&e.push({role:"assistant",content:n.assistant});return e.length>0?e:void 0}function kf(t,e,n){switch(t.type){case"adaptive":return{type:"adaptive",display:"summarized"};case"disabled":return{type:"disabled"};case"enabled":{if(typeof n=="string"&&PU(n))return{type:"adaptive",display:"summarized"};let r=Math.floor(e*MU),o=Math.max(1024,e-1-r),s=t.budgetTokens!==void 0&&Number.isFinite(t.budgetTokens)?Math.floor(t.budgetTokens):void 0,i=Math.min(Math.max(s??o,1024),o);if(s!==void 0&&s>o){let a=`think:${n??"default"}:${s}:${e}`;Xl.has(a)||(Xl.add(a),console.warn(`[afk] thinking budgetTokens ${s} leaves too little of max_tokens ${e} for the reply; clamping to ${o}.`))}return{type:"enabled",budget_tokens:i,display:"summarized"}}}}function _f(t,e){if(t!==void 0)return t;let n=e.toLowerCase();if(/(claude-)?(opus|sonnet)-(4-[678]|5)/.test(n))return"max"}var IU,PU,Xl,MU,Af=b(()=>{"use strict";hr();Bo();IU=t=>/opus-4-(7|[89])/.test(t),PU=t=>IU(t)||/(claude-)?(opus|sonnet)-5/.test(t),Xl=new Set,MU=.25});import{mkdirSync as OU,appendFileSync as DU,existsSync as FU}from"fs";import{resolve as LU}from"path";import{dirname as NU}from"path";function Tf(t){let e=t;for(let[n,r]of BU)e=e.replace(n,(...o)=>{let s=o.slice(0,o.length-2);return r(s)});return e}function Ef(t){return typeof t=="string"?Tf(t):Array.isArray(t)?t.map(Ef):t}function HU(t){if(t===null||typeof t!="object")return t;let e=t,n={...e},r=e.env;if(r&&typeof r=="object"){let o={};for(let[s,i]of Object.entries(r))UU.test(s)&&typeof i=="string"?o[s]=`<REDACTED length=${i.length}>`:o[s]=i;n.env=o}return"system"in e&&(n.system=Ef(e.system)),"systemPrompt"in e&&(n.systemPrompt=Ef(e.systemPrompt)),n}function jU(t){if(t==null)return{kind:"undefined",note:"SDK uses minimal prompt; claude_code preset NOT loaded"};if(typeof t=="string")return{kind:"custom-string",note:"SDK uses this string as full system prompt; claude_code preset NOT loaded"};if(Array.isArray(t))return{kind:"custom-string-array",note:"SDK uses array as full system prompt with cache boundaries; claude_code preset NOT loaded"};if(typeof t=="object"){let e=t;if(e.type==="preset"&&e.preset==="claude_code"){let n={kind:"preset-claude-code",note:"claude_code preset loaded"};return typeof e.append=="string"&&(n.append={length:e.append.length}),e.excludeDynamicSections===!0&&(n.excludeDynamicSections=!0),n}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}return{kind:"custom-string",note:"Unrecognized systemPrompt shape; treated as opaque"}}function YA(t){let e=_.AFK_DUMP_PROMPT;if(!e||e===""||e==="0"||e.toLowerCase()==="false")return;process.stderr.write(`[--dump-prompt] WARNING: dump may contain secrets from system prompt or messages. Inspect before sharing.
@@ -1206,7 +1206,7 @@ Enter a number${A}`}v&&(d.allowSkip?k+=`
1206
1206
  model: ${t.model}${t.cwd?`
1207
1207
  cwd: ${t.cwd}`:""}`;case"user":return`\u{1F464} ${ks(t.text,oT)}`;case"assistant":return`\u{1F916} ${ks(t.text,oT)}`;case"tool":return`\u{1F527} ${t.toolName}(${ks(t.input,Wf)})`;case"tool_error":return`\u26A0\uFE0F tool failed: ${ks(t.content,Wf)}`;case"done":{let e=[];return typeof t.durationMs=="number"&&e.push(`${(t.durationMs/1e3).toFixed(1)}s`),typeof t.costUsd=="number"&&e.push(`$${t.costUsd.toFixed(4)}`),`\u2705 turn done${e.length?` (${e.join(", ")})`:""}`}case"error":return`\u274C error: ${ks(t.message,Wf)}`;case"paused":return`\u23F8\uFE0F paused on usage limit${t.resetsAt?` (resets ${t.resetsAt})`:""}`;case"resumed":return"\u25B6\uFE0F resumed";case"closed":return`\u{1F3C1} session closed${t.reason?` (${t.reason})`:""} \u2014 watch ended`;default:return null}}async function sT(t){let e=Jc(t);return e?.data.sessionId&&await Wi(e.data.sessionId)?e.data.sessionId:await Wi(t)?t:null}async function iT(){let t=[],n=(await mo()).filter(s=>s.surface!=="telegram");if(n.length>0){t.push("\u{1F7E2} Live sessions:");for(let s of n)t.push(` ${s.sessionId} (${s.surface}, ${s.cwd})`)}let r=jn().filter(s=>s.source!=="telegram").slice(0,8),o=[];for(let s of r)s.sessionId&&await Wi(s.sessionId)&&o.push(` ${s.name??s.id} (${s.model})`);return o.length>0&&(t.length>0&&t.push(""),t.push("\u{1F4BE} Recent sessions with activity logs:",...o)),t.length===0?"No watchable sessions found. Start one with `afk i` on your machine, then /watch <session-id-or-name>.":(t.push("","Watch one with /watch <session-id-or-name>."),t.join(`
1208
1208
  `))}var yc=class{watches=new Map;log;bot;messageHandler;elicitHeartbeatMs;constructor(e=()=>{},n,r,o=NH){this.log=e,this.bot=n,this.messageHandler=r,this.elicitHeartbeatMs=o}watching(e){return this.watches.get(e)?.sessionId}getWatched(e){return this.watches.get(e)?.sessionId}start(e,n,r){this.stop(e);let o=new AbortController,s=this._run(e,n,r,o.signal).catch(i=>{this.log("watch loop error:",i)});this.watches.set(e,{sessionId:n,abort:o,finished:s})}stop(e){let n=this.watches.get(e);if(n)return this.watches.delete(e),n.abort.abort(),n.sessionId}async stopAll(){let e=[...this.watches.values()];this.watches.clear();for(let n of e)n.abort.abort();await Promise.allSettled(e.map(n=>n.finished))}async _run(e,n,r,o){let s=[],i=null,a=Promise.resolve(),l=this.bot!==void 0&&this.messageHandler!==void 0?mc(pc(this.messageHandler,this.bot,e,{ledgerOriginated:!0}),fc(this.bot,new Set([e]),(...d)=>this.log("[elicitation]",...d))):void 0,c=()=>{if(i=null,s.length===0)return;let d=s.join(`
1209
- `);s=[],a=a.then(()=>r(d)).catch(u=>this.log("watch send error:",u))};try{for await(let d of ay(n,{signal:o})){if(d.kind==="elicitation"&&l!==void 0){i&&clearTimeout(i),c(),await a;let p=Date.now(),f=0,m=setInterval(()=>{if(f>=$H){clearInterval(m);return}f+=1;let w=Math.round((Date.now()-p)/6e4);r(`\u23F3 Still waiting on your answer (${w}m elapsed) \u2014 no deadline, reply above whenever you're ready. (Send /unwatch to stop watching this session.)`).catch(()=>{})},this.elicitHeartbeatMs);m.unref?.();let g=await(async()=>{try{return await l(d.request,{signal:o})}finally{clearInterval(m)}})(),h=hc(n);if(h!==null){let w=tT(h,n,d.reqId,g);new Ht(n).record({kind:"elicitation_response",reqId:d.reqId,result:g,hmac:w})}else this.log("[watch] no session key for",n,"\u2014 skipping elicitation write-back");continue}let u=UH(d);if(u){if(s.push(u),d.kind==="closed"){c();break}i||(i=setTimeout(c,LH),i.unref?.())}}i&&clearTimeout(i),c(),await a}finally{i&&clearTimeout(i);let d=this.watches.get(e);d&&d.sessionId===n&&d.abort.signal===o&&this.watches.delete(e)}}};fn();Ki();Ne();var bc=class t{bot;sessionManager;options;running=!1;registeredCommandChats=new Set;messageHandler;watchManager;autoSubscribeInterval=null;static AUTO_SUBSCRIBE_INTERVAL_MS=5e3;constructor(e){this.options=e,this.bot=new BH(e.botToken,{handlerTimeout:1/0}),this.sessionManager=new si(e),this.messageHandler=new cc(this.bot,this.sessionManager,this.registeredCommandChats,this.log.bind(this),e.tagOnlyChats??new Set),this.watchManager=new yc(this.log.bind(this),this.bot,this.messageHandler),this.setupHandlers()}setupHandlers(){this.bot.use(dh(this.options.allowedChatIds,this.log.bind(this))),this.bot.command("start",r=>Xc(r)),this.bot.command("help",r=>Qc(r,this.sessionManager)),this.bot.command("clear",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}(await this.sessionManager.getSession(o)).state!=="idle"?(this.messageHandler.enqueueClear(o,r),await r.reply("Clear queued.")):await Pf(r,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}),this.bot.command("compact",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}if((await this.sessionManager.getSession(o)).state!=="idle")this.messageHandler.enqueueCompact(o,r),await r.reply("Compact queued.");else try{await cE(r,this.sessionManager,this.log.bind(this))}finally{this.messageHandler.drainQueue(o).catch(i=>this.log("Drain error:",i))}}),this.bot.command("model",r=>Mf(r,this.sessionManager,this.log.bind(this))),this.bot.command(["cd","cwd"],r=>dE(r,this.sessionManager,this.log.bind(this))),this.bot.command("name",r=>uE(r,this.sessionManager,this.log.bind(this))),this.bot.command("afk",r=>yE(r,this.sessionManager,this.log.bind(this))),this.bot.command("usage",r=>wE(r,this.log.bind(this))),this.bot.command("sessions",r=>mE(r,this.sessionManager,this.log.bind(this))),this.bot.command("new",r=>gE(r,this.sessionManager,this.registeredCommandChats,this.log.bind(this))),this.bot.command("watch",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}let i=((r.message&&"text"in r.message?r.message.text:"")??"").split(/\s+/).slice(1).join(" ").trim();try{if(!i){await r.reply(await iT());return}let a=await sT(i);if(!a){await r.reply(`No session ledger found for "${i}". Use /watch with no argument to list watchable sessions.`);return}let l=async c=>{for(let d of We(c))await r.telegram.sendMessage(o,d)};this.watchManager.start(o,a,l),await r.reply(`\u{1F4E1} Watching ${a} \u2014 new activity will stream here. /unwatch to stop.`)}catch(a){this.log("Watch error:",a),await r.reply(V(a))}}),this.bot.command("unwatch",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}let s=this.watchManager.stop(o);await r.reply(s?`Stopped watching ${s}.`:"Not watching anything.")}),this.bot.command("abort",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}let s=this.watchManager.getWatched(o);if(!s){await r.reply("Not watching any session. Use /watch <session-id> to watch a REPL session first, then /abort to stop it.");return}let i=hc(s);if(i===null){await r.reply("Session key not found \u2014 the REPL may not have enabled AFK mode (/afk on). Cannot send a verified abort.");return}let a=rT(),l=nT(i,s,a);new Ht(s).record({kind:"abort_request",nonce:a,hmac:l}),await r.reply(`\u270B Abort sent to session ${s}.`)});let e=r=>{r.catch(o=>{let i=(o instanceof Error?o.message:String(o)).replace(/\/bot[^/]+\//g,"/bot[REDACTED]/");this.log("Detached update handler error:",i)})};this.bot.on("text",r=>e(this.messageHandler.handle(r))),this.bot.on("photo",r=>e(this.messageHandler.handlePhoto(r)));let n=new RegExp(`^${HH(sc)}`);this.bot.action(n,r=>OE(r,{log:this.log.bind(this)})),this.bot.action(/^afk:m:/,async r=>{if(await r.answerCbQuery().catch(()=>{}),r.chat?.id!==void 0&&!this.options.allowedChatIds.has(r.chat.id))return;let s=(typeof r.callbackQuery=="object"&&"data"in r.callbackQuery?r.callbackQuery.data:"").replace("afk:m:",""),i=r.chat?.id;if(!(!i||!s)&&zn.includes(s))try{await this.sessionManager.switchModel(i,s);let a=li(s);await r.editMessageText(a).catch(()=>r.reply(a))}catch(a){this.log("Model action error:",a)}}),this.bot.action(/^afk:sw:/,async r=>{await r.answerCbQuery().catch(()=>{}),!(r.chat?.id!==void 0&&!this.options.allowedChatIds.has(r.chat.id))&&await hE(r,this.sessionManager,this.log.bind(this))}),this.bot.catch((r,o)=>{this.log("Bot error:",r),o.reply(V("An unexpected error occurred. Please try again.")).catch(s=>this.log("Failed to send error message:",s))})}async start(){if(this.running)throw new Error("Bot is already running");this.log("Loading sessions..."),await this.sessionManager.loadSessions();let e=[...this.options.allowedChatIds];if(e.length>0){let r=e[0],o=pc(this.messageHandler,this.bot,r),s=fc(this.bot,new Set(this.options.allowedChatIds),(...i)=>this.log("[elicitation]",...i));Be.install(mc(o,s))}await pA(),this.log("Starting bot..."),await this.bot.launch(),this.log("Registering bot commands..."),await this.bot.telegram.setMyCommands([{command:"start",description:"Show welcome and command list"},{command:"help",description:"Show this command list"},{command:"clear",description:"Clear conversation history"},{command:"compact",description:"Compact conversation history"},{command:"model",description:"Switch Claude model (opus/sonnet/haiku)"},{command:"cd",description:"Show or change session working directory"},{command:"name",description:"Show or set the session name"},{command:"afk",description:"Toggle autonomous (AFK) mode for this chat"},{command:"usage",description:"Show Claude subscription usage"},{command:"watch",description:"Live-tail a CLI session from this chat"},{command:"unwatch",description:"Stop watching a session"}]),this.running=!0,this.log("Bot started successfully"),this.startAutoSubscribe();let n=async r=>{this.log(`Received ${r}, shutting down...`),await this.stop(),process.exit(0)};process.once("SIGINT",()=>n("SIGINT")),process.once("SIGTERM",()=>n("SIGTERM"))}async stop(){if(this.running){this.log("Stopping bot..."),this.running=!1,this.log("Stopping auto-subscribe loop..."),this.stopAutoSubscribe(),this.log("Uninstalling elicitation handler..."),Be.uninstall(),this.log("Stopping session watches..."),await this.watchManager.stopAll(),this.log("Closing sessions..."),await this.sessionManager.closeAll(),this.log("Stopping bot polling...");try{this.bot.stop()}catch(e){this.log("Error stopping bot (may not have been started):",e)}this.log("Bot stopped")}}getStats(){return{running:this.running,activeSessions:this.sessionManager.getSessionCount(),totalChats:this.sessionManager.getChatCount()}}getBusySessionCount(){return this.sessionManager.getBusySessionCount()}async handleStart(e){return Xc(e)}async handleHelp(e){return Qc(e,this.sessionManager)}async handleClear(e){let n=e.chat?.id;if(!n){await e.reply(V("Could not identify chat"));return}if((await this.sessionManager.getSession(n)).state!=="idle")this.messageHandler.enqueueClear(n,e),await e.reply("Clear queued.");else return Pf(e,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}async handleMessage(e){return this.messageHandler.handle(e)}async handlePhoto(e){return this.messageHandler.handlePhoto(e)}async handleModelSwitch(e){return Mf(e,this.sessionManager,this.log.bind(this))}startAutoSubscribe(){if(this.autoSubscribeInterval!==null)return;let e=()=>{this.runAutoSubscribeTick().catch(n=>this.log("auto-subscribe tick error:",n))};this.autoSubscribeInterval=setInterval(e,t.AUTO_SUBSCRIBE_INTERVAL_MS),this.autoSubscribeInterval.unref?.(),e()}stopAutoSubscribe(){this.autoSubscribeInterval!==null&&(clearInterval(this.autoSubscribeInterval),this.autoSubscribeInterval=null)}async runAutoSubscribeTick(){let e=[...this.options.allowedChatIds];if(e.length===0)return;let n;try{n=await mo()}catch{return}let r=new Set(n.filter(o=>o.surface==="cli"&&o.afk===!0&&o.sessionId).map(o=>o.sessionId));for(let o of e){let s=this.watchManager.getWatched(o);s!==void 0&&!r.has(s)&&(this.watchManager.stop(o),this.log(`[auto-subscribe] stopped watch for ${s} (afk cleared)`));for(let i of r){if(this.watchManager.watching(o)===i)continue;let a=async l=>{for(let c of We(l))await this.bot.telegram.sendMessage(o,c)};this.watchManager.start(o,i,a),this.log(`[auto-subscribe] started watch for ${i} on chat ${o}`);break}}}log(...e){this.options.verbose&&console.log("[TelegramBot]",...e)}};function HH(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}ro();zu();z();W();import cie from"chalk";import K from"chalk";var jH={brand:K.hex("#E67E4C"),mint:K.hex("#5FE3A1"),goblin:K.hex("#9CB04A"),user:K.cyan,caret:K.hex("#7AA2F7"),tool:K.hex("#DCDCAA"),chrome:K.hex("#B0B8C2"),syntaxString:K.italic.hex("#8AB07A"),toolArg:K.dim.white,thinking:K.italic.hex("#9B8FB5"),success:K.green,error:K.red,warning:K.yellow,plan:K.hex("#9F7CE0"),bypass:K.bold.hex("#FF6AC1"),meta:K.blackBright,info:K.hex("#5BA8FF"),fileRef:K.hex("#56B5A8"),heading:K.bold.white,label:K.dim,dim:K.dim,bold:K.bold,italic:K.italic,inverse:K.inverse,diffAdd:K.green,diffRemove:K.red,diffHunk:K.blackBright},pie={brand:K.hex("#C0562A"),mint:K.hex("#1B9E63"),goblin:K.hex("#6B7D2A"),user:K.hex("#0E7490"),caret:K.hex("#3B5BDB"),tool:K.hex("#7A6E00"),chrome:K.hex("#5A6470"),syntaxString:K.italic.hex("#3F7A3F"),toolArg:K.hex("#6B7280"),thinking:K.italic.hex("#6D5B8E"),success:K.hex("#2E7D32"),error:K.hex("#C62828"),warning:K.hex("#B8860B"),plan:K.hex("#7048C0"),bypass:K.bold.hex("#D6297F"),meta:K.hex("#6B7280"),info:K.hex("#1D6FD6"),fileRef:K.hex("#0F766E"),heading:K.bold.hex("#1F2937"),label:K.dim,dim:K.dim,bold:K.bold,italic:K.italic,inverse:K.inverse,diffAdd:K.hex("#2E7D32"),diffRemove:K.hex("#C62828"),diffHunk:K.hex("#6B7280")};var WH={...jH};var KH="https://api.telegram.org";async function aT(t){try{let e=await fetch(`${KH}/bot${t}/getMe`);if(!e.ok)return null;let n=await e.json();return!n.ok||!n.result?.id||!n.result?.first_name?null:{id:n.result.id,...n.result.username!==void 0?{username:n.result.username}:{},firstName:n.result.first_name}}catch{return null}}Bd();W();z();import{randomUUID as Sj}from"node:crypto";import{createHash as mj}from"crypto";import{appendFileSync as gj}from"fs";import{mkdir as hj,open as yj,writeFile as bj}from"fs/promises";import{join as kT}from"path";import{z as y}from"zod";var lT=["policy-refusal","timeout","permission-denied","hook-block","abort","elicitation-declined","denial-breaker"];var GH=y.object({phase:y.literal("started"),toolUseId:y.string(),name:y.string(),inputBytes:y.number().int().nonnegative(),subagentId:y.string().optional()}),cT=y.enum(lT),qH=y.object({phase:y.literal("completed"),toolUseId:y.string(),name:y.string(),resultBytes:y.number().int().nonnegative(),isError:y.boolean(),truncated:y.boolean(),durationMs:y.number().nonnegative(),incomplete:y.boolean().optional(),incompleteReason:y.string().optional(),circuitBreaker:y.boolean().optional(),failureClass:cT.optional(),batchIndex:y.number().int().positive().optional(),batchSize:y.number().int().positive().optional(),subagentId:y.string().optional()}),dT=y.discriminatedUnion("phase",[GH,qH]),zH=y.enum(["PreToolUse","PostToolUse","PostToolUseFailure","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),uT=y.object({hookEvent:zH,decision:y.union([y.literal("block"),y.literal("approve")]).optional(),reason:y.string().optional(),blockedTool:y.string().optional(),subagentId:y.string().optional(),injectedContextBytes:y.number().int().nonnegative().optional(),durationMs:y.number().nonnegative().optional(),approvalOutcome:y.enum(["approved","denied","unrecognised","timeout","decline","cancel","hard-block"]).optional()}),JH=y.object({transition:y.literal("started"),subagentId:y.string(),parentId:y.string(),model:y.string(),allowedTools:y.array(y.string()).readonly().optional(),systemPromptHash:y.string().optional(),promptHead:y.string().optional(),agentType:y.string().optional(),resolvedAgentType:y.string().optional()}),VH=y.object({transition:y.literal("succeeded"),subagentId:y.string(),durationMs:y.number().nonnegative(),turnCount:y.number().int().nonnegative(),totalCostUsd:y.number().nonnegative().optional(),outputBytes:y.number().int().nonnegative(),stopReason:y.string().optional()}),YH=y.object({transition:y.literal("failed"),subagentId:y.string(),errorClass:y.string(),errorMessage:y.string(),partialOutputBytes:y.number().int().nonnegative(),failureClass:cT.optional()}),XH=y.object({transition:y.literal("cancelled"),subagentId:y.string(),source:y.enum(["cascade","explicit"]),timeout:y.boolean().optional()}),pT=y.discriminatedUnion("transition",[JH,VH,YH,XH]),QH=y.object({transition:y.literal("started"),jobId:y.string(),subagentId:y.string(),label:y.string(),model:y.string()}),ZH=y.object({transition:y.literal("completed"),jobId:y.string(),subagentId:y.string(),durationMs:y.number().nonnegative(),outputBytes:y.number().int().nonnegative()}),ej=y.object({transition:y.literal("failed"),jobId:y.string(),subagentId:y.string(),durationMs:y.number().nonnegative(),errorClass:y.string(),errorMessage:y.string()}),tj=y.object({transition:y.literal("cancelled"),jobId:y.string(),subagentId:y.string(),source:y.enum(["explicit","cascade"])}),nj=y.object({transition:y.literal("joined"),jobId:y.string(),subagentId:y.string(),jobStatus:y.enum(["completed","failed","cancelled"])}),rj=y.object({transition:y.literal("delivered"),jobId:y.string(),subagentId:y.string(),jobStatus:y.enum(["completed","failed","cancelled"])}),fT=y.discriminatedUnion("transition",[QH,ZH,ej,tj,nj,rj]),mT=y.object({kind:y.literal("monetary"),runningCostUsd:y.number().nonnegative(),maxBudgetUsd:y.number().nonnegative(),lastTurnCostUsd:y.number().nonnegative()}),oj=y.enum(["user_signal","cascade","timeout","budget","hook_block"]),gT=y.object({origin:oj,cascadedTo:y.array(y.string()).readonly(),reason:y.string().optional()}),hT=y.enum(["manual","token_threshold","turn_count"]),sj=y.object({path:y.string(),sizeBytes:y.number().int().nonnegative(),sha256:y.string().regex(/^[0-9a-f]{64}$/)}),ij=y.object({trigger:hT,preCompactionMessages:y.array(y.unknown()),summary:y.string(),keptTailCount:y.number().int().nonnegative(),keepLastNConfig:y.number().int().nonnegative(),messagesBefore:y.number().int().nonnegative(),messagesAfter:y.number().int().nonnegative(),tokensSavedEstimate:y.number().nonnegative().optional(),summarizationTokens:y.object({input:y.number().int().nonnegative(),output:y.number().int().nonnegative()}).optional()}),aj=y.object({trigger:hT,preCompactionMessagesRef:sj,summary:y.string(),keptTailCount:y.number().int().nonnegative(),keepLastNConfig:y.number().int().nonnegative(),messagesBefore:y.number().int().nonnegative(),messagesAfter:y.number().int().nonnegative(),tokensSavedEstimate:y.number().nonnegative().optional(),summarizationTokens:y.object({input:y.number().int().nonnegative(),output:y.number().int().nonnegative()}).optional()}),lj=y.enum(["model_end_turn","truncated","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),yT=y.object({reason:lj,finalTurnCount:y.number().int().nonnegative(),finalCostUsd:y.number().nonnegative(),finalTokens:y.object({input:y.number().int().nonnegative().optional(),output:y.number().int().nonnegative().optional(),cacheRead:y.number().int().nonnegative().optional(),cacheCreation:y.number().int().nonnegative().optional()}),lastStopReason:y.string().optional(),guidance:y.string().optional()}),bT=y.object({source:y.string(),assertion:y.string(),evidence:y.array(y.string()).readonly(),confidence:y.number().min(0).max(1),dissent:y.string().optional()}),cj=y.enum(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),dj=y.enum(["click","fill","press","select","hover","scroll_to","wait_for"]),uj=y.object({kind:y.enum(["semantic","element_id","selector"]),text:y.string().max(80).optional(),role:y.string().optional(),elementId:y.string().optional(),selectorHash:y.string().regex(/^[0-9a-f]{8}$/).optional()}),wT=y.object({tool:cj,action:dj.optional(),toolUseId:y.string(),target:uj.optional(),urlBefore:y.string().nullable(),urlAfter:y.string().nullable(),status:y.enum(["ok","error","ambiguous_target","blocked_by_policy"]),screenshotPath:y.string().optional(),observationSummary:y.string().max(500).optional(),error:y.object({reason:y.string(),recoverable:y.boolean()}).optional(),durationMs:y.number().nonnegative()}),pj=y.enum(["bootstrap_start","bootstrap_done","session_init_start","session_init_done","mcp_connect_start","mcp_connect_done","mcp_server_start","mcp_server_done","loop_start","loop_end","model_ttfb","interrupt_halt","rate_limit","usage_limit_pause","usage_limit_resume","idle_watchdog_fired","suspected_loop","compaction_disabled"]),ST=y.object({phase:pj,durationMs:y.number().nonnegative().optional(),metadata:y.record(y.string(),y.union([y.string(),y.number(),y.boolean()])).optional(),model:y.string().optional(),resolvedModel:y.string().optional(),origin:y.enum(["cli","telegram","daemon","unknown"]).optional(),actor:y.enum(["main","subagent"]).optional()}),fj=y.object({status:y.enum(["succeeded","failed","cancelled"]),finalCostUsd:y.number().nonnegative(),finalTurnCount:y.number().int().nonnegative(),closedAt:y.string().datetime(),incomplete:y.boolean().optional(),subagentCount:y.number().int().nonnegative().optional(),subagentTokens:y.object({input:y.number().int().nonnegative().optional(),output:y.number().int().nonnegative().optional(),cacheRead:y.number().int().nonnegative().optional(),cacheCreation:y.number().int().nonnegative().optional()}).optional(),subagentCostUsd:y.number().nonnegative().optional()}),vT=y.discriminatedUnion("kind",[y.object({kind:y.literal("tool_call"),payload:dT}),y.object({kind:y.literal("hook_decision"),payload:uT}),y.object({kind:y.literal("subagent_lifecycle"),payload:pT}),y.object({kind:y.literal("background_agent"),payload:fT}),y.object({kind:y.literal("budget"),payload:mT}),y.object({kind:y.literal("abort"),payload:gT}),y.object({kind:y.literal("compaction"),payload:ij}),y.object({kind:y.literal("closure"),payload:yT}),y.object({kind:y.literal("claim"),payload:bT}),y.object({kind:y.literal("browser_event"),payload:wT}),y.object({kind:y.literal("session_phase"),payload:ST})]),Tie=y.discriminatedUnion("kind",[y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("tool_call"),payload:dT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("hook_decision"),payload:uT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("subagent_lifecycle"),payload:pT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("background_agent"),payload:fT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("budget"),payload:mT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("abort"),payload:gT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("compaction"),payload:aj}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("closure"),payload:yT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("claim"),payload:bT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("browser_event"),payload:wT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("session_phase"),payload:ST}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("session_sealed"),payload:fj})]);var wc=new Set,_T=!1;function wj(){_T||(_T=!0,process.on("exit",()=>{for(let t of wc)t.sealOnProcessExit()}))}var Sc=class{traceDir;tracePath;seq=0;sealed=!1;sealRecordPersisted=!1;fh=null;writeQueue=Promise.resolve();constructor(e){this.traceDir=e.traceDir,this.tracePath=kT(this.traceDir,"trace.jsonl")}getTracePath(){return this.tracePath}async write(e){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return vT.parse(e),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(e);await this.appendLine(n)})}async seal(e){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{if(await this.ensureOpen(),this.sealRecordPersisted)return;let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:e};await this.appendLine(n),this.sealRecordPersisted=!0,this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(e){let n=this.writeQueue.then(e,e);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await hj(this.traceDir,{recursive:!0}),this.fh=await yj(this.tracePath,"a"),wc.add(this),wj())}async closeHandle(){if(wc.delete(this),!this.fh)return;let e=this.fh;this.fh=null,await e.close()}sealOnProcessExit(){if(this.sealRecordPersisted||this.seq===0)return;this.sealed=!0,wc.delete(this);try{let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:{status:"failed",finalCostUsd:0,finalTurnCount:0,closedAt:new Date().toISOString(),incomplete:!0}};gj(this.tracePath,`${JSON.stringify(n)}
1209
+ `);s=[],a=a.then(()=>r(d)).catch(u=>this.log("watch send error:",u))};try{for await(let d of ay(n,{signal:o})){if(d.kind==="elicitation"&&l!==void 0){i&&clearTimeout(i),c(),await a;let p=Date.now(),f=0,m=setInterval(()=>{if(f>=$H){clearInterval(m);return}f+=1;let w=Math.round((Date.now()-p)/6e4);r(`\u23F3 Still waiting on your answer (${w}m elapsed) \u2014 no deadline, reply above whenever you're ready. (Send /unwatch to stop watching this session.)`).catch(()=>{})},this.elicitHeartbeatMs);m.unref?.();let g=await(async()=>{try{return await l(d.request,{signal:o})}finally{clearInterval(m)}})(),h=hc(n);if(h!==null){let w=tT(h,n,d.reqId,g);new Ht(n).record({kind:"elicitation_response",reqId:d.reqId,result:g,hmac:w})}else this.log("[watch] no session key for",n,"\u2014 skipping elicitation write-back");continue}let u=UH(d);if(u){if(s.push(u),d.kind==="closed"){c();break}i||(i=setTimeout(c,LH),i.unref?.())}}i&&clearTimeout(i),c(),await a}finally{i&&clearTimeout(i);let d=this.watches.get(e);d&&d.sessionId===n&&d.abort.signal===o&&this.watches.delete(e)}}};fn();Ki();Ne();var bc=class t{bot;sessionManager;options;running=!1;registeredCommandChats=new Set;messageHandler;watchManager;autoSubscribeInterval=null;static AUTO_SUBSCRIBE_INTERVAL_MS=5e3;constructor(e){this.options=e,this.bot=new BH(e.botToken,{handlerTimeout:1/0}),this.sessionManager=new si(e),this.messageHandler=new cc(this.bot,this.sessionManager,this.registeredCommandChats,this.log.bind(this),e.tagOnlyChats??new Set),this.watchManager=new yc(this.log.bind(this),this.bot,this.messageHandler),this.setupHandlers()}setupHandlers(){this.bot.use(dh(this.options.allowedChatIds,this.log.bind(this))),this.bot.command("start",r=>Xc(r)),this.bot.command("help",r=>Qc(r,this.sessionManager)),this.bot.command("clear",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}(await this.sessionManager.getSession(o)).state!=="idle"?(this.messageHandler.enqueueClear(o,r),await r.reply("Clear queued.")):await Pf(r,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}),this.bot.command("compact",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}if((await this.sessionManager.getSession(o)).state!=="idle")this.messageHandler.enqueueCompact(o,r),await r.reply("Compact queued.");else try{await cE(r,this.sessionManager,this.log.bind(this))}finally{this.messageHandler.drainQueue(o).catch(i=>this.log("Drain error:",i))}}),this.bot.command("model",r=>Mf(r,this.sessionManager,this.log.bind(this))),this.bot.command(["cd","cwd"],r=>dE(r,this.sessionManager,this.log.bind(this))),this.bot.command("name",r=>uE(r,this.sessionManager,this.log.bind(this))),this.bot.command("afk",r=>yE(r,this.sessionManager,this.log.bind(this))),this.bot.command("usage",r=>wE(r,this.log.bind(this))),this.bot.command("sessions",r=>mE(r,this.sessionManager,this.log.bind(this))),this.bot.command("new",r=>gE(r,this.sessionManager,this.registeredCommandChats,this.log.bind(this))),this.bot.command("watch",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}let i=((r.message&&"text"in r.message?r.message.text:"")??"").split(/\s+/).slice(1).join(" ").trim();try{if(!i){await r.reply(await iT());return}let a=await sT(i);if(!a){await r.reply(`No session ledger found for "${i}". Use /watch with no argument to list watchable sessions.`);return}let l=async c=>{for(let d of We(c))await r.telegram.sendMessage(o,d)};this.watchManager.start(o,a,l),await r.reply(`\u{1F4E1} Watching ${a} \u2014 new activity will stream here. /unwatch to stop.`)}catch(a){this.log("Watch error:",a),await r.reply(V(a))}}),this.bot.command("unwatch",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}let s=this.watchManager.stop(o);await r.reply(s?`Stopped watching ${s}.`:"Not watching anything.")}),this.bot.command("abort",async r=>{let o=r.chat?.id;if(!o){await r.reply(V("Could not identify chat"));return}let s=this.watchManager.getWatched(o);if(!s){await r.reply("Not watching any session. Use /watch <session-id> to watch a REPL session first, then /abort to stop it.");return}let i=hc(s);if(i===null){await r.reply("Session key not found \u2014 the REPL may not have enabled AFK mode (/afk on). Cannot send a verified abort.");return}let a=rT(),l=nT(i,s,a);new Ht(s).record({kind:"abort_request",nonce:a,hmac:l}),await r.reply(`\u270B Abort sent to session ${s}.`)});let e=r=>{r.catch(o=>{let i=(o instanceof Error?o.message:String(o)).replace(/\/bot[^/]+\//g,"/bot[REDACTED]/");this.log("Detached update handler error:",i)})};this.bot.on("text",r=>e(this.messageHandler.handle(r))),this.bot.on("photo",r=>e(this.messageHandler.handlePhoto(r)));let n=new RegExp(`^${HH(sc)}`);this.bot.action(n,r=>OE(r,{log:this.log.bind(this)})),this.bot.action(/^afk:m:/,async r=>{if(await r.answerCbQuery().catch(()=>{}),r.chat?.id!==void 0&&!this.options.allowedChatIds.has(r.chat.id))return;let s=(typeof r.callbackQuery=="object"&&"data"in r.callbackQuery?r.callbackQuery.data:"").replace("afk:m:",""),i=r.chat?.id;if(!(!i||!s)&&zn.includes(s))try{await this.sessionManager.switchModel(i,s);let a=li(s);await r.editMessageText(a).catch(()=>r.reply(a))}catch(a){this.log("Model action error:",a)}}),this.bot.action(/^afk:sw:/,async r=>{await r.answerCbQuery().catch(()=>{}),!(r.chat?.id!==void 0&&!this.options.allowedChatIds.has(r.chat.id))&&await hE(r,this.sessionManager,this.log.bind(this))}),this.bot.catch((r,o)=>{this.log("Bot error:",r),o.reply(V("An unexpected error occurred. Please try again.")).catch(s=>this.log("Failed to send error message:",s))})}async start(){if(this.running)throw new Error("Bot is already running");this.log("Loading sessions..."),await this.sessionManager.loadSessions();let e=[...this.options.allowedChatIds];if(e.length>0){let r=e[0],o=pc(this.messageHandler,this.bot,r),s=fc(this.bot,new Set(this.options.allowedChatIds),(...i)=>this.log("[elicitation]",...i));Be.install(mc(o,s))}await pA(),this.log("Starting bot..."),await this.bot.launch(),this.log("Registering bot commands..."),await this.bot.telegram.setMyCommands([{command:"start",description:"Show welcome and command list"},{command:"help",description:"Show this command list"},{command:"clear",description:"Clear conversation history"},{command:"compact",description:"Compact conversation history"},{command:"model",description:"Switch Claude model (opus/sonnet/haiku)"},{command:"cd",description:"Show or change session working directory"},{command:"name",description:"Show or set the session name"},{command:"afk",description:"Toggle autonomous (AFK) mode for this chat"},{command:"usage",description:"Show Claude subscription usage"},{command:"watch",description:"Live-tail a CLI session from this chat"},{command:"unwatch",description:"Stop watching a session"}]),this.running=!0,this.log("Bot started successfully"),this.startAutoSubscribe();let n=async r=>{this.log(`Received ${r}, shutting down...`),await this.stop(),process.exit(0)};process.once("SIGINT",()=>n("SIGINT")),process.once("SIGTERM",()=>n("SIGTERM"))}async stop(){if(this.running){this.log("Stopping bot..."),this.running=!1,this.log("Stopping auto-subscribe loop..."),this.stopAutoSubscribe(),this.log("Uninstalling elicitation handler..."),Be.uninstall(),this.log("Stopping session watches..."),await this.watchManager.stopAll(),this.log("Closing sessions..."),await this.sessionManager.closeAll(),this.log("Stopping bot polling...");try{this.bot.stop()}catch(e){this.log("Error stopping bot (may not have been started):",e)}this.log("Bot stopped")}}getStats(){return{running:this.running,activeSessions:this.sessionManager.getSessionCount(),totalChats:this.sessionManager.getChatCount()}}getBusySessionCount(){return this.sessionManager.getBusySessionCount()}async handleStart(e){return Xc(e)}async handleHelp(e){return Qc(e,this.sessionManager)}async handleClear(e){let n=e.chat?.id;if(!n){await e.reply(V("Could not identify chat"));return}if((await this.sessionManager.getSession(n)).state!=="idle")this.messageHandler.enqueueClear(n,e),await e.reply("Clear queued.");else return Pf(e,this.sessionManager,this.registeredCommandChats,this.log.bind(this))}async handleMessage(e){return this.messageHandler.handle(e)}async handlePhoto(e){return this.messageHandler.handlePhoto(e)}async handleModelSwitch(e){return Mf(e,this.sessionManager,this.log.bind(this))}startAutoSubscribe(){if(this.autoSubscribeInterval!==null)return;let e=()=>{this.runAutoSubscribeTick().catch(n=>this.log("auto-subscribe tick error:",n))};this.autoSubscribeInterval=setInterval(e,t.AUTO_SUBSCRIBE_INTERVAL_MS),this.autoSubscribeInterval.unref?.(),e()}stopAutoSubscribe(){this.autoSubscribeInterval!==null&&(clearInterval(this.autoSubscribeInterval),this.autoSubscribeInterval=null)}async runAutoSubscribeTick(){let e=[...this.options.allowedChatIds];if(e.length===0)return;let n;try{n=await mo()}catch{return}let r=new Set(n.filter(o=>o.surface==="cli"&&o.afk===!0&&o.sessionId).map(o=>o.sessionId));for(let o of e){let s=this.watchManager.getWatched(o);s!==void 0&&!r.has(s)&&(this.watchManager.stop(o),this.log(`[auto-subscribe] stopped watch for ${s} (afk cleared)`));for(let i of r){if(this.watchManager.watching(o)===i)continue;let a=async l=>{for(let c of We(l))await this.bot.telegram.sendMessage(o,c)};this.watchManager.start(o,i,a),this.log(`[auto-subscribe] started watch for ${i} on chat ${o}`);break}}}log(...e){this.options.verbose&&console.log("[TelegramBot]",...e)}};function HH(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}ro();zu();z();W();import cie from"chalk";import K from"chalk";var jH={brand:K.hex("#E67E4C"),mint:K.hex("#5FE3A1"),goblin:K.hex("#9CB04A"),user:K.cyan,caret:K.hex("#7AA2F7"),tool:K.hex("#DCDCAA"),chrome:K.hex("#B0B8C2"),syntaxString:K.italic.hex("#8AB07A"),toolArg:K.dim.white,thinking:K.italic.hex("#9B8FB5"),success:K.green,error:K.red,warning:K.yellow,plan:K.hex("#9F7CE0"),bypass:K.bold.hex("#FF6AC1"),meta:K.blackBright,info:K.hex("#5BA8FF"),fileRef:K.hex("#56B5A8"),heading:K.bold.white,label:K.dim,dim:K.dim,bold:K.bold,italic:K.italic,inverse:K.inverse,diffAdd:K.green,diffRemove:K.red,diffHunk:K.blackBright},pie={brand:K.hex("#C0562A"),mint:K.hex("#1B9E63"),goblin:K.hex("#6B7D2A"),user:K.hex("#0E7490"),caret:K.hex("#3B5BDB"),tool:K.hex("#7A6E00"),chrome:K.hex("#5A6470"),syntaxString:K.italic.hex("#3F7A3F"),toolArg:K.hex("#6B7280"),thinking:K.italic.hex("#6D5B8E"),success:K.hex("#2E7D32"),error:K.hex("#C62828"),warning:K.hex("#B8860B"),plan:K.hex("#7048C0"),bypass:K.bold.hex("#D6297F"),meta:K.hex("#6B7280"),info:K.hex("#1D6FD6"),fileRef:K.hex("#0F766E"),heading:K.bold.hex("#1F2937"),label:K.dim,dim:K.dim,bold:K.bold,italic:K.italic,inverse:K.inverse,diffAdd:K.hex("#2E7D32"),diffRemove:K.hex("#C62828"),diffHunk:K.hex("#6B7280")};var WH={...jH};var KH="https://api.telegram.org";async function aT(t){try{let e=await fetch(`${KH}/bot${t}/getMe`);if(!e.ok)return null;let n=await e.json();return!n.ok||!n.result?.id||!n.result?.first_name?null:{id:n.result.id,...n.result.username!==void 0?{username:n.result.username}:{},firstName:n.result.first_name}}catch{return null}}Bd();W();z();import{randomUUID as Sj}from"node:crypto";import{createHash as mj}from"crypto";import{appendFileSync as gj}from"fs";import{mkdir as hj,open as yj,writeFile as bj}from"fs/promises";import{join as kT}from"path";import{z as y}from"zod";var lT=["policy-refusal","timeout","permission-denied","hook-block","abort","elicitation-declined","denial-breaker"];var GH=y.object({phase:y.literal("started"),toolUseId:y.string(),name:y.string(),inputBytes:y.number().int().nonnegative(),subagentId:y.string().optional()}),cT=y.enum(lT),qH=y.object({phase:y.literal("completed"),toolUseId:y.string(),name:y.string(),resultBytes:y.number().int().nonnegative(),isError:y.boolean(),truncated:y.boolean(),durationMs:y.number().nonnegative(),incomplete:y.boolean().optional(),incompleteReason:y.string().optional(),circuitBreaker:y.boolean().optional(),failureClass:cT.optional(),batchIndex:y.number().int().positive().optional(),batchSize:y.number().int().positive().optional(),subagentId:y.string().optional()}),dT=y.discriminatedUnion("phase",[GH,qH]),zH=y.enum(["PreToolUse","PostToolUse","PostToolUseFailure","SessionStart","SessionEnd","SubagentStart","SubagentStop"]),uT=y.object({hookEvent:zH,decision:y.union([y.literal("block"),y.literal("approve")]).optional(),reason:y.string().optional(),blockedTool:y.string().optional(),subagentId:y.string().optional(),injectedContextBytes:y.number().int().nonnegative().optional(),durationMs:y.number().nonnegative().optional(),approvalOutcome:y.enum(["approved","denied","unrecognised","timeout","decline","cancel","hard-block"]).optional()}),JH=y.object({transition:y.literal("started"),subagentId:y.string(),parentId:y.string(),model:y.string(),allowedTools:y.array(y.string()).readonly().optional(),systemPromptHash:y.string().optional(),promptHead:y.string().optional(),agentType:y.string().optional(),resolvedAgentType:y.string().optional()}),VH=y.object({transition:y.literal("succeeded"),subagentId:y.string(),durationMs:y.number().nonnegative(),turnCount:y.number().int().nonnegative(),totalCostUsd:y.number().nonnegative().optional(),outputBytes:y.number().int().nonnegative(),stopReason:y.string().optional()}),YH=y.object({transition:y.literal("failed"),subagentId:y.string(),errorClass:y.string(),errorMessage:y.string(),partialOutputBytes:y.number().int().nonnegative(),failureClass:cT.optional()}),XH=y.object({transition:y.literal("cancelled"),subagentId:y.string(),source:y.enum(["cascade","explicit"]),timeout:y.boolean().optional()}),pT=y.discriminatedUnion("transition",[JH,VH,YH,XH]),QH=y.object({transition:y.literal("started"),jobId:y.string(),subagentId:y.string(),label:y.string(),model:y.string()}),ZH=y.object({transition:y.literal("completed"),jobId:y.string(),subagentId:y.string(),durationMs:y.number().nonnegative(),outputBytes:y.number().int().nonnegative()}),ej=y.object({transition:y.literal("failed"),jobId:y.string(),subagentId:y.string(),durationMs:y.number().nonnegative(),errorClass:y.string(),errorMessage:y.string()}),tj=y.object({transition:y.literal("cancelled"),jobId:y.string(),subagentId:y.string(),source:y.enum(["explicit","cascade"])}),nj=y.object({transition:y.literal("joined"),jobId:y.string(),subagentId:y.string(),jobStatus:y.enum(["completed","failed","cancelled"])}),rj=y.object({transition:y.literal("delivered"),jobId:y.string(),subagentId:y.string(),jobStatus:y.enum(["completed","failed","cancelled"])}),fT=y.discriminatedUnion("transition",[QH,ZH,ej,tj,nj,rj]),mT=y.object({kind:y.literal("monetary"),runningCostUsd:y.number().nonnegative(),maxBudgetUsd:y.number().nonnegative(),lastTurnCostUsd:y.number().nonnegative()}),oj=y.enum(["user_signal","cascade","timeout","budget","hook_block"]),gT=y.object({origin:oj,cascadedTo:y.array(y.string()).readonly(),reason:y.string().optional()}),hT=y.enum(["manual","token_threshold","turn_count"]),sj=y.object({path:y.string(),sizeBytes:y.number().int().nonnegative(),sha256:y.string().regex(/^[0-9a-f]{64}$/)}),ij=y.object({trigger:hT,preCompactionMessages:y.array(y.unknown()),summary:y.string(),keptTailCount:y.number().int().nonnegative(),keepLastNConfig:y.number().int().nonnegative(),messagesBefore:y.number().int().nonnegative(),messagesAfter:y.number().int().nonnegative(),tokensSavedEstimate:y.number().nonnegative().optional(),summarizationTokens:y.object({input:y.number().int().nonnegative(),output:y.number().int().nonnegative()}).optional()}),aj=y.object({trigger:hT,preCompactionMessagesRef:sj,summary:y.string(),keptTailCount:y.number().int().nonnegative(),keepLastNConfig:y.number().int().nonnegative(),messagesBefore:y.number().int().nonnegative(),messagesAfter:y.number().int().nonnegative(),tokensSavedEstimate:y.number().nonnegative().optional(),summarizationTokens:y.object({input:y.number().int().nonnegative(),output:y.number().int().nonnegative()}).optional()}),lj=y.enum(["model_end_turn","truncated","iteration_cap","abort","timeout","budget_exceeded","hook_blocked","max_turns_exceeded"]),yT=y.object({reason:lj,finalTurnCount:y.number().int().nonnegative(),finalCostUsd:y.number().nonnegative(),finalTokens:y.object({input:y.number().int().nonnegative().optional(),output:y.number().int().nonnegative().optional(),cacheRead:y.number().int().nonnegative().optional(),cacheCreation:y.number().int().nonnegative().optional()}),lastStopReason:y.string().optional(),guidance:y.string().optional()}),bT=y.object({source:y.string(),assertion:y.string(),evidence:y.array(y.string()).readonly(),confidence:y.number().min(0).max(1),dissent:y.string().optional()}),cj=y.enum(["browser_open","browser_observe","browser_act","browser_screenshot","browser_extract","browser_close"]),dj=y.enum(["click","fill","press","select","hover","scroll_to","wait_for"]),uj=y.object({kind:y.enum(["semantic","element_id","selector"]),text:y.string().max(80).optional(),role:y.string().optional(),elementId:y.string().optional(),selectorHash:y.string().regex(/^[0-9a-f]{8}$/).optional()}),wT=y.object({tool:cj,action:dj.optional(),toolUseId:y.string(),target:uj.optional(),urlBefore:y.string().nullable(),urlAfter:y.string().nullable(),status:y.enum(["ok","error","ambiguous_target","blocked_by_policy"]),screenshotPath:y.string().optional(),observationSummary:y.string().max(500).optional(),error:y.object({reason:y.string(),recoverable:y.boolean()}).optional(),durationMs:y.number().nonnegative()}),pj=y.enum(["bootstrap_start","bootstrap_done","session_init_start","session_init_done","mcp_connect_start","mcp_connect_done","mcp_server_start","mcp_server_done","loop_start","loop_end","model_ttfb","interrupt_halt","rate_limit","ttfb_timeout","usage_limit_pause","usage_limit_resume","idle_watchdog_fired","suspected_loop","compaction_disabled"]),ST=y.object({phase:pj,durationMs:y.number().nonnegative().optional(),metadata:y.record(y.string(),y.union([y.string(),y.number(),y.boolean()])).optional(),model:y.string().optional(),resolvedModel:y.string().optional(),origin:y.enum(["cli","telegram","daemon","unknown"]).optional(),actor:y.enum(["main","subagent"]).optional()}),fj=y.object({status:y.enum(["succeeded","failed","cancelled"]),finalCostUsd:y.number().nonnegative(),finalTurnCount:y.number().int().nonnegative(),closedAt:y.string().datetime(),incomplete:y.boolean().optional(),subagentCount:y.number().int().nonnegative().optional(),subagentTokens:y.object({input:y.number().int().nonnegative().optional(),output:y.number().int().nonnegative().optional(),cacheRead:y.number().int().nonnegative().optional(),cacheCreation:y.number().int().nonnegative().optional()}).optional(),subagentCostUsd:y.number().nonnegative().optional()}),vT=y.discriminatedUnion("kind",[y.object({kind:y.literal("tool_call"),payload:dT}),y.object({kind:y.literal("hook_decision"),payload:uT}),y.object({kind:y.literal("subagent_lifecycle"),payload:pT}),y.object({kind:y.literal("background_agent"),payload:fT}),y.object({kind:y.literal("budget"),payload:mT}),y.object({kind:y.literal("abort"),payload:gT}),y.object({kind:y.literal("compaction"),payload:ij}),y.object({kind:y.literal("closure"),payload:yT}),y.object({kind:y.literal("claim"),payload:bT}),y.object({kind:y.literal("browser_event"),payload:wT}),y.object({kind:y.literal("session_phase"),payload:ST})]),Tie=y.discriminatedUnion("kind",[y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("tool_call"),payload:dT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("hook_decision"),payload:uT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("subagent_lifecycle"),payload:pT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("background_agent"),payload:fT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("budget"),payload:mT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("abort"),payload:gT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("compaction"),payload:aj}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("closure"),payload:yT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("claim"),payload:bT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("browser_event"),payload:wT}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("session_phase"),payload:ST}),y.object({ts:y.string().datetime(),seq:y.number().int().nonnegative(),kind:y.literal("session_sealed"),payload:fj})]);var wc=new Set,_T=!1;function wj(){_T||(_T=!0,process.on("exit",()=>{for(let t of wc)t.sealOnProcessExit()}))}var Sc=class{traceDir;tracePath;seq=0;sealed=!1;sealRecordPersisted=!1;fh=null;writeQueue=Promise.resolve();constructor(e){this.traceDir=e.traceDir,this.tracePath=kT(this.traceDir,"trace.jsonl")}getTracePath(){return this.tracePath}async write(e){if(this.sealed)throw new Error("NdjsonTraceWriter: trace is sealed; write() rejected");return vT.parse(e),this.enqueue(async()=>{await this.ensureOpen();let n=await this.materializePersistedEvent(e);await this.appendLine(n)})}async seal(e){this.sealed||(this.sealed=!0,await this.enqueue(async()=>{if(await this.ensureOpen(),this.sealRecordPersisted)return;let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:e};await this.appendLine(n),this.sealRecordPersisted=!0,this.fh&&await this.fh.sync()}),await this.closeHandle())}async close(){await this.enqueue(async()=>{}),await this.closeHandle()}enqueue(e){let n=this.writeQueue.then(e,e);return this.writeQueue=n.then(()=>{},()=>{}),n}async ensureOpen(){this.fh||(await hj(this.traceDir,{recursive:!0}),this.fh=await yj(this.tracePath,"a"),wc.add(this),wj())}async closeHandle(){if(wc.delete(this),!this.fh)return;let e=this.fh;this.fh=null,await e.close()}sealOnProcessExit(){if(this.sealRecordPersisted||this.seq===0)return;this.sealed=!0,wc.delete(this);try{let n={ts:new Date().toISOString(),seq:this.seq++,kind:"session_sealed",payload:{status:"failed",finalCostUsd:0,finalTurnCount:0,closedAt:new Date().toISOString(),incomplete:!0}};gj(this.tracePath,`${JSON.stringify(n)}
1210
1210
  `),this.sealRecordPersisted=!0}catch{}let e=this.fh;this.fh=null,e&&e.close().catch(()=>{})}async appendLine(e){if(!this.fh)throw new Error("NdjsonTraceWriter: file handle missing");await this.fh.appendFile(`${JSON.stringify(e)}
1211
1211
  `)}async materializePersistedEvent(e){let n=new Date().toISOString(),r=this.seq++;if(e.kind==="compaction"){let o=await this.persistCompactionSidecar(e.payload,r,n);return{ts:n,seq:r,kind:"compaction",payload:o}}return{ts:n,seq:r,kind:e.kind,payload:e.payload}}async persistCompactionSidecar(e,n,r){let o=r.replace(/[:.]/g,"-"),s=kT(this.traceDir,`${String(n).padStart(6,"0")}-${o}-pre-compaction.json`),i=JSON.stringify(e.preCompactionMessages),a=Buffer.byteLength(i,"utf8"),l=mj("sha256").update(i).digest("hex");await bj(s,i,{encoding:"utf8",flag:"w"});let c={path:s,sizeBytes:a,sha256:l};return{trigger:e.trigger,preCompactionMessagesRef:c,summary:e.summary,keptTailCount:e.keptTailCount,keepLastNConfig:e.keepLastNConfig,messagesBefore:e.messagesBefore,messagesAfter:e.messagesAfter,...e.tokensSavedEstimate!==void 0?{tokensSavedEstimate:e.tokensSavedEstimate}:{},...e.summarizationTokens!==void 0?{summarizationTokens:e.summarizationTokens}:{}}}};function Kf(t={}){if(_.AFK_TRACE_DISABLED==="1")return null;let e=t.sessionLabel??Sj(),n=js(e),r=new Sc({traceDir:n});return{writer:r,tracePath:r.getTracePath(),sessionLabel:e}}function AT(t=Kf){return t()?.writer??null}function Gf(t,e={}){let n="traceWriter"in e?e.traceWriter??null:(e.createTraceWriter??Kf)()?.writer??null,r=n?{traceWriter:n,...t,surface:"telegram"}:{...t,surface:"telegram"};return(e.newSession??(s=>new yn(s)))(r)}Xi();var vj=["shadow-verify","shadow_verify","resolve","diagnose","appmap","mint","review","verify","verifier"],kj=[/\bverdict(s)?\b/i,/\brecommend(ation)?s?\b/i,/\bshould\s+(delete|remove|rewrite|refactor|rename|reject|merge|revert|disable)\b/i,/\b(USELESS|KEEP|REJECT|APPROVE|SALVAGE|BLOCK|FAIL)\b/,/\b(redundant|duplicated|superseded|obsolete)\b/i,/\bvulnerab\w*\b/i,/\bunused\b/i,/\bbroken\b/i,/\bregress\w*\b/i,/\|\s*(status|verdict|decision|severity|risk|finding|priority|holds\??)\s*\|/i,/\bfound\s+\d+\s*(issue|problem|bug|error|finding|vulnerabilit)/i,/\b(critical|high|medium|low)\s+(severity|priority|risk)\b/i,/\bclaim(s)?\b[^\n]{0,80}\b(holds?|refuted|verified|partial|confirmed|disputed)\b/i,/\b(root\s*cause|incident)\b/i,/\brecommend\s+(removing|deleting|rewriting|refactoring|merging|reverting)\b/i,/\bI\s+(applied|committed|pushed|edited|wrote|fixed|patched|reset|restored|staged)\b/i,/\b(applied|committed|pushed|fixed|patched)\s+(the|these|those)\s+(change|commit|fix|patch|edit)/i],_j=[/\bverifier_verdict\b/i,/"\s*claim\s*"\s*:/i,/\bre-derived\b[^.\n]{0,80}\bindependent/i,/\bindependently\s+(re-derived|re-verified|verified|checked)\b/i,/\bverifier\s+(agrees|disagrees|confirms|refutes)\b/i,/\b(CONFIRMED|REFUTED|UNVERIFIABLE)\b[\s\S]*?\b(CONFIRMED|REFUTED|UNVERIFIABLE)\b/,/\|\s*(claims?|verdicts?)\s*\|/i],Aj=`[framework-generated context: shadow-verify nudge]
1212
1212