agent-afk 5.167.2 → 5.167.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/provider.d.ts +1 -0
- package/dist/agent/session/agent-session.d.ts +3 -3
- package/dist/agent/types/session-types.d.ts +3 -3
- package/dist/cli/slash/plugin-skills/state.d.ts +1 -0
- package/dist/cli.mjs +5 -5
- package/dist/index.mjs +2 -2
- package/dist/telegram.mjs +2 -2
- package/package.json +1 -1
package/dist/agent/provider.d.ts
CHANGED
|
@@ -176,6 +176,7 @@ export interface ProviderCommandInfo {
|
|
|
176
176
|
name: string;
|
|
177
177
|
description?: string;
|
|
178
178
|
argumentHint?: string;
|
|
179
|
+
whenToUse?: string;
|
|
179
180
|
source?: 'builtin' | 'user' | 'project' | 'plugin' | 'imported' | 'command';
|
|
180
181
|
}
|
|
181
182
|
export interface ProviderModelInfo {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ContentBlockParam } from '@anthropic-ai/sdk/resources';
|
|
2
2
|
import type { TraceWriter } from '../trace/writer.js';
|
|
3
3
|
import type { HookRegistry } from '../hooks.js';
|
|
4
|
-
import type { ProviderCompactResult, ProviderQuery, ProviderRewindConversationResult, RewindTarget } from '../provider.js';
|
|
4
|
+
import type { ProviderCommandInfo, ProviderCompactResult, ProviderQuery, ProviderRewindConversationResult, RewindTarget } from '../provider.js';
|
|
5
5
|
import { type ZodType } from 'zod';
|
|
6
|
-
import type { AccountInfo, AgentConfig, AgentInfo, AgentModelInput, IAgentSession, InputStreamRef, McpServerStatus, Message, ModelInfo, OutputEvent, PermissionMode, ResponseMetadata, RewindFilesResult, SDKControlGetContextUsageResponse, SendMessageOptions, SessionIdentity, SessionMetadata, SessionState,
|
|
6
|
+
import type { AccountInfo, AgentConfig, AgentInfo, AgentModelInput, IAgentSession, InputStreamRef, McpServerStatus, Message, ModelInfo, OutputEvent, PermissionMode, ResponseMetadata, RewindFilesResult, SDKControlGetContextUsageResponse, SendMessageOptions, SessionIdentity, SessionMetadata, SessionState, StructuredMessageOptions } from '../types.js';
|
|
7
7
|
import type { ElicitationRequest } from '../types/sdk-types.js';
|
|
8
8
|
export declare class AgentSession implements IAgentSession {
|
|
9
9
|
private readonly ownedTraceWriter;
|
|
@@ -74,7 +74,7 @@ export declare class AgentSession implements IAgentSession {
|
|
|
74
74
|
getSessionIdentity(): SessionIdentity;
|
|
75
75
|
getSessionMetadata(): SessionMetadata;
|
|
76
76
|
getQuery(): ProviderQuery;
|
|
77
|
-
supportedCommands(): Promise<
|
|
77
|
+
supportedCommands(): Promise<ProviderCommandInfo[]>;
|
|
78
78
|
supportedModels(): Promise<ModelInfo[]>;
|
|
79
79
|
supportedAgents(): Promise<AgentInfo[]>;
|
|
80
80
|
getContextUsage(): Promise<SDKControlGetContextUsageResponse>;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { AccountInfo, AgentInfo, ApiKeySource, McpServerStatus, ModelInfo, PermissionMode, SDKControlGetContextUsageResponse, SDKStatus
|
|
1
|
+
import type { AccountInfo, AgentInfo, ApiKeySource, McpServerStatus, ModelInfo, PermissionMode, SDKControlGetContextUsageResponse, SDKStatus } from './sdk-types.js';
|
|
2
2
|
import type { ContentBlockParam } from '@anthropic-ai/sdk/resources';
|
|
3
3
|
import type { AgentModelInput } from './model-types.js';
|
|
4
4
|
import type { InputStreamRef } from './permission-types.js';
|
|
5
5
|
import type { Message, MessageChunk, ResponseMetadata, SendMessageOptions, StructuredMessageOptions } from './message-types.js';
|
|
6
|
-
import type { ProviderCompactResult, ProviderQuery, ProviderRewindConversationResult, RewindTarget } from '../provider.js';
|
|
6
|
+
import type { ProviderCommandInfo, ProviderCompactResult, ProviderQuery, ProviderRewindConversationResult, RewindTarget } from '../provider.js';
|
|
7
7
|
import type { HookRegistry } from '../hooks.js';
|
|
8
8
|
import type { ZodType } from 'zod';
|
|
9
9
|
export type SessionState = 'idle' | 'processing' | 'streaming' | 'compacting' | 'closed';
|
|
@@ -131,7 +131,7 @@ export interface IAgentSession {
|
|
|
131
131
|
getOutputStream(): AsyncIterable<OutputEvent>;
|
|
132
132
|
getHistory?(): readonly Message[];
|
|
133
133
|
getInputStreamRef(): Pick<InputStreamRef, 'pushUserMessage' | 'queueFrameworkContext'>;
|
|
134
|
-
supportedCommands(): Promise<
|
|
134
|
+
supportedCommands(): Promise<ProviderCommandInfo[]>;
|
|
135
135
|
supportedModels(): Promise<ModelInfo[]>;
|
|
136
136
|
supportedAgents(): Promise<AgentInfo[]>;
|
|
137
137
|
getContextUsage(): Promise<SDKControlGetContextUsageResponse>;
|
package/dist/cli.mjs
CHANGED
|
@@ -420,7 +420,7 @@ ${o}`,paths:[t,n]}:o!==null?i={content:o,paths:[n]}:r!==null?i={content:r,paths:
|
|
|
420
420
|
|
|
421
421
|
${t}`}var eye,fC=y(()=>{"use strict";eye=new Set(["script","style","noscript","template","svg"])});function rye(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 S1(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function oye(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 v1(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??rye,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(!nye.has(d.status)||u===o)return d;let p=oye(d,s)??S1(u,i,s);B("[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=S1(u,i,s);B("[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 nye,k1=y(()=>{"use strict";ue();nye=new Set([429,502,503,504])});import{BlockList as iye,isIP as hC}from"node:net";import{lookup as sye}from"node:dns/promises";import{Agent as aye}from"undici";function E1(){let e=v.AFK_WEB_ALLOW_PRIVATE_HOSTS?.trim().toLowerCase();return e==="1"||e==="true"}function dye(e){return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e}function gC(e){let t=hC(e);return t===0?!1:uye.check(e,t===4?"ipv4":"ipv6")}async function R1(e){return sye(e,{all:!0,verbatim:!0})}async function yC(e,t={}){if(t.allowPrivateHosts??E1())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=dye(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(hC(r)!==0)return gC(r)?{allowed:!1,reason:o(r,r)}:{allowed:!0};let i=t.lookupFn??R1,s;try{s=await i(r)}catch{return{allowed:!0}}for(let a of s)if(gC(a.address))return{allowed:!1,reason:o(a.address,`${r} (resolved)`)};return{allowed:!0}}async function fm(e,t={}){let n=await yC(e,t);if(!n.allowed)throw new mr(n.reason)}async function fb(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<=T1;s++){await fm(i,o);let a={...n,redirect:"manual",...e===globalThis.fetch&&!(r.allowPrivateHosts??E1())?{dispatcher:pye}:{}},l=await v1(e,i,a,r.retry??{});if(!mye.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 (>${T1}) starting from ${t}`)}var lye,cye,uye,mr,pye,T1,mye,bC=y(()=>{"use strict";L();k1();lye=[["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]],cye=[["::",96],["64:ff9b::",96],["fc00::",7],["fe80::",10]],uye=(()=>{let e=new iye;for(let[t,n]of lye)e.addSubnet(t,n,"ipv4");for(let[t,n]of cye)e.addSubnet(t,n,"ipv6");return e})(),mr=class extends Error{constructor(t){super(t),this.name="EgressBlockedError"}};pye=new aye({connect:{lookup(e,t,n){R1(e).then(r=>{let o=r.find(s=>gC(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,hC(i.address))},r=>n(r,"",0))}}});T1=20,mye=new Set([301,302,303,307,308])});var _1={};vn(_1,{enforceDomainPolicy:()=>fr,loadBrowserConfig:()=>wC});import{readFileSync as fye}from"node:fs";import{join as gye}from"path";function hye(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function x1(e,t){return hye(t).test(e)}function wye(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(yye.has(t))return!0;if(bye.has(t))return!1}return!1}function A1(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function Sye(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 C1(e){let t=e===void 0||e.trim()===""?"default":e.trim();return $l(t),t}function vye(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function kye(e){try{return fye(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function Tye(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=C1(t.defaultProfile)),n}function wC(e){let t=e?.env??v,n=e?.readFileSync??kye,r=e?.surface??t.AGENT_SURFACE,o=wye(t.AFK_BROWSER_HEADLESS,r),i=A1(t.AFK_BROWSER_ALLOWED_DOMAINS),s=A1(t.AFK_BROWSER_BLOCKED_DOMAINS),a=vye(t.AFK_BROWSER_DOM_SNAPSHOTS),l=Sye(t.AFK_BROWSER_BACKEND),c=C1(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():gye($n(),"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=Tye(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(x1(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>x1(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var yye,bye,aa=y(()=>{"use strict";L();H();yye=new Set(["daemon","subagent","telegram","afk"]),bye=new Set(["repl","interactive","cli"])});import{readFileSync as Eye}from"node:fs";import{join as Rye}from"node:path";import{homedir as xye}from"node:os";function Cye(e){let t=e??Aye,n;try{n=Eye(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 _ye(e){try{return process.kill(e,0),!0}catch{return!1}}async function Iye(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 SC(e){let t=Cye(e);return t===null?{available:!1,connection:null,reason:"connection file missing or invalid"}:_ye(t.pid)?await Iye(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 Aye,I1=y(()=>{"use strict";Aye=Rye(xye(),".config","agent-browser","connection.json")});async function P1(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 SC(),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&&Pye.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 SC(),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 Pye,M1=y(()=>{"use strict";I1();Pye=new Set(["daemon","subagent"])});import{createHash as Mye}from"crypto";function O1(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&Oye.test(e.label))}function D1(e){return Mye("sha256").update(e,"utf8").digest("hex").slice(0,8)}function $1(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var Oye,gb=y(()=>{"use strict";Oye=/password|secret|token|api[_-]?key|otp|2fa/i});import{randomBytes as Dye}from"crypto";import{mkdir as $ye,stat as Lye,writeFile as Fye}from"fs/promises";import{join as vC}from"path";import{gzip as Nye}from"zlib";import{promisify as Bye}from"util";function Uye(e){return vC(sn(e),"browser")}function jye(e){return vC(Uye(e),"screenshots")}function Hye(){return new Date().toISOString().replace(/[:.]/g,"-")}function Wye(){return Dye(3).toString("hex")}async function xc(e,t,n){if(t.length>L1)throw new Error(`writeScreenshotSidecar: buffer exceeds ${L1} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=jye(e);await $ye(r,{recursive:!0});let o=`${Hye()}-${Wye()}-${n}.png`,i=vC(r,o);await Fye(i,t);let{size:s}=await Lye(i);return{path:i,bytes:s}}var k7e,L1,kC=y(()=>{"use strict";H();gb();k7e=Bye(Nye);L1=5*1024*1024});var hb,F1=y(()=>{"use strict";hb=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 TC(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 N1(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 EC(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 B1(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(TC)};let i=r[0].id;await EC(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 U1=y(()=>{"use strict";aa()});var j1={};vn(j1,{AgentBrowserProvider:()=>RC});var RC,H1=y(()=>{"use strict";aa();kC();F1();U1();RC=class{name="agent-browser";config;client;sessions=new Map;constructor(t,n){this.config=t,this.client=new hb(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=N1(n.knownElements,t.target);if(r===null){if(t.target.kind==="semantic"){let s=await B1({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 EC(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 xc(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(TC),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 xc(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 Kye,readFileSync as Gye}from"node:fs";import{createRequire as qye}from"node:module";import{dirname as zye,join as Vye}from"node:path";function G1(e){if(typeof e=="string")return e;let t=[],n=e;for(let r=0;r<Jye&&n instanceof Error;r++)t.push(n.message),n=n.cause;return t.length>0?t.join(" | "):String(e)}function mn(e){let t=G1(e);return K1.some(n=>t.includes(n))}function Xye(){try{let t=qye(import.meta.url).resolve("playwright/package.json"),n=JSON.parse(Gye(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=Vye(zye(t),o);return Kye(i)?`node ${/\s/.test(i)?`"${i}"`:i} install chromium`:void 0}catch{return}}function gm(){return W1??=Xye()??Yye,W1}function xC(e){return e.includes("install chromium")}function Kn(e,t){let n=G1(e),r=t?.latched===!0?` ${Qye}`:"";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: ${gm()}.${o}${r}`}return`browser tools require the optional \`playwright\` peer dependency. Install via: pnpm add playwright (then ${gm()}). Or pick a different tool.${r}`}function hm(e,t,n=!1){if(!mn(e))return e;let r=e instanceof Error?e.message:String(e);return new Error(`${r}
|
|
422
422
|
|
|
423
|
-
${Kn(e,{headless:t,latched:n})}`,{cause:e})}var K1,Yye,Jye,W1,Qye,yb=y(()=>{"use strict";K1=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Yye="pnpm exec playwright install chromium",Jye=4;Qye="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 la from"node:fs";import bb from"node:path";import{randomBytes as Zye}from"node:crypto";import{chromium as ebe}from"playwright";function tbe(){try{return"5.167.2"}catch{}try{let e=bb.resolve(import.meta.dirname,"../../../package.json"),t=la.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var nbe,wb,q1=y(()=>{"use strict";yb();H();ue();nbe=tbe(),wb=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=ebe.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=hm(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/${nbe}`}}loadStorageState(t){let n=Ll(t);try{if(!la.existsSync(n))return;let r=JSON.parse(la.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ll(t);if(!la.existsSync(r))return;let o=await n.storageState(),i=bb.join(bb.dirname(r),`.${bb.basename(r)}.${process.pid}.${Zye(4).toString("hex")}.tmp`);la.writeFileSync(i,JSON.stringify(o),{mode:384}),la.chmodSync(i,384),la.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as rbe}from"node:crypto";function obe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function ibe(e,t,n){return`el_${rbe("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 z1(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Y1(e,t){let n=e.role??"",r=e.name??"";V1.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])Y1(i,t)}async function abe(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},J1).catch(()=>[])}async function lbe(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},J1).catch(()=>[])}function cbe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Sb(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=cbe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=abe(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=[],Y1(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await lbe(e)).filter($=>V1.has($.role??"")));let S=new Map;for(let M of p){let $=z1(M.name),F=S.get($);(!F||F.bbox.w===0&&M.bbox.w>0)&&S.set($,M)}let k=b.map(M=>({ax:M,dom:S.get(z1(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,$)=>{let F=M.dom?.bbox.y??0,U=$.dom?.bbox.y??0;if(F!==U)return F-U;let W=M.dom?.bbox.x??0,G=$.dom?.bbox.x??0;return W-G}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,$)=>{let F=M.ax.role??"generic",U=M.ax.name??"",W=ibe(F,U,$),G=M.dom?.bbox??{x:0,y:0,w:0,h:0},j=M.dom?.type??null,K=null;M.ax.value!==void 0&&M.ax.value!==null&&(K=String(M.ax.value)),M.ax.checked!==void 0&&(K=String(M.ax.checked)),O1({role:F,kind:j})&&(K="[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 P;M.dom?.testId?P=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(P=`#${M.dom.id}`);let N={id:W,role:F,label:obe(U),kind:j,value:K,state:Q,bbox:G};return P!==void 0&&(N.selector=P),N}),I="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?I="loading":M==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=sbe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var V1,J1,X1=y(()=>{"use strict";gb();V1=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);J1="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Q1(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 AC(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>Q1(e,i)))).filter(o=>o!==null)}async function ube(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 CC(e,t,n){switch(t.kind){case"element_id":return dbe(e,t,n);case"selector":return pbe(e,t);case"semantic":return mbe(e,t)}}async function dbe(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 AC(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function pbe(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 AC(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function mbe(e,t){return t.role!==void 0?fbe(e,t.text,t.role):gbe(e,t.text,t)}async function fbe(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 AC(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function gbe(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 ube(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 Q1(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 Z1=y(()=>{"use strict"});async function _C(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 eH=y(()=>{"use strict";aa()});var PC={};vn(PC,{PlaywrightProvider:()=>IC});function tH(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 IC,MC=y(()=>{"use strict";q1();X1();Z1();aa();eH();kC();IC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new wb(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 _C(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 Sb(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 Sb(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 CC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${tH(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 _C(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 Sb(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 CC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${tH(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 xc(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 xc(n,o,r);return i}catch{return null}}}});var ua={};vn(ua,{__resetBrowserRegistryForTests:()=>vbe,browserProviderActive:()=>bbe,closeBrowserProvider:()=>DC,getBrowserProvider:()=>ybe,getLastRoutingDecision:()=>Sbe,peekBrowserProvider:()=>wbe});function nH(){Promise.resolve(DC()).then(()=>{process.exit(130)})}function rH(){Promise.resolve(DC()).then(()=>{process.exit(143)})}function oH(){Yr=null}function hbe(){vb||(process.on("SIGINT",nH),process.on("SIGTERM",rH),process.on("exit",oH),vb=!0)}function iH(){vb&&(process.removeListener("SIGINT",nH),process.removeListener("SIGTERM",rH),process.removeListener("exit",oH),vb=!1)}async function ybe(e){return Yr!==null?Yr:(ca!==null||(ca=(async()=>{let t=wC(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??v.AGENT_SURFACE,r=await P1({config:t,surface:n});OC=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(H1(),j1)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(MC(),PC));o=new i(t)}return hbe(),Yr=o,ca=null,o})()),ca)}async function DC(){if(Yr===null)return;let e=Yr;Yr=null,ca=null,iH(),await e.shutdown()}function bbe(){return Yr!==null}function wbe(){return Yr}function Sbe(){return OC}function vbe(){Yr=null,ca=null,OC=null,iH()}var Yr,ca,vb,OC,da=y(()=>{"use strict";aa();M1();L();Yr=null,ca=null,vb=!1,OC=null});async function sH(e,t){try{return await y1(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Abe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(da(),ua)),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(()=>(MC(),PC)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(aa(),_1)),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 aH(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Abe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await fb(n,e,{headers:xbe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Rbe.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(Ebe.test(p)&&!Tbe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await sH(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=mC({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await fm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>fm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await fm(d.finalUrl,o);let p=await sH(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=mC({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 Tbe,Ebe,Rbe,xbe,lH=y(()=>{"use strict";b1();fC();bC();ue();Tbe=/(text\/html|application\/xhtml\+xml)/i,Ebe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Rbe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,xbe={"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 Ibe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Cbe,{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),_be),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(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 cH(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Ibe({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 uH(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
423
|
+
${Kn(e,{headless:t,latched:n})}`,{cause:e})}var K1,Yye,Jye,W1,Qye,yb=y(()=>{"use strict";K1=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"],Yye="pnpm exec playwright install chromium",Jye=4;Qye="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 la from"node:fs";import bb from"node:path";import{randomBytes as Zye}from"node:crypto";import{chromium as ebe}from"playwright";function tbe(){try{return"5.167.4"}catch{}try{let e=bb.resolve(import.meta.dirname,"../../../package.json"),t=la.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var nbe,wb,q1=y(()=>{"use strict";yb();H();ue();nbe=tbe(),wb=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=ebe.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=hm(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/${nbe}`}}loadStorageState(t){let n=Ll(t);try{if(!la.existsSync(n))return;let r=JSON.parse(la.readFileSync(n,"utf8"));return B("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){B("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ll(t);if(!la.existsSync(r))return;let o=await n.storageState(),i=bb.join(bb.dirname(r),`.${bb.basename(r)}.${process.pid}.${Zye(4).toString("hex")}.tmp`);la.writeFileSync(i,JSON.stringify(o),{mode:384}),la.chmodSync(i,384),la.renameSync(i,r),B("[browser/vault] saved session",{profile:t,file:r})}catch(r){B("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as rbe}from"node:crypto";function obe(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function ibe(e,t,n){return`el_${rbe("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 z1(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function Y1(e,t){let n=e.role??"",r=e.name??"";V1.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])Y1(i,t)}async function abe(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},J1).catch(()=>[])}async function lbe(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},J1).catch(()=>[])}function cbe(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Sb(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=cbe(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=abe(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=[],Y1(d,b)):(o.push("observation skipped accessibility tree (returned null)"),w=!0,b=(await lbe(e)).filter($=>V1.has($.role??"")));let S=new Map;for(let M of p){let $=z1(M.name),F=S.get($);(!F||F.bbox.w===0&&M.bbox.w>0)&&S.set($,M)}let k=b.map(M=>({ax:M,dom:S.get(z1(M.name??""))})),E=r?k:k.filter(M=>M.dom?M.dom.bbox.w>0||M.dom.bbox.h>0:!0);E.sort((M,$)=>{let F=M.dom?.bbox.y??0,U=$.dom?.bbox.y??0;if(F!==U)return F-U;let W=M.dom?.bbox.x??0,G=$.dom?.bbox.x??0;return W-G}),E.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=E.slice(0,n).map((M,$)=>{let F=M.ax.role??"generic",U=M.ax.name??"",W=ibe(F,U,$),G=M.dom?.bbox??{x:0,y:0,w:0,h:0},j=M.dom?.type??null,K=null;M.ax.value!==void 0&&M.ax.value!==null&&(K=String(M.ax.value)),M.ax.checked!==void 0&&(K=String(M.ax.checked)),O1({role:F,kind:j})&&(K="[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 P;M.dom?.testId?P=`[data-testid="${M.dom.testId}"]`:M.dom?.id&&(P=`#${M.dom.id}`);let N={id:W,role:F,label:obe(U),kind:j,value:K,state:Q,bbox:G};return P!==void 0&&(N.selector=P),N}),I="idle";try{let M=await e.evaluate(()=>document.readyState);M==="loading"?I="loading":M==="interactive"?I="navigating":I="idle"}catch{I="navigating"}I!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),w&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let C=sbe(f),x=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:x,url:g,title:h,textSummary:C,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:I,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var V1,J1,X1=y(()=>{"use strict";gb();V1=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);J1="a[href], button, input, select, textarea, [role], [tabindex], label"});async function Q1(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 AC(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>Q1(e,i)))).filter(o=>o!==null)}async function ube(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 CC(e,t,n){switch(t.kind){case"element_id":return dbe(e,t,n);case"selector":return pbe(e,t);case"semantic":return mbe(e,t)}}async function dbe(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 AC(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function pbe(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 AC(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function mbe(e,t){return t.role!==void 0?fbe(e,t.text,t.role):gbe(e,t.text,t)}async function fbe(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 AC(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function gbe(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 ube(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 Q1(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 Z1=y(()=>{"use strict"});async function _C(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 eH=y(()=>{"use strict";aa()});var PC={};vn(PC,{PlaywrightProvider:()=>IC});function tH(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 IC,MC=y(()=>{"use strict";q1();X1();Z1();aa();eH();kC();IC=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new wb(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 _C(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 Sb(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 Sb(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 CC(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${tH(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 _C(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 Sb(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 CC(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${tH(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 xc(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 xc(n,o,r);return i}catch{return null}}}});var ua={};vn(ua,{__resetBrowserRegistryForTests:()=>vbe,browserProviderActive:()=>bbe,closeBrowserProvider:()=>DC,getBrowserProvider:()=>ybe,getLastRoutingDecision:()=>Sbe,peekBrowserProvider:()=>wbe});function nH(){Promise.resolve(DC()).then(()=>{process.exit(130)})}function rH(){Promise.resolve(DC()).then(()=>{process.exit(143)})}function oH(){Yr=null}function hbe(){vb||(process.on("SIGINT",nH),process.on("SIGTERM",rH),process.on("exit",oH),vb=!0)}function iH(){vb&&(process.removeListener("SIGINT",nH),process.removeListener("SIGTERM",rH),process.removeListener("exit",oH),vb=!1)}async function ybe(e){return Yr!==null?Yr:(ca!==null||(ca=(async()=>{let t=wC(e),n=e?.surface??(e?.env??{}).AGENT_SURFACE??v.AGENT_SURFACE,r=await P1({config:t,surface:n});OC=r;let o;if(r.backend==="agent-browser"){let{AgentBrowserProvider:i}=await Promise.resolve().then(()=>(H1(),j1)),s=r.availability.connection;o=new i(t,s)}else{let{PlaywrightProvider:i}=await Promise.resolve().then(()=>(MC(),PC));o=new i(t)}return hbe(),Yr=o,ca=null,o})()),ca)}async function DC(){if(Yr===null)return;let e=Yr;Yr=null,ca=null,iH(),await e.shutdown()}function bbe(){return Yr!==null}function wbe(){return Yr}function Sbe(){return OC}function vbe(){Yr=null,ca=null,OC=null,iH()}var Yr,ca,vb,OC,da=y(()=>{"use strict";aa();M1();L();Yr=null,ca=null,vb=!1,OC=null});async function sH(e,t){try{return await y1(e,t)}catch(n){return B("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function Abe(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(da(),ua)),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(()=>(MC(),PC)),{loadBrowserConfig:s}=await Promise.resolve().then(()=>(aa(),_1)),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 aH(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??Abe,o=t.lookupFn!==void 0?{lookupFn:t.lookupFn}:{},i=null,s="",a=e,l=null,c=null;try{let d=await fb(n,e,{headers:xbe,signal:t.signal},o);l=d.status,a=d.url||e;let p=d.headers.get("content-type")??"";if(d.ok){if(Rbe.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(Ebe.test(p)&&!Tbe.test(p))return{title:"",markdown:f.trim(),finalUrl:a,usedRender:!1};if(s=f,i=await sH(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=mC({html:s,extractedTextLength:i.textLength});return{title:i.title,markdown:i.markdown,finalUrl:a,usedRender:!1,...d!==void 0?{advisory:d}:{}}}try{await fm(e,o);let d=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal,requestGuard:f=>fm(f,o)});d.finalUrl!==e&&/^https?:\/\//i.test(d.finalUrl)&&await fm(d.finalUrl,o);let p=await sH(d.html,d.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");if(i===null||p.textLength>=i.textLength){let f=mC({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 Tbe,Ebe,Rbe,xbe,lH=y(()=>{"use strict";b1();fC();bC();ue();Tbe=/(text\/html|application\/xhtml\+xml)/i,Ebe=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,Rbe=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,xbe={"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 Ibe(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(Cbe,{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),_be),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let u=await i.text(),d=se(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 cH(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?Ibe({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 uH(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
424
424
|
|
|
425
425
|
(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(`
|
|
426
426
|
`).trimEnd()}var Cbe,_be,dH=y(()=>{"use strict";ze();Cbe="https://api.exa.ai/search",_be=10});function kb(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 pa=y(()=>{"use strict";yb()});function Lbe(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=Pbe;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,Mbe)}let a=Obe;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,Dbe)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function $C(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Ys(e,t),truncated:!0}}function Fbe(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=Lbe(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 yC(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 fb(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=$C(f,s.maxBytes);return{content:g.content,...g.truncated?{truncated:!0}:{}}}if(s.mode==="markdown")try{let p=await aH(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=$C(w1(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)&&!xC(f)?` (the render fallback needs the optional Playwright browser \u2014 run \`${gm()}\`)`:"";return{content:`web_scrape markdown error: ${f}${g}`,isError:!0}}let d=cH({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:$be,timeoutMs:s.timeoutMs,signal:a.signal}),f=$C(uH(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 Pbe,Mbe,Obe,Dbe,$be,pH,mH=y(()=>{"use strict";lH();dH();bC();gi();fC();pa();Pbe=3e4,Mbe=12e4,Obe=1e5,Dbe=1e6,$be=10;pH=Fbe()});import{existsSync as gH,mkdirSync as Nbe,readFileSync as Bbe,renameSync as Ube,unlinkSync as jbe,writeFileSync as Hbe}from"node:fs";import{dirname as fH,join as Wbe}from"node:path";import{randomBytes as Kbe}from"node:crypto";function Rn(e){let t=e??wh();if(!gH(t))return[];try{let n=Bbe(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 ki(e,t){let n=t??wh();Nbe(fH(n),{recursive:!0});let r=Wbe(fH(n),`.schedules.json.${process.pid}.${Kbe(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{Hbe(r,o,"utf-8"),Ube(r,n)}catch(i){try{gH(r)&&jbe(r)}catch{}throw i}}function Tb(e,t){let n=Rn(t),r=n.map(l=>l.id),o=Gbe(e.name),i=qbe(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),ki(n,t),a}function Eb(e,t){let n=Rn(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(ki(o,t),!0)}function ym(e,t){return Rn(t).find(n=>n.id===e)}function Gbe(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function qbe(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function Rb(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 xb=y(()=>{"use strict";H()});import{existsSync as zbe,readFileSync as Vbe}from"node:fs";import{join as Ybe}from"node:path";async function Gn(e,t,n){let r,o;try{let i=Ybe(cp("default"),"port");if(!zbe(i))return{synced:!1,detail:"daemon-not-detected (no port file)"};let s=Vbe(i,"utf-8").trim(),a=Jbe(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 Jbe(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 Ti,LC=y(()=>{"use strict";H();Ti="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 Xbe}from"node:fs";import{readFile as Qbe}from"node:fs/promises";var hH,yH,bH,wH,SH=y(()=>{"use strict";xb();H();LC();hH=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=Tb({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 Gn("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 Gn("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:Ti}})}},yH=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})))}},bH=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(!Xbe(i))return{content:JSON.stringify([])};let s;try{let c=await Qbe(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1143,7 +1143,7 @@ On your first turn, decide whether to call memory_search based on the request:
|
|
|
1143
1143
|
- If hot memory (shown in <cross-session-memory> tags above) already covers the relevant context, skip the search.
|
|
1144
1144
|
- Search at most once per session for general context. Search again only if new information surfaces a specific topic worth querying.
|
|
1145
1145
|
|
|
1146
|
-
Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`});function Mm(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 I_=y(()=>{"use strict"});function kw(){try{let e=ba();return Promise.resolve(e.map(t=>{let n={name:t.name,description:t.description};return t.argumentHint&&(n.argumentHint=t.argumentHint),t.source&&(n.source=t.source),n}))}catch{return Promise.resolve([])}}var P_=y(()=>{"use strict";yr()});function Zr(e){return e!=null&&Bve.includes(e)}function Uve(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 Tw(e,t,n={}){let r=`\u26A0 This turn was cut off at the output-token limit (${Uve(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 Bve,Om=y(()=>{"use strict";Bve=["max_tokens","length","max_output_tokens"]});var Uc,M_=y(()=>{"use strict";pe();Uc=class{constructor(t,n,r){this.signal=t;this.traceWriter=n;this.provider=r;re(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"&&re(this.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-this.interruptedAt,metadata:{provider:this.provider}}),re(this.traceWriter,{phase:"loop_end",durationMs:t})}}});import{readFileSync as jve}from"node:fs";import{homedir as Hve}from"node:os";import{join as MK}from"node:path";function Wve(e){try{return jve(e,"utf-8")}catch{return null}}function eo(e,t={},n=!1){let r=t.readEnv??(u=>process.env[u]),o=(t.homedir??Hve)(),i=t.readFile??Wve;if(n){let u=MK(o,".codex","auth.json"),d=i(u);if(d!==null){let p=OK(d);if(p.kind==="chatgpt"&&p.accessToken){let f={apiKey:p.accessToken,source:"chatgpt-oauth",last4:jc(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:jc(e)};let s=r("OPENAI_API_KEY");if(s&&s.length>0)return{apiKey:s,source:"env",last4:jc(s),envVar:"OPENAI_API_KEY"};let a=r("CODEX_API_KEY");if(a&&a.length>0)return{apiKey:a,source:"env",last4:jc(a),envVar:"CODEX_API_KEY"};let l=MK(o,".codex","auth.json"),c=i(l);if(c!==null){let u=OK(c);if(u.kind==="apikey")return{apiKey:u.apiKey,source:"codex-cli",last4:jc(u.apiKey)};if(u.kind==="chatgpt"){if(Kve(r)&&u.accessToken){let d={apiKey:u.accessToken,source:"chatgpt-oauth",last4:jc(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 OK(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=Gve(i);l!==void 0&&(a.accountId=l);let c=qve(i);c!==void 0&&(a.expiresAt=c)}return a}return{kind:"no-key"}}function jc(e){return e.length<=4?e:e.slice(-4)}function Kve(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 DK(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 Gve(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=DK(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 qve(e){let t=e.access_token;if(typeof t!="string")return;let n=DK(t)?.exp;return typeof n=="number"?n:void 0}function zve(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 Dm(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=zve(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 Hc=y(()=>{"use strict"});function Ew(e,t,n){let r=e.lastIndexOf($K);if(r===-1)return e;let o=e.indexOf(`
|
|
1146
|
+
Use FTS5 syntax: "exact phrase", term1 AND term2, prefix*.`});function Mm(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 I_=y(()=>{"use strict"});function kw(){try{let e=ba();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 P_=y(()=>{"use strict";yr()});function Zr(e){return e!=null&&Bve.includes(e)}function Uve(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 Tw(e,t,n={}){let r=`\u26A0 This turn was cut off at the output-token limit (${Uve(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 Bve,Om=y(()=>{"use strict";Bve=["max_tokens","length","max_output_tokens"]});var Uc,M_=y(()=>{"use strict";pe();Uc=class{constructor(t,n,r){this.signal=t;this.traceWriter=n;this.provider=r;re(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"&&re(this.traceWriter,{phase:"interrupt_halt",durationMs:Date.now()-this.interruptedAt,metadata:{provider:this.provider}}),re(this.traceWriter,{phase:"loop_end",durationMs:t})}}});import{readFileSync as jve}from"node:fs";import{homedir as Hve}from"node:os";import{join as MK}from"node:path";function Wve(e){try{return jve(e,"utf-8")}catch{return null}}function eo(e,t={},n=!1){let r=t.readEnv??(u=>process.env[u]),o=(t.homedir??Hve)(),i=t.readFile??Wve;if(n){let u=MK(o,".codex","auth.json"),d=i(u);if(d!==null){let p=OK(d);if(p.kind==="chatgpt"&&p.accessToken){let f={apiKey:p.accessToken,source:"chatgpt-oauth",last4:jc(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:jc(e)};let s=r("OPENAI_API_KEY");if(s&&s.length>0)return{apiKey:s,source:"env",last4:jc(s),envVar:"OPENAI_API_KEY"};let a=r("CODEX_API_KEY");if(a&&a.length>0)return{apiKey:a,source:"env",last4:jc(a),envVar:"CODEX_API_KEY"};let l=MK(o,".codex","auth.json"),c=i(l);if(c!==null){let u=OK(c);if(u.kind==="apikey")return{apiKey:u.apiKey,source:"codex-cli",last4:jc(u.apiKey)};if(u.kind==="chatgpt"){if(Kve(r)&&u.accessToken){let d={apiKey:u.accessToken,source:"chatgpt-oauth",last4:jc(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 OK(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=Gve(i);l!==void 0&&(a.accountId=l);let c=qve(i);c!==void 0&&(a.expiresAt=c)}return a}return{kind:"no-key"}}function jc(e){return e.length<=4?e:e.slice(-4)}function Kve(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 DK(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 Gve(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=DK(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 qve(e){let t=e.access_token;if(typeof t!="string")return;let n=DK(t)?.exp;return typeof n=="number"?n:void 0}function zve(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 Dm(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=zve(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 Hc=y(()=>{"use strict"});function Ew(e,t,n){let r=e.lastIndexOf($K);if(r===-1)return e;let o=e.indexOf(`
|
|
1147
1147
|
`,r+$K.length);if(o===-1)return e;let i=o+1;if(!e.startsWith(O_,i))return e;let s=e.indexOf(`
|
|
1148
1148
|
`,i),a=s===-1?e.length:s,l=e.slice(i+O_.length,a),c=Ay(t??new Date,n);return l===c?e:e.slice(0,i+O_.length)+c+e.slice(a)}var $K,O_,D_=y(()=>{"use strict";Gt();$K=`# Environment
|
|
1149
1149
|
- Working directory: `,O_="- Date: "});function Vve(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 Yve(e){let t=e.source;return t.type==="base64"?`data:${t.media_type};base64,${t.data}`:t.type==="url"?t.url:null}function LK(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}]
|
|
@@ -1679,7 +1679,7 @@ ${n}
|
|
|
1679
1679
|
Status written to: ${Nl()}
|
|
1680
1680
|
`)}_readSlot(){let t=this.backend.read();if(!t)return{};try{return JSON.parse(t).mcpOAuth?.[this.serverName]??{}}catch{return{}}}_updateSlot(t){let n=this.backend.read(),r={};if(n)try{r=JSON.parse(n)}catch{}let o=r.mcpOAuth??{},i=o[this.serverName]??{};o[this.serverName]=t(i),r.mcpOAuth=o,this.backend.write(JSON.stringify(r))}}});import*as f5 from"node:path";function Ek(e=process.env){return e.AFK_DEMO_CLEAN==="1"||typeof e.SCRIPT=="string"&&e.SCRIPT.length>0||e.ASCIINEMA_REC==="1"}function NMe(e=process.env){return e.AFK_BELL==="1"}function Rk(e=process.env){return e.AFK_REDUCED_MOTION==="1"}function g5(e=process.env){return e.AFK_CARET_BLINK!=="0"}function xk(e=process.env){return e.AFK_GOBLIN_SPINNER!=="0"}function h5(e=process.env){let t=e.AFK_GOBLIN_MASCOT;return t==="1"||t==="true"}function Vu(e,t=process.env){NMe(t)&&e.isTTY&&e.write("\x07")}function BMe(e=process.env){return e.AFK_TERM_TITLE!=="0"}function UMe(e=process.env){return e.AFK_NOTIFY==="1"}function qf(e,t){let n=f5.basename(e)||e;return t?`afk \u2014 ${n} \xB7 running`:`afk \u2014 ${n}`}function y5(e){return e.replace(/[\x00-\x1F\x7F-\x9F]/g,"")}function Yu(e,t,n=process.env){BMe(n)&&e.isTTY&&e.write(`\x1B]2;${y5(t)}\x07`)}function b5(e,t,n=process.env){UMe(n)&&e.isTTY&&e.write(`\x1B]9;${y5(t)}\x07`)}var ns=y(()=>{"use strict"});function zf(e){return jMe.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}function rs(e,t){let n=["afk","interactive"];return typeof t=="string"&&t.length>0&&n.push("--model",zf(t)),n.push("--resume",zf(e)),n.join(" ")}var jMe,Ju=y(()=>{"use strict";jMe=/^[A-Za-z0-9_@%+=:,./-]+$/});function zMe(){return i0}function me(e){if(hn.has(e.name))throw new Error(`Slash command already registered: ${e.name}`);hn.set(e.name,e);for(let t of e.aliases??[]){if(os.has(t)||hn.has(t))throw new Error(`Slash alias collides: ${t}`);os.set(t,e.name)}i0++}function is(e){if(hn.has(e.name)){for(let[t,n]of os.entries())n===e.name&&os.delete(t);hn.delete(e.name)}me(e)}function w5(e){hn.has(e.name)||me(e)}function VMe(e){return hn.has(e)||os.has(e)}function Xu(){return{has:e=>VMe(`/${e}`),version:zMe}}function S5(){hn.clear(),os.clear(),i0++}function Rr(){return[...hn.values()].sort((e,t)=>e.name.localeCompare(t.name))}function Qu(){let e=[];for(let[t,n]of os.entries()){let r=hn.get(n);r&&e.push({alias:t,canonical:n,summary:r.summary})}return e.sort((t,n)=>t.alias.localeCompare(n.alias))}function _k(e){if(hn.has(e))return hn.get(e);let t=os.get(e);return t?hn.get(t):void 0}function YMe(e,t){let n=Array.from({length:e.length+1},()=>new Array(t.length+1).fill(0));for(let r=0;r<=e.length;r++)n[r][0]=r;for(let r=0;r<=t.length;r++)n[0][r]=r;for(let r=1;r<=e.length;r++)for(let o=1;o<=t.length;o++){let i=e[r-1]===t[o-1]?0:1;n[r][o]=Math.min(n[r-1][o]+1,n[r][o-1]+1,n[r-1][o-1]+i)}return n[e.length][t.length]}function JMe(e,t=3){let n;for(let r of hn.keys()){let o=YMe(e,r);o<=t&&(n===void 0||o<n.dist)&&(n={name:r,dist:o})}return n?.name}function s0(e){let t=e.trim();if(!t.startsWith("/"))return null;let n=t.indexOf(" ");return n===-1?{name:t,args:""}:{name:t.slice(0,n),args:t.slice(n+1).trim()}}async function v5(e,t,n){let r=s0(e);if(r===null)return{handled:!1};let o=_k(r.name);if(!o){let a=JMe(r.name);return a?t.out.warn(`Unknown command: ${r.name} (did you mean ${a}?)`):t.out.warn(`Unknown command: ${r.name} (type /help for commands)`),{handled:!0,result:"continue"}}let i=n??[];i.length>0&&o.acceptsAttachments!==!0&&t.out.warn(`\u26A0 Image attachments are ignored by ${r.name} (images only reach the model on skill commands like /forge, /mint).`);let s=await o.handler(t,r.args,o.acceptsAttachments===!0?i:void 0);return s==="forward"?{handled:!1}:{handled:!0,result:s}}var hn,os,i0,Ut=y(()=>{"use strict";hn=new Map,os=new Map,i0=0});function k5(e){Pn=e}function _t(e){return e.includes(":")?e.split(":").pop():e}var Pn,Zu=y(()=>{"use strict";Pn={discovered:[],collisions:[],shadowedBareNames:new Set}});import{readdirSync as XMe,readFileSync as QMe,statSync as T5}from"fs";import{join as ZMe,basename as e0e,dirname as t0e}from"path";function a0(e){return Yf(e).flags}function Yf(e){let t=e??Ir(),n=new Map,r=new Map;try{T5(t)}catch{return{flags:n,categories:r}}let o=(i,s)=>{if(s>8)return;let a;try{a=XMe(i)}catch{return}for(let l of a){let c=ZMe(i,l),u;try{u=T5(c)}catch{continue}if(u.isDirectory()){o(c,s+1);continue}if(l!=="SKILL.md"||!u.isFile())continue;let d;try{d=QMe(c,"utf-8")}catch{continue}let p=e0e(t0e(c));if(!p)continue;let f=lf(d),g=f.frontmatterFlags&&f.frontmatterFlags.length>0?f.frontmatterFlags:yP(`${f.frontmatter?.["argument-hint"]??""}
|
|
1681
1681
|
${f.body}`);if(g.length>0){let b=n.get(p)??[],w=new Set([...b,...g]);n.set(p,Array.from(w).sort())}let h=f.frontmatter?.category;h&&h.length>0&&r.set(p,h)}};return o(t,0),{flags:n,categories:r}}function E5(){let e=a0();for(let[t,n]of a0(Is())){let r=e.get(t)??[];e.set(t,Array.from(new Set([...r,...n])).sort())}return e}function ss(e){if(!e)return;let t=e.split(/(?<=[.!?])\s+/);for(let n of t){let r=/^(Use(?:d)? when\b.*|When\s+(?:the\s+user\s+|to\s+)?\b.*)$/i.exec(n.trim());if(r&&r[1]){let o=r[1].trim();if(o.length>=12)return o}}}var Jf=y(()=>{"use strict";H();bP()});function Pk(e){return e==="user"?"user":e==="project"?"project":e?.startsWith("imported:")?"imported":"builtin"}function Ik(e){switch(e){case"builtin":return"built-in";case"user":return"user";case"project":return"project";case"plugin":return"plugin";case"imported":return"imported";case"command":return"command"}}function l0(e,t){try{let n=Ve(e);return Jn(n,t)?n:void 0}catch{return}}function n0e(e,t){let n=[];for(let r of Fc(t))r.includes(":")&&_t(r)===e&&n.push({slash:`/${r}`,source:Pk(Ve(r).origin)});for(let r of Pn.collisions)r.bare===e&&n.push({slash:r.altSlash,source:r.source??"plugin"});return n}function c0(e,t,n,r){let o=t.replace(/^\//,"").trim(),i=l0(o,r),s=n.find(w=>_t(w.name)===o||w.name===o);if(!i&&!s){e.out.line(),e.out.line(m.dim(` No skill found matching "${se(o)}".`)),e.out.line(m.dim(" Run /skills to see everything available.")),e.out.line();return}let a=i?.name??_t(s.name),l=i?.description??s.description,c=i?.argumentHint??s?.argumentHint,u=c?`/${a} ${c}`:`/${a}`,d=i?Pk(i.origin):s?.source??"plugin",p=Math.max(20,ee()),f=Math.max(20,Math.min(p-2,100));e.out.line(),e.out.line(` ${m.warning(u)}`),e.out.line();for(let w of ce(l,f).split(`
|
|
1682
|
-
`))e.out.line(` ${w}`);let g=i?.whenToUse??ss(l);if(g&&g!==l.trim()){e.out.line(),e.out.line(` ${m.bold("When to use")}`);for(let w of ce(g,f).split(`
|
|
1682
|
+
`))e.out.line(` ${w}`);let g=i?.whenToUse??s?.whenToUse??ss(l);if(g&&g!==l.trim()){e.out.line(),e.out.line(` ${m.bold("When to use")}`);for(let w of ce(g,f).split(`
|
|
1683
1683
|
`))e.out.line(` ${m.dim(w)}`)}let h=i?.flags??E5().get(o);h&&h.length>0&&(e.out.line(),e.out.line(` ${m.bold("Flags")} ${m.dim(h.join(", "))}`)),e.out.line(),e.out.line(` ${m.bold("Source")} ${m.dim(Ik(d))}`);let b=n0e(a,r);if(b.length>0){e.out.line(),e.out.line(` ${m.bold("Alternatives")}`);for(let w of b)e.out.line(` ${m.dim("\u21B3")} ${m.warning(w.slash)} ${m.dim(`(${Ik(w.source)} \u2014 shadowed by /${a})`)}`)}e.out.line()}var R5=y(()=>{"use strict";Vt();D();Qe();he();Jf();Zu();ze()});function u0(e,t){if(e.length===0)return!0;let n=0;for(let r=0;r<t.length&&n<e.length;r++)t[r]===e[n]&&(n+=1);return n===e.length}function x5(e,t){let n=e.name.toLowerCase(),r=n.includes(":")?n.split(":").pop():n;if(r.startsWith(t)||n.startsWith(t))return 0;if(u0(t,r)||u0(t,n))return 1;let o=e.description.toLowerCase(),i=(e.hint??"").toLowerCase(),s=`${o} ${i}`;return s.includes(t)?2:u0(t,s)?3:null}function A5(e,t){let n=t.trim().toLowerCase();if(n.length===0)return[];let r=n.split(/\s+/).filter(s=>s.length>0),o=[[],[],[],[]];for(let s of e){let a;if(r.length===1)a=x5(s,r[0]);else{let l=0,c=!0;for(let u of r){let d=x5(s,u);if(d===null){c=!1;break}d>l&&(l=d)}a=c?l:null}a!==null&&o[a].push({skill:s,tier:a})}let i=(s,a)=>s.skill.name.localeCompare(a.skill.name);for(let s of o)s.sort(i);return[].concat(...o)}var C5=y(()=>{"use strict"});function d0(e,t){let n=[],r=new Set;for(let o of Fc(t)){let i=Ve(o),s=i.argumentHint??ss(i.description);n.push({name:o,description:i.description,...s!==void 0?{hint:s}:{}}),r.add(o),r.add(_t(o))}for(let o of e){let i=_t(o.name);if(r.has(o.name)||r.has(i))continue;let s=Pn.collisions.find(c=>c.bare===i),a=s?s.altSlash.replace(/^\//,""):o.name,l=o.argumentHint??ss(o.description);n.push({name:a,description:o.description,...l!==void 0?{hint:l}:{}})}return n}function r0e(e,t,n,r){let{skill:o}=t,i=`/${o.name}`,s=o.hint?`${i} ${o.hint}`:i,a=ce(o.description,r).split(`
|
|
1684
1684
|
`);if(V(s)>n-1){e.out.line(" "+m.warning(s));for(let l of a)e.out.line(" "+" ".repeat(n)+m.dim(l))}else{let l=rt(m.warning(s),n);e.out.line(" "+l+m.dim(a[0]??""));for(let c of a.slice(1))e.out.line(" "+" ".repeat(n)+m.dim(c))}}function p0(e,t,n){let r=A5(t,n);if(e.out.line(),r.length===0){e.out.line(m.dim(` No skills matched "${se(n)}".`)),e.out.line(m.dim(" Try a shorter term, or run /skills to browse everything.")),e.out.line();return}let o=Math.max(20,ee()),i=r.reduce((l,c)=>Math.max(l,V(c.skill.hint?`/${c.skill.name} ${c.skill.hint}`:`/${c.skill.name}`)),0),s=Math.min(i+2,Math.max(10,Math.floor((o-2)*.45))),a=Math.max(12,o-2-s);e.out.line(m.bold("Skills matching")+m.dim(` "${se(n)}"`)+m.dim(` (${r.length} result${r.length===1?"":"s"})`)),e.out.line();for(let l of r)r0e(e,l,s,a);e.out.line(),e.out.line(m.dim(" Tip: /skills <name> for full details \xB7 /skills to browse everything")),e.out.line()}var _5=y(()=>{"use strict";Vt();D();Qe();he();le();C5();Jf();Zu();ze()});function i0e(e,t){let n=new Map,r=(i,s)=>{let a=_t(i.slashName.replace(/^\//,"")),l=n.get(a);l?(l.alts.push(i),!l.category&&s&&l.main.source!=="builtin"&&(l.category=s)):n.set(a,{main:i,alts:[],...s?{category:s}:{}})};for(let i of Fc(t)){let s=Ve(i),a=`/${i}`,l=s.argumentHint?`${a} ${s.argumentHint}`:a;r({slashName:a,display:l,description:s.description,source:Pk(s.origin)},s.category)}let o=new Map(Pn.collisions.map(i=>[i.bare,i.altSlash]));for(let i of e){let s=_t(i.name),l=o.get(s)??`/${i.name}`,c=i.argumentHint?`${l} ${i.argumentHint}`:l;r({slashName:l,display:c,description:i.description,source:i.source??"plugin"},i.category)}return n}function f0(e,t){let n=_t(e.main.slashName.replace(/^\//,"")),r=_t(t.main.slashName.replace(/^\//,""));return n.localeCompare(r)}function g0(e,t,n,r){let{main:o,alts:i}=t,s=ce(o.description,r).split(`
|
|
1685
1685
|
`);if(V(o.display)>n-1){e.out.line(" "+m.warning(o.display));for(let a of s)e.out.line(" "+" ".repeat(n)+m.dim(a))}else{let a=rt(m.warning(o.display),n);e.out.line(" "+a+m.dim(s[0]??""));for(let l of s.slice(1))e.out.line(" "+" ".repeat(n)+m.dim(l))}if(i.length>0){let a=i.map(l=>l.slashName).join(", ");for(let l of ce(`\u21B3 also: ${a}`,r).split(`
|
|
@@ -1799,7 +1799,7 @@ ${f.body}`);if(g.length>0){let b=n.get(p)??[],w=new Set([...b,...g]);n.set(p,Arr
|
|
|
1799
1799
|
${e.replace(/<\/system-reminder>/gi,"")}
|
|
1800
1800
|
</system-reminder>
|
|
1801
1801
|
|
|
1802
|
-
${t}`}var mQ=y(()=>{"use strict"});function gQ(){fQ||(fQ=!0,_O("review",sQ),lQ())}var fQ,MT=y(()=>{"use strict";PO();CO();PO();pQ();mQ();fQ=!1});function DO(e,t){let n=`/${e.name}`,r=e.argumentHint?`${n} ${e.argumentHint}`:void 0,o=ss(e.description);return{name:n,summary:e.description,acceptsAttachments:!0,...r!==void 0?{usage:r}:{},...o?{hint:o}:{},...t&&t.length>0?{flags:t}:{},async handler(i,s,a){let l=_t(e.name)==="review",c=s,u=[],d=null;if(l){let f=B6(s);u=f.targets,c=f.cleanedArgs;for(let g of f.unknown)i.out.warn(`/review: unknown --post target "${g}" \u2014 expected "github" or "telegram".`);u.length===0&&f.unknown.length===0&&/--post\b/.test(s)&&i.out.warn('/review: --post needs a target \u2014 try "--post github" or "--post telegram".');try{d=AO(c)}catch{d=null}}let p={name:e.name,description:e.description,handler:async()=>{},context:"inline"};try{let f=await _T(i,{skillName:e.name,skillMeta:p,args:c,attachments:a,preflight:async()=>{let g=e.name.includes(":")?e.name.split(":").pop()??e.name:e.name,h={skillName:g,rawArgs:c,source:e.source??"plugin",capabilities:{compose:!0,subagents:!0}},b=i.session.current.sessionId,w=al(b);return(await sl(h,{cwd:i.stats.cwd??process.cwd(),artifactDir:w},k=>{v.AFK_SKILL_STREAM_VERBOSE==="1"&&i.out.warn(`preflight(${g}) failed: ${k instanceof Error?k.message:String(k)}`)}))?.manifestBlock}});l&&u.length>0&&await pk(i.out,{targets:u,reviewText:f,prRefFromArgs:d})}catch(f){i.out.line(),i.out.error(`${e.name} failed: ${f instanceof Error?f.message:String(f)}`)}return"continue"}}}async function OT(e){let t;try{t=await e.supportedCommands()}catch(u){return console.error(m.dim(" \u26A0 Plugin-skill discovery failed: ")+(u instanceof Error?u.message:String(u))),null}let{flags:n,categories:r}=Yf(),o=Yf(await Promise.resolve().then(()=>(H(),zL)).then(u=>u.getBundledPluginsDir()));for(let[u,d]of o.flags){let p=n.get(u)??[];n.set(u,Array.from(new Set([...p,...d])).sort())}for(let[u,d]of o.categories)r.has(u)||r.set(u,d);let i=t.map(u=>{let d=_t(u.name),p=r.get(d);return{name:u.name,description:u.description,...u.argumentHint?{argumentHint:u.argumentHint}:{},...u.source?{source:u.source}:{},...p?{category:p}:{}}}),s=v.AFK_INTERNAL==="1",a=new Set(Qr().filter(u=>Jn(Ve(u),s)).map(_t)),l=[],c=new Set;for(let u of i){let d=`/${u.name}`;if(GDe.has(d))continue;let p=_t(u.name),f=n.get(p);if(a.has(p)){let g=u.name.includes(":")?u.name:`plugin:${u.name}`,h={...u,name:g};is(DO(h,f)),l.push({bare:p,altSlash:`/${g}`,...u.source?{source:u.source}:{}}),c.add(p);continue}is(DO(u,f))}return k5({discovered:i,collisions:l,shadowedBareNames:c}),is(M5(i)),i.length}function $O(){return Pn.collisions.length===0?[]:Pn.collisions.map(e=>m.dim(` /${e.bare}: vendored or user skill wins; plugin form ${e.altSlash} stays reachable.`))}async function kg(e){let[t,n]=await Promise.all([OT(e),Ok(e)]);return{skillCount:t,agentCount:n}}var GDe,LO=y(()=>{"use strict";Vt();D();Dk();Ut();RO();XM();CO();MT();L();Jf();Mk();Zu();GDe=new Set(["/exit","/quit","/clear","/compact","/help"])});function hQ(e){let t={builtin:0,plugin:0,user:0,project:0,imported:0,command:0};for(let r of e)t[r.source]++;return[["builtin","built-in"],["plugin","plugin"],["user","user"],["project","project"],["imported","imported"],["command","command"]].filter(([r])=>t[r]>0).map(([r,o])=>`${t[r]} ${o}`).join(" \xB7 ")}function yQ(e,t){return e.size===0?null:{added:[...t].filter(n=>!e.has(n)).sort(),removed:[...e].filter(n=>!t.has(n)).sort()}}function bQ(e){let{added:t,removed:n}=e;if(t.length===0&&n.length===0)return"";let r=[];t.length&&r.push(`+${t.length}`),n.length&&r.push(`\u2212${n.length}`);let o=`${r.join(" ")} since last reload`,i=[];return t.length>0&&t.length<=3&&i.push(`new: ${t.map(s=>`/${s}`).join(", ")}`),n.length>0&&n.length<=3&&i.push(`gone: ${n.map(s=>`/${s}`).join(", ")}`),i.length>0&&(o+=` (${i.join("; ")})`),o}function wQ(e){if(e.length===0)return[];let t=8,n=e.slice(0,t),r=Math.min(24,n.reduce((i,s)=>Math.max(i,s.name.length),0)),o=n.map(i=>m.dim(` ${i.name.padEnd(r)} ${D5(i)}`));return e.length>t&&o.push(m.dim(` \u2026and ${e.length-t} more`)),o}var FO,NO=y(()=>{"use strict";Tr();yr();$5();D();Dk();LO();Zu();FO={name:"/reload-plugins",summary:"Reload plugin skills from disk and refresh the slash registry",async handler(e){e.out.line(),e.out.info("Reloading plugins\u2026");let t=new Set(Pn.discovered.map(a=>a.name));vr();try{let a=e.session.current.getQuery();typeof a.reloadPlugins=="function"&&await a.reloadPlugins()}catch(a){e.out.warn(`Plugin reload failed: ${a instanceof Error?a.message:String(a)}`)}let[n,r]=await Promise.all([OT(e.session.current),Ok(e.session.current)]);if(n===null&&r===null)return e.out.error("Could not refresh plugin skills or agents."),e.out.line(),"continue";let o=O5(),i=[];n!==null&&i.push(`${n} skill${n===1?"":"s"}`),r!==null&&i.push(`${r} agent${r===1?"":"s"}`);let s=o.length>0?` from ${o.length} plugin${o.length===1?"":"s"}`:"";if(e.out.success(`Reloaded ${i.join(" + ")}${s}.`),n!==null){let a=hQ(ba()),l=yQ(t,new Set(Pn.discovered.map(d=>d.name))),c=l?bQ(l):"",u=[a,c].filter(d=>d.length>0);u.length>0&&e.out.line(m.dim(` ${u.join(" \xB7 ")}`))}for(let a of wQ(o))e.out.line(a);return e.out.line(),"continue"}}});function SQ(){me(h0),me(FO)}var DT=y(()=>{"use strict";Ut();Mk();NO();Jf();Mk();LO();NO()});var Tg=y(()=>{"use strict";lr()});function vQ(e,t=5){if(e.length===0)return"";let n=e.slice(-t),r=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];return n.map(o=>{let i=Math.max(0,Math.min(1,o)),s=Math.min(7,Math.floor(i*8));return r[s]}).join("")}var kQ=y(()=>{"use strict"});function $T(e){if(e!==void 0&&!(e.fiveHourUtilization===void 0&&e.sevenDayUtilization===void 0))return{...e.fiveHourUtilization!==void 0?{fiveHour:{utilization:e.fiveHourUtilization,...e.fiveHourResetsAt!==void 0?{resetsAt:e.fiveHourResetsAt}:{}}}:{},...e.sevenDayUtilization!==void 0?{sevenDay:{utilization:e.sevenDayUtilization,...e.sevenDayResetsAt!==void 0?{resetsAt:e.sevenDayResetsAt}:{}}}:{},observedAt:e.observedAt}}function TQ(e){return e>zDe?"critical":e>qDe?"caution":"calm"}function JDe(e){return e==="critical"?m.error:e==="caution"?m.warning:m.chrome}function BO(e){let t=Math.floor(e/6e4);if(t<1)return"<1m";let n=Math.floor(t/1440),r=Math.floor(t%1440/60),o=t%60;return n>0?`${n}d${r}h`:r>0?`${r}h${o}m`:`${o}m`}function XDe(e){let t=[];return e.fiveHour!==void 0&&t.push({label:"5h",state:e.fiveHour,severity:TQ(e.fiveHour.utilization)}),e.sevenDay!==void 0&&t.push({label:"7d",state:e.sevenDay,severity:TQ(e.sevenDay.utilization)}),t}function QDe(e){return e.reduce((t,n)=>t===void 0||n.state.utilization>t.state.utilization?n:t,void 0)}function ZDe(e){return e.some(t=>t.severity==="critical")?"critical":e.some(t=>t.severity==="caution")?"caution":"calm"}function EQ(e,t=new Date){let n=XDe(e);if(n.length===0)return;let r=ZDe(n),o=e.observedAt!==void 0&&t.getTime()-e.observedAt.getTime()>VDe,i=r==="calm"?void 0:QDe(n),s=n.map(l=>{let c=JDe(l.severity),u=`${Math.round(l.state.utilization*100)}%`,d=`${m.meta(l.label)} ${c(u)}`;if(l===i&&l.state.resetsAt!==void 0){let p=l.state.resetsAt.getTime()-t.getTime();p>0&&(d+=` ${m.meta(`${YDe}${BO(p)}`)}`)}return d});return{text:(o?m.meta("~"):"")+s.join(m.dim(" \xB7 ")),severity:r,stale:o}}var qDe,zDe,VDe,YDe,Eg=y(()=>{"use strict";D();qDe=.5,zDe=.8,VDe=600*1e3,YDe="\u27F3"});import{statSync as e$e}from"node:fs";function LT(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.unpricedTurns=t.unpricedTurns??0,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.name=t.name,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}function t$e(e){try{return e$e(e).isDirectory()}catch{return!1}}function AQ(e,t){if(e!==void 0)return e;if(t!==void 0&&t$e(t))return t}function FT(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=xQ(RQ(r.user),80),i=xQ(n$e(RQ(r.assistant)),120);o.length>0&&t.fn(m.dim(` Last: ${o}`)),i.length>0&&t.fn(m.dim(` \u21B3 ${i}`)),t.fn(m.dim(" \u21AA /history for full review"))}function RQ(e){return De(e).replace(/\s+/g," ").trim()}function n$e(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function xQ(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}function UO(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];return n?(n.footprint??n.input+n.output+n.cache)/ot(e.model):0}function tr(e,t,n,r){let o=UO(e,t),i=ot(e.model),s,a=t?.getDetail();if(a!==void 0)s=a.used;else{let f=e.turnTokens[e.turnTokens.length-1];f&&(s=f.footprint??f.input+f.output+f.cache)}let l;if(e.turnTokens.length>=2){let f=e.turnTokens.map(h=>(h.footprint??h.input+h.output+h.cache)/i),g=vQ(f,5);g.length>0&&(l=g)}let c=n?.getBranch(),u=n?.getPr(),d=$T(gw()),p=e.totalTurns>0?e.totalTurns:void 0;return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:o,contextLimit:i,contextUsedTokens:s,contextSparkline:l,permissionMode:e.permissionMode,...e.cwd!==void 0?{cwd:e.cwd}:{},...c!==void 0?{branch:c}:{},...u!==void 0?{pr:u}:{},...d!==void 0?{quotaWindows:d}:{},...p!==void 0?{turnCount:p}:{},...p!==void 0&&r&&r>0?{maxTurns:r}:{}}}var Rg,po=y(()=>{"use strict";xm();Tg();kQ();Eg();D();ze();Rg={stream:process.stdout,hideCursor:!1,discardStdin:!1}});function BT(e){if(e.type==="chunk"){let t=e.chunk;return t.type==="content"?De(t.content):t.type==="tool_use_detail"?m.dim(` [tool: ${t.toolName}]`):null}if(e.type==="error")return m.dim(` [error: ${e.error.message}]`);if(e.type==="message"){let t=e.message.content,n=typeof t=="string"?t:JSON.stringify(t);return De(n)}return null}var IQ,HO=y(()=>{"use strict";D();ze();IQ=BT});function PQ(e){WO=e}function MQ(e){KO=e}function UT(e){return WO||(e.out.error("Background subagent jobs are not available in this session."),null)}function u$e(e,t=120){let n=De(e).replace(/[\r\n]+/g," ").trim();return n.length>t?`${n.slice(0,t)}\u2026`:n}function d$e(e){let t=OQ[e.status],n=e.endedAt!==void 0?ye(e.endedAt-e.startedAt):ye(Date.now()-e.startedAt),r=ne(e.label,60),o=` ${t} ${m.bold(e.jobId)} ${r} ${m.dim(`(${e.provenance} \xB7 ${e.status} \xB7 ${n} \xB7 ${e.model})`)}`;if(!KO||e.status!=="running")return o;let i=KO.getSummary(e.jobId);if(!i)return o;let s=ee(),a=u$e(i.text,Math.max(40,s-10)),l=Math.round((Date.now()-i.refreshedAt)/1e3),c=i.stale?" [stale]":"",u=m.dim(` \u21B3 ${a} (${l}s ago)${c}`);return`${o}
|
|
1802
|
+
${t}`}var mQ=y(()=>{"use strict"});function gQ(){fQ||(fQ=!0,_O("review",sQ),lQ())}var fQ,MT=y(()=>{"use strict";PO();CO();PO();pQ();mQ();fQ=!1});function DO(e,t){let n=`/${e.name}`,r=e.argumentHint?`${n} ${e.argumentHint}`:void 0,o=ss(e.description);return{name:n,summary:e.description,acceptsAttachments:!0,...r!==void 0?{usage:r}:{},...o?{hint:o}:{},...t&&t.length>0?{flags:t}:{},async handler(i,s,a){let l=_t(e.name)==="review",c=s,u=[],d=null;if(l){let f=B6(s);u=f.targets,c=f.cleanedArgs;for(let g of f.unknown)i.out.warn(`/review: unknown --post target "${g}" \u2014 expected "github" or "telegram".`);u.length===0&&f.unknown.length===0&&/--post\b/.test(s)&&i.out.warn('/review: --post needs a target \u2014 try "--post github" or "--post telegram".');try{d=AO(c)}catch{d=null}}let p={name:e.name,description:e.description,handler:async()=>{},context:"inline"};try{let f=await _T(i,{skillName:e.name,skillMeta:p,args:c,attachments:a,preflight:async()=>{let g=e.name.includes(":")?e.name.split(":").pop()??e.name:e.name,h={skillName:g,rawArgs:c,source:e.source??"plugin",capabilities:{compose:!0,subagents:!0}},b=i.session.current.sessionId,w=al(b);return(await sl(h,{cwd:i.stats.cwd??process.cwd(),artifactDir:w},k=>{v.AFK_SKILL_STREAM_VERBOSE==="1"&&i.out.warn(`preflight(${g}) failed: ${k instanceof Error?k.message:String(k)}`)}))?.manifestBlock}});l&&u.length>0&&await pk(i.out,{targets:u,reviewText:f,prRefFromArgs:d})}catch(f){i.out.line(),i.out.error(`${e.name} failed: ${f instanceof Error?f.message:String(f)}`)}return"continue"}}}async function OT(e){let t;try{t=await e.supportedCommands()}catch(u){return console.error(m.dim(" \u26A0 Plugin-skill discovery failed: ")+(u instanceof Error?u.message:String(u))),null}let{flags:n,categories:r}=Yf(),o=Yf(await Promise.resolve().then(()=>(H(),zL)).then(u=>u.getBundledPluginsDir()));for(let[u,d]of o.flags){let p=n.get(u)??[];n.set(u,Array.from(new Set([...p,...d])).sort())}for(let[u,d]of o.categories)r.has(u)||r.set(u,d);let i=t.map(u=>{let d=_t(u.name),p=r.get(d);return{name:u.name,description:u.description??"",...u.argumentHint?{argumentHint:u.argumentHint}:{},...u.whenToUse?{whenToUse:u.whenToUse}:{},...u.source?{source:u.source}:{},...p?{category:p}:{}}}),s=v.AFK_INTERNAL==="1",a=new Set(Qr().filter(u=>Jn(Ve(u),s)).map(_t)),l=[],c=new Set;for(let u of i){let d=`/${u.name}`;if(GDe.has(d))continue;let p=_t(u.name),f=n.get(p);if(a.has(p)){let g=u.name.includes(":")?u.name:`plugin:${u.name}`,h={...u,name:g};is(DO(h,f)),l.push({bare:p,altSlash:`/${g}`,...u.source?{source:u.source}:{}}),c.add(p);continue}is(DO(u,f))}return k5({discovered:i,collisions:l,shadowedBareNames:c}),is(M5(i)),i.length}function $O(){return Pn.collisions.length===0?[]:Pn.collisions.map(e=>m.dim(` /${e.bare}: vendored or user skill wins; plugin form ${e.altSlash} stays reachable.`))}async function kg(e){let[t,n]=await Promise.all([OT(e),Ok(e)]);return{skillCount:t,agentCount:n}}var GDe,LO=y(()=>{"use strict";Vt();D();Dk();Ut();RO();XM();CO();MT();L();Jf();Mk();Zu();GDe=new Set(["/exit","/quit","/clear","/compact","/help"])});function hQ(e){let t={builtin:0,plugin:0,user:0,project:0,imported:0,command:0};for(let r of e)t[r.source]++;return[["builtin","built-in"],["plugin","plugin"],["user","user"],["project","project"],["imported","imported"],["command","command"]].filter(([r])=>t[r]>0).map(([r,o])=>`${t[r]} ${o}`).join(" \xB7 ")}function yQ(e,t){return e.size===0?null:{added:[...t].filter(n=>!e.has(n)).sort(),removed:[...e].filter(n=>!t.has(n)).sort()}}function bQ(e){let{added:t,removed:n}=e;if(t.length===0&&n.length===0)return"";let r=[];t.length&&r.push(`+${t.length}`),n.length&&r.push(`\u2212${n.length}`);let o=`${r.join(" ")} since last reload`,i=[];return t.length>0&&t.length<=3&&i.push(`new: ${t.map(s=>`/${s}`).join(", ")}`),n.length>0&&n.length<=3&&i.push(`gone: ${n.map(s=>`/${s}`).join(", ")}`),i.length>0&&(o+=` (${i.join("; ")})`),o}function wQ(e){if(e.length===0)return[];let t=8,n=e.slice(0,t),r=Math.min(24,n.reduce((i,s)=>Math.max(i,s.name.length),0)),o=n.map(i=>m.dim(` ${i.name.padEnd(r)} ${D5(i)}`));return e.length>t&&o.push(m.dim(` \u2026and ${e.length-t} more`)),o}var FO,NO=y(()=>{"use strict";Tr();yr();$5();D();Dk();LO();Zu();FO={name:"/reload-plugins",summary:"Reload plugin skills from disk and refresh the slash registry",async handler(e){e.out.line(),e.out.info("Reloading plugins\u2026");let t=new Set(Pn.discovered.map(a=>a.name));vr();try{let a=e.session.current.getQuery();typeof a.reloadPlugins=="function"&&await a.reloadPlugins()}catch(a){e.out.warn(`Plugin reload failed: ${a instanceof Error?a.message:String(a)}`)}let[n,r]=await Promise.all([OT(e.session.current),Ok(e.session.current)]);if(n===null&&r===null)return e.out.error("Could not refresh plugin skills or agents."),e.out.line(),"continue";let o=O5(),i=[];n!==null&&i.push(`${n} skill${n===1?"":"s"}`),r!==null&&i.push(`${r} agent${r===1?"":"s"}`);let s=o.length>0?` from ${o.length} plugin${o.length===1?"":"s"}`:"";if(e.out.success(`Reloaded ${i.join(" + ")}${s}.`),n!==null){let a=hQ(ba()),l=yQ(t,new Set(Pn.discovered.map(d=>d.name))),c=l?bQ(l):"",u=[a,c].filter(d=>d.length>0);u.length>0&&e.out.line(m.dim(` ${u.join(" \xB7 ")}`))}for(let a of wQ(o))e.out.line(a);return e.out.line(),"continue"}}});function SQ(){me(h0),me(FO)}var DT=y(()=>{"use strict";Ut();Mk();NO();Jf();Mk();LO();NO()});var Tg=y(()=>{"use strict";lr()});function vQ(e,t=5){if(e.length===0)return"";let n=e.slice(-t),r=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];return n.map(o=>{let i=Math.max(0,Math.min(1,o)),s=Math.min(7,Math.floor(i*8));return r[s]}).join("")}var kQ=y(()=>{"use strict"});function $T(e){if(e!==void 0&&!(e.fiveHourUtilization===void 0&&e.sevenDayUtilization===void 0))return{...e.fiveHourUtilization!==void 0?{fiveHour:{utilization:e.fiveHourUtilization,...e.fiveHourResetsAt!==void 0?{resetsAt:e.fiveHourResetsAt}:{}}}:{},...e.sevenDayUtilization!==void 0?{sevenDay:{utilization:e.sevenDayUtilization,...e.sevenDayResetsAt!==void 0?{resetsAt:e.sevenDayResetsAt}:{}}}:{},observedAt:e.observedAt}}function TQ(e){return e>zDe?"critical":e>qDe?"caution":"calm"}function JDe(e){return e==="critical"?m.error:e==="caution"?m.warning:m.chrome}function BO(e){let t=Math.floor(e/6e4);if(t<1)return"<1m";let n=Math.floor(t/1440),r=Math.floor(t%1440/60),o=t%60;return n>0?`${n}d${r}h`:r>0?`${r}h${o}m`:`${o}m`}function XDe(e){let t=[];return e.fiveHour!==void 0&&t.push({label:"5h",state:e.fiveHour,severity:TQ(e.fiveHour.utilization)}),e.sevenDay!==void 0&&t.push({label:"7d",state:e.sevenDay,severity:TQ(e.sevenDay.utilization)}),t}function QDe(e){return e.reduce((t,n)=>t===void 0||n.state.utilization>t.state.utilization?n:t,void 0)}function ZDe(e){return e.some(t=>t.severity==="critical")?"critical":e.some(t=>t.severity==="caution")?"caution":"calm"}function EQ(e,t=new Date){let n=XDe(e);if(n.length===0)return;let r=ZDe(n),o=e.observedAt!==void 0&&t.getTime()-e.observedAt.getTime()>VDe,i=r==="calm"?void 0:QDe(n),s=n.map(l=>{let c=JDe(l.severity),u=`${Math.round(l.state.utilization*100)}%`,d=`${m.meta(l.label)} ${c(u)}`;if(l===i&&l.state.resetsAt!==void 0){let p=l.state.resetsAt.getTime()-t.getTime();p>0&&(d+=` ${m.meta(`${YDe}${BO(p)}`)}`)}return d});return{text:(o?m.meta("~"):"")+s.join(m.dim(" \xB7 ")),severity:r,stale:o}}var qDe,zDe,VDe,YDe,Eg=y(()=>{"use strict";D();qDe=.5,zDe=.8,VDe=600*1e3,YDe="\u27F3"});import{statSync as e$e}from"node:fs";function LT(e,t,n){e.totalTurns=t.totalTurns,e.totalCostUsd=t.totalCostUsd,e.unpricedTurns=t.unpricedTurns??0,e.totalTokens=t.totalTokens,e.totalDurationMs=t.totalDurationMs,e.turns=[...t.turns],e.sessionId=t.sessionId??n,e.name=t.name,e.model=t.model,e.sessionStartTime=t.startedAt??Date.now()}function t$e(e){try{return e$e(e).isDirectory()}catch{return!1}}function AQ(e,t){if(e!==void 0)return e;if(t!==void 0&&t$e(t))return t}function FT(e,t){let n=e.turns;if(n.length===0)return;let r=n[n.length-1];if(!r)return;let o=xQ(RQ(r.user),80),i=xQ(n$e(RQ(r.assistant)),120);o.length>0&&t.fn(m.dim(` Last: ${o}`)),i.length>0&&t.fn(m.dim(` \u21B3 ${i}`)),t.fn(m.dim(" \u21AA /history for full review"))}function RQ(e){return De(e).replace(/\s+/g," ").trim()}function n$e(e){let t=e.match(/^.*?(?<![A-Za-z]\.[A-Za-z])[.!?](?=\s|$)/);return t?t[0]:e}function xQ(e,t){let n=[...e];return n.length<=t?e:n.slice(0,t-1).join("")+"\u2026"}function UO(e,t){if(t?.getRatio()!==void 0)return t.getRatio();let n=e.turnTokens[e.turnTokens.length-1];return n?(n.footprint??n.input+n.output+n.cache)/ot(e.model):0}function tr(e,t,n,r){let o=UO(e,t),i=ot(e.model),s,a=t?.getDetail();if(a!==void 0)s=a.used;else{let f=e.turnTokens[e.turnTokens.length-1];f&&(s=f.footprint??f.input+f.output+f.cache)}let l;if(e.turnTokens.length>=2){let f=e.turnTokens.map(h=>(h.footprint??h.input+h.output+h.cache)/i),g=vQ(f,5);g.length>0&&(l=g)}let c=n?.getBranch(),u=n?.getPr(),d=$T(gw()),p=e.totalTurns>0?e.totalTurns:void 0;return{model:e.model,cost:e.totalCostUsd,tokens:e.totalTokens,contextPct:o,contextLimit:i,contextUsedTokens:s,contextSparkline:l,permissionMode:e.permissionMode,...e.cwd!==void 0?{cwd:e.cwd}:{},...c!==void 0?{branch:c}:{},...u!==void 0?{pr:u}:{},...d!==void 0?{quotaWindows:d}:{},...p!==void 0?{turnCount:p}:{},...p!==void 0&&r&&r>0?{maxTurns:r}:{}}}var Rg,po=y(()=>{"use strict";xm();Tg();kQ();Eg();D();ze();Rg={stream:process.stdout,hideCursor:!1,discardStdin:!1}});function BT(e){if(e.type==="chunk"){let t=e.chunk;return t.type==="content"?De(t.content):t.type==="tool_use_detail"?m.dim(` [tool: ${t.toolName}]`):null}if(e.type==="error")return m.dim(` [error: ${e.error.message}]`);if(e.type==="message"){let t=e.message.content,n=typeof t=="string"?t:JSON.stringify(t);return De(n)}return null}var IQ,HO=y(()=>{"use strict";D();ze();IQ=BT});function PQ(e){WO=e}function MQ(e){KO=e}function UT(e){return WO||(e.out.error("Background subagent jobs are not available in this session."),null)}function u$e(e,t=120){let n=De(e).replace(/[\r\n]+/g," ").trim();return n.length>t?`${n.slice(0,t)}\u2026`:n}function d$e(e){let t=OQ[e.status],n=e.endedAt!==void 0?ye(e.endedAt-e.startedAt):ye(Date.now()-e.startedAt),r=ne(e.label,60),o=` ${t} ${m.bold(e.jobId)} ${r} ${m.dim(`(${e.provenance} \xB7 ${e.status} \xB7 ${n} \xB7 ${e.model})`)}`;if(!KO||e.status!=="running")return o;let i=KO.getSummary(e.jobId);if(!i)return o;let s=ee(),a=u$e(i.text,Math.max(40,s-10)),l=Math.round((Date.now()-i.refreshedAt)/1e3),c=i.stale?" [stale]":"",u=m.dim(` \u21B3 ${a} (${l}s ago)${c}`);return`${o}
|
|
1803
1803
|
${u}`}function GO(e,t){let n=OQ[t.status];e.out.line(` ${n} ${m.bold(t.jobId)} ${t.label}`);let r=t.endedAt!==void 0?ye(t.endedAt-t.startedAt):ye(Date.now()-t.startedAt);e.out.line(` Status: ${t.status} \xB7 ${r}`),e.out.line(` Subagent: ${t.subagentId}`),e.out.line(` Model: ${t.model}`),e.out.line(` Owner: ${t.provenance}`);let o=t.result;if(o?.message?.content){e.out.line("");let i=typeof o.message.content=="string"?o.message.content:JSON.stringify(o.message.content),s=Er(i,o.stopReason),a=s.split(`
|
|
1804
1804
|
`).slice(0,40);for(let l of a)e.out.line(` ${l}`);s.split(`
|
|
1805
1805
|
`).length>40&&e.out.line(m.dim(" \u2026 (truncated; full result available via /bgsub:join again)"))}o?.error&&e.out.error(` Error: ${o.error.message}`)}var WO,KO,OQ,p$e,m$e,f$e,g$e,DQ,qO=y(()=>{"use strict";D();nt();he();le();RS();bt();ze();HO();OQ={running:"\u25D0",completed:"\u2713",failed:"\u2717",cancelled:"\u2298"};p$e={name:"/bgsub",summary:"List background subagent jobs",usage:"/bgsub [id]",hint:'When you want to check on background subagent jobs spawned with mode="background" during this session.',async handler(e,t){let n=UT(e);if(!n)return"continue";let r=t.trim();if(r){let i=n.get(r);return i?(GO(e,i),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}let o=n.list();if(o.length===0)return e.out.info('No background subagent jobs. Spawn one by calling the agent tool with mode="background".'),"continue";for(let i of o)e.out.line(d$e(i));return"continue"}},m$e={name:"/bgsub:status",summary:"Show one background job",usage:"/bgsub:status <id>",hint:"When you need the full detail view for one specific background job by its ID.",async handler(e,t){let n=UT(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:status <id>"),"continue";let o=n.get(r);return o?(GO(e,o),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},f$e={name:"/bgsub:join",summary:"Wait for a background subagent job and print its result",usage:"/bgsub:join <id>",hint:"When a background subagent has finished and you want to surface its result into the conversation.",async handler(e,t){let n=UT(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:join <id>"),"continue";if(n.get(r)){try{await n.join(r)}catch(s){let a=s instanceof Error?s.message:String(s);e.out.error(`/bgsub:join failed: ${a}`)}let i=n.get(r);return i&&GO(e,i),"continue"}let o=await ro.readMeta(r);if(o){e.out.info("Job evicted from memory \u2014 replaying from log."),Jt(o.stopReason)&&(e.out.line(` ${Er("",o.stopReason).trimEnd()}`),e.out.line(""));let i=0;for await(let s of ro.readEvents(r)){let a=IQ(s);a!==null&&(e.out.line(a),i++)}return i===0&&e.out.info(` (no events recorded for job ${r})`),e.out.line(""),e.out.line(` Status: ${o.status}`+(o.endedAt!==void 0?` \xB7 ended ${new Date(o.endedAt).toISOString()}`:"")),"continue"}return e.out.error(`No background job with ID "${r}".`),"continue"}},g$e={name:"/bgsub:cancel",summary:"Cancel a running background subagent job",usage:"/bgsub:cancel <id>",hint:"When you want to abort a background subagent job that is still in progress.",async handler(e,t){let n=UT(e);if(!n)return"continue";let r=t.trim();if(!r)return e.out.info("Usage: /bgsub:cancel <id>"),"continue";let o=n.get(r);return o?o.status!=="running"?(e.out.info(`Job ${r} is already ${o.status}; nothing to cancel.`),"continue"):(await n.cancelJob(r)?e.out.line(m.dim(` \u2192 cancellation requested for ${r}`)):e.out.info(`Job ${r} could not be cancelled (already terminal).`),"continue"):(e.out.error(`No background job with ID "${r}".`),"continue")}},DQ=[p$e,m$e,f$e,g$e]});function b$e(e){return e==="succeeded"||e==="completed"?m.success(e):e==="failed"?m.error(e):e==="running"?m.info(e):e==="cancelled"?m.dim(e):m.dim(e)}function $Q(e=80){let t=Math.min(e,100);return m.dim("\u2500".repeat(t))}function w$e(e,t,n){let r=[m.bold(`Subagent: ${e.slice(0,20)}`),...n?[m.dim(`type: ${n}`)]:[],`status: ${b$e(t)}`];return[$Q(),r.join(" "),$Q()].join(`
|
|
@@ -2028,7 +2028,7 @@ ${E}
|
|
|
2028
2028
|
${T}`})}return{fileBlocks:l,warnings:c}}function Yne(e){let t=e.replace(/\s+/g," ").trim();return t.length<=60?t:`${t.slice(0,59)}\u2026`}async function Jne(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();D();L();nt();D();Fa();function Xne(){return{toolStartTimes:new Map,subagentStartTimes:new Map,subagentLabels:new Map}}function Qne(e,t){Fe()&&(t.pending||e.toolStartTimes.has(t.toolUseId)||e.toolStartTimes.set(t.toolUseId,Date.now()))}function Zne(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=Me(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 ere(e,t,n,r){if(!Fe())return;let{subagentId:o,agentType:i}=n,s=Me(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 QE=class{state;writer;ttfb;constructor(t,n){this.state=Xne(),this.writer=t,this.ttfb=n}onToolStart(t){Qne(this.state,t)}onToolResult(t,n){Zne(this.state,t,n,this.writer)}onSubagentEvent(t,n){ere(this.state,t,n,this.writer)}onFirstContent(t){this.ttfb.waitingLineEmitted&&(this.ttfb.waitingLineEmitted=!1,t.write("\r\x1B[2K"))}};function tre(e){return{startedAt:e,received:!1,waitingLineEmitted:!1}}function nre(e){return e.received?{}:{turnStartedAt:e.startedAt}}function rre(e,t,n){let r=t.type==="chunk"&&t.chunk.type==="content"&&!n;return r&&(e.received=!0),r}function ore(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 QE(e,n)))}ue();D();var Aje=3e3;async function ire(e,t){if(!e)return t;let n=Date.now();if(n-t<Aje)return t;try{let r=e();r instanceof Promise&&await r}catch(r){je()&&console.error(" "+m.error("onContextProgress (status refresh) failed:"),r)}return n}D();ue();mt();fs();var Cje="Keep waiting \u2014 auto-resume in progress",sre="Switch model / provider (type /model after)",_je="Stop waiting";async function are(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}`:Cje,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,_je],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=>{je()&&console.error(" "+m.error("picker pause-interrupt session.interrupt() failed:"),h)}))}).catch(f=>{je()&&console.error(" "+m.error("picker promise rejected:"),f)})}else(i??{fn:console.log}).fn(IF({reason:t.reason,...t.resetsAt!==void 0?{resetsAt:t.resetsAt}:{},...t.accountId!==void 0?{accountId:t.accountId}:{},...t.autoResume!==void 0?{autoResume:t.autoResume}:{}}))}iT();async function lre(e,t,n,r,o="summary",i,s){let a=u3(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l=Date.now(),c=tre(l);ore(i,process.stdout,c),Yu(process.stdout,qf(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=[],I=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,x=()=>{let W=r.subagentControl;W?.hasPromotableForeground()&&Jne(W,_,r.onQueuedUserMessage).then(({jobs:G,flushedText:j,flushedPreview:K})=>{let Q=(i??{fn:console.log}).fn;for(let P of G)Q(m.dim(` \u2192 subagent backgrounded as ${P.jobId}: ${P.label}`));j!==void 0&&Q(m.dim(` \u2192 queued message sent to this turn: ${Yne(K??j)}`))}).catch(()=>{})},_=r.getCompositor?r.getCompositor():null,M=()=>new vd({out:kd(i),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch(W=>{je()&&console.error(" "+m.error("session.interrupt() failed:"),W)})},...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}:{},..._?{compositor:_}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{},...nre(c),...r.addPreviewDiffRef?{addPreviewDiffRef:r.addPreviewDiffRef}:{}}),$=M(),F=async()=>{if(!h){h=!0;try{await $.dispose()}catch{}}},U=async()=>{await $.arm();let W=$.getCompositor();if(i&&W){let G=W;i.fn=j=>G.commitAbove(j),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(W),r.setInterruptNotifier?.(G=>$.setInterrupting(G)),r.rearmStatus?.()};try{_?_.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{S=!0,$.setSoftStopping(!0),t.interrupt().catch(N=>{je()&&console.error(" "+m.error("soft-stop session.interrupt() failed:"),N)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(N=>{je()&&console.error(" "+m.error("soft-stop cancelActiveForeground() failed:"),N)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{k=!0,t.interrupt().catch(P=>{je()&&console.error(" "+m.error("pause-interrupt session.interrupt() failed:"),P)})}),await U(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(x);let{fileBlocks:W,warnings:G}=Vne(e.text,{rootDir:process.cwd()});for(let P of G)(i??{fn:console.log}).fn(m.dim(` @-file: ${P}`));if(e.attachments.length>0&&(await t.waitForInitialization(),t.sessionId===void 0))throw new Error("CLI session initialized without a session id");let j=W.length>0||e.attachments.length>0?await zne(e.text,e.attachments,void 0,W,t.sessionId):e.text,K=t.sendMessageStream(j);if(await Nc((P,N)=>{$.process(P,N),N&&c.plainHooks?.onSubagentEvent(P,N)},async()=>{for await(let P of K){if(S||k)break;let N=rre(c,P,f);if(P.type==="chunk"&&P.chunk.type==="content"?(u=p?Hne(u,P.chunk.content):u+P.chunk.content,p=!1,f=!0):P.type==="message"&&!f&&(u=P.message.content),P.type==="stream_retry"&&(u=u.slice(0,d),p=u.length>0),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let Y=P.chunk,te={toolName:Y.toolName,toolUseId:Y.toolUseId,input:Y.toolInput,...Y.toolInputRaw!==void 0&&{inputRaw:Y.toolInputRaw}};I.set(Y.toolUseId,te),R.push(te),c.plainHooks?.onToolStart(Y)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let Y=P.chunk;d=u.length,p=!0;let te=I.get(Y.toolUseId);te&&(te.result=Y.content,te.isError=Y.isError,I.delete(Y.toolUseId)),c.plainHooks?.onToolResult(Y,te?.toolName),T=await ire(r.onContextProgress,T)}if(P.type==="paused"){await are({event:P,session:t,borrowedCompositor:_,pickerRef:E,completionWriter:i,disposeRendererOnce:F,setPausedState:r.setPausedState,onPauseInterrupt:()=>{k=!0}});continue}if(P.type==="resumed"){r.setPausedState?.(!1),E.abort?.abort(),E.abort=null;let Y=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";u="",d=0,p=!1,f=!1,R.length=0,I.clear(),b=!1,w=void 0,g=!1,$=M(),h=!1,await U(),(i??{fn:console.log}).fn(m.success(Y));continue}if(P.type==="error"){await F(),Yl(jl(P.error)),g=!0;continue}$.process(P),N&&(c.plainHooks?.onFirstContent(process.stdout),$.notifyFirstContent()),P.type==="done"&&(b=!0,w=P.metadata)}}),await F(),S){let P=i?i.fn:console.log,N=_?_.getPendingCount():0,Y=N>0?` \xB7 ${N} queued`:"";P(m.warning(`\u23F8 Stopped${Y} \u2014 work so far kept.`)+m.dim(" Send a message to continue.")),P("")}if(k){let P=i?i.fn:console.log;P(m.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(b&&!S&&!k){Ha(n,a,u,w,R),r.onTurnComplete&&await r.onTurnComplete(a,u).catch(()=>{}),Vu(process.stdout),b5(process.stdout,"afk: turn complete");let P=Y=>{i?i.fn(Y):console.log(Y)},N=XE(u);if(N){P(Wne(N,{durationMs:w?.durationMs,totalCostUsd:w?.totalCostUsd,toolCount:R.length})),P("");let Y=H7(R);if(r.onTerminalState)try{r.onTerminalState(N,{doneHasCorroboratingEvidence:Y})}catch{}if(n.permissionMode==="autonomous"){let te=N.kind==="done"&&pm().verifyDone===!0&&!Y;K7(N,void 0,{unverified:te})}}if(b$(w,n,P),r.onAfterTurn){let Y=r.onAfterTurn();Y instanceof Promise&&await Y.catch(()=>{})}}}catch(W){await F(),g||Yl(jl(W))}finally{await F(),Yu(process.stdout,qf(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),E.abort?.abort(),E.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}ts();wp();var Ije=5e3,Pje=3,Mje="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Oje(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 cre(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 _=>{je()&&(h=nE(_)),await kg(e.session.current),je()&&(b=$O())}).catch(()=>{});let w=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,S,k=!1,E=!1,T,R,I,C=(()=>{let _=parseInt(e.options.maxTurns,10);return _>0?_:void 0})(),x=0;g.onInjectable=()=>{x>=Pje||!o.isAwaitingInput()||!o.bufferIsEmpty()||n.pendingSteerRead||(x++,Vu(process.stdout),w={text:Mje,attachments:[]},o.abortPendingRead())};try{for(n.steerReadLine=async _=>{let M=()=>o.abortPendingRead({clearBuffer:!0});if(_?.addEventListener("abort",M,{once:!0}),_?.aborted)return"";try{return(await o.readLine({promptFn:()=>"Steer the agent \u2192 ",onEscape:M})).text}finally{_?.removeEventListener("abort",M)}};;){if(h&&(e.replRenderer.writeLine(h),e.replRenderer.writeLine(""),h=null),b.length>0){for(let P of b)e.replRenderer.writeLine(P);e.replRenderer.writeLine(""),b=[]}let _=f.drainNotifications();for(let{job:P,result:N}of _){let Y=N.errorReason===void 0?"\u2713":"\u2717",te=N.errorReason==="abort"?"killed":N.errorReason==="timeout"?"timed out":N.errorReason==="signal-killed"?"killed by signal":`exit ${N.exitCode??0}`,Pe=Math.max(0,Math.round(N.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${Y} [${P.id}] ${te} \xB7 ${Pe}s \xB7 `)+P.command)}let M=g.drainNotifications();for(let{job:P}of M){let N=P.status==="completed"?"\u2713":P.status==="failed"?"\u2717":"\u2298",Y=P.endedAt!==void 0?Math.max(0,Math.round((P.endedAt-P.startedAt)/100)/10):0,te=ne(P.label,60);e.replRenderer.writeLine(m.dim(` ${N} [${P.jobId}] subagent ${P.status} \xB7 ${Y}s \xB7 `)+te)}let $=l.renderIfChanged(e.stats.sessionId);if($.length>0){for(let P of $)e.replRenderer.writeLine(P);e.replRenderer.writeLine("")}let F,U,W=n.pendingSteerRead;if(W){let P=await W;n.pendingSteerRead===W&&(n.pendingSteerRead=null),P?.trim()&&(n.pendingSteerText=P)}if(n.pendingSteerText&&(w={text:n.pendingSteerText,attachments:[]},n.pendingSteerText=null),w===void 0){let P=await e.session.current.takePendingPlanExitSeed();P!==void 0&&(e.stats.permissionMode=P.mode,w={text:P.message,attachments:[]})}if(w!==void 0){let P=w;w=void 0;let N=Md(e.stats.permissionMode),Y=za({buffer:P.text,promptText:N,isTTY:!!process.stdout.isTTY,attachmentSummary:ad([...P.attachments])});e.replRenderer.writeLine(Y),F=P.text.trim(),U=P.attachments}else{let P=S;S=void 0;let N=await o.readLine({promptFn:()=>Md(e.stats.permissionMode),...P!==void 0?{initialBuffer:P}:{},primePromptSuggestion:!0,onSigint:r,onShiftTab:()=>{GE(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});F=N.text.trim(),U=N.attachments}if(!F&&U.length===0)continue;if(F.startsWith("!")){let P=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!P&&(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 G=!1;if(F.startsWith("/")){let P=await v5(F,e.slashCtx,U);if(P.handled){if(P.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),P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="submit"){w={text:P.result.message,attachments:U??[]},e.statusLine.rearm();continue}if(P.result!==null&&typeof P.result=="object"&&"kind"in P.result&&P.result.kind==="prefill"){S=P.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}G=!0}a.push(F),await Oje(e,F);let j=F;if(G){let P=s0(F);if(P){let N=P.name.replace(/^\//,"").split(":").pop()??"";if(N&&IO(N)){let Y={skillName:N,rawArgs:P.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},te=e.session.current.sessionId,Pe=al(te),ie=Date.now();B(`[afk trace] preflight.start commandName=${N}`);let Te=!1,Ke=await sl(Y,{cwd:e.stats.cwd??process.cwd(),artifactDir:Pe},Dn=>{je()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${N}) failed: `)+(Dn instanceof Error?Dn.message:String(Dn)))});Te=Ke!==null,B(`[afk trace] preflight.end commandName=${N} durationMs=${Date.now()-ie} success=${Te}`),j=OO(Ke?.manifestBlock,F)}}}let K=f.drainInjections();K.length>0&&(j=K+j);let Q=g.drainInjections();if(Q.length>0&&(j=Q+j),T!==void 0&&(j=T+`
|
|
2029
2029
|
|
|
2030
2030
|
`+j,T=void 0),e.hookRegistry)try{let P={event:"UserPromptSubmit",prompt:j,sessionId:e.stats.sessionId},N=await e.hookRegistry.dispatch(P);N.injectContext&&(j=N.injectContext+j)}catch(P){if(P instanceof xe){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+(P.reason?m.dim(`: ${se(P.reason)}`):"")),e.statusLine.rearm();continue}if(P instanceof Ur){e.replRenderer.writeLine(m.warning("\u2298 Turn blocked by hook")+m.dim(`: handler timed out after ${P.timeoutMs}ms`)),e.statusLine.rearm();continue}throw P}if(R=void 0,I=void 0,FF(),jF(),await lre({text:j,attachments:U},e.session.current,e.stats,{setInFlight(P){n.turnInFlight=P},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(P){await t.appendUser(P)},async onQueuedUserMessage(P){await t.appendQueuedUser(P)},async onTurnComplete(P,N){if(await t.appendTurn(P,N),e.stats.sessionId)try{es(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(tr(e.stats,e.contextSampler,e.gitStatusSampler,C)),e.statusLine.rearm(),c?.repaint("observing"),d?.update(e.stats)},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(P,N)=>{p?.push(P),R=P.kind,I=N?.doneHasCorroboratingEvidence},setActiveCompositor:P=>{n.activeCompositor=P,P===null&&n.interruptPickerAbort&&(n.interruptPickerAbort.abort(),n.interruptPickerAbort=null)},setInterruptNotifier:P=>{n.notifyInterrupting=P},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:P=>o.setBackgroundHandler(P),setSoftStopHandler:i,setPausedState:P=>o.setPausedState(P),setPauseInterruptHandler:P=>o.setPauseInterruptHandler(P),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(tr(e.stats,e.contextSampler,e.gitStatusSampler,C)),d?.update(e.stats,e.contextSampler.getRatio())},...c?{onStageChange:(P,N)=>{c.repaint(P),u?.onStage(P,N)}}:{},...e.addPreviewDiffRef?{addPreviewDiffRef:e.addPreviewDiffRef}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(Md(e.stats.permissionMode))),e.hookRegistry)try{let P=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...R!==void 0?{terminalState:R}:{},...I!==void 0?{doneHasCorroboratingEvidence:I}:{}},void 0,Ije);P.injectContext&&P.injectContext.trim().length>0&&(T=P.injectContext)}catch(P){if(P instanceof Mt)throw P;P instanceof Ur?(B("[stop hook] handler timed out"),e.completionWriter.fn(m.dim(" [stop hook] timed out"))):P instanceof xe?e.completionWriter.fn(m.dim(` [stop hook] blocked: ${se(P.reason??"no reason given")}`)):B("[stop hook] unexpected error: "+String(P))}}}finally{n.steerReadLine=null,n.pendingSteerRead=null,n.pendingSteerText=null}}function Dje(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 ure(e,t,n,r){let o=await nne(),i=new KE({rl:e.rl,history:o,statusLine:e.statusLine}),s=Dje(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await Ene(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar,getMascotBar:()=>a?.mascotBar});a=jne(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 cre(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)}}om();Ac();import{execFile as $je}from"node:child_process";import{dirname as Lje,isAbsolute as Fje,resolve as Nje}from"node:path";import{promisify as Bje}from"node:util";var dre=Bje($je),Uje=3e3,jje=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Hje(){let t=(await dre("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=Fje(t)?t:Nje(process.cwd(),t);return Lje(n)}async function pre(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Hje()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Uje)});try{let o=zn({execFile:dre,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=>jje.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}ty();om();import{promises as Wje}from"node:fs";import{dirname as Kje,join as gre}from"node:path";import{randomBytes as Gje}from"node:crypto";var qje=["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(`
|
|
2031
|
-
`),mre=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,S$=30,zje=1024,Vje=8e3,Yje="haiku";async function Jje(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=e1e(n,zje),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Vje),s=t.signal?t1e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await tc({token:t.token,model:t.model??Yje,system:qje,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=Xje(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Kje(t.worktreePath);return await Qje(l,c)}function Xje(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(mre.test(t)&&t.length<=S$)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>S$)break;o=s}return mre.test(o)?o:null}async function Qje(e,t){if(!await Zje(gre(t,e)))return e;let n=Gje(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,S$-5)}-${n}`}async function Zje(e){try{return await Wje.access(e),!0}catch{return!1}}function e1e(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 t1e(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 hre(e){let t,n,r=gre(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Jje(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=`${sb(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return fre(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 fre(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 fre(e,t){e&&e.setCwd(t),n1e(t)}function n1e(e){try{process.chdir(e)}catch{}}wt();At();Bl();po();H();import{spawn as bre}from"child_process";import{existsSync as wre,mkdirSync as a1e,readFileSync as Sre,unlinkSync as yre,writeFileSync as vre}from"fs";import{get as l1e}from"https";import{join as kre}from"path";import{readFileSync as r1e}from"fs";import{dirname as o1e,join as i1e}from"path";import{fileURLToPath as s1e}from"url";function go(){try{return"5.167.
|
|
2031
|
+
`),mre=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,S$=30,zje=1024,Vje=8e3,Yje="haiku";async function Jje(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=e1e(n,zje),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Vje),s=t.signal?t1e([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await tc({token:t.token,model:t.model??Yje,system:qje,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=Xje(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Kje(t.worktreePath);return await Qje(l,c)}function Xje(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(mre.test(t)&&t.length<=S$)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>S$)break;o=s}return mre.test(o)?o:null}async function Qje(e,t){if(!await Zje(gre(t,e)))return e;let n=Gje(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,S$-5)}-${n}`}async function Zje(e){try{return await Wje.access(e),!0}catch{return!1}}function e1e(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 t1e(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 hre(e){let t,n,r=gre(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Jje(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=`${sb(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return fre(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 fre(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 fre(e,t){e&&e.setCwd(t),n1e(t)}function n1e(e){try{process.chdir(e)}catch{}}wt();At();Bl();po();H();import{spawn as bre}from"child_process";import{existsSync as wre,mkdirSync as a1e,readFileSync as Sre,unlinkSync as yre,writeFileSync as vre}from"fs";import{get as l1e}from"https";import{join as kre}from"path";import{readFileSync as r1e}from"fs";import{dirname as o1e,join as i1e}from"path";import{fileURLToPath as s1e}from"url";function go(){try{return"5.167.4"}catch{}try{let e=o1e(s1e(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(r1e(i1e(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}D();L();var c1e=64*1024,u1e=10800*1e3,d1e=800,p1e=3600*1e3,m1e="update-check.json",f1e="pending-update.json";function v$(){return kre(Ps(),m1e)}function Hg(){return kre(Ps(),f1e)}function k$(){let e=Ps();wre(e)||a1e(e,{recursive:!0})}function Tre(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 Ere(){try{let e=Sre(v$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function Rre(){try{k$();let e=`
|
|
2032
2032
|
const https = require('https');
|
|
2033
2033
|
const fs = require('fs');
|
|
2034
2034
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|