agent-afk 5.170.0 → 5.170.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type OpenAIAuthSource = 'config' | 'env' | 'codex-cli' | 'chatgpt-oauth' | 'no-usable-auth' | 'no-usable-auth-codex-oauth' | 'no-usable-auth-forced-chatgpt-oauth';
|
|
1
|
+
export type OpenAIAuthSource = 'config' | 'env' | 'codex-cli' | 'chatgpt-oauth' | 'chatgpt-oauth-expired' | 'no-usable-auth' | 'no-usable-auth-codex-oauth' | 'no-usable-auth-forced-chatgpt-oauth';
|
|
2
2
|
export interface OpenAIAuthResolution {
|
|
3
3
|
apiKey: string | null;
|
|
4
4
|
source: OpenAIAuthSource;
|
package/dist/cli.mjs
CHANGED
|
@@ -424,7 +424,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
|
|
|
424
424
|
|
|
425
425
|
${t}`}var fye,AC=y(()=>{"use strict";fye=new Set(["script","style","noscript","template","svg"])});function yye(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function N1(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function bye(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function B1(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??yye,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!hye.has(d.status)||u===o)return d;let p=bye(d,s)??N1(u,i,s);N("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=N1(u,i,s);N("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var hye,U1=y(()=>{"use strict";de();hye=new Set([429,502,503,504])});import{BlockList as wye,isIP as _C}from"node:net";import{lookup as Sye}from"node:dns/promises";import{Agent as vye}from"undici";function H1(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function Rye(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function CC(e){let t=_C(e);return t===0?!1:Eye.check(e,t===4?"ipv4":"ipv6")}async function W1(e){return Sye(e,{all:!0,verbatim:!0})}async function IC(e,t={}){if(t.allowPrivateHosts??H1())return{allowed:!0};let n;try{n=new URL(e)}catch{return{allowed:!1,reason:`"${e}" is not a valid absolute URL`}}if(n.protocol!=="http:"&&n.protocol!=="https:")return{allowed:!1,reason:`protocol "${n.protocol}" not supported (http/https only)`};let r=Rye(n.hostname),o=(a,l)=>`refusing to fetch ${l} \u2014 internal/private address ${a} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`;if(_C(r)!==0)return CC(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??W1,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(CC(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function wm(e,t={}){let n=await IC(e,t);if(!n.allowed)throw new mr(n.reason)}async function vb(e,t,n={},r={}){let o={...r.lookupFn!==void 0?{lookupFn:r.lookupFn}:{},...r.allowPrivateHosts!==void 0?{allowPrivateHosts:r.allowPrivateHosts}:{}},i=t;for(let s=0;s<=j1;s++){await wm(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??H1())?{dispatcher:xye}:{}},l=await B1(e,i,a,r.retry??{});if(!Aye.has(l.status))return l;let c=l.headers.get("location");if(c===null||c.trim()==="")return l;let u;try{u=new URL(c,l.url||i).toString()}catch{return l}await l.body?.cancel().catch(()=>{}),i=u}throw new mr(`too many redirects (>${j1}) starting from ${t}`)}var kye,Tye,Eye,mr,xye,j1,Aye,PC=y(()=>{"use strict";L();U1();kye=[["0.0.0.0",8],["10.0.0.0",8],["100.64.0.0",10],["127.0.0.0",8],["169.254.0.0",16],["172.16.0.0",12],["192.168.0.0",16]],Tye=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],Eye=(()=>{let e=new wye;for(let[t,n]of kye)e.addSubnet(t,n,"ipv4");for(let[t,n]of Tye)e.addSubnet(t,n,"ipv6");return e})(),mr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};xye=new vye({connect:{lookup(e,t,n){W1(e).then(r=>{let o=r.find(s=>CC(s.address));if(o!==void 0){n(new mr(`refusing to connect to ${e} (resolved) \u2014 internal/private address ${o.address} (loopback, link-local, cloud metadata, or RFC1918 space). Set AFK_WEB_ALLOW_PRIVATE_HOSTS=1 to allow private-host access.`),"",0);return}let i=r[0];if(i===void 0){n(new Error(`DNS lookup returned no addresses for ${e}`),"",0);return}n(null,i.address,_C(i.address))},r=>n(r,"",0))}}});j1=20,Aye=new Set([301,302,303,307,308])});var z1={};vn(z1,{enforceDomainPolicy:()=>fr,loadBrowserConfig:()=>MC});import{readFileSync as Cye}from"node:fs";import{join as _ye}from"path";function Iye(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function K1(e,t){return Iye(t).test(e)}function Oye(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(Pye.has(t))return!0;if(Mye.has(t))return!1}return!1}function G1(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Dye(e){if(e===void 0||e==="")return"auto";if(e==="playwright"||e==="agent-browser"||e==="auto")return e;throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${e}`)}function q1(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Bl(t),t}function $ye(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function Lye(e){try{return Cye(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Fye(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright"||t.backend==="agent-browser"||t.backend==="auto")n.backend=t.backend;else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: must be "playwright", "agent-browser", or "auto", got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=q1(t.defaultProfile)),n}function MC(e){let t=e?.env??v,n=e?.readFileSync??Lye,r=e?.surface??t.AGENT_SURFACE,o=Oye(t.AFK_BROWSER_HEADLESS,r),i=G1(t.AFK_BROWSER_ALLOWED_DOMAINS),s=G1(t.AFK_BROWSER_BLOCKED_DOMAINS),a=$ye(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Dye(t.AFK_BROWSER_BACKEND),c=q1(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():_ye(Dn(),"browser.json"),f=n(p);if(f===void 0)return u;let g;try{g=JSON.parse(f)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=Fye(u,g);return h.configPath=p,h}function fr(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(K1(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>K1(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var Pye,Mye,da=y(()=>{"use strict";L();U();Pye=new Set(["daemon","subagent","telegram","afk"]),Mye=new Set(["repl","interactive","cli"])});import{readFileSync as Nye}from"node:fs";import{join as Bye}from"node:path";import{homedir as Uye}from"node:os";function Hye(e){let t=e??jye,n;try{n=Nye(t,"utf8")}catch{return null}let r;try{r=JSON.parse(n)}catch{return null}if(typeof r!="object"||r===null||Array.isArray(r))return null;let o=r;if(typeof o.url!="string"||typeof o.token!="string"||typeof o.pid!="number")return null;let i;try{i=new URL(o.url)}catch{return null}let{hostname:s,protocol:a}=i;if(!(s==="127.0.0.1"||s==="localhost"||s==="::1")||a!=="http:")throw new Error(`Agent Browser connection file contains an untrusted URL: ${o.url}. Only http://127.0.0.1 or http://localhost is permitted.`);return{url:o.url,token:o.token,pid:o.pid,version:typeof o.version=="string"?o.version:"unknown"}}function Wye(e){try{return process.kill(e,0),!0}catch{return!1}}async function Kye(e,t,n=2e3){try{let r=new AbortController,o=setTimeout(()=>r.abort(),n),i=await fetch(`${e}/health`,{method:"GET",headers:{Authorization:`Bearer ${t}`,Host:"127.0.0.1:8833"},signal:r.signal});return clearTimeout(o),i.ok}catch{return!1}}async function OC(e){let t=Hye(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:Wye(t.pid)?await Kye(t.url,t.token)?{available:!0,connection:t,reason:null}:{available:!1,connection:t,reason:`health probe failed at ${t.url}`}:{available:!1,connection:t,reason:`stale connection file: PID ${t.pid} not alive`}}var jye,V1=y(()=>{"use strict";jye=Bye(Uye(),".config","agent-browser","connection.json")});async function Y1(e){let{config:t,surface:n}=e;if(t.backend==="playwright")return{backend:"playwright",reason:"explicit config: backend=playwright",probeMs:0,availability:null};if(t.backend==="agent-browser"){let s=Date.now(),a=await OC(),l=Date.now()-s;if(!a.available)throw new Error(`AFK_BROWSER_BACKEND=agent-browser but Agent Browser is not available: ${a.reason}`);return{backend:"agent-browser",reason:"explicit config: backend=agent-browser",probeMs:l,availability:a}}if(n&&Gye.has(n))return{backend:"playwright",reason:`auto: surface "${n}" excluded from Agent Browser`,probeMs:0,availability:null};if(t.headless)return{backend:"playwright",reason:"auto: headless mode requires Playwright",probeMs:0,availability:null};let r=Date.now(),o=await OC(),i=Date.now()-r;return o.available?{backend:"agent-browser",reason:"auto: Agent Browser available and preferred",probeMs:i,availability:o}:{backend:"playwright",reason:`auto: Agent Browser unavailable (${o.reason})`,probeMs:i,availability:o}}var Gye,J1=y(()=>{"use strict";V1();Gye=new Set(["daemon","subagent"])});import{createHash as qye}from"crypto";function X1(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&zye.test(e.label))}function Q1(e){return qye("sha256").update(e,"utf8").digest("hex").slice(0,8)}function Z1(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var zye,kb=y(()=>{"use strict";zye=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as Vye}from"crypto";import{mkdir as Yye,stat as Jye,writeFile as Xye}from"fs/promises";import{join as DC}from"path";import{gzip as Qye}from"zlib";import{promisify as Zye}from"util";function ebe(e){return DC(sn(e),"browser")}function tbe(e){return DC(ebe(e),"screenshots")}function nbe(){return new Date().toISOString().replace(/[:.]/g,"-")}function rbe(){return Vye(3).toString("hex")}async function _c(e,t,n){if(t.length>eH)throw new Error(`writeScreenshotSidecar: buffer exceeds ${eH} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=tbe(e);await Yye(r,{recursive:!0});let o=`${nbe()}-${rbe()}-${n}.png`,i=DC(r,o);await Xye(i,t);let{size:s}=await Jye(i);return{path:i,bytes:s}}var Q7e,eH,$C=y(()=>{"use strict";U();kb();Q7e=Zye(Qye);eH=5*1024*1024});var Tb,tH=y(()=>{"use strict";Tb=class{baseUrl;token;constructor(t){this.baseUrl=t.url,this.token=t.token}async call(t,n,r=3e4){let o={version:1,method:t,params:n},i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let a=await fetch(`${this.baseUrl}/agent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`,Host:new URL(this.baseUrl).host},body:JSON.stringify(o),signal:i.signal});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Agent Browser ${t} failed (HTTP ${a.status}): ${l}`)}return await a.json()}finally{clearTimeout(s)}}async listTabs(){return(await this.call("tabs.list",null)).tabs}async openTab(t){return{tabId:(await this.call("tabs.open",{url:t},6e4)).tab_id}}async closeTab(t){await this.call("tabs.close",{tab_id:t})}async read(t,n){return this.call("page.read",{tab_id:t,mode:n?.mode??"main",...n?.query?{query:n.query}:{},...n?.budget?{budget:n.budget}:{}})}async inspect(t,n){return this.call("page.inspect",{tab_id:t,mode:n?.mode??"interactive",...n?.query?{query:n.query}:{},...n?.limit?{limit:n.limit}:{}})}async click(t,n){await this.call("page.click",{tab_id:t,element_id:n})}async fill(t,n,r){await this.call("page.fill",{tab_id:t,element_id:n,value:r})}async press(t,n,r){await this.call("page.press",{tab_id:t,key:n,...r?{element_id:r}:{}})}async select(t,n,r){await this.call("page.select",{tab_id:t,element_id:n,value:r})}async waitFor(t,n,r){await this.call("page.wait",{tab_id:t,condition:n,...r?.value?{value:r.value}:{},...r?.timeout?{timeout:r.timeout}:{}},(r?.timeout??3e4)+5e3)}async evalScript(t,n){return this.call("page.eval",{tab_id:t,script:n})}async screenshot(t){return this.call("page.screenshot",{tab_id:t})}}});function LC(e){return{id:e.id,role:e.role,label:e.label,kind:e.kind,value:e.value,state:{disabled:e.disabled,...e.checked!==void 0?{checked:e.checked}:{},...e.selected!==void 0?{selected:e.selected}:{},...e.expanded!==void 0?{expanded:e.expanded}:{}},bbox:e.bbox,...e.selector?{selector:e.selector}:{}}}function nH(e,t){switch(t.kind){case"element_id":if(e.has(t.elementId))return t.elementId;throw new Error(`Element ${t.elementId} not found in current observation. Call browser_observe to refresh.`);case"selector":return null;case"semantic":return null}}async function FC(e,t,n,r,o,i){switch(n){case"click":await e.click(t,r);break;case"fill":if(o===void 0)throw new Error("fill requires a value");await e.fill(t,r,o);break;case"press":if(o===void 0)throw new Error("press requires a value (key combo)");await e.press(t,o,r);break;case"select":if(o===void 0)throw new Error("select requires a value");await e.select(t,r,o);break;case"hover":throw new Error("hover is not supported by Agent Browser; use element_id from a prior observation to target clicks instead");case"scroll_to":{let s=r.replace(/\\/g,"\\\\").replace(/"/g,'\\"');await e.evalScript(t,`document.querySelector('[data-element-id="${s}"]')?.scrollIntoView({behavior:'smooth',block:'center'})`);break}case"wait_for":await e.waitFor(t,"element",{value:r,timeout:i??1e4});break;default:throw new Error(`Unknown action: ${n}`)}}async function rH(e,t){if(t.target.kind!=="semantic")throw new Error("resolveSemanticAndAct called with non-semantic target");let{elements:n}=await e.client.inspect(e.tabId,{mode:"interactive",query:t.target.text,limit:10}),r=n;if(t.target.role){let l=t.target.role.toLowerCase();r=n.filter(c=>c.role.toLowerCase()===l)}if(r.length===0)throw new Error(`No element found matching semantic target: text="${t.target.text}"`+(t.target.role?`, role="${t.target.role}"`:""));if(r.length>1)return{outcome:"ambiguous_target",query:{text:t.target.text,...t.target.role?{role:t.target.role}:{}},candidates:r.slice(0,5).map(LC)};let i=r[0].id;await FC(e.client,e.tabId,t.action,i,t.value,t.timeoutMs);let s=await e.client.read(e.tabId,{mode:"main"}),a=fr(s.url,e.config);return a.allowed?{elementId:i}:{outcome:"blocked_by_policy",url:s.url,reason:`action navigated to blocked domain: ${a.reason}`}}var oH=y(()=>{"use strict";da()});var iH={};vn(iH,{AgentBrowserProvider:()=>NC});var NC,sH=y(()=>{"use strict";da();$C();tH();oH();NC=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new Tb(n)}async open(t){let n=fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let r=this.sessions.get(t.sessionId);if(r)await this.client.evalScript(r.tabId,`window.location.href = ${JSON.stringify(t.url)}`),await this.client.waitFor(r.tabId,"load",{timeout:t.timeoutMs??3e4});else{let{tabId:s}=await this.client.openTab(t.url);await this.client.waitFor(s,"load",{timeout:t.timeoutMs??3e4}),r={tabId:s,observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null},this.sessions.set(t.sessionId,r)}let o=await this.client.read(r.tabId,{mode:"main"}),i=fr(o.url,this.config);return i.allowed?this.buildObservation(r,t.sessionId,t.screenshot,void 0,"browser_open"):(await this.client.evalScript(r.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`redirected to blocked domain: ${i.reason}`})}async observe(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);return this.buildObservation(n,t.sessionId,t.screenshot,t.maxElements,"browser_observe")}async act(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);let r=nH(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await rH({client:this.client,config:this.config,tabId:n.tabId},t);return"outcome"in s?s:(n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString(),this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"))}throw t.target.kind==="selector"?new Error("selector targets are not supported by Agent Browser; use element_id or semantic targets"):new Error(`Cannot resolve target: ${JSON.stringify(t.target)}`)}await FC(this.client,n.tabId,t.action,r,t.value,t.timeoutMs),n.lastAction=`browser_act:${t.action}`,n.lastActionAt=new Date().toISOString();let o=await this.client.read(n.tabId,{mode:"main"}),i=fr(o.url,this.config);return i.allowed?this.buildObservation(n,t.sessionId,t.screenshot,void 0,"browser_act"):(await this.client.evalScript(n.tabId,"window.location.href = 'about:blank'").catch(()=>{}),{outcome:"blocked_by_policy",url:o.url,reason:`action navigated to blocked domain: ${i.reason}`})}async render(t){throw new Error("AgentBrowserProvider does not support render(). Use PlaywrightProvider for one-shot content fetches.")}async screenshot(t){let n=this.sessions.get(t.sessionId);if(!n)throw new Error(`No Agent Browser tab open for session ${t.sessionId}. Call browser_open first.`);if(t.target!==void 0||t.fullPage)throw new Error("Agent Browser does not support element or full-page screenshots; omit target and fullPage.");let r=await this.client.screenshot(n.tabId),o=Buffer.from(r.data,"base64"),i=o.length>=24?o.readUInt32BE(16):0,s=o.length>=24?o.readUInt32BE(20):0;return{path:(await _c(t.sessionId,o,"browser_screenshot")).path,bytes:o.length,width:i,height:s,dataBase64:r.data,mediaType:"image/png"}}async extract(t){throw new Error("AgentBrowserProvider does not support extract() yet.")}async close(t){let n=this.sessions.get(t.sessionId);if(n){try{await this.client.closeTab(n.tabId)}catch{}this.sessions.delete(t.sessionId)}}describe(t){let n=this.sessions.get(t);return n?{active:!0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:1}:null}async shutdown(){let t=Array.from(this.sessions.entries()).map(async([,n])=>{try{await this.client.closeTab(n.tabId)}catch{}});await Promise.all(t),this.sessions.clear()}async buildObservation(t,n,r,o,i="browser_open"){let[s,a]=await Promise.all([this.client.read(t.tabId,{mode:"main",budget:4e3}),this.client.inspect(t.tabId,{mode:"interactive",limit:o??80})]),l=a.elements.map(LC),c=o??80,u=l.slice(0,c);t.observationCounter+=1,t.knownElements=new Map(u.map(h=>[h.id,h])),t.currentUrl=s.url,t.currentTitle=s.title;let d=[];l.length>c&&d.push(`page has ${l.length} interactive elements; showing first ${c}`);let p=null;if(r)try{let h=await this.client.screenshot(t.tabId),b=Buffer.from(h.data,"base64");p=(await _c(n,b,i)).path}catch{d.push("screenshot capture failed")}let f=`obs_${t.observationCounter.toString(36)}`,g={httpStatus:null,loadingState:"idle",hasDialog:!1,consoleErrors:0};return{observationId:f,url:s.url,title:s.title,textSummary:s.content.slice(0,4e3),interactive:u,status:g,warnings:d,screenshotPath:p,capturedAt:new Date().toISOString()}}}});import{existsSync as obe,readFileSync as ibe}from"node:fs";import{createRequire as sbe}from"node:module";import{dirname as abe,join as lbe}from"node:path";function cH(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<ube&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function mn(e){let t=cH(e);return lH.some(n=>t.includes(n))}function dbe(){try{let t=sbe(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(ibe(t,"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 i=lbe(abe(t),o);return obe(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function Sm(){return aH??=dbe()??cbe,aH}function BC(e){return e.includes("install chromium")}function Wn(e,t){let n=cH(e),r=t?.latched===!0?` ${pbe}`:"";if(n.includes("Executable doesn't exist")){let o="";return t?.headless===!0?o=" This launch was headless, which needs the `chromium_headless_shell-*` build.":t?.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: ${Sm()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${Sm()}). Or pick a different tool.${r}`}function vm(e,t,n=!1){if(!mn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
426
426
|
|
|
427
|
-
${Wn(e,{headless:t,latched:n})}`,{cause:e})}var lH,cbe,ube,aH,pbe,Eb=y(()=>{"use strict";lH=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],cbe="pnpm exec playwright install chromium",ube=4;pbe="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 pa from"node:fs";import Rb from"node:path";import{randomBytes as mbe}from"node:crypto";import{chromium as fbe}from"playwright";function gbe(){try{return"5.170.0"}catch{}try{let e=Rb.resolve(import.meta.dirname,"../../../package.json"),t=pa.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var hbe,xb,uH=y(()=>{"use strict";Eb();U();de();hbe=gbe(),xb=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}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=fbe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=vm(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let 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 a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${hbe}`}}loadStorageState(t){let n=Ul(t);try{if(!pa.existsSync(n))return;let r=JSON.parse(pa.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ul(t);if(!pa.existsSync(r))return;let o=await n.storageState(),i=Rb.join(Rb.dirname(r),`.${Rb.basename(r)}.${process.pid}.${mbe(4).toString("hex")}.tmp`);pa.writeFileSync(i,JSON.stringify(o),{mode:384}),pa.chmodSync(i,384),pa.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as ybe}from"node:crypto";function bbe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function wbe(e,t,n){return`el_${ybe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Sbe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function dH(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function mH(e,t){let n=e.role??"",r=e.name??"";pH.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])mH(i,t)}async function vbe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},fH).catch(()=>[])}async function kbe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},fH).catch(()=>[])}function Tbe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ab(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Tbe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=vbe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],mH(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await kbe(e)).filter(D=>pH.has(D.role??"")));let S=new Map;for(let M of p){let D=dH(M.name),B=S.get(D);(!B||B.bbox.w===0&&M.bbox.w>0)&&S.set(D,M)}let k=b.map(M=>({ax:M,dom:S.get(dH(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,D)=>{let B=M.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(B!==F)return B-F;let j=M.dom?.bbox.x??0,K=D.dom?.bbox.x??0;return j-K}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,D)=>{let B=M.ax.role??"generic",F=M.ax.name??"",j=wbe(B,F,D),K=M.dom?.bbox??{x:0,y:0,w:0,h:0},H=M.dom?.type??null,W=null;M.ax.value!==void 0&&M.ax.value!==null&&(W=String(M.ax.value)),M.ax.checked!==void 0&&(W=String(M.ax.checked)),X1({role:B,kind:H})&&(W="[redacted]");let Q={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(Q.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(Q.selected=M.ax.selected),M.ax.expanded!==void 0&&(Q.expanded=M.ax.expanded);let oe;M.dom?.testId?oe=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(oe=`#${M.dom.id}`);let _={id:j,role:B,label:bbe(F),kind:H,value:W,state:Q,bbox:K};return oe!==void 0&&(_.selector=oe),_}),P="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?P="loading":M==="interactive"?P="navigating":P="idle"}catch{P="navigating"}P!=="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 C=Sbe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:P,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var pH,fH,gH=y(()=>{"use strict";kb();pH=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);fH="a[href], button, input, select, textarea, [role], [tabindex], label"});async function hH(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>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 UC(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>hH(e,i)))).filter(o=>o!==null)}async function Ebe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function jC(e,t,n){switch(t.kind){case"element_id":return Rbe(e,t,n);case"selector":return xbe(e,t);case"semantic":return Abe(e,t)}}async function Rbe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await UC(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function xbe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await UC(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Abe(e,t){return t.role!==void 0?Cbe(e,t.text,t.role):_be(e,t.text,t)}async function Cbe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await UC(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function _be(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Ebe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await hH(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,k=0;for(let E=0;E<S.length;E++)k=k*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var yH=y(()=>{"use strict"});async function HC(e,t,n,r){let o=e.url();if(o===n)return null;let i=fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var bH=y(()=>{"use strict";da()});var KC={};vn(KC,{PlaywrightProvider:()=>WC});function wH(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var WC,GC=y(()=>{"use strict";uH();gH();yH();da();bH();$C();WC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new xb(t)}async open(t){let n=fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await HC(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await Ab(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Ab(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await jC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${wH(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await HC(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ab(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await jC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${wH(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await _c(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await _c(n,o,r);return i}catch{return null}}}});var fa={};vn(fa,{__resetBrowserRegistryForTests:()=>$be,browserProviderActive:()=>Mbe,closeBrowserProvider:()=>zC,getBrowserProvider:()=>Pbe,getLastRoutingDecision:()=>Dbe,peekBrowserProvider:()=>Obe});function SH(){Promise.resolve(zC()).then(()=>{process.exit(130)})}function vH(){Promise.resolve(zC()).then(()=>{process.exit(143)})}function kH(){Yr=null}function Ibe(){Cb||(process.on("SIGINT",SH),process.on("SIGTERM",vH),process.on("exit",kH),Cb=!0)}function TH(){Cb&&(process.removeListener("SIGINT",SH),process.removeListener("SIGTERM",vH),process.removeListener("exit",kH),Cb=!1)}async function Pbe(e){return Yr!==null?Yr:(ma!==null||(ma=(async()=>{let t=MC(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??v.AGENT_SURFACE,r=await Y1({config:t,surface:n});qC=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(sH(),iH)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(GC(),KC));o=new i(t)}return Ibe(),Yr=o,ma=null,o})()),ma)}async function zC(){if(Yr===null)return;let e=Yr;Yr=null,ma=null,TH(),await e.shutdown()}function Mbe(){return Yr!==null}function Obe(){return Yr}function Dbe(){return qC}function $be(){Yr=null,ma=null,qC=null,TH()}var Yr,ma,Cb,qC,ga=y(()=>{"use strict";da();J1();L();Yr=null,ma=null,Cb=!1,qC=null});async function EH(e,t){try{return await $1(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function jbe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ga(),fa)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(GC(),KC)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(da(),z1)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function RH(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??jbe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await vb(n,e,{headers:Ube,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Bbe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Nbe.test(p)&&!Fbe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await EH(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof mr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=xC({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await wm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>wm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await wm(d.finalUrl,o);let p=await EH(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=xC({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof mr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Fbe,Nbe,Bbe,Ube,xH=y(()=>{"use strict";L1();AC();PC();de();Fbe=/(text\/html|application\/xhtml\+xml)/i,Nbe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Bbe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Ube={"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 Kbe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Hbe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Wbe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.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 AH(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Kbe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function CH(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
427
|
+
${Wn(e,{headless:t,latched:n})}`,{cause:e})}var lH,cbe,ube,aH,pbe,Eb=y(()=>{"use strict";lH=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],cbe="pnpm exec playwright install chromium",ube=4;pbe="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 pa from"node:fs";import Rb from"node:path";import{randomBytes as mbe}from"node:crypto";import{chromium as fbe}from"playwright";function gbe(){try{return"5.170.1"}catch{}try{let e=Rb.resolve(import.meta.dirname,"../../../package.json"),t=pa.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var hbe,xb,uH=y(()=>{"use strict";Eb();U();de();hbe=gbe(),xb=class{config;browser;sessions=new Map;launchPromise;launchFailure;shutdownComplete=!1;constructor(t){this.config=t}clearLaunchFailure(){this.launchFailure=void 0}latchLaunchFailure(t){this.launchFailure={error:t}}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=fbe.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,this.clearLaunchFailure(),t)).catch(t=>{this.launchPromise=void 0;let n=vm(t,this.config.headless,!0);throw this.latchLaunchFailure(n),n}),this.launchPromise)}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i;n.requestGuard!==void 0&&await o.route("**/*",async a=>{try{await n.requestGuard(a.request().url()),await a.continue()}catch(l){i=l,await a.abort("blockedbyclient")}});let 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 a=await o.newPage(),l;try{l=await a.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil})}catch(p){throw i??p}if(i!==void 0)throw i;let c=await a.content();if(i!==void 0)throw i;let u=a.url(),d=l!==null?l.status():null;return{html:c,finalUrl:u,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){this.clearLaunchFailure();let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.clearLaunchFailure(),this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${hbe}`}}loadStorageState(t){let n=Ul(t);try{if(!pa.existsSync(n))return;let r=JSON.parse(pa.readFileSync(n,"utf8"));return N("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){N("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ul(t);if(!pa.existsSync(r))return;let o=await n.storageState(),i=Rb.join(Rb.dirname(r),`.${Rb.basename(r)}.${process.pid}.${mbe(4).toString("hex")}.tmp`);pa.writeFileSync(i,JSON.stringify(o),{mode:384}),pa.chmodSync(i,384),pa.renameSync(i,r),N("[browser/vault] saved session",{profile:t,file:r})}catch(r){N("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as ybe}from"node:crypto";function bbe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function wbe(e,t,n){return`el_${ybe("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function Sbe(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function dH(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function mH(e,t){let n=e.role??"",r=e.name??"";pH.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])mH(i,t)}async function vbe(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let u=window.getComputedStyle(s);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},fH).catch(()=>[])}async function kbe(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in i?i.value:void 0,d=u!==void 0?String(u):void 0,p=i.disabled??!1,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},fH).catch(()=>[])}function Tbe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Ab(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=Tbe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=vbe(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,f,g,h]=await Promise.all([s,a,l,c,u]),b,w=!1;d!==null?(b=[],mH(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await kbe(e)).filter(D=>pH.has(D.role??"")));let S=new Map;for(let M of p){let D=dH(M.name),B=S.get(D);(!B||B.bbox.w===0&&M.bbox.w>0)&&S.set(D,M)}let k=b.map(M=>({ax:M,dom:S.get(dH(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,D)=>{let B=M.dom?.bbox.y??0,F=D.dom?.bbox.y??0;if(B!==F)return B-F;let j=M.dom?.bbox.x??0,K=D.dom?.bbox.x??0;return j-K}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,D)=>{let B=M.ax.role??"generic",F=M.ax.name??"",j=wbe(B,F,D),K=M.dom?.bbox??{x:0,y:0,w:0,h:0},H=M.dom?.type??null,W=null;M.ax.value!==void 0&&M.ax.value!==null&&(W=String(M.ax.value)),M.ax.checked!==void 0&&(W=String(M.ax.checked)),X1({role:B,kind:H})&&(W="[redacted]");let Q={disabled:M.ax.disabled??!1};M.ax.checked!==void 0&&(Q.checked=M.ax.checked===!0||M.ax.checked==="mixed"),M.ax.selected!==void 0&&(Q.selected=M.ax.selected),M.ax.expanded!==void 0&&(Q.expanded=M.ax.expanded);let oe;M.dom?.testId?oe=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(oe=`#${M.dom.id}`);let _={id:j,role:B,label:bbe(F),kind:H,value:W,state:Q,bbox:K};return oe!==void 0&&(_.selector=oe),_}),P="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?P="loading":M==="interactive"?P="navigating":P="idle"}catch{P="navigating"}P!=="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 C=Sbe(f),x=`obs_${t.observationCounter.toString(36)}`,I=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:P,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:I}}var pH,fH,gH=y(()=>{"use strict";kb();pH=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);fH="a[href], button, input, select, textarea, [role], [tabindex], label"});async function hH(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>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 UC(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>hH(e,i)))).filter(o=>o!==null)}async function Ebe(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function jC(e,t,n){switch(t.kind){case"element_id":return Rbe(e,t,n);case"selector":return xbe(e,t);case"semantic":return Abe(e,t)}}async function Rbe(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await UC(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function xbe(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await UC(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function Abe(e,t){return t.role!==void 0?Cbe(e,t.text,t.role):_be(e,t.text,t)}async function Cbe(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await UC(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function _be(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let u=[];s>0&&u.push({loc:r,count:s}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:i,count:l});let d=await Ebe(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),f=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let w=await hH(b.locator,b.index);if(w!==null){let S=`${w.role}:${w.label}:${h}`,k=0;for(let E=0;E<S.length;E++)k=k*31+S.charCodeAt(E)>>>0;f.push({...w,id:`el_${k.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var yH=y(()=>{"use strict"});async function HC(e,t,n,r){let o=e.url();if(o===n)return null;let i=fr(o,t);if(i.allowed)return null;try{await e.goBack()}catch{await r()}return{outcome:"blocked_by_policy",url:o,reason:i.reason}}var bH=y(()=>{"use strict";da()});var KC={};vn(KC,{PlaywrightProvider:()=>WC});function wH(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var WC,GC=y(()=>{"use strict";uH();gH();yH();da();bH();$C();WC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new xb(t)}async open(t){let n=fr(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(d){a=d}let l=o.url();if(!(a!==null&&(l===""||l==="about:blank"))){let d=await HC(o,this.config,t.url,()=>this.close({sessionId:r}));if(d!==null)return d}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let u=await Ab(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,u.interactive,u.url,u.title,"browser_open"),a!==null)throw a;return u}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Ab(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await jC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${wH(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":await l.fill(t.value??"");break;case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=await HC(r,this.config,i,()=>this.close({sessionId:n}));if(d!==null)return d;let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await Ab(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal,requestGuard:t.requestGuard})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let u=await jC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${wH(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await u.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await _c(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await _c(n,o,r);return i}catch{return null}}}});var fa={};vn(fa,{__resetBrowserRegistryForTests:()=>$be,browserProviderActive:()=>Mbe,closeBrowserProvider:()=>zC,getBrowserProvider:()=>Pbe,getLastRoutingDecision:()=>Dbe,peekBrowserProvider:()=>Obe});function SH(){Promise.resolve(zC()).then(()=>{process.exit(130)})}function vH(){Promise.resolve(zC()).then(()=>{process.exit(143)})}function kH(){Yr=null}function Ibe(){Cb||(process.on("SIGINT",SH),process.on("SIGTERM",vH),process.on("exit",kH),Cb=!0)}function TH(){Cb&&(process.removeListener("SIGINT",SH),process.removeListener("SIGTERM",vH),process.removeListener("exit",kH),Cb=!1)}async function Pbe(e){return Yr!==null?Yr:(ma!==null||(ma=(async()=>{let t=MC(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??v.AGENT_SURFACE,r=await Y1({config:t,surface:n});qC=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(sH(),iH)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(GC(),KC));o=new i(t)}return Ibe(),Yr=o,ma=null,o})()),ma)}async function zC(){if(Yr===null)return;let e=Yr;Yr=null,ma=null,TH(),await e.shutdown()}function Mbe(){return Yr!==null}function Obe(){return Yr}function Dbe(){return qC}function $be(){Yr=null,ma=null,qC=null,TH()}var Yr,ma,Cb,qC,ga=y(()=>{"use strict";da();J1();L();Yr=null,ma=null,Cb=!1,qC=null});async function EH(e,t){try{return await $1(e,t)}catch(n){return N("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function jbe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ga(),fa)),r=await n();try{return await r.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}catch(o){if(r.name==="agent-browser"){let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(GC(),KC)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(da(),z1)),a=s(),l=new i(a);try{return await l.render({url:e,timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:t.requestGuard})}finally{await l.shutdown()}}throw o}}async function RH(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??jbe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await vb(n,e,{headers:Ube,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Bbe.test(p))throw new Error(`web_scrape markdown mode received binary content (${p.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let f=await d.text();if(Nbe.test(p)&&!Fbe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await EH(f,a),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}catch(d){if(t.signal.aborted||d instanceof mr||d instanceof Error&&d.message.startsWith("web_scrape markdown mode received binary"))throw d;c=d}if(!(i===null||i.textLength<200)&&i!==null){let d=xC({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await wm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>wm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await wm(d.finalUrl,o);let p=await EH(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=xC({html:d.html,extractedTextLength:p.textLength});return{title:p.title,markdown:p.markdown,finalUrl:d.finalUrl,usedRender:!0,...f!==void 0?{advisory:f}:{}}}}catch(d){if(t.signal.aborted||d instanceof mr)throw d;if(i===null){let p=d instanceof Error?d.message:String(d),f=c instanceof Error?c.message:`HTTP ${l??"error"}`,g=new Error(`web_scrape could not retrieve ${e}: fetch failed (${f}) and render failed (${p}).`);throw g.cause=d,g}}if(i!==null)return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${l??"error"}).`)}var Fbe,Nbe,Bbe,Ube,xH=y(()=>{"use strict";L1();AC();PC();de();Fbe=/(text\/html|application\/xhtml\+xml)/i,Nbe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Bbe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,Ube={"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 Kbe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Hbe,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),Wbe),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=ae(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.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 AH(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Kbe({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function CH(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
428
428
|
|
|
429
429
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
430
430
|
`).trimEnd()}var Hbe,Wbe,_H=y(()=>{"use strict";je();Hbe="https://api.exa.ai/search",Wbe=10});function _b(e){if(e instanceof Error&&e.name==="TimeoutError")return"timeout";let t=e instanceof Error?e.message:String(e);return/Timeout\s+\d+\s*ms exceeded/i.test(t)?"timeout":void 0}var ha=y(()=>{"use strict";Eb()});function Jbe(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=Gbe;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,qbe)}let a=zbe;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,Vbe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function VC(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Zs(e,t),truncated:!0}}function Xbe(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env,r=e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{};return async(o,i)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=Jbe(o);if("error"in s)return{content:s.error,isError:!0};if(i.aborted){let d=i.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let a=new AbortController,l=()=>{a.abort(i.reason)},c,u=()=>{let d=a.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(i.addEventListener("abort",l,{once:!0}),c=setTimeout(()=>{a.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.url!==void 0){let p=await IC(s.url,r);if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(!p.allowed)return{content:`web_scrape blocked: ${p.reason}`,isError:!0}}if(s.mode==="raw"){let p;try{let h={method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:a.signal};p=await vb(t,s.url,h,r)}catch(h){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:h instanceof mr?{content:`web_scrape blocked: ${h.message}`,isError:!0}:{content:`web_scrape network error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}if(!p.ok)return{content:`web_scrape HTTP ${p.status} ${p.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let f;try{f=await p.text()}catch(h){return{content:`web_scrape read error: ${h instanceof Error?h.message:String(h)}`,isError:!0}}let g=VC(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await RH(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:a.signal,...e.lookupFn!==void 0?{lookupFn:e.lookupFn}:{}});if(p.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0};let f=VC(F1(p.markdown,p.advisory),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){if(a.signal.aborted)return{content:`web_scrape aborted: ${u()}`,isError:!0};if(p instanceof mr)return{content:`web_scrape blocked: ${p.message}`,isError:!0};let f=p instanceof Error?p.message:String(p),g=mn(p)&&!BC(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${Sm()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=AH({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let p=await d.search(s.query,{limit:Ybe,timeoutMs:s.timeoutMs,signal:a.signal}),f=VC(CH(s.query,p),s.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}catch(p){return a.signal.aborted?{content:`web_scrape aborted: ${u()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${p instanceof Error?p.message:String(p)}`,isError:!0}}}finally{c!==void 0&&clearTimeout(c),i.removeEventListener("abort",l)}}}var Gbe,qbe,zbe,Vbe,Ybe,IH,PH=y(()=>{"use strict";xH();_H();PC();wi();AC();ha();Gbe=3e4,qbe=12e4,zbe=1e5,Vbe=1e6,Ybe=10;IH=Xbe()});import{existsSync as OH,mkdirSync as Qbe,readFileSync as Zbe,renameSync as ewe,unlinkSync as twe,writeFileSync as nwe}from"node:fs";import{dirname as MH,join as rwe}from"node:path";import{randomBytes as owe}from"node:crypto";function Rn(e){let t=e??Rh();if(!OH(t))return[];try{let n=Zbe(t,"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 ${t}: ${r}`),[]}}function xi(e,t){let n=t??Rh();Qbe(MH(n),{recursive:!0});let r=rwe(MH(n),`.schedules.json.${process.pid}.${owe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{nwe(r,o,"utf-8"),ewe(r,n)}catch(i){try{OH(r)&&twe(r)}catch{}throw i}}function Ib(e,t){let n=Rn(t),r=n.map(l=>l.id),o=iwe(e.name),i=swe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),xi(n,t),a}function Pb(e,t){let n=Rn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(xi(o,t),!0)}function km(e,t){return Rn(t).find(n=>n.id===e)}function iwe(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function swe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function Mb(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Ob=y(()=>{"use strict";U()});import{existsSync as awe,readFileSync as lwe}from"node:fs";import{join as cwe}from"node:path";async function Kn(e,t,n){let r,o;try{let i=cwe(mp("default"),"port");if(!awe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=lwe(i,"utf-8").trim(),a=uwe(s);if(!a)return{synced:!1,detail:"daemon-not-detected (invalid port file)"};({host:r,port:o}=a)}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let i=r.includes(":")?`[${r}]`:r,s=await fetch(`http://${i}:${o}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return s.ok?{synced:!0,detail:"synced"}:e==="POST"&&s.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&s.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${s.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}function uwe(e){let t=parseInt(e,10);if(String(t)===e&&!Number.isNaN(t))return t<1||t>65535?null:{host:"localhost",port:t};let n=e.lastIndexOf(":");if(n<1)return null;let r=e.slice(0,n),o=e.slice(n+1);if(!/^\d+$/.test(o))return null;let i=parseInt(o,10);return Number.isNaN(i)||i<1||i>65535||/^:+$/.test(r)?null:{host:r.startsWith("[")&&r.endsWith("]")?r.slice(1,-1):r,port:i}}var Ai,YC=y(()=>{"use strict";U();Ai="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 dwe}from"node:fs";import{readFile as pwe}from"node:fs/promises";var DH,$H,LH,FH,NH=y(()=>{"use strict";Ob();U();YC();DH=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;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 i=Ib({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}),s=i.enabled?await Kn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await Kn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:Ai}})}},$H=async(e,t)=>{let n=Rn();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})))}},LH=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;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,i=sr();if(!dwe(i))return{content:JSON.stringify([])};let s;try{let c=await pwe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1147,7 +1147,7 @@ On your first turn, decide whether to call memory_search based on the request:
|
|
|
1147
1147
|
- If hot memory (shown in <cross-session-memory> tags above) already covers the relevant context, skip the search.
|
|
1148
1148
|
- Search at most once per session for general context. Search again only if new information surfaces a specific topic worth querying.
|
|
1149
1149
|
|
|
1150
|
-
Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`});function Fm(e,t){let n=(d,p)=>{if(!(d==null&&p==null))return(d??0)+(p??0)},r=(d,p)=>p!==void 0?p:d,o={stopReason:t.stopReason??e.stopReason??null,...t.raw!==void 0?{raw:t.raw}:e.raw!==void 0?{raw:e.raw}:{}},i=n(e.inputTokens,t.inputTokens);i!==void 0&&(o.inputTokens=i);let s=n(e.outputTokens,t.outputTokens);s!==void 0&&(o.outputTokens=s);let a=r(e.cachedInputTokens,t.cachedInputTokens);a!==void 0&&(o.cachedInputTokens=a);let l=r(e.cacheCreationTokens,t.cacheCreationTokens);l!==void 0&&(o.cacheCreationTokens=l);let c=n(e.totalTokens,t.totalTokens);c!==void 0&&(o.totalTokens=c);let u=n(e.totalCostUsd,t.totalCostUsd);return u!==void 0&&(o.totalCostUsd=u),o}var W_=y(()=>{"use strict"});function _w(){try{let e=ka();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),t.whenToUse&&(n.whenToUse=t.whenToUse),t.source&&(n.source=t.source),n}))}catch{return Promise.resolve([])}}var K_=y(()=>{"use strict";yr()});function Zr(e){return e!=null&&Zve.includes(e)}function eke(e){switch(e){case"max_tokens":return'stop_reason "max_tokens"';case"length":return'finish_reason "length"';case"max_output_tokens":return'incomplete_details.reason "max_output_tokens"';default:return"the provider output-token cap"}}function Iw(e,t,n={}){let r=`\u26A0 This turn was cut off at the output-token limit (${eke(t)}) before the model finished \u2014 anything above is partial, not a complete answer.`;if(e.length>0){let o=[...new Set(e)].join(", "),i=n.canIncreaseOutputLimit===!1?"Continue in a follow-up turn or retry so the model can finish the action.":"Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS, then retry.";return`${r} A tool call was truncated mid-request and was NOT dispatched (${o}); that action did not run. ${i}`}return n.canIncreaseOutputLimit===!1?`${r} Continue in a follow-up turn or retry the request.`:`${r} Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS to allow a longer reply.`}var Zve,Nm=y(()=>{"use strict";Zve=["max_tokens","length","max_output_tokens"]});var Wc,G_=y(()=>{"use strict";me();Wc=class{constructor(t,n,r){this.signal=t;this.traceWriter=n;this.provider=r;ne(n,{phase:"loop_start"}),this.interruptedAt=t.aborted?Date.now():null,n&&!t.aborted&&t.addEventListener("abort",this.onInterrupt,{once:!0})}signal;traceWriter;provider;interruptedAt;onInterrupt=()=>{this.interruptedAt===null&&(this.interruptedAt=Date.now())};finish(t){this.signal.removeEventListener("abort",this.onInterrupt),this.interruptedAt!==null&&this.signal.reason==="interrupted"&&ne(this.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-this.interruptedAt,metadata:{provider:this.provider}}),ne(this.traceWriter,{phase:"loop_end",durationMs:t})}}});import{readFileSync as tke}from"node:fs";import{homedir as nke}from"node:os";import{join as JK}from"node:path";function rke(e){try{return tke(e,"utf-8")}catch{return null}}function eo(e,t={},n=!1){let r=t.readEnv??(u=>process.env[u]),o=(t.homedir??nke)(),i=t.readFile??rke;if(n){let u=JK(o,".codex","auth.json"),d=i(u);if(d!==null){let p=XK(d);if(p.kind==="chatgpt"&&p.accessToken){let f={apiKey:p.accessToken,source:"chatgpt-oauth",last4:Kc(p.accessToken)};return p.accountId!==void 0&&(f.accountId=p.accountId),p.expiresAt!==void 0&&(f.expiresAt=p.expiresAt),f}}return{apiKey:null,source:"no-usable-auth-forced-chatgpt-oauth"}}if(e&&e.length>0)return{apiKey:e,source:"config",last4:Kc(e)};let s=r("OPENAI_API_KEY");if(s&&s.length>0)return{apiKey:s,source:"env",last4:Kc(s),envVar:"OPENAI_API_KEY"};let a=r("CODEX_API_KEY");if(a&&a.length>0)return{apiKey:a,source:"env",last4:Kc(a),envVar:"CODEX_API_KEY"};let l=JK(o,".codex","auth.json"),c=i(l);if(c!==null){let u=XK(c);if(u.kind==="apikey")return{apiKey:u.apiKey,source:"codex-cli",last4:Kc(u.apiKey)};if(u.kind==="chatgpt"){if(oke(r)&&u.accessToken){let d={apiKey:u.accessToken,source:"chatgpt-oauth",last4:Kc(u.accessToken)};return u.accountId!==void 0&&(d.accountId=u.accountId),u.expiresAt!==void 0&&(d.expiresAt=u.expiresAt),d}return{apiKey:null,source:"no-usable-auth-codex-oauth"}}}return{apiKey:null,source:"no-usable-auth"}}function XK(e){let t;try{t=JSON.parse(e)}catch{return{kind:"invalid"}}if(typeof t!="object"||t===null)return{kind:"invalid"};let n=t,r=n.OPENAI_API_KEY;if(typeof r=="string"&&r.length>0)return{kind:"apikey",apiKey:r};let o=n.tokens,i=typeof o=="object"&&o!==null?o:null,s=i&&typeof i.access_token=="string"?i.access_token:void 0;if(n.auth_mode==="chatgpt"||s){let a={kind:"chatgpt"};if(s&&(a.accessToken=s),i){let l=ike(i);l!==void 0&&(a.accountId=l);let c=ske(i);c!==void 0&&(a.expiresAt=c)}return a}return{kind:"no-key"}}function Kc(e){return e.length<=4?e:e.slice(-4)}function oke(e){let t=e("AFK_OPENAI_CHATGPT_OAUTH");if(!t)return!1;let n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}function QK(e){let t=e.split(".");if(t.length<2||!t[1])return null;try{let n=Buffer.from(t[1],"base64url").toString("utf-8"),r=JSON.parse(n);return typeof r=="object"&&r!==null?r:null}catch{return null}}function ike(e){let t=e.account_id;if(typeof t=="string"&&t.length>0)return t;for(let n of["access_token","id_token"]){let r=e[n];if(typeof r!="string")continue;let o=QK(r);if(!o)continue;let i=o["https://api.openai.com/auth"];if(typeof i=="object"&&i!==null){let a=i.chatgpt_account_id;if(typeof a=="string"&&a.length>0)return a}let s=o.chatgpt_account_id;if(typeof s=="string"&&s.length>0)return s}}function ske(e){let t=e.access_token;if(typeof t!="string")return;let n=QK(t)?.exp;return typeof n=="number"?n:void 0}function ake(e){if(typeof e!="number")return"";let t=e-Math.floor(Date.now()/1e3);if(t<=0)return", EXPIRED \u2014 re-run `codex` to refresh";let n=Math.floor(t/3600),r=Math.floor(t%3600/60);return`, expires in ${n>0?`${n}h `:""}${r}m`}function Bm(e){switch(e.source){case"config":return`using explicit AFK config API key (\u2026${e.last4??"????"})`;case"env":return`using ${e.envVar??"OPENAI_API_KEY"} env var (\u2026${e.last4??"????"})`;case"codex-cli":return`using Codex CLI API key from ~/.codex/auth.json (\u2026${e.last4??"????"})`;case"chatgpt-oauth":{let t=e.accountId?`\u2026${e.accountId.slice(-4)}`:"unknown",n=ake(e.expiresAt);return`using ChatGPT subscription OAuth from ~/.codex/auth.json (account ${t}${n})`}case"no-usable-auth-codex-oauth":return"Found ChatGPT/OAuth credentials in ~/.codex/auth.json but the OpenAI provider is in API-key mode. To use your ChatGPT subscription, set AFK_OPENAI_CHATGPT_OAUTH=1 (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires). Otherwise run `codex login --api-key` or set OPENAI_API_KEY.";case"no-usable-auth-forced-chatgpt-oauth":return"This model's slot is configured provider: 'chatgpt-oauth' but no ChatGPT-subscription token was found in ~/.codex/auth.json. Sign in with `codex` using ChatGPT (not API-key mode), or change the slot to provider: 'openai' with a key. (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires).";default:return"No OpenAI auth found. Set OPENAI_API_KEY, pass an explicit apiKey in AFK config, or run `codex login --api-key`."}}var Gc=y(()=>{"use strict"});function Pw(e,t,n){let r=e.lastIndexOf(ZK);if(r===-1)return e;let o=e.indexOf(`
|
|
1150
|
+
Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`});function Fm(e,t){let n=(d,p)=>{if(!(d==null&&p==null))return(d??0)+(p??0)},r=(d,p)=>p!==void 0?p:d,o={stopReason:t.stopReason??e.stopReason??null,...t.raw!==void 0?{raw:t.raw}:e.raw!==void 0?{raw:e.raw}:{}},i=n(e.inputTokens,t.inputTokens);i!==void 0&&(o.inputTokens=i);let s=n(e.outputTokens,t.outputTokens);s!==void 0&&(o.outputTokens=s);let a=r(e.cachedInputTokens,t.cachedInputTokens);a!==void 0&&(o.cachedInputTokens=a);let l=r(e.cacheCreationTokens,t.cacheCreationTokens);l!==void 0&&(o.cacheCreationTokens=l);let c=n(e.totalTokens,t.totalTokens);c!==void 0&&(o.totalTokens=c);let u=n(e.totalCostUsd,t.totalCostUsd);return u!==void 0&&(o.totalCostUsd=u),o}var W_=y(()=>{"use strict"});function _w(){try{let e=ka();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),t.whenToUse&&(n.whenToUse=t.whenToUse),t.source&&(n.source=t.source),n}))}catch{return Promise.resolve([])}}var K_=y(()=>{"use strict";yr()});function Zr(e){return e!=null&&Zve.includes(e)}function eke(e){switch(e){case"max_tokens":return'stop_reason "max_tokens"';case"length":return'finish_reason "length"';case"max_output_tokens":return'incomplete_details.reason "max_output_tokens"';default:return"the provider output-token cap"}}function Iw(e,t,n={}){let r=`\u26A0 This turn was cut off at the output-token limit (${eke(t)}) before the model finished \u2014 anything above is partial, not a complete answer.`;if(e.length>0){let o=[...new Set(e)].join(", "),i=n.canIncreaseOutputLimit===!1?"Continue in a follow-up turn or retry so the model can finish the action.":"Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS, then retry.";return`${r} A tool call was truncated mid-request and was NOT dispatched (${o}); that action did not run. ${i}`}return n.canIncreaseOutputLimit===!1?`${r} Continue in a follow-up turn or retry the request.`:`${r} Raise --max-output-tokens / AFK_MAX_OUTPUT_TOKENS to allow a longer reply.`}var Zve,Nm=y(()=>{"use strict";Zve=["max_tokens","length","max_output_tokens"]});var Wc,G_=y(()=>{"use strict";me();Wc=class{constructor(t,n,r){this.signal=t;this.traceWriter=n;this.provider=r;ne(n,{phase:"loop_start"}),this.interruptedAt=t.aborted?Date.now():null,n&&!t.aborted&&t.addEventListener("abort",this.onInterrupt,{once:!0})}signal;traceWriter;provider;interruptedAt;onInterrupt=()=>{this.interruptedAt===null&&(this.interruptedAt=Date.now())};finish(t){this.signal.removeEventListener("abort",this.onInterrupt),this.interruptedAt!==null&&this.signal.reason==="interrupted"&&ne(this.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-this.interruptedAt,metadata:{provider:this.provider}}),ne(this.traceWriter,{phase:"loop_end",durationMs:t})}}});import{readFileSync as tke}from"node:fs";import{homedir as nke}from"node:os";import{join as JK}from"node:path";function rke(e){try{return tke(e,"utf-8")}catch{return null}}function eo(e,t={},n=!1){let r=t.readEnv??(u=>process.env[u]),o=(t.homedir??nke)(),i=t.readFile??rke;if(n){let u=JK(o,".codex","auth.json"),d=i(u);if(d!==null){let p=XK(d);if(p.kind==="chatgpt"&&p.accessToken){if(p.expiresAt!==void 0&&p.expiresAt<=Math.floor(Date.now()/1e3))return{apiKey:null,source:"chatgpt-oauth-expired",expiresAt:p.expiresAt};let f={apiKey:p.accessToken,source:"chatgpt-oauth",last4:Kc(p.accessToken)};return p.accountId!==void 0&&(f.accountId=p.accountId),p.expiresAt!==void 0&&(f.expiresAt=p.expiresAt),f}}return{apiKey:null,source:"no-usable-auth-forced-chatgpt-oauth"}}if(e&&e.length>0)return{apiKey:e,source:"config",last4:Kc(e)};let s=r("OPENAI_API_KEY");if(s&&s.length>0)return{apiKey:s,source:"env",last4:Kc(s),envVar:"OPENAI_API_KEY"};let a=r("CODEX_API_KEY");if(a&&a.length>0)return{apiKey:a,source:"env",last4:Kc(a),envVar:"CODEX_API_KEY"};let l=JK(o,".codex","auth.json"),c=i(l);if(c!==null){let u=XK(c);if(u.kind==="apikey")return{apiKey:u.apiKey,source:"codex-cli",last4:Kc(u.apiKey)};if(u.kind==="chatgpt"){if(oke(r)&&u.accessToken){if(u.expiresAt!==void 0&&u.expiresAt<=Math.floor(Date.now()/1e3))return{apiKey:null,source:"chatgpt-oauth-expired",expiresAt:u.expiresAt};let d={apiKey:u.accessToken,source:"chatgpt-oauth",last4:Kc(u.accessToken)};return u.accountId!==void 0&&(d.accountId=u.accountId),u.expiresAt!==void 0&&(d.expiresAt=u.expiresAt),d}return{apiKey:null,source:"no-usable-auth-codex-oauth"}}}return{apiKey:null,source:"no-usable-auth"}}function XK(e){let t;try{t=JSON.parse(e)}catch{return{kind:"invalid"}}if(typeof t!="object"||t===null)return{kind:"invalid"};let n=t,r=n.OPENAI_API_KEY;if(typeof r=="string"&&r.length>0)return{kind:"apikey",apiKey:r};let o=n.tokens,i=typeof o=="object"&&o!==null?o:null,s=i&&typeof i.access_token=="string"?i.access_token:void 0;if(n.auth_mode==="chatgpt"||s){let a={kind:"chatgpt"};if(s&&(a.accessToken=s),i){let l=ike(i);l!==void 0&&(a.accountId=l);let c=ske(i);c!==void 0&&(a.expiresAt=c)}return a}return{kind:"no-key"}}function Kc(e){return e.length<=4?e:e.slice(-4)}function oke(e){let t=e("AFK_OPENAI_CHATGPT_OAUTH");if(!t)return!1;let n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}function QK(e){let t=e.split(".");if(t.length<2||!t[1])return null;try{let n=Buffer.from(t[1],"base64url").toString("utf-8"),r=JSON.parse(n);return typeof r=="object"&&r!==null?r:null}catch{return null}}function ike(e){let t=e.account_id;if(typeof t=="string"&&t.length>0)return t;for(let n of["access_token","id_token"]){let r=e[n];if(typeof r!="string")continue;let o=QK(r);if(!o)continue;let i=o["https://api.openai.com/auth"];if(typeof i=="object"&&i!==null){let a=i.chatgpt_account_id;if(typeof a=="string"&&a.length>0)return a}let s=o.chatgpt_account_id;if(typeof s=="string"&&s.length>0)return s}}function ske(e){let t=e.access_token;if(typeof t!="string")return;let n=QK(t)?.exp;return typeof n=="number"?n:void 0}function ake(e){if(typeof e!="number")return"";let t=e-Math.floor(Date.now()/1e3);if(t<=0)return", EXPIRED \u2014 re-run `codex` to refresh";let n=Math.floor(t/3600),r=Math.floor(t%3600/60);return`, expires in ${n>0?`${n}h `:""}${r}m`}function Bm(e){switch(e.source){case"config":return`using explicit AFK config API key (\u2026${e.last4??"????"})`;case"env":return`using ${e.envVar??"OPENAI_API_KEY"} env var (\u2026${e.last4??"????"})`;case"codex-cli":return`using Codex CLI API key from ~/.codex/auth.json (\u2026${e.last4??"????"})`;case"chatgpt-oauth":{let t=e.accountId?`\u2026${e.accountId.slice(-4)}`:"unknown",n=ake(e.expiresAt);return`using ChatGPT subscription OAuth from ~/.codex/auth.json (account ${t}${n})`}case"chatgpt-oauth-expired":return"ChatGPT subscription token from ~/.codex/auth.json is EXPIRED \u2014 re-run `codex` to refresh. (read-only; AFK does not refresh the token itself.)";case"no-usable-auth-codex-oauth":return"Found ChatGPT/OAuth credentials in ~/.codex/auth.json but the OpenAI provider is in API-key mode. To use your ChatGPT subscription, set AFK_OPENAI_CHATGPT_OAUTH=1 (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires). Otherwise run `codex login --api-key` or set OPENAI_API_KEY.";case"no-usable-auth-forced-chatgpt-oauth":return"This model's slot is configured provider: 'chatgpt-oauth' but no ChatGPT-subscription token was found in ~/.codex/auth.json. Sign in with `codex` using ChatGPT (not API-key mode), or change the slot to provider: 'openai' with a key. (read-only; AFK will not refresh the token \u2014 re-run `codex` when it expires).";default:return"No OpenAI auth found. Set OPENAI_API_KEY, pass an explicit apiKey in AFK config, or run `codex login --api-key`."}}var Gc=y(()=>{"use strict"});function Pw(e,t,n){let r=e.lastIndexOf(ZK);if(r===-1)return e;let o=e.indexOf(`
|
|
1151
1151
|
`,r+ZK.length);if(o===-1)return e;let i=o+1;if(!e.startsWith(q_,i))return e;let s=e.indexOf(`
|
|
1152
1152
|
`,i),a=s===-1?e.length:s,l=e.slice(i+q_.length,a),c=Dy(t??new Date,n);return l===c?e:e.slice(0,i+q_.length)+c+e.slice(a)}var ZK,q_,z_=y(()=>{"use strict";Kt();ZK=`# Environment
|
|
1153
1153
|
- Working directory: `,q_="- Date: "});function lke(e,t){let n=t===1?"An image was":`${t} images were`,r=t===1?"an image":"images",o=t===1?"it":"them",i=e&&e.trim().length>0?`the current model ("${e.trim()}")`:"the current model";return`[${n} attached to this message, but ${i} cannot view images. Acknowledge to the user that you received ${r} but are unable to see ${o}, and suggest switching to a vision-capable model (e.g. gpt-4o or a Claude model).]`}function cke(e){let t=e.source;return t.type==="base64"?`data:${t.media_type};base64,${t.data}`:t.type==="url"?t.url:null}function eG(e,t){if(typeof e=="string")return e;let n=[],r=0;for(let s of e)if(typeof s=="object"&&s&&"type"in s){if(s.type==="text")n.push(s.text);else if(s.type==="image")r+=1;else if(s.type==="document"){let a=s,l=a.title??"document",c=a.source;if(c&&c.type==="text")n.push(`[Document: ${l}]
|
|
@@ -1828,7 +1828,7 @@ ${u}`}function oD(e,t){let n=VQ[t.status];e.out.line(` ${n} ${m.bold(t.jobId)}
|
|
|
1828
1828
|
`);let c=l.length;function u(){let d=a();process.stdout.write(`\x1B[${c}A\x1B[0J`+d.join(`
|
|
1829
1829
|
`)+`
|
|
1830
1830
|
`),c=d.length}return new Promise(d=>{process.stdin.setRawMode(!0),al(process.stdin);let p=(g,h)=>{if(h)if(h.name==="up"||h.sequence==="\x1B[A")r>0&&(r--,r<o&&(o=r),u());else if(h.name==="down"||h.sequence==="\x1B[B"){if(r<e.length-1){r++;let{end:b}=s();r>=b&&o++,u()}}else h.name==="space"?(i.has(r)?i.delete(r):i.add(r),u()):h.name==="return"||h.name==="enter"?(f(),d([...i].sort((b,w)=>b-w))):(h.name==="escape"||h.ctrl&&h.name==="c")&&(f(),d(":cancel"))};function f(){process.stdin.removeListener("keypress",p);try{process.stdin.setRawMode(!1)}catch{}}process.stdin.on("keypress",p)})}var pl,pD=y(()=>{"use strict";Ad();aT();$();pl="\u270E Type your own answer"});import Z$e from"path";import{statSync as eLe}from"fs";function T7(e){fl=e}var fl,E7,gD=y(()=>{"use strict";E7={name:"/allow-dir",aliases:["/add-dir"],summary:"Manage per-session directory access grants for tool handlers",usage:"/allow-dir [--rw | --revoke] [<path>]",hint:"When the model needs read or write access to a directory outside the session root \u2014 grant it here without restarting.",flags:["--rw","--revoke"],async handler(e,t){if(!fl)return e.out.error("Directory grants not available in this session."),"continue";let n=t.trim();if(!n){let a=fl.getGrants();return e.out.line(" Session directory grants:"),e.out.line(` resolveBase : ${a.resolveBase??"(none)"}`),e.out.line(` readRoots : ${a.readRoots.length>0?a.readRoots.join(", "):"(none)"}`),e.out.line(` writeRoots : ${a.writeRoots.length>0?a.writeRoots.join(", "):"(none)"}`),"continue"}let r="read",o=n;if(o.startsWith("--rw ")||o==="--rw"?(r="write",o=o.slice(5).trim()):(o.startsWith("--revoke ")||o==="--revoke")&&(r="revoke",o=o.slice(9).trim()),!o)return e.out.error("Usage: /allow-dir [--rw | --revoke] <path>"),"continue";let i=Z$e.resolve(process.cwd(),o);if(r!=="revoke")try{eLe(i)}catch{return e.out.error(`Path does not exist: ${i}`),"continue"}let s=e.stats.sessionId;if(r==="revoke"){let a=fl.getGrants();fl.revokeRoot(i,"slash",s),a.resolveBase&&i===a.resolveBase?e.out.warn(`Cannot revoke the session's initial resolveBase: ${i}`):e.out.line(`\u2713 Revoked: ${i}`)}else r==="write"?(fl.addWriteRoot(i,"slash",s),e.out.line(`\u2713 Read+write grant: ${i}`)):(fl.addReadRoot(i,"slash",s),e.out.line(`\u2713 Read-only grant: ${i}`));return"continue"}}});import R7 from"chalk";function x7(e,t){let n=hD.get(e);if(n){if(n.glyph===t.glyph&&n.color===t.color&&n.inFlightVerb===t.inFlightVerb)return;throw new Error(`Trusted skill "${e}" already registered with different config`)}hD.set(e,t),r2(e)}function cE(e){return hD.get(e)}function tLe(e){return(e/1e3).toFixed(1)+"s"}function A7(e,t){let n=cE(e.skillName),r=tLe(e.durationMs);if(!n){let i=`[${e.skillName} \xB7 ${r}]`;return Cd(i,t?.columns)}if(t?.isTTY!==!1){let i;if(e.claimsTotal!==void 0){let a=e.claimsTotal===e.claimsConfirmed&&e.claimsRefuted===void 0&&e.claimsInconclusive===void 0,l;if(a)l=`${e.claimsTotal} claims \xB7 all confirmed`;else{let c=`${e.claimsTotal} claims`;e.claimsConfirmed!==void 0&&(c+=` \xB7 ${e.claimsConfirmed} confirmed`),e.claimsRefuted!==void 0&&(c+=` \xB7 ${e.claimsRefuted} refuted`),e.claimsInconclusive!==void 0&&(c+=` \xB7 ${e.claimsInconclusive} inconclusive`),l=c}i=`${n.glyph} ${e.skillName} \xB7 ${l} \xB7 ${r}`}else i=`${n.glyph} ${e.skillName} \xB7 ${r}`;let s=R7.hex(n.color)(i);return Cd(s,t?.columns)}else{let i;if(e.claimsTotal!==void 0){let s=e.claimsConfirmed??0;i=`[${e.skillName} \xB7 ${s}/${e.claimsTotal} confirmed \xB7 ${r}]`}else i=`[${e.skillName} \xB7 ${r}]`;return Cd(i,t?.columns)}}function Cd(e,t){return t!==void 0&&V(e)>t?ee(e,t):e}function C7(e,t){let n=cE(e);if(!n){let i=`[${e} \xB7 running\u2026]`;return Cd(i,t?.columns)}if(t?.isTTY!==!1){let i=`${n.glyph} ${e} \xB7 ${n.inFlightVerb}`,s=R7.hex(n.color)(i);return Cd(s,t?.columns)}let o=`[${e} \xB7 ${n.inFlightVerb}]`;return Cd(o,t?.columns)}var hD,uE=y(()=>{"use strict";ce();TI();hD=new Map});import nLe from"ora";function rLe(e){return e>=1e6?`${(e/1e6).toFixed(1)}MB`:e>=1e3?`${Math.round(e/1e3)}KB`:`${e}B`}var oLe,iLe,sLe,aLe,lLe,D7,$7=y(()=>{"use strict";$();pt();Bt();qu();po();Ne();pD();oLe={name:"/exit",aliases:["/quit"],summary:"Exit the session",hint:"When you want to tear down the REPL \u2014 Ctrl+D on an empty prompt does the same.",async handler(){return"exit"}},iLe={name:"/clear",summary:"Clear conversation history",hint:"When the current thread has drifted off-topic or you want a clean slate without restarting the session.",async handler(e){try{await e.session.current.reset(),e.ui.clearScreen(),J6(e.stats),e.ledger?.clear(),e.out.success("Conversation history cleared.")}catch(t){e.out.error(t instanceof Error?t.message:"Unknown error")}return"continue"}},sLe={name:"/compact",summary:"Compact history (summarize older messages)",hint:"When context is filling up but you want to keep the thread \u2014 summarizes old turns and keeps the recent ones intact.",async handler(e){let t=e.getCompositor?.()??null,n=null,r=!1,o=()=>{r&&(t?t.setSpinner({enabled:!1}):n?.stop(),r=!1)};try{let i=e.session.current,s=i.hookRegistry;s&&await s.dispatch({event:"PreCompact",sessionId:i.sessionId,trigger:"manual"}),t?(e.out.info("Summarizing earlier turns..."),t.setSpinner({enabled:!0}),r=!0):(n=nLe({text:m.meta("Summarizing earlier turns..."),...Ig}).start(),r=!0);let a=await i.compact();if(o(),a.compacted){let l=a.tokensSavedEstimate?` (~${a.tokensSavedEstimate} input tokens saved)`:"";e.out.success(`Compacted ${a.messagesBefore} \u2192 ${a.messagesAfter} messages${l}.`)}else{let l=a.reason??"unknown";if(l==="aborted")e.out.info("Compaction cancelled.");else if(l.startsWith("summarization-failed"))e.out.error(`Compaction failed: ${l}. History unchanged.`);else if(l==="microcompacted"){let c=a.microcompaction,u=c?` \u2014 cleared ${c.blocksCleared} tool result${c.blocksCleared===1?"":"s"} (~${rLe(c.bytesReclaimed)} reclaimed)`:"";e.out.success(`Reclaimed context${u}.`)}else l==="nothing-to-summarize"?e.out.info("Nothing to compact \u2014 all history is within the keep window."):l==="not-supported"?e.out.warn("Compaction is not supported for this model or provider \u2014 use a Claude model to enable /compact."):l==="responses-compaction-unavailable"?e.out.warn("Summarization is unavailable on this backend \u2014 it refused the compaction request earlier this session. Start a new session, or set AFK_COMPACT_MODEL to a model this endpoint can serve."):e.out.info(`Nothing to compact (${l}).`)}}catch(i){if(o(),i instanceof Mt)throw i;if(i instanceof xe)return e.out.info(`Compaction skipped: ${i.reason??"blocked by hook"}`),"continue";e.out.error(i instanceof Error?i.message:"Unknown error")}return"continue"}},aLe={name:"/rewind",summary:"Edit a previous message (rewind the conversation)",hint:"When you want to go back and re-ask an earlier prompt \u2014 pick a message, the conversation rewinds to it, and its text loads into the input to edit and resend. (Also: press Esc twice at an empty prompt.)",async handler(e){let t=e.session.current,n=t.listRewindTargets();if(n.length===0)return e.out.info("Nothing to rewind to \u2014 no earlier messages in this conversation."),"continue";let r=e.getCompositor?.()??null;r?.suspendInput();let o;try{o=await aE(n.map(a=>a.preview),new AbortController().signal)}finally{r?.resumeInput()}if(o===null)return e.out.info("Rewind requires an interactive terminal."),"continue";if(o===":cancel")return"continue";let i=n[o];if(!i)return"continue";let s=await t.rewindConversation(i.turnIndex);if(!s.rewound){let a=s.reason??"unknown";return a==="not-supported"?e.out.warn("Rewind is not supported for this provider \u2014 use a Claude model to enable /rewind."):a==="session-busy"||a==="turn-in-flight"?e.out.info("Cannot rewind while a turn is running."):e.out.info(`Cannot rewind (${a}).`),"continue"}return e.out.success(`Rewound ${s.messagesBefore} \u2192 ${s.messagesAfter} messages. Edit the message below and press Enter to resend.`),{kind:"prefill",message:s.reloadText??""}}},lLe={name:"/help",summary:"Show this help",hint:"When you want the full command list with usage strings \u2014 broader than this inline dropdown.",async handler(e){let t=Rr(),n=t.reduce((r,o)=>Math.max(r,o.name.length),0)+2;e.out.line(),e.out.line(m.bold(m.brand("Commands"))),e.out.line(se());for(let r of t){let o=r.usage??r.name,i=" ".repeat(Math.max(0,n-o.length));e.out.line(` ${m.warning(o)}${i} ${m.dim(r.summary)}`)}return e.out.line(),e.out.line(m.dim(" Tip: Ctrl+C interrupts a running turn; a second press exits.")),e.out.line(m.dim(" Hidden: /keys for keybindings \xB7 @ to attach files \xB7 !cmd to run shell \xB7 Shift+Tab to change mode")),e.out.line(),"continue"}},D7=[oLe,iLe,sLe,aLe,lLe]});function yD(e,t){let n=e+t;return n>0?Math.round(e/n*100):void 0}function F7(e){if(!e)return"";let t=e.cacheRead??0,n=e.cacheCreation??0,r=yD(t,n);return r===void 0?"":` ${[`cache r=${L7(t)}`,`w=${L7(n)}`,`hit=${r}%`].join(" ")}`}function L7(e){return e<1e3?String(e):e<1e6?`${(e/1e3).toFixed(1)}k`:`${(e/1e6).toFixed(1)}m`}var bD=y(()=>{"use strict"});function wD(e,t=30){return!e||e.length===0?m.dim("(none)"):e.length<=t?e.join(", "):`${e.slice(0,t).join(", ")}, ${m.dim(`+${e.length-t} more`)}`}function tr(e,t){return` ${m.label(e.padEnd(16))} ${t}`}function pE(e){let t=[];t.push(" "+se("Session Debug")),e.sessionId&&t.push(tr("session",e.sessionId)),e.model&&t.push(tr("model",e.model)),e.permissionMode&&t.push(tr("permission",e.permissionMode)),e.cwd&&t.push(tr("cwd",e.cwd)),e.claudeCodeVersion&&t.push(tr("sdk",`v${e.claudeCodeVersion}`)),e.apiKeySource&&t.push(tr("api key",e.apiKeySource)),e.outputStyle&&t.push(tr("output style",e.outputStyle));let n=e.tools?.length??0;t.push(tr(`tools (${n})`,wD(e.tools)));let r=e.mcpServers??[],o=r.length?r.map(c=>`${c.name}[${c.status}]`).join(", "):m.dim("(none)");t.push(tr(`mcp (${r.length})`,o));let i=e.skills?.length??0;t.push(tr(`skills (${i})`,wD(e.skills)));let s=e.plugins?.length??0,a=s?(e.plugins??[]).map(c=>c.name).join(", "):m.dim("(none)");t.push(tr(`plugins (${s})`,a));let l=e.slashCommands?.length??0;return t.push(tr(`slash (${l})`,wD(e.slashCommands))),t.push(" "+se()),t.join(`
|
|
1831
|
-
`)}var SD=y(()=>{"use strict";$();pt()});function cLe(e,t){try{if(!e||e.trim().toLowerCase()==="auto")return{available:!0,needs:"unknown"};let n=zs(e,t);if(n.id==="")return{available:!1,needs:"local",hint:"not configured (set AFK_MODEL_LOCAL / models.local)"};if(n.provider==="chatgpt-oauth"){let o=eo(void 0,{},!0).apiKey!=null;return{available:o,needs:"chatgpt-oauth",hint:o?void 0:"needs ChatGPT sign-in (~/.codex/auth.json)"}}if(n.provider==="xai-oauth"){let o=In(void 0,"oauth").apiKey!=null;return{available:o,needs:"xai-oauth",hint:o?void 0:"needs SuperGrok OAuth (`afk provider auth xai login`)"}}if(n.provider==="xai"){let o=In(n.apiKey,"apikey").apiKey!=null;return{available:o,needs:"xai",hint:o?void 0:"needs XAI_API_KEY"}}if(n.apiKey)return{available:!0,needs:"unknown"};let r=ie(e,t?{slots:t}:void 0);if(r==="anthropic-direct"){let o=!!sm();return{available:o,needs:"anthropic",hint:o?void 0:"needs Claude sign-in / ANTHROPIC_API_KEY"}}if(r==="openai-compatible"){if(n.baseUrl)return{available:!0,needs:"local"};let o=!!am()||eo(void 0,{},!1).apiKey!=null;return{available:o,needs:"openai",hint:o?void 0:"needs OPENAI_API_KEY"}}if(r==="xai"||r==="xai-oauth"){let s=In(void 0,r==="xai-oauth"?"oauth":void 0).apiKey!=null;return{available:s,needs:r==="xai-oauth"?"xai-oauth":"xai",hint:s?void 0:"needs XAI_API_KEY or SuperGrok OAuth (`afk provider auth xai login`)"}}return{available:!0,needs:"unknown"}}catch{return{available:!0,needs:"unknown"}}}function N7(e,t){return cLe(e,t).available}var B7=y(()=>{"use strict";Be();Et();Lt();Gc();Ji()});async function U7(e){let t=e?.fetchImpl??fetch,n=e?.timeoutMs??pLe,r=e?.token??(v.CLAUDE_CODE_OAUTH_TOKEN||ft());if(!r)return{kind:"unavailable",reason:"no-token",detail:"No Claude Code OAuth token found. Set CLAUDE_CODE_OAUTH_TOKEN or run `claude login` and try again."};let o;try{o=await t(uLe,{headers:{Authorization:`Bearer ${r}`,"anthropic-beta":dLe},signal:AbortSignal.timeout(n)})}catch(d){return mLe(d)?{kind:"unavailable",reason:"timeout",detail:"Request to the usage endpoint timed out."}:{kind:"unavailable",reason:"network-error",detail:"Network error while contacting the usage endpoint."}}if(!o.ok)return{kind:"unavailable",reason:"http-error",detail:`Usage endpoint returned HTTP ${o.status}.`};let i;try{i=await o.json()}catch{return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned a response that was not valid JSON."}}if(typeof i!="object"||i===null)return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned an unexpected response shape."};let s=i,a=mE(s.five_hour),l=mE(s.seven_day),c=mE(s.seven_day_sonnet),u=mE(s.seven_day_opus);return!a&&!l&&!c&&!u?{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint response contained none of the known usage windows."}:{kind:"ok",...a!==void 0?{fiveHour:a}:{},...l!==void 0?{sevenDay:l}:{},...c!==void 0?{sevenDaySonnet:c}:{},...u!==void 0?{sevenDayOpus:u}:{}}}function mLe(e){return e instanceof Error&&(e.name==="TimeoutError"||e.name==="AbortError")}function hLe(e){if(typeof e=="string"){let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}if(typeof e=="number")return!Number.isFinite(e)||e<fLe||e>gLe?void 0:new Date(e*1e3)}function mE(e){if(typeof e!="object"||e===null)return;let t=e,n=t.utilization;if(typeof n!="number"||!Number.isFinite(n))return;let r=n>1?n/100:n,o=Math.min(1,Math.max(0,r)),i=hLe(t.resets_at);return{utilization:o,...i!==void 0?{resetsAt:i}:{}}}var uLe,dLe,pLe,fLe,gLe,j7=y(()=>{"use strict";Ei();L();uLe="https://api.anthropic.com/api/oauth/usage",dLe="oauth-2025-04-20",pLe=1e4;fLe=0,gLe=4102444800});function H7(e){if(rc.includes(e)||gi(e)!==void 0)return!0;let t=ie(e);if(t==="openai-compatible"||t==="xai"||t==="xai-oauth")return!0;let n=zs(e).id.trim().toLowerCase();return n.startsWith("claude-")||n.startsWith("claude_")}var W7=y(()=>{"use strict";Be();Et()});function yLe(e,t){if(t.length===0)return 100;let n=De(e).toLowerCase(),r=t.toLowerCase();if(n.includes(r))return 100;let o=0,i=-1,s=-1;for(let c=0;c<n.length&&o<r.length;c++)n[c]===r[o]&&(i===-1&&(i=c),s=c,o++);if(o<r.length)return;let a=s-i+1,l=r.length/a;return 50+Math.round(l*49)}function Dg(e,t){let n=[];for(let r=0;r<e.length;r++){let o=yLe(e[r]??"",t);o!==void 0&&n.push({originalIndex:r,score:o})}return t.length===0?n:n.sort((r,o)=>o.score-r.score)}var K7=y(()=>{"use strict";ce()});function bn(e,t){return new Promise(n=>{let{header:r,options:o,multi:i=!1,signal:s,initialIndex:a=0,onCtrlC:l,searchable:c=!1}=t;if(o.length===0){n(null);return}if(s?.aborted){n(null);return}let u="",d=Dg(o,u),p=()=>c?d.map(C=>o[C.originalIndex]??""):o,f=kD(a,0,o.length-1),g=0,h=C=>{let x=e.terminalRows?.();if(x===void 0)return vD;let I=r.length+(c?1:0)+1,M=Math.max(0,x-1-I),D=C>Math.min(vD,M)?1:0;return Math.min(vD,Math.max(0,M-D))},b=()=>{let C=p().length;if(C===0){f=0,g=0;return}let x=h(C);f=kD(f,0,C-1),f<g&&(g=f),x>0&&f>=g+x&&(g=f-x+1),g=kD(g,0,Math.max(0,C-x))},w=new Set(t.initialSelected??[]),S=!1,k=C=>{S||(S=!0,s&&s.removeEventListener("abort",E),e.exitPickerMode(),n(C))},E=()=>k(null);s&&s.addEventListener("abort",E,{once:!0});let T=()=>{let C=[];for(let j of r)C.push(j);c&&C.push(m.dim(" Filter: ")+u+"\u2588");let x=p(),I=x.length,M=h(I);b();let D=g,B=Math.min(g+M,I);for(let j=D;j<B;j++){let K=x[j]??"",H=j===f,W=H?m.brand(bLe):wLe,Q;if(i){let oe=c?d[j]?.originalIndex??j:j,_=w.has(oe),G=_?m.success(SLe):m.dim(vLe),Y=H&&!_?m.bold(K):K;Q=` ${W} ${G} ${Y}`}else{let oe=H?m.bold(K):m.dim(K);Q=` ${W} ${oe}`}C.push(Q)}if(I>M){let j=D+1,K=B;C.push(m.dim(` (${j}\u2013${K} of ${I} \u2191/\u2193 scroll)`))}let F=c?ELe:i?TLe:kLe;return C.push(m.dim(" "+F)),C},R=(C,x)=>{if(!S){if(x.name==="escape"){if(c&&u.length>0){u="",d=Dg(o,u),f=0,g=0,e.repaintPicker();return}k(null);return}if(x.ctrl&&x.name==="c"){l?.(),k(null);return}if(c&&(x.name==="backspace"||x.name==="delete")){u.length>0&&(u=u.slice(0,-1),d=Dg(o,u),f=0,g=0,e.repaintPicker());return}if(x.name==="up"||x.ctrl&&x.name==="p"){let I=p().length;f=f===0?I-1:f-1,b(),e.repaintPicker();return}if(x.name==="down"||x.ctrl&&x.name==="n"){let I=p().length;f=f===I-1?0:f+1,b(),e.repaintPicker();return}if(x.name==="return"){if(c&&d.length===0)return;if(i){let I=[];for(let M=0;M<o.length;M++)if(w.has(M)){let D=o[M];D!==void 0&&I.push(D)}k(I)}else{let I=c?d[f]?.originalIndex??f:f,M=o[I];k(M!==void 0?[M]:[])}return}if(i&&(x.name==="space"||C===" ")){let I=c?d[f]?.originalIndex??f:f;w.has(I)?w.delete(I):w.add(I),e.repaintPicker();return}if(x.name==="home"){f=0,g=0,e.repaintPicker();return}if(x.name==="end"){f=p().length-1,b(),e.repaintPicker();return}if(c&&C!==void 0&&C.length===1&&!x.ctrl&&!x.meta&&(C.codePointAt(0)??0)>=32){u+=C,d=Dg(o,u),f=0,g=0,e.repaintPicker();return}}};b();let P={renderRows:T,onKey:R};e.enterPickerMode(P)})}function kD(e,t,n){return n<t||e<t?t:e>n?n:e}var bLe,wLe,SLe,vLe,kLe,TLe,ELe,vD,ys=y(()=>{"use strict";$();K7();bLe="\u25B8",wLe=" ",SLe="\u25C9",vLe="\u25EF",kLe="\u2191/\u2193 navigate \xB7 enter select \xB7 esc cancel",TLe="\u2191/\u2193 navigate \xB7 space toggle \xB7 enter confirm \xB7 esc cancel",ELe="\u2191/\u2193 navigate \xB7 enter select \xB7 esc clear/cancel \xB7 type to filter",vD=20});function xLe(e,t){let n=`${Math.round(t.utilization*100)}%`,r=t.resetsAt?m.dim(` (resets ${t.resetsAt.toLocaleString()})`):"";return` ${e.padEnd(16)}${m.meta(n)}${r}`}function CLe(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,i=n?.cache_read_input_tokens??0,s=n?.cache_creation_input_tokens??0,a=t.totalTokens??n?.context_window_tokens??0,l=yD(i,s);e.line(),e.line(m.bold("Token usage")+m.dim(" (SDK breakdown)")),e.line(se()),e.line(` total ${m.success(Ae(t.totalTokens))} of ${m.meta(Ae(t.maxTokens))} (${m.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${m.meta(Ae(t.autoCompactThreshold))}`),e.line(),e.line(m.dim(" Last turn (API):")),e.line(` input ${m.meta(Ae(r))} ${m.dim("(turn total)")}`),e.line(` output ${m.meta(Ae(o))} ${m.dim("(turn total)")}`),e.line(` cache read ${m.meta(Ae(i))} ${m.dim("(last call)")}`),e.line(` cache creat ${m.meta(Ae(s))} ${m.dim("(last call)")}`),l!==void 0&&e.line(` cache hit ${m.meta(`${l}%`)} ${m.dim("(of cached tokens, last call)")}`),e.line(` window ${m.meta(Ae(a))} ${m.dim("(last call occupancy)")}`);let c=t.categories??[];if(c.length>0){let f=[...c].sort((g,h)=>h.tokens-g.tokens).slice(0,5);e.line(),e.line(m.dim(" Top categories:"));for(let g of f)e.line(` ${m.warning(g.name.padEnd(18))} ${m.meta(Ae(g.tokens))}`)}let u=t.systemTools??[],d=t.mcpTools??[];if(u.length>0||d.length>0){e.line();let f=u.reduce((h,b)=>h+b.tokens,0),g=d.reduce((h,b)=>h+b.tokens,0);u.length>0&&e.line(m.dim(` system tools ${u.length} tools, ${Ae(f)} tokens`)),d.length>0&&e.line(m.dim(` MCP tools ${d.length} tools, ${Ae(g)} tokens`))}let p=t.agents??[];if(p.length>0){let f=p.reduce((g,h)=>g+h.tokens,0);e.line(m.dim(` agents ${p.length} loaded, ${Ae(f)} tokens`))}if(t.skills){let f=t.skills;e.line(m.dim(` skills ${f.includedSkills}/${f.totalSkills} included, ${Ae(f.tokens)} tokens`))}if(t.slashCommands){let f=t.slashCommands;e.line(m.dim(` slash cmds ${f.includedCommands}/${f.totalCommands} included, ${Ae(f.tokens)} tokens`))}e.line()}function _Le(e,t){let n=t.turnTokens.reduce((u,d)=>u+d.input,0),r=t.turnTokens.reduce((u,d)=>u+d.output,0),o=t.turnTokens.reduce((u,d)=>u+d.cache,0),i=n+r,s=it(t.model),a=t.turnTokens[t.turnTokens.length-1],l=a?a.footprint??a.input+a.output+a.cache:0,c=s>0?Math.round(l/s*100):0;e.line(),e.line(m.bold("Token usage")+m.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(se()),e.line(` input ${m.meta(Ae(n))}`),e.line(` output ${m.meta(Ae(r))}`),e.line(` cache read ${m.meta(Ae(o))}`),e.line(` total ${m.success(Ae(i))}`),e.line(` context ${m.meta(`${c}% of ${Ae(s)} (${t.model})`)}`),e.line()}async function G7(e,t){if(!H7(t)){e.out.warn(`Unknown model: ${t}. Aliases: ${rc.join(", ")} (or a full model id)`);return}let n=oc(t);if(n){e.out.warn(n);return}try{await e.session.current.setModel(t),e.stats.model=t,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${m.brand(t)}`)}catch(r){e.out.error(`Failed to switch model: ${r instanceof Error?r.message:String(r)}`)}}var RLe,ALe,ILe,PLe,MLe,OLe,DLe,$Le,LLe,q7,z7=y(()=>{"use strict";$();pt();et();bD();Cg();SD();B7();j7();Et();W7();ys();RLe={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(m.bold("Session cost")),n.line(se()),n.line(` total ${m.success(Qt(t.totalCostUsd))}`),n.line(` turns ${m.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${m.meta(Qt(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(Qt).join(m.dim(" \xB7 "));n.line(` last 5 ${r}`)}return t.unpricedTurns>0&&n.line(` unpriced ${m.warning(`${t.unpricedTurns} turn${t.unpricedTurns===1?"":"s"} had no cost metadata \u2014 total may be understated`)}`),n.line(),n.line(m.dim(" This is session-local spend. For account-wide subscription quota, see /usage.")),n.line(),"continue"}};ALe={name:"/usage",summary:"Show Claude subscription usage (5h / 7d windows)",hint:"When you want to know how close you are to hitting your Claude subscription's rolling usage limits \u2014 distinct from /cost, which is session-local spend.",async handler(e){let{out:t}=e,n=await U7();if(t.line(),n.kind==="unavailable")return t.line(m.bold("Subscription usage")),t.line(se()),n.reason==="no-token"?t.warn("No Claude subscription token found \u2014 run `claude login`, then try /usage again."):t.warn(`Usage unavailable (${n.reason}): ${n.detail}`),t.line(),"continue";let o=[["5-hour",n.fiveHour],["7-day",n.sevenDay],["7-day (Sonnet)",n.sevenDaySonnet],["7-day (Opus)",n.sevenDayOpus]].filter(i=>i[1]!==void 0);if(t.line(m.bold("Subscription usage")),t.line(se()),o.length===0)t.line(m.dim(" No usage windows reported."));else for(let[i,s]of o)t.line(xLe(i,s));return t.line(),"continue"}};ILe={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();CLe(e.out,t)}catch{_Le(e.out,e.stats)}return"continue"}},PLe={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(m.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(se()),t.turns.forEach((r,o)=>{let i=m.meta(`#${o+1}`),s=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${i} ${m.user("\u25B6")} ${s}`),n.line(` ${m.brand("\u25C6")} ${m.dim(a)}`)}),n.line(),"continue")}};MLe={name:"/model",usage:"/model [local|small|medium|large|opus|sonnet|haiku|fable|org/model]",summary:"Switch the active model mid-session",hint:"Switch the capability tier (local/small/medium/large \u2014 or your configured names) or pass a full model id. Bare `/model` opens an interactive picker on a TTY. Upgrade to large for a hard problem, downshift to small for cheap iteration \u2014 context carries over. Also accepts HuggingFace-style ids (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(n)return await G7(e,n),"continue";let r=e.getCompositor?.()??null;if(r){let i=[...rc],s=i.indexOf(e.stats.model),l=(await bn(r,{header:[m.bold("Switch model"),m.dim(`current: ${e.stats.model}`),m.dim("or type a full id: /model <org/model>"),""],options:i,initialIndex:s>=0?s:0}))?.[0];return l&&await G7(e,l),"continue"}e.out.info(`Current model: ${m.brand(e.stats.model)}`);let o=rc.map(i=>N7(i)?i:`${i} (needs sign-in)`).join(", ");return e.out.line(m.dim(` Aliases: ${o} (or any org/model HF id)`)),"continue"}},OLe={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(m.bold(`Tools (${n.length})`)),e.out.line(se());let r=3,o=Math.ceil(n.length/r),i=Math.max(...n.map(s=>s.length))+2;for(let s=0;s<o;s++){let a=[];for(let l=0;l<r;l++){let c=l*o+s;c<n.length&&a.push(n[c].padEnd(i))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},DLe={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(Ek(),m5)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(m.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(se());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${m.warning("\u25CF")} ${i} ${m.dim(`(${l}m ago)`)}`),e.out.line(` ${m.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(m.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(m.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),i=o.indexOf(" ");if(i===-1||o.slice(0,i).length===0||o.slice(i+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let s=o.slice(0,i).trim(),a=o.slice(i+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${s}"\u2026`),await e.mcpManager.completeAuth(s,a),e.out.success(`OAuth complete for "${s}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${s}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(m.bold(`MCP servers (${o.length})`)),e.out.line(se());let i=0;for(let s of o){let a=typeof s=="string"?s:s.name??JSON.stringify(s),l=typeof s=="object"&&s!==null&&"status"in s?String(s.status):"",c=l==="connected"?m.success("\u25CF"):m.warning("\u25CF");e.out.line(` ${c} ${a}${l?m.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(m.dim(` ${i} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},$Le={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(m.bold("Context-window limits")),e.out.line(se());for(let[t,n]of Object.entries(sc)){let r=t===e.stats.model?m.brand(" \u2190 active"):"";e.out.line(` ${m.warning(t.padEnd(12))} ${m.meta(Ae(n))}${r}`)}return e.out.line(),"continue"}},LLe={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(pE(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},q7=[RLe,ILe,PLe,MLe,OLe,DLe,$Le,LLe,ALe]});function FLe(e){switch(e){case"bypassPermissions":return"bypass restored \u2014 no prompts, read/write any path";case"acceptEdits":return"accept-edits restored \u2014 edits auto-approved";case"dontAsk":case"auto":return"previous mode restored \u2014 no approval prompts";default:return"default permissions restored"}}async function $g(e,t){let n=e.stats.permissionMode==="plan",r=t!==void 0?t:!n,o=r?"plan":e.session.current.getPrePlanMode?.()??"default";try{if(await e.session.current.setPermissionMode(o),e.stats.permissionMode=o,e.ui.repaintStatusLine(),r){let i=TD?"":m.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");TD||(TD=!0),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(m.success("\u25CB plan mode OFF")+m.dim(` \u2014 ${FLe(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}var TD,V7=y(()=>{"use strict";$();TD=!1});async function NLe(e){if(await $g(e,!1),e.stats.permissionMode==="plan")return"continue";let t=lp(e.stats.cwd??process.cwd());return e.out.info(m.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:lw(t)}}var Y7,J7=y(()=>{"use strict";U();R_();V7();$();Y7={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode; /plan off saves the plan to a file then implements it",hint:"Think through an approach without changing anything \u2014 write tools and state-mutating bash are refused until you exit; read-only investigation runs. /plan off saves the plan + implements it; Shift+Tab cycles to the next mode without implementing.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();return n!==""&&r!=="on"&&r!=="off"?(e.stats.permissionMode!=="plan"&&await $g(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await $g(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await $g(e,!1),"continue"):NLe(e)}}});function WLe(e){let t=e.trim();return HLe.some(n=>n.test(t))}function AD(e){let t=-1,n=-1;for(let r=0;r<e.length;r++){let o=e[r];o.isError!==!0&&(jLe.has(o.toolName)?t=r:o.toolName==="bash"&&WLe(o.input)&&(n=r))}return t<0?"no-code-changes":n>t?"verified":"unverified"}function Z7(e){return e.some(n=>n.isError!==!0&&xD.has(n.toolName))?AD(e)!=="unverified":!1}function KLe(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":BLe[e.kind]}`,i=[];for(let[a,l]of ULe[e.kind]){let c=e[l];typeof c=="string"&&c.trim().length>0&&i.push(a?`\u2022 ${a}: ${c.trim()}`:`\u2022 ${c.trim()}`)}if(i.length===0&&e.rawBody.trim().length>0){let a=e.rawBody.trim();i.push(a.length>Q7?`${a.slice(0,Q7)}\u2026 [truncated]`:a)}n&&i.push("\u2022 \u26A0\uFE0F Unverified: no recognized successful verification was observed backing this Done claim \u2014 confirm before relying on this.");let s=i.length>0?i.join(`
|
|
1831
|
+
`)}var SD=y(()=>{"use strict";$();pt()});function cLe(e,t){try{if(!e||e.trim().toLowerCase()==="auto")return{available:!0,needs:"unknown"};let n=zs(e,t);if(n.id==="")return{available:!1,needs:"local",hint:"not configured (set AFK_MODEL_LOCAL / models.local)"};if(n.provider==="chatgpt-oauth"){let o=eo(void 0,{},!0),i=o.apiKey!=null,s=i?void 0:o.source==="chatgpt-oauth-expired"?"ChatGPT token expired \u2014 re-run `codex` to refresh":"needs ChatGPT sign-in (~/.codex/auth.json)";return{available:i,needs:"chatgpt-oauth",hint:s}}if(n.provider==="xai-oauth"){let o=In(void 0,"oauth").apiKey!=null;return{available:o,needs:"xai-oauth",hint:o?void 0:"needs SuperGrok OAuth (`afk provider auth xai login`)"}}if(n.provider==="xai"){let o=In(n.apiKey,"apikey").apiKey!=null;return{available:o,needs:"xai",hint:o?void 0:"needs XAI_API_KEY"}}if(n.apiKey)return{available:!0,needs:"unknown"};let r=ie(e,t?{slots:t}:void 0);if(r==="anthropic-direct"){let o=!!sm();return{available:o,needs:"anthropic",hint:o?void 0:"needs Claude sign-in / ANTHROPIC_API_KEY"}}if(r==="openai-compatible"){if(n.baseUrl)return{available:!0,needs:"local"};let o=!!am()||eo(void 0,{},!1).apiKey!=null;return{available:o,needs:"openai",hint:o?void 0:"needs OPENAI_API_KEY"}}if(r==="xai"||r==="xai-oauth"){let s=In(void 0,r==="xai-oauth"?"oauth":void 0).apiKey!=null;return{available:s,needs:r==="xai-oauth"?"xai-oauth":"xai",hint:s?void 0:"needs XAI_API_KEY or SuperGrok OAuth (`afk provider auth xai login`)"}}return{available:!0,needs:"unknown"}}catch{return{available:!0,needs:"unknown"}}}function N7(e,t){return cLe(e,t).available}var B7=y(()=>{"use strict";Be();Et();Lt();Gc();Ji()});async function U7(e){let t=e?.fetchImpl??fetch,n=e?.timeoutMs??pLe,r=e?.token??(v.CLAUDE_CODE_OAUTH_TOKEN||ft());if(!r)return{kind:"unavailable",reason:"no-token",detail:"No Claude Code OAuth token found. Set CLAUDE_CODE_OAUTH_TOKEN or run `claude login` and try again."};let o;try{o=await t(uLe,{headers:{Authorization:`Bearer ${r}`,"anthropic-beta":dLe},signal:AbortSignal.timeout(n)})}catch(d){return mLe(d)?{kind:"unavailable",reason:"timeout",detail:"Request to the usage endpoint timed out."}:{kind:"unavailable",reason:"network-error",detail:"Network error while contacting the usage endpoint."}}if(!o.ok)return{kind:"unavailable",reason:"http-error",detail:`Usage endpoint returned HTTP ${o.status}.`};let i;try{i=await o.json()}catch{return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned a response that was not valid JSON."}}if(typeof i!="object"||i===null)return{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint returned an unexpected response shape."};let s=i,a=mE(s.five_hour),l=mE(s.seven_day),c=mE(s.seven_day_sonnet),u=mE(s.seven_day_opus);return!a&&!l&&!c&&!u?{kind:"unavailable",reason:"malformed-response",detail:"Usage endpoint response contained none of the known usage windows."}:{kind:"ok",...a!==void 0?{fiveHour:a}:{},...l!==void 0?{sevenDay:l}:{},...c!==void 0?{sevenDaySonnet:c}:{},...u!==void 0?{sevenDayOpus:u}:{}}}function mLe(e){return e instanceof Error&&(e.name==="TimeoutError"||e.name==="AbortError")}function hLe(e){if(typeof e=="string"){let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}if(typeof e=="number")return!Number.isFinite(e)||e<fLe||e>gLe?void 0:new Date(e*1e3)}function mE(e){if(typeof e!="object"||e===null)return;let t=e,n=t.utilization;if(typeof n!="number"||!Number.isFinite(n))return;let r=n>1?n/100:n,o=Math.min(1,Math.max(0,r)),i=hLe(t.resets_at);return{utilization:o,...i!==void 0?{resetsAt:i}:{}}}var uLe,dLe,pLe,fLe,gLe,j7=y(()=>{"use strict";Ei();L();uLe="https://api.anthropic.com/api/oauth/usage",dLe="oauth-2025-04-20",pLe=1e4;fLe=0,gLe=4102444800});function H7(e){if(rc.includes(e)||gi(e)!==void 0)return!0;let t=ie(e);if(t==="openai-compatible"||t==="xai"||t==="xai-oauth")return!0;let n=zs(e).id.trim().toLowerCase();return n.startsWith("claude-")||n.startsWith("claude_")}var W7=y(()=>{"use strict";Be();Et()});function yLe(e,t){if(t.length===0)return 100;let n=De(e).toLowerCase(),r=t.toLowerCase();if(n.includes(r))return 100;let o=0,i=-1,s=-1;for(let c=0;c<n.length&&o<r.length;c++)n[c]===r[o]&&(i===-1&&(i=c),s=c,o++);if(o<r.length)return;let a=s-i+1,l=r.length/a;return 50+Math.round(l*49)}function Dg(e,t){let n=[];for(let r=0;r<e.length;r++){let o=yLe(e[r]??"",t);o!==void 0&&n.push({originalIndex:r,score:o})}return t.length===0?n:n.sort((r,o)=>o.score-r.score)}var K7=y(()=>{"use strict";ce()});function bn(e,t){return new Promise(n=>{let{header:r,options:o,multi:i=!1,signal:s,initialIndex:a=0,onCtrlC:l,searchable:c=!1}=t;if(o.length===0){n(null);return}if(s?.aborted){n(null);return}let u="",d=Dg(o,u),p=()=>c?d.map(C=>o[C.originalIndex]??""):o,f=kD(a,0,o.length-1),g=0,h=C=>{let x=e.terminalRows?.();if(x===void 0)return vD;let I=r.length+(c?1:0)+1,M=Math.max(0,x-1-I),D=C>Math.min(vD,M)?1:0;return Math.min(vD,Math.max(0,M-D))},b=()=>{let C=p().length;if(C===0){f=0,g=0;return}let x=h(C);f=kD(f,0,C-1),f<g&&(g=f),x>0&&f>=g+x&&(g=f-x+1),g=kD(g,0,Math.max(0,C-x))},w=new Set(t.initialSelected??[]),S=!1,k=C=>{S||(S=!0,s&&s.removeEventListener("abort",E),e.exitPickerMode(),n(C))},E=()=>k(null);s&&s.addEventListener("abort",E,{once:!0});let T=()=>{let C=[];for(let j of r)C.push(j);c&&C.push(m.dim(" Filter: ")+u+"\u2588");let x=p(),I=x.length,M=h(I);b();let D=g,B=Math.min(g+M,I);for(let j=D;j<B;j++){let K=x[j]??"",H=j===f,W=H?m.brand(bLe):wLe,Q;if(i){let oe=c?d[j]?.originalIndex??j:j,_=w.has(oe),G=_?m.success(SLe):m.dim(vLe),Y=H&&!_?m.bold(K):K;Q=` ${W} ${G} ${Y}`}else{let oe=H?m.bold(K):m.dim(K);Q=` ${W} ${oe}`}C.push(Q)}if(I>M){let j=D+1,K=B;C.push(m.dim(` (${j}\u2013${K} of ${I} \u2191/\u2193 scroll)`))}let F=c?ELe:i?TLe:kLe;return C.push(m.dim(" "+F)),C},R=(C,x)=>{if(!S){if(x.name==="escape"){if(c&&u.length>0){u="",d=Dg(o,u),f=0,g=0,e.repaintPicker();return}k(null);return}if(x.ctrl&&x.name==="c"){l?.(),k(null);return}if(c&&(x.name==="backspace"||x.name==="delete")){u.length>0&&(u=u.slice(0,-1),d=Dg(o,u),f=0,g=0,e.repaintPicker());return}if(x.name==="up"||x.ctrl&&x.name==="p"){let I=p().length;f=f===0?I-1:f-1,b(),e.repaintPicker();return}if(x.name==="down"||x.ctrl&&x.name==="n"){let I=p().length;f=f===I-1?0:f+1,b(),e.repaintPicker();return}if(x.name==="return"){if(c&&d.length===0)return;if(i){let I=[];for(let M=0;M<o.length;M++)if(w.has(M)){let D=o[M];D!==void 0&&I.push(D)}k(I)}else{let I=c?d[f]?.originalIndex??f:f,M=o[I];k(M!==void 0?[M]:[])}return}if(i&&(x.name==="space"||C===" ")){let I=c?d[f]?.originalIndex??f:f;w.has(I)?w.delete(I):w.add(I),e.repaintPicker();return}if(x.name==="home"){f=0,g=0,e.repaintPicker();return}if(x.name==="end"){f=p().length-1,b(),e.repaintPicker();return}if(c&&C!==void 0&&C.length===1&&!x.ctrl&&!x.meta&&(C.codePointAt(0)??0)>=32){u+=C,d=Dg(o,u),f=0,g=0,e.repaintPicker();return}}};b();let P={renderRows:T,onKey:R};e.enterPickerMode(P)})}function kD(e,t,n){return n<t||e<t?t:e>n?n:e}var bLe,wLe,SLe,vLe,kLe,TLe,ELe,vD,ys=y(()=>{"use strict";$();K7();bLe="\u25B8",wLe=" ",SLe="\u25C9",vLe="\u25EF",kLe="\u2191/\u2193 navigate \xB7 enter select \xB7 esc cancel",TLe="\u2191/\u2193 navigate \xB7 space toggle \xB7 enter confirm \xB7 esc cancel",ELe="\u2191/\u2193 navigate \xB7 enter select \xB7 esc clear/cancel \xB7 type to filter",vD=20});function xLe(e,t){let n=`${Math.round(t.utilization*100)}%`,r=t.resetsAt?m.dim(` (resets ${t.resetsAt.toLocaleString()})`):"";return` ${e.padEnd(16)}${m.meta(n)}${r}`}function CLe(e,t){let n=t.apiUsage,r=n?.input_tokens??0,o=n?.output_tokens??0,i=n?.cache_read_input_tokens??0,s=n?.cache_creation_input_tokens??0,a=t.totalTokens??n?.context_window_tokens??0,l=yD(i,s);e.line(),e.line(m.bold("Token usage")+m.dim(" (SDK breakdown)")),e.line(se()),e.line(` total ${m.success(Ae(t.totalTokens))} of ${m.meta(Ae(t.maxTokens))} (${m.meta(`${Math.round(t.percentage*100)/100}%`)})`),t.autoCompactThreshold&&t.isAutoCompactEnabled&&e.line(` compact at ${m.meta(Ae(t.autoCompactThreshold))}`),e.line(),e.line(m.dim(" Last turn (API):")),e.line(` input ${m.meta(Ae(r))} ${m.dim("(turn total)")}`),e.line(` output ${m.meta(Ae(o))} ${m.dim("(turn total)")}`),e.line(` cache read ${m.meta(Ae(i))} ${m.dim("(last call)")}`),e.line(` cache creat ${m.meta(Ae(s))} ${m.dim("(last call)")}`),l!==void 0&&e.line(` cache hit ${m.meta(`${l}%`)} ${m.dim("(of cached tokens, last call)")}`),e.line(` window ${m.meta(Ae(a))} ${m.dim("(last call occupancy)")}`);let c=t.categories??[];if(c.length>0){let f=[...c].sort((g,h)=>h.tokens-g.tokens).slice(0,5);e.line(),e.line(m.dim(" Top categories:"));for(let g of f)e.line(` ${m.warning(g.name.padEnd(18))} ${m.meta(Ae(g.tokens))}`)}let u=t.systemTools??[],d=t.mcpTools??[];if(u.length>0||d.length>0){e.line();let f=u.reduce((h,b)=>h+b.tokens,0),g=d.reduce((h,b)=>h+b.tokens,0);u.length>0&&e.line(m.dim(` system tools ${u.length} tools, ${Ae(f)} tokens`)),d.length>0&&e.line(m.dim(` MCP tools ${d.length} tools, ${Ae(g)} tokens`))}let p=t.agents??[];if(p.length>0){let f=p.reduce((g,h)=>g+h.tokens,0);e.line(m.dim(` agents ${p.length} loaded, ${Ae(f)} tokens`))}if(t.skills){let f=t.skills;e.line(m.dim(` skills ${f.includedSkills}/${f.totalSkills} included, ${Ae(f.tokens)} tokens`))}if(t.slashCommands){let f=t.slashCommands;e.line(m.dim(` slash cmds ${f.includedCommands}/${f.totalCommands} included, ${Ae(f.tokens)} tokens`))}e.line()}function _Le(e,t){let n=t.turnTokens.reduce((u,d)=>u+d.input,0),r=t.turnTokens.reduce((u,d)=>u+d.output,0),o=t.turnTokens.reduce((u,d)=>u+d.cache,0),i=n+r,s=it(t.model),a=t.turnTokens[t.turnTokens.length-1],l=a?a.footprint??a.input+a.output+a.cache:0,c=s>0?Math.round(l/s*100):0;e.line(),e.line(m.bold("Token usage")+m.dim(" (local stats \u2014 SDK breakdown unavailable)")),e.line(se()),e.line(` input ${m.meta(Ae(n))}`),e.line(` output ${m.meta(Ae(r))}`),e.line(` cache read ${m.meta(Ae(o))}`),e.line(` total ${m.success(Ae(i))}`),e.line(` context ${m.meta(`${c}% of ${Ae(s)} (${t.model})`)}`),e.line()}async function G7(e,t){if(!H7(t)){e.out.warn(`Unknown model: ${t}. Aliases: ${rc.join(", ")} (or a full model id)`);return}let n=oc(t);if(n){e.out.warn(n);return}try{await e.session.current.setModel(t),e.stats.model=t,e.ui.repaintStatusLine(),e.out.success(`Model switched to ${m.brand(t)}`)}catch(r){e.out.error(`Failed to switch model: ${r instanceof Error?r.message:String(r)}`)}}var RLe,ALe,ILe,PLe,MLe,OLe,DLe,$Le,LLe,q7,z7=y(()=>{"use strict";$();pt();et();bD();Cg();SD();B7();j7();Et();W7();ys();RLe={name:"/cost",summary:"Show total and per-turn cost",hint:"When you want a dollar breakdown of this session \u2014 total, average per turn, and the recent turn-by-turn series.",async handler(e){let{stats:t,out:n}=e;if(n.line(),n.line(m.bold("Session cost")),n.line(se()),n.line(` total ${m.success(Qt(t.totalCostUsd))}`),n.line(` turns ${m.meta(String(t.totalTurns))}`),t.totalTurns>0){let r=t.totalCostUsd/t.totalTurns;n.line(` avg/turn ${m.meta(Qt(r))}`)}if(t.turnCosts.length>0){let r=t.turnCosts.slice(-5).map(Qt).join(m.dim(" \xB7 "));n.line(` last 5 ${r}`)}return t.unpricedTurns>0&&n.line(` unpriced ${m.warning(`${t.unpricedTurns} turn${t.unpricedTurns===1?"":"s"} had no cost metadata \u2014 total may be understated`)}`),n.line(),n.line(m.dim(" This is session-local spend. For account-wide subscription quota, see /usage.")),n.line(),"continue"}};ALe={name:"/usage",summary:"Show Claude subscription usage (5h / 7d windows)",hint:"When you want to know how close you are to hitting your Claude subscription's rolling usage limits \u2014 distinct from /cost, which is session-local spend.",async handler(e){let{out:t}=e,n=await U7();if(t.line(),n.kind==="unavailable")return t.line(m.bold("Subscription usage")),t.line(se()),n.reason==="no-token"?t.warn("No Claude subscription token found \u2014 run `claude login`, then try /usage again."):t.warn(`Usage unavailable (${n.reason}): ${n.detail}`),t.line(),"continue";let o=[["5-hour",n.fiveHour],["7-day",n.sevenDay],["7-day (Sonnet)",n.sevenDaySonnet],["7-day (Opus)",n.sevenDayOpus]].filter(i=>i[1]!==void 0);if(t.line(m.bold("Subscription usage")),t.line(se()),o.length===0)t.line(m.dim(" No usage windows reported."));else for(let[i,s]of o)t.line(xLe(i,s));return t.line(),"continue"}};ILe={name:"/tokens",aliases:["/ctx"],summary:"Show token usage (SDK breakdown with local-stats fallback)",hint:"When you want to know how full the context window is \u2014 input/output/cache breakdown plus % of the model's limit used.",async handler(e){try{let t=await e.session.current.getContextUsage();CLe(e.out,t)}catch{_Le(e.out,e.stats)}return"continue"}},PLe={name:"/history",summary:"Show conversation history",async handler(e){let{stats:t,out:n}=e;return t.turns.length===0?(n.info("No turns yet in this session."),"continue"):(n.line(),n.line(m.bold(`Session history (${t.turns.length} turn${t.turns.length===1?"":"s"})`)),n.line(se()),t.turns.forEach((r,o)=>{let i=m.meta(`#${o+1}`),s=r.user.length>100?r.user.slice(0,97)+"...":r.user,a=r.assistant.length>100?r.assistant.slice(0,97)+"...":r.assistant;n.line(` ${i} ${m.user("\u25B6")} ${s}`),n.line(` ${m.brand("\u25C6")} ${m.dim(a)}`)}),n.line(),"continue")}};MLe={name:"/model",usage:"/model [local|small|medium|large|opus|sonnet|haiku|fable|org/model]",summary:"Switch the active model mid-session",hint:"Switch the capability tier (local/small/medium/large \u2014 or your configured names) or pass a full model id. Bare `/model` opens an interactive picker on a TTY. Upgrade to large for a hard problem, downshift to small for cheap iteration \u2014 context carries over. Also accepts HuggingFace-style ids (e.g. mlx-community/Qwen3-30B-A3B-4bit).",async handler(e,t){let n=t.trim().toLowerCase();if(n)return await G7(e,n),"continue";let r=e.getCompositor?.()??null;if(r){let i=[...rc],s=i.indexOf(e.stats.model),l=(await bn(r,{header:[m.bold("Switch model"),m.dim(`current: ${e.stats.model}`),m.dim("or type a full id: /model <org/model>"),""],options:i,initialIndex:s>=0?s:0}))?.[0];return l&&await G7(e,l),"continue"}e.out.info(`Current model: ${m.brand(e.stats.model)}`);let o=rc.map(i=>N7(i)?i:`${i} (needs sign-in)`).join(", ");return e.out.line(m.dim(` Aliases: ${o} (or any org/model HF id)`)),"continue"}},OLe={name:"/tools",summary:"List tools available to the session",async handler(e){try{let n=(await e.session.current.waitForInitialization()).tools??[];if(n.length===0)return e.out.info("No tools reported by the session."),"continue";e.out.line(),e.out.line(m.bold(`Tools (${n.length})`)),e.out.line(se());let r=3,o=Math.ceil(n.length/r),i=Math.max(...n.map(s=>s.length))+2;for(let s=0;s<o;s++){let a=[];for(let l=0;l<r;l++){let c=l*o+s;c<n.length&&a.push(n[c].padEnd(i))}e.out.line(" "+a.join(""))}e.out.line()}catch(t){e.out.error(`Could not read session tools: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},DLe={name:"/mcp",summary:'List MCP servers connected to the session ("/mcp auth" to surface pending OAuth URLs)',async handler(e,t){let n=(t??"").trim().toLowerCase();if(n==="auth"){try{let{readOauthPending:r}=await Promise.resolve().then(()=>(Ek(),m5)),o=r();if(Object.keys(o).length===0)return e.out.info("No MCP servers are waiting for OAuth."),"continue";e.out.line(),e.out.line(m.bold(`MCP OAuth pending (${Object.keys(o).length})`)),e.out.line(se());for(let[i,s]of Object.entries(o)){let a=Date.now()-s.timestamp,l=Math.round(a/6e4);e.out.line(` ${m.warning("\u25CF")} ${i} ${m.dim(`(${l}m ago)`)}`),e.out.line(` ${m.info(s.authorizationUrl)}`)}e.out.line(),e.out.line(m.dim(" Open each URL in a browser. After authorizing, paste the code with:")),e.out.line(m.dim(" /mcp auth complete <serverName> <code>")),e.out.line()}catch(r){e.out.error(`Could not read OAuth state: ${r instanceof Error?r.message:String(r)}`)}return"continue"}if(n.startsWith("auth complete ")){let r=(t??"").trim(),o=r.slice(r.toLowerCase().indexOf("auth complete ")+14).trim(),i=o.indexOf(" ");if(i===-1||o.slice(0,i).length===0||o.slice(i+1).trim().length===0)return e.out.error("Usage: /mcp auth complete <serverName> <code>"),"continue";let s=o.slice(0,i).trim(),a=o.slice(i+1).trim();if(!e.mcpManager)return e.out.error("No MCP manager available in this session. Make sure an mcp.json config is present and at least one server is enabled."),"continue";try{e.out.info(`Completing OAuth for "${s}"\u2026`),await e.mcpManager.completeAuth(s,a),e.out.success(`OAuth complete for "${s}" \u2014 server is now connected.`)}catch(l){e.out.error(`OAuth completion failed for "${s}": ${l instanceof Error?l.message:String(l)}`)}return"continue"}if(n!==""&&n!=="auth")return e.out.error(`Unknown /mcp subcommand: "${n}". Try: /mcp, /mcp auth, /mcp auth complete <server> <code>.`),"continue";try{let o=(await e.session.current.waitForInitialization()).mcpServers??[];if(o.length===0)return e.out.info("No MCP servers connected."),"continue";e.out.line(),e.out.line(m.bold(`MCP servers (${o.length})`)),e.out.line(se());let i=0;for(let s of o){let a=typeof s=="string"?s:s.name??JSON.stringify(s),l=typeof s=="object"&&s!==null&&"status"in s?String(s.status):"",c=l==="connected"?m.success("\u25CF"):m.warning("\u25CF");e.out.line(` ${c} ${a}${l?m.dim(` (${l})`):""}`),l==="oauth_pending"&&i++}e.out.line(),i>0&&(e.out.line(m.dim(` ${i} server(s) need OAuth \u2014 run "/mcp auth" to see authorization URLs.`)),e.out.line())}catch(r){e.out.error(`Could not read MCP servers: ${r instanceof Error?r.message:String(r)}`)}return"continue"}},$Le={name:"/limits",summary:"Show known per-model context-window limits",async handler(e){e.out.line(),e.out.line(m.bold("Context-window limits")),e.out.line(se());for(let[t,n]of Object.entries(sc)){let r=t===e.stats.model?m.brand(" \u2190 active"):"";e.out.line(` ${m.warning(t.padEnd(12))} ${m.meta(Ae(n))}${r}`)}return e.out.line(),"continue"}},LLe={name:"/debug",summary:"Show SDK session metadata (tools, MCP, skills, plugins, etc.)",hint:"When something feels broken and you want to inspect what the session actually loaded \u2014 tools, MCP servers, plugins, system prompt source.",async handler(e){try{let t=await e.session.current.waitForInitialization();e.out.line(),e.out.line(pE(t)),e.out.line()}catch(t){e.out.error(`Could not read session metadata: ${t instanceof Error?t.message:String(t)}`)}return"continue"}},q7=[RLe,ILe,PLe,MLe,OLe,DLe,$Le,LLe,ALe]});function FLe(e){switch(e){case"bypassPermissions":return"bypass restored \u2014 no prompts, read/write any path";case"acceptEdits":return"accept-edits restored \u2014 edits auto-approved";case"dontAsk":case"auto":return"previous mode restored \u2014 no approval prompts";default:return"default permissions restored"}}async function $g(e,t){let n=e.stats.permissionMode==="plan",r=t!==void 0?t:!n,o=r?"plan":e.session.current.getPrePlanMode?.()??"default";try{if(await e.session.current.setPermissionMode(o),e.stats.permissionMode=o,e.ui.repaintStatusLine(),r){let i=TD?"":m.dim(" /plan off saves the plan + implements; Shift+Tab cycles to the next mode.");TD||(TD=!0),e.out.success(m.warning("\u25CF plan mode ON")+m.dim(" \u2014 writes are refused; read-only bash runs, mutating bash is blocked.")+i)}else e.out.success(m.success("\u25CB plan mode OFF")+m.dim(` \u2014 ${FLe(o)}`))}catch(i){e.out.error(`Could not toggle plan mode: ${i instanceof Error?i.message:String(i)}`)}}var TD,V7=y(()=>{"use strict";$();TD=!1});async function NLe(e){if(await $g(e,!1),e.stats.permissionMode==="plan")return"continue";let t=lp(e.stats.cwd??process.cwd());return e.out.info(m.dim(` \u2192 saving the plan to ${t}/, then implementing it.`)),{kind:"submit",message:lw(t)}}var Y7,J7=y(()=>{"use strict";U();R_();V7();$();Y7={name:"/plan",usage:"/plan [on|off|<prompt>]",summary:"Toggle plan mode; /plan off saves the plan to a file then implements it",hint:"Think through an approach without changing anything \u2014 write tools and state-mutating bash are refused until you exit; read-only investigation runs. /plan off saves the plan + implements it; Shift+Tab cycles to the next mode without implementing.",async handler(e,t){let n=t.trim(),r=n.toLowerCase();return n!==""&&r!=="on"&&r!=="off"?(e.stats.permissionMode!=="plan"&&await $g(e,!0),{kind:"submit",message:n}):(r==="on"?!0:r==="off"?!1:e.stats.permissionMode!=="plan")===!0?(e.stats.permissionMode==="plan"||await $g(e,!0),"continue"):e.stats.permissionMode!=="plan"?(await $g(e,!1),"continue"):NLe(e)}}});function WLe(e){let t=e.trim();return HLe.some(n=>n.test(t))}function AD(e){let t=-1,n=-1;for(let r=0;r<e.length;r++){let o=e[r];o.isError!==!0&&(jLe.has(o.toolName)?t=r:o.toolName==="bash"&&WLe(o.input)&&(n=r))}return t<0?"no-code-changes":n>t?"verified":"unverified"}function Z7(e){return e.some(n=>n.isError!==!0&&xD.has(n.toolName))?AD(e)!=="unverified":!1}function KLe(e,t={}){let n=e.kind==="done"&&t.unverified===!0,o=`\u{1F916} AFK \xB7 ${n?"\u26A0\uFE0F Done (unverified)":BLe[e.kind]}`,i=[];for(let[a,l]of ULe[e.kind]){let c=e[l];typeof c=="string"&&c.trim().length>0&&i.push(a?`\u2022 ${a}: ${c.trim()}`:`\u2022 ${c.trim()}`)}if(i.length===0&&e.rawBody.trim().length>0){let a=e.rawBody.trim();i.push(a.length>Q7?`${a.slice(0,Q7)}\u2026 [truncated]`:a)}n&&i.push("\u2022 \u26A0\uFE0F Unverified: no recognized successful verification was observed backing this Done claim \u2014 confirm before relying on this.");let s=i.length>0?i.join(`
|
|
1832
1832
|
`):"(no detail)";return We(`${o}
|
|
1833
1833
|
${s}`)}function eZ(){ED=0,RD=!1}async function tZ(e,t=Hn,n={}){try{if(ED>=X7){RD||(RD=!0,await t(`\u{1F916} AFK \xB7 reached ${X7} updates this session \u2014 further terminal-state pushes muted. Run /afk off then /afk on to resume.`));return}ED+=1,await t(KLe(e,n))}catch{}}var X7,Q7,BLe,ULe,xD,jLe,HLe,ED,RD,fE=y(()=>{"use strict";pi();Co();X7=20,Q7=500,BLe={done:"\u2705 Done",blocked:"\u26D4 Blocked",asking:"\u2753 Asking",interrupted:"\u23F8\uFE0F Interrupted"},ULe={done:[["","whatWasDone"],["Evidence","evidence"],["Pending","deferred"]],blocked:[["Blocked by","whatBlocks"],["Unblock","unblockCondition"],["Done so far","alreadyDone"]],asking:[["","question"],["Resolves","assumption"],["Then","followup"]],interrupted:[["","whatWasInProgress"],["State saved","stateLocation"],["Resume needs","resumeRequires"]]},xD=new Set(["write_file","edit_file","bash"]),jLe=new Set(["write_file","edit_file"]),HLe=[/^\s*(?:pnpm|npm|yarn|bun|npx)\s+(?:run\s+)?(?:test|lint|check|typecheck|type-check|verify|build)\b/,/^\s*make\s+(?:test|check|lint|verify|build)\b/,/^\s*cargo\s+(?:test|check|clippy|build)\b/,/^\s*go\s+(?:test|vet|build)\b/,/^\s*(?:pytest|python3?\s+-m\s+(?:pytest|unittest))\b/,/^\s*(?:vitest|jest|mocha|ava|tap)\b/,/^\s*(?:pnpm\s+exec|npx)\s+(?:vitest|jest|mocha|pytest|tsc)\b/,/^\s*tsc\b/,/^\s*(?:gcc|g\+\+|clang|clang\+\+|rustc|javac|dotnet\s+(?:build|test))\b/,/^\s*swift\s+(?:build|test)\b/,/^\s*(?:rake\s+(?:test|spec)|bundle\s+exec\s+rspec)\b/];ED=0,RD=!1});import*as _d from"node:fs";import*as rZ from"node:path";import{createHmac as GLe,randomBytes as oZ,timingSafeEqual as qLe}from"node:crypto";function VLe(e){return JSON.stringify(CD(e))}function CD(e){if(Array.isArray(e))return e.map(CD);if(e!==null&&typeof e=="object"){let t=e,n={};for(let r of Object.keys(t).sort())n[r]=CD(t[r]);return n}return e}function sZ(e){let t=nZ(e);if(t)return t;let n;try{n=Fh(e)}catch{return null}try{_d.mkdirSync(rZ.dirname(n),{recursive:!0});let r=oZ(zLe).toString("hex");return _d.writeFileSync(n,r+`
|
|
1834
1834
|
`,{mode:384}),r}catch{return nZ(e)}}function nZ(e){let t;try{t=Fh(e)}catch{return null}try{let n=_d.readFileSync(t,"utf8").trim();return n.length>0?n:null}catch{return null}}function aZ(e,t){return GLe("sha256",e).update(t).digest("hex")}function lZ(e,t){if(typeof e!="string"||typeof t!="string"||e.length!==t.length||e.length===0||!/^[0-9a-f]+$/i.test(e)||!/^[0-9a-f]+$/i.test(t))return!1;let n,r;try{n=Buffer.from(e,"hex"),r=Buffer.from(t,"hex")}catch{return!1}return n.length!==r.length||n.length===0?!1:qLe(n,r)}function YLe(e,t,n){return["elicitation_response",e,t,VLe(n)].join(iZ)}function JLe(e,t,n,r){return aZ(e,YLe(t,n,r))}function cZ(e,t,n,r,o){return lZ(o,JLe(e,t,n,r))}function XLe(e,t){return["abort_request",e,t].join(iZ)}function QLe(e,t,n){return aZ(e,XLe(t,n))}function uZ(e,t,n,r){return lZ(r,QLe(e,t,n))}function dZ(){return oZ(8).toString("hex")}var zLe,iZ,_D=y(()=>{"use strict";U();zLe=32,iZ="\0"});function mZ(e){let{sessionId:t,key:n,onAbort:r}=e;if(n===null)return{stop:()=>{}};let o=new AbortController;return(async()=>{try{for await(let i of Cm(t,{fromStart:!1,signal:o.signal}))if(i.kind==="abort_request"&&uZ(n,t,i.nonce,i.hmac)){r("remote abort via Telegram"),o.abort();return}}catch{}})(),{stop:()=>{o.abort()}}}function fZ(e){let{sessionId:t,key:n,emitElicitation:r,fallback:o}=e,i=e.newReqId??dZ;return function(a,l){let c=l.signal;if(c.aborted)return Promise.resolve(pZ);let u=i(),d,p=new Promise(h=>{d=h}),f=new AbortController,g=()=>{f.abort(),d(pZ)};c.addEventListener("abort",g,{once:!0}),n&&(async()=>{try{for await(let h of Cm(t,{fromStart:!1,signal:f.signal}))if(h.kind==="elicitation_response"&&h.reqId===u&&cZ(n,t,u,h.result,h.hmac)){d(h.result);return}}catch{}})();try{r({kind:"elicitation",reqId:u,request:a})}catch{}return Promise.resolve(o(a,{signal:f.signal})).then(h=>d(h)).catch(()=>{}),p.finally(()=>{f.abort(),c.removeEventListener("abort",g)})}}var pZ,gZ=y(()=>{"use strict";ba();_D();pZ={action:"decline"}});function ZLe(){return v.TELEGRAM_BOT_TOKEN?Ac().length>0:!1}async function Lg(e,t){let n=e.stats.permissionMode==="autonomous",r=t!==void 0?t:!n;try{if(await e.session.current.setPermissionMode(r?"autonomous":"default"),e.stats.permissionMode=r?"autonomous":"default",e.ui.repaintStatusLine(),r){eZ();let o=e.session.current,i=o.sessionId,s=e.swapElicitationHandler,a=e.stdinElicitationHandler;if(i&&s&&a){let l=sZ(i);l===null&&e.out.error("AFK: could not establish a signing key \u2014 phone replies and remote /abort will NOT work (keyboard only). Check that the AFK state dir is writable.");let c=fZ({sessionId:i,key:l,emitElicitation:u=>o.recordLedgerElicitation(u.reqId,u.request),fallback:a});s(c),gE?.stop(),gE=mZ({sessionId:i,key:l,onAbort:u=>o.abort(u)}),PA(i,!0)}else e.out.error("AFK: phone relay NOT armed \u2014 the session has no id until your first message completes. Running keyboard-only; re-run /afk on after a turn to enable phone questions/approvals and remote /abort.");e.out.success(m.info("\u25D0 AFK mode ON")+m.dim(" \u2014 autonomous on reversible work; high-risk/irreversible ops are refused; terminal states report to Telegram.")),ZLe()||e.out.error("Telegram is not configured, so AFK updates will not be delivered. Run /telegram-setup to connect a chat. (AFK posture + safety gate still apply.)")}else{e.swapElicitationHandler?.(null),gE?.stop(),gE=null;let o=e.session.current.sessionId;o&&PA(o,!1),e.out.success(m.success("\u25CB AFK mode OFF")+m.dim(" \u2014 default permissions restored"))}}catch(o){e.out.error(`Could not toggle AFK mode: ${o instanceof Error?o.message:String(o)}`)}}var gE,ID=y(()=>{"use strict";L();bm();fE();_D();gZ();ia();$();gE=null});var hZ,yZ=y(()=>{"use strict";ID();hZ={name:"/afk",usage:"/afk [on|off]",summary:"Toggle AFK mode \u2014 autonomous work + Telegram reporting while you are away",hint:"Tell the agent you are away from keyboard: it works autonomously on reversible operations, a safety gate refuses high-risk/irreversible ops, and each turn reports its terminal state to Telegram. /afk off restores default permissions.",async handler(e,t){let n=t.trim().toLowerCase(),r=n==="on"?!0:n==="off"?!1:e.stats.permissionMode!=="autonomous";return r&&e.stats.permissionMode==="autonomous"?"continue":!r&&e.stats.permissionMode==="plan"?(e.out.warn("AFK is already off \u2014 you're in plan mode. Use `/plan off` to leave plan mode."),"continue"):!r&&e.stats.permissionMode!=="autonomous"?(await Lg(e,!1),"continue"):(await Lg(e,r),"continue")}}});import{readFileSync as eFe,writeFileSync as tFe,existsSync as bZ,mkdirSync as nFe}from"fs";import{join as rFe}from"path";function wZ(){return Cx(),xh()}function SZ(e){return rFe(wZ(),`${e}.json`)}function hE(e){let t=SZ(e);if(!bZ(t))return{sessionId:e,items:[]};try{let n=eFe(t,"utf-8"),r=JSON.parse(n);return Array.isArray(r.items)?r:{sessionId:e,items:[]}}catch{return{sessionId:e,items:[]}}}function Fg(e){let t=wZ();bZ(t)||nFe(t,{recursive:!0}),tFe(SZ(e.sessionId),JSON.stringify(e,null,2))}function vZ(e,t){let r={id:e.items.reduce((o,i)=>Math.max(o,i.id),0)+1,text:t,done:!1,createdAt:Date.now()};return e.items.push(r),r}function kZ(e,t){let n=e.items.find(r=>r.id===t);return n&&(n.done=!0),n}function TZ(e,t){let n=e.items.findIndex(r=>r.id===t);return n===-1?!1:(e.items.splice(n,1),!0)}function EZ(e){e.items.length=0}function yE(e){if(e.items.length===0)return[];let t=[],n=Math.max(20,te());{let r=m.dim("\u250C\u2500 todos "),o=Math.max(0,Math.min(n-10,120));t.push(r+m.dim("\u2500".repeat(o)))}for(let r of e.items){let o=r.done?m.success("[x]"):m.dim("[ ]"),i=r.done?m.dim(r.text):Ep(r.text),a=` ${m.meta(`#${r.id}`)} ${o} `,l=Math.max(8,n-V(a)),c=ue(i,l).split(`
|
|
@@ -2057,7 +2057,7 @@ ${E}
|
|
|
2057
2057
|
${T}`})}return{fileBlocks:l,warnings:c}}function cre(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function ure(e,t,n){let r=t?.peekQueuedText(),o=r!==void 0?{text:r.text,claimed:!1}:void 0;r!==void 0&&t?.reserveQueued?.(r);let i;try{i=await e.promoteActiveForeground(o)}catch(s){throw r!==void 0&&t?.releaseQueued?.(r),s}if(o?.claimed===!0&&t!==null&&r!==void 0){try{await n?.(o.text)}catch{}return t.dropQueued(r),{jobs:i,flushedText:o.text,flushedPreview:r.preview}}return r!==void 0&&t?.releaseQueued?.(r),{jobs:i}}L();$();L();et();$();ja();function dre(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function pre(e,t){Fe()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function mre(e,t,n,r){if(!Fe())return;let o=e.toolStartTimes.get(t.toolUseId),i=o!==void 0?Date.now()-o:void 0;e.toolStartTimes.delete(t.toolUseId);let s=Oe(n??"tool"),a=t.isError?m.error("err"):m.success("ok"),l=i!==void 0?` \xB7 ${ye(i)}`:"";r.fn(m.dim(` \u25E6 ${s}${l} \xB7 `)+a)}function fre(e,t,n,r){if(!Fe())return;let{subagentId:o,agentType:i}=n,s=Oe(i??o);if(e.subagentStartTimes.has(o)||(e.subagentStartTimes.set(o,Date.now()),e.subagentLabels.set(o,s),r.fn(m.dim(` \u25E6 worker ${s} started`))),t.type==="done"||t.type==="error"){let l=e.subagentStartTimes.get(o),c=l!==void 0?Date.now()-l:void 0;e.subagentStartTimes.delete(o),e.subagentLabels.delete(o);let u=c!==void 0?` \xB7 ${ye(c)}`:"",d=t.type==="error"?m.error("failed"):m.success("done");r.fn(m.dim(` \u25E6 worker ${s}${u} \xB7 `)+d)}}var cR=class{state;writer;ttfb;constructor(t,n){this.state=dre(),this.writer=t,this.ttfb=n}onToolStart(t){pre(this.state,t)}onToolResult(t,n){mre(this.state,t,n,this.writer)}onSubagentEvent(t,n){fre(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function gre(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function hre(e){return e.received?{}:{turnStartedAt:e.startedAt}}function yre(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function bre(e,t=process.stdout,n){if(!Fe()||!t.isTTY)return;(e?.fn??console.log)(m.dim(" \u25E6 waiting for response\u2026")),n&&(n.waitingLineEmitted=!0,e&&(n.plainHooks=new cR(e,n)))}de();$();var Gje=3e3;async function wre(e,t){if(!e)return t;let n=Date.now();if(n-t<Gje)return t;try{let r=e();r instanceof Promise&&await r}catch(r){He()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}$();de();pt();ys();var qje="Keep waiting \u2014 auto-resume in progress",Sre="Switch model / provider (type /model after)",zje="Stop waiting";async function vre(e){let{event:t,session:n,borrowedCompositor:r,pickerRef:o,completionWriter:i,disposeRendererOnce:s,setPausedState:a,onPauseInterrupt:l}=e;if(a?.(!0),await s(),r&&t.autoResume===!0){let c=new AbortController;o.abort=c;let u=t.resetsAt?t.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,d=u?`Keep waiting \u2014 auto-resumes at ${u}`:qje,p=[m.warning(" \u23F3 Usage limit reached.")+(u?m.dim(` Auto-resumes at ${u}.`):""),m.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];bn(r,{header:p,options:[d,Sre,zje],signal:c.signal,initialIndex:0}).then(f=>{if(o.abort=null,!f)return;let g=f[0];g===void 0||g===d||(l(),g===Sre&&(i??{fn:console.log}).fn(m.dim(" Hint: type /model <name> to switch, then send your message again.")),n.interrupt().catch(h=>{He()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{He()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(KF({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}pT();async function kre(e,t,n,r,o="summary",i,s){let a=A3(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=gre(l);bre(i,process.stdout,c),Qu(process.stdout,Xf(process.cwd(),!0));let u="",d=0,p=!1,f=!1,g=!1,h=!1,b=!1,w,S=!1,k=!1,E={abort:null},T=0,R=[],P=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,x=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&ure(j,I,r.onQueuedUserMessage).then(({jobs:K,flushedText:H,flushedPreview:W})=>{let Q=(i??{fn:console.log}).fn;for(let oe of K)Q(m.dim(` \u2192 subagent backgrounded as ${oe.jobId}: ${oe.label}`));H!==void 0&&Q(m.dim(` \u2192 queued message sent to this turn: ${cre(W??H)}`))}).catch(()=>{})},I=r.getCompositor?r.getCompositor():null,M=()=>new Ed({out:xd(i),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch(j=>{He()&&console.error(" "+m.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:x}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...I?{compositor:I}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...hre(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),D=M(),B=async()=>{if(!h){h=!0;try{await D.dispose()}catch{}}},F=async()=>{await D.arm();let j=D.getCompositor();if(i&&j){let K=j;i.fn=H=>K.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(K=>D.setInterrupting(K)),r.rearmStatus?.()};try{I?I.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,D.setSoftStopping(!0),t.interrupt().catch(G=>{He()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),G)});let _=r.subagentControl;_?.hasActiveForeground()&&_.cancelActiveForeground().catch(G=>{He()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),G)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch(_=>{He()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),_)})}),await F(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(x),r.setTaskViewHandler?.(rre(r));let{fileBlocks:j,warnings:K}=lre(e.text,{rootDir:process.cwd()});for(let _ of K)(i??{fn:console.log}).fn(m.dim(` @-file: ${_}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let H=j.length>0||e.attachments.length>0?await are(e.text,e.attachments,void 0,j,t.sessionId):e.text,W=t.sendMessageStream(H);if(await jc((_,G)=>{D.process(_,G),G&&c.plainHooks?.onSubagentEvent(_,G)},async()=>{for await(let _ of W){if(S||k)break;let G=yre(c,_,f);if(_.type==="chunk"&&_.chunk.type==="content"?(u=p?tre(u,_.chunk.content):u+_.chunk.content,p=!1,f=!0):_.type==="message"&&!f&&(u=_.message.content),_.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),_.type==="chunk"&&_.chunk.type==="tool_use_detail"){let Y=_.chunk,pe={toolName:Y.toolName,toolUseId:Y.toolUseId,input:Y.toolInput,...Y.toolInputRaw!==void 0&&{inputRaw:Y.toolInputRaw}};P.set(Y.toolUseId,pe),R.push(pe),c.plainHooks?.onToolStart(Y)}else if(_.type==="chunk"&&_.chunk.type==="tool_result"){let Y=_.chunk;d=u.length,p=!0;let pe=P.get(Y.toolUseId);pe&&(pe.result=Y.content,pe.isError=Y.isError,P.delete(Y.toolUseId)),c.plainHooks?.onToolResult(Y,pe?.toolName),T=await wre(r.onContextProgress,T)}if(_.type==="paused"){await vre({event:_,session:t,borrowedCompositor:I,pickerRef:E,completionWriter:i,disposeRendererOnce:B,setPausedState:r.setPausedState,onPauseInterrupt:()=>{k=!0}});continue}if(_.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let Y=_.hotSwapped&&_.accountId?`\u25B6 Resumed on ${_.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,R.length=0,P.clear(),b=!1,w=void 0,g=!1,D=M(),h=!1,await F(),(i??{fn:console.log}).fn(m.success(Y));continue}if(_.type==="error"){await B(),tc(Gl(_.error)),g=!0;continue}D.process(_),G&&(c.plainHooks?.onFirstContent(process.stdout),D.notifyFirstContent()),_.type==="done"&&(b=!0,w=_.metadata)}}),b&&!S&&!k){let _=Zne(D.getPendingBuffer());_>=0&&D.stripPendingTerminalState(_)}await B();let oe=i?i.fn:console.log;if(S){let _=I?I.getPendingCount():0,G=_>0?` \xB7 ${_} queued`:"";oe(m.warning(`\u23F8 Stopped${G} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),oe("")}if(k&&(oe(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),oe("")),b&&!S&&!k){qa(n,a,u,w,R),await r.onTurnComplete?.(a,u).catch(()=>{}),Xu(process.stdout),$5(process.stdout,"afk: turn complete");let _=Y=>{i?i.fn(Y):console.log(Y)},G=aR(u);if(G){_(nre(G,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:R.length})),_("");let Y=AD(R),pe=Z7(R);if(r.onTerminalState)try{r.onTerminalState(G,{doneHasCorroboratingEvidence:pe,doneEvidenceClassification:Y})}catch{}if(n.permissionMode==="autonomous"){let re=G.kind==="done"&&ym().verifyDone===!0&&!pe;tZ(G,void 0,{unverified:re})}}if(M$(w,n,_),r.onAfterTurn){let Y=r.onAfterTurn();Y instanceof Promise&&await Y.catch(()=>{})}}}catch(j){await B(),g||tc(Gl(j))}finally{await B(),Qu(process.stdout,Xf(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setTaskViewHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}os();Tp();var Vje=5e3,Yje=3,Jje="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Xje(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function Tre(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,mascotBar:u,healthRail:d,verdictLedger:p,shellPassthrough:f,bgResultNotifier:g}=s,h=null,b=[];e.session.current.waitForInitialization().then(async M=>{He()&&(h=pE(M)),await Ag(e.session.current),He()&&(b=YO())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,k=!1,E=!1,T,R,P,C,x=(()=>{let M=parseInt(e.options.maxTurns,10);return M>0?M:void 0})(),I=0;g.onInjectable=()=>{I>=Yje||!o.isAwaitingInput()||!o.bufferIsEmpty()||n.pendingSteerRead||(I++,Xu(process.stdout),w={text:Jje,attachments:[]},o.abortPendingRead())};try{for(n.steerReadLine=async M=>{let D=()=>o.abortPendingRead({clearBuffer:!0});if(M?.addEventListener("abort",D,{once:!0}),M?.aborted)return"";try{return(await o.readLine({promptFn:()=>"Steer the agent \u2192 ",onEscape:D})).text}finally{M?.removeEventListener("abort",D)}};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let _ of b)e.replRenderer.writeLine(_);e.replRenderer.writeLine(""),b=[]}let M=f.drainNotifications();for(let{job:_,result:G}of M){let Y=G.errorReason===void 0?"\u2713":"\u2717",pe=G.errorReason==="abort"?"killed":G.errorReason==="timeout"?"timed out":G.errorReason==="signal-killed"?"killed by signal":`exit ${G.exitCode??0}`,re=Math.max(0,Math.round(G.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${Y} [${_.id}] ${pe} \xB7 ${re}s \xB7 `)+_.command)}let D=g.drainNotifications();for(let{job:_}of D){let G=_.status==="completed"?"\u2713":_.status==="failed"?"\u2717":"\u2298",Y=_.endedAt!==void 0?Math.max(0,Math.round((_.endedAt-_.startedAt)/100)/10):0,pe=ee(_.label,60);e.replRenderer.writeLine(m.dim(` ${G} [${_.jobId}] subagent ${_.status} \xB7 ${Y}s \xB7 `)+pe)}let B=l.renderIfChanged(e.stats.sessionId);if(B.length>0){for(let _ of B)e.replRenderer.writeLine(_);e.replRenderer.writeLine("")}let F,j,K=n.pendingSteerRead;if(K){let _=await K;n.pendingSteerRead===K&&(n.pendingSteerRead=null),_?.trim()&&(n.pendingSteerText=_)}if(n.pendingSteerText&&(w={text:n.pendingSteerText,attachments:[]},n.pendingSteerText=null),w===void 0){let _=await e.session.current.takePendingPlanExitSeed();_!==void 0&&(e.stats.permissionMode=_.mode,w={text:_.message,attachments:[]})}if(w!==void 0){let _=w;w=void 0;let G=Ld(e.stats.permissionMode),Y=Xa({buffer:_.text,promptText:G,isTTY:!!process.stdout.isTTY,attachmentSummary:ud([..._.attachments])});e.replRenderer.writeLine(Y),F=_.text.trim(),j=_.attachments}else{let _=S;S=void 0;let G=await o.readLine({promptFn:()=>Ld(e.stats.permissionMode),..._!==void 0?{initialBuffer:_}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{tR(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});F=G.text.trim(),j=G.attachments}if(!F&&j.length===0)continue;if(F.startsWith("!")){let _=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!_&&(k||(k=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(F))){e.statusLine.rearm();continue}}let H=!1;if(F.startsWith("/")){let _=await N5(F,e.slashCtx,j);if(_.handled){if(_.result==="exit"){await e.resolveWorktreeDisposition?.(!0),e.rl.close();return}if((F==="/clear"||F.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),p.reset(),T=void 0),_.result!==null&&typeof _.result=="object"&&"kind"in _.result&&_.result.kind==="submit"){w={text:_.result.message,attachments:j??[]},e.statusLine.rearm();continue}if(_.result!==null&&typeof _.result=="object"&&"kind"in _.result&&_.result.kind==="prefill"){S=_.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}H=!0}a.push(F),await Xje(e,F);let W=F;if(H){let _=S0(F);if(_){let G=_.name.replace(/^\//,"").split(":").pop()??"";if(G&&KO(G)){let Y={skillName:G,rawArgs:_.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},pe=e.session.current.sessionId,re=dl(pe),Re=Date.now();N(`[afk trace] preflight.start commandName=${G}`);let Ge=!1,or=await ul(Y,{cwd:e.stats.cwd??process.cwd(),artifactDir:re},qe=>{He()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${G}) failed: `)+(qe instanceof Error?qe.message:String(qe)))});Ge=or!==null,N(`[afk trace] preflight.end commandName=${G} durationMs=${Date.now()-Re} success=${Ge}`),W=zO(or?.manifestBlock,F)}}}let Q=f.drainInjections();Q.length>0&&(W=Q+W);let oe=g.drainInjections();if(oe.length>0&&(W=oe+W),T!==void 0&&(W=T+`
|
|
2058
2058
|
|
|
2059
2059
|
`+W,T=void 0),e.hookRegistry)try{let _={event:"UserPromptSubmit",prompt:W,sessionId:e.stats.sessionId},G=await e.hookRegistry.dispatch(_);G.injectContext&&(W=G.injectContext+W)}catch(_){if(_ instanceof xe){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(_.reason?m.dim(`: ${ae(_.reason)}`):"")),e.statusLine.rearm();continue}if(_ instanceof Ur){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${_.timeoutMs}ms`)),e.statusLine.rearm();continue}throw _}if(R=P=C=void 0,XF(),tN(),await kre({text:W,attachments:j},e.session.current,e.stats,{setInFlight(_){n.turnInFlight=_},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(_){await t.appendUser(_)},async onQueuedUserMessage(_){await t.appendQueuedUser(_)},async onTurnComplete(_,G){if(await t.appendTurn(_,G),e.stats.sessionId)try{rs(e.stats)}catch(Y){E||(E=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(Y instanceof Error?Y.message:String(Y))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.repaint(er(e.stats,e.contextSampler,e.gitStatusSampler,x)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(_,G)=>{p?.push(_),R=_.kind,P=G?.doneHasCorroboratingEvidence,C=G?.doneEvidenceClassification},setActiveCompositor:_=>{n.activeCompositor=_,_===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:_=>{n.notifyInterrupting=_},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:_=>o.setBackgroundHandler(_),setTaskViewHandler:_=>o.setTaskViewHandler(_),setSoftStopHandler:i,setPausedState:_=>o.setPausedState(_),setPauseInterruptHandler:_=>o.setPauseInterruptHandler(_),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(er(e.stats,e.contextSampler,e.gitStatusSampler,x)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(_,G)=>{c.repaint(_),u?.onStage(_,G)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Ld(e.stats.permissionMode))),e.hookRegistry)try{let _=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},...P!==void 0?{doneHasCorroboratingEvidence:P}:{},...C!==void 0?{doneEvidenceClassification:C}:{}},void 0,Vje);_.injectContext&&_.injectContext.trim().length>0&&(T=_.injectContext)}catch(_){if(_ instanceof Mt)throw _;_ instanceof Ur?(N("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):_ instanceof xe?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${ae(_.reason??"no reason given")}`)):N("[stop hook] unexpected error: "+String(_))}}}finally{n.steerReadLine=null,n.pendingSteerRead=null,n.pendingSteerText=null}}function Qje(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function Ere(e,t,n,r){let o=await mne(),i=new eR({rl:e.rl,history:o,statusLine:e.statusLine}),s=Qje(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await $ne(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=Qne(e,n);let c=a;e.slashCtx.suspendFooter=()=>{c.bgStatusBar.stop(),c.mascotBar.stop(),c.healthRail.stop(),e.statusLine.stop()},e.slashCtx.resumeFooter=()=>{e.statusLine.start(),c.healthRail.start(),c.mascotBar.start(),c.bgStatusBar.start(),c.bgStatusBar.redraw()},await Tre(e,t,n,r,i,l,a,o),await e.resolveWorktreeDisposition?.(!0)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),a?.healthRail.stop(),a?.loopStageBar.stop(),a?.mascotBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}cm();Ic();import{execFile as Zje}from"node:child_process";import{dirname as e1e,isAbsolute as t1e,resolve as n1e}from"node:path";import{promisify as r1e}from"node:util";var Rre=r1e(Zje),o1e=3e3,i1e=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function s1e(){let t=(await Rre("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=t1e(t)?t:n1e(process.cwd(),t);return e1e(n)}async function xre(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await s1e()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),o1e)});try{let o=qn({execFile:Rre,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>i1e.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}ay();cm();import{promises as a1e}from"node:fs";import{dirname as l1e,join as _re}from"node:path";import{randomBytes as c1e}from"node:crypto";var u1e=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
2060
|
-
`),Are=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,D$=30,d1e=1024,p1e=8e3,m1e="haiku";async function f1e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=b1e(n,d1e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??p1e),s=t.signal?w1e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ic({token:t.token,model:t.model??m1e,system:u1e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=g1e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=l1e(t.worktreePath);return await h1e(l,c)}function g1e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Are.test(t)&&t.length<=D$)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>D$)break;o=s}return Are.test(o)?o:null}async function h1e(e,t){if(!await y1e(_re(t,e)))return e;let n=c1e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,D$-5)}-${n}`}async function y1e(e){try{return await a1e.access(e),!0}catch{return!1}}function b1e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function w1e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Ire(e){let t,n,r=_re(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await f1e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${mb(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Cre(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Cre(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Cre(e,t){e&&e.setCwd(t),S1e(t)}function S1e(e){try{process.chdir(e)}catch{}}bt();At();Wl();po();U();import{spawn as Mre}from"child_process";import{existsSync as Ore,mkdirSync as R1e,readFileSync as Dre,unlinkSync as Pre,writeFileSync as $re}from"fs";import{get as x1e}from"https";import{join as Lre}from"path";import{readFileSync as v1e}from"fs";import{dirname as k1e,join as T1e}from"path";import{fileURLToPath as E1e}from"url";function go(){try{return"5.170.
|
|
2060
|
+
`),Are=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,D$=30,d1e=1024,p1e=8e3,m1e="haiku";async function f1e(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=b1e(n,d1e),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??p1e),s=t.signal?w1e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await ic({token:t.token,model:t.model??m1e,system:u1e,user:r,maxTokens:32,signal:s})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(i)}let l=g1e(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=l1e(t.worktreePath);return await h1e(l,c)}function g1e(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Are.test(t)&&t.length<=D$)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>D$)break;o=s}return Are.test(o)?o:null}async function h1e(e,t){if(!await y1e(_re(t,e)))return e;let n=c1e(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,D$-5)}-${n}`}async function y1e(e){try{return await a1e.access(e),!0}catch{return!1}}function b1e(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function w1e(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function Ire(e){let t,n,r=_re(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await f1e(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${mb(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return Cre(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return Cre(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function Cre(e,t){e&&e.setCwd(t),S1e(t)}function S1e(e){try{process.chdir(e)}catch{}}bt();At();Wl();po();U();import{spawn as Mre}from"child_process";import{existsSync as Ore,mkdirSync as R1e,readFileSync as Dre,unlinkSync as Pre,writeFileSync as $re}from"fs";import{get as x1e}from"https";import{join as Lre}from"path";import{readFileSync as v1e}from"fs";import{dirname as k1e,join as T1e}from"path";import{fileURLToPath as E1e}from"url";function go(){try{return"5.170.1"}catch{}try{let e=k1e(E1e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(v1e(T1e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}$();L();var A1e=64*1024,C1e=10800*1e3,_1e=800,I1e=3600*1e3,P1e="update-check.json",M1e="pending-update.json";function $$(){return Lre(Ds(),P1e)}function Vg(){return Lre(Ds(),M1e)}function L$(){let e=Ds();Ore(e)||R1e(e,{recursive:!0})}function Fre(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Nre(){try{let e=Dre($$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Bre(){try{L$();let e=`
|
|
2061
2061
|
const https = require('https');
|
|
2062
2062
|
const fs = require('fs');
|
|
2063
2063
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|