agent-afk 4.44.0 → 4.44.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +3 -3
- package/dist/index.mjs +179 -177
- package/dist/telegram.mjs +219 -217
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -1078,7 +1078,7 @@ ${o}`;return s.includes("already checked out")||s.includes("is already used by w
|
|
|
1078
1078
|
Effective base URL: ${r}`)),r}return t}function R1(){if(kg!==void 0)return kg;if(!Gk){let o=[$a(process.cwd(),".env"),mt(),OS()];for(let s of o)Eg(s)&&x1({path:s,override:!1});Gk=!0}let e={},t=v.AFK_MODEL??v.CLAUDE_MODEL;if(t){let o=t.toLowerCase();e.model=Mf(o)?o:t}if(re(t)==="anthropic-direct"){let o=xg();o!==void 0&&(e.apiKey=o)}let r=v.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=v.AFK_LOCAL_API_KEY||"local"),v.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(v.AFK_MAX_TOKENS,10)),v.AFK_TEMPERATURE&&(e.temperature=parseFloat(v.AFK_TEMPERATURE)),v.AFK_SYSTEM_PROMPT&&(e.systemPrompt=v.AFK_SYSTEM_PROMPT),v.AFK_AUTO_ROUTING){let o=v.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return v.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=T1(v.AFK_OPENAI_BASE_URL)),kg=e,e}function Tg(){if(Ws!==void 0)return Ws;let e=[$a(process.cwd(),"afk.config.json"),Ut(),pc()];for(let t of e)if(Eg(t))try{let n=zk(t,"utf-8"),r=JSON.parse(n),o={},s=hv(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=Mf(i)?i:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),typeof r.permissionMode=="string"){let i=r.permissionMode;(i==="default"||i==="plan"||i==="autonomous"||i==="bypassPermissions")&&(o.permissionMode=i)}if(r.autoRouting&&typeof r.autoRouting=="object"){let i={};typeof r.autoRouting.interactive=="boolean"&&(i.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(i.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(i.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(i.daemon=r.autoRouting.daemon),o.autoRouting=i}if(r.daemon&&typeof r.daemon=="object"){let i={};typeof r.daemon.task=="string"&&(i.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(i.taskId=r.daemon.taskId);let a=r.daemon.worktreePrune;a&&typeof a=="object"&&(i.worktreePrune={enabled:typeof a.enabled=="boolean"?a.enabled:!0,cron:typeof a.cron=="string"?a.cron:"0 4 * * *",maxAgeDaysClean:typeof a.maxAgeDaysClean=="number"?a.maxAgeDaysClean:14,maxAgeDaysDirty:typeof a.maxAgeDaysDirty=="number"?a.maxAgeDaysDirty:30,scope:typeof a.scope=="string"?a.scope:"all"}),o.daemon=i}if(r.telegram&&typeof r.telegram=="object"){let i={},a=r.telegram.notify;if(a&&typeof a=="object"){let l={};if((a.mode==="primary"||a.mode==="broadcast"||a.mode==="custom")&&(l.mode=a.mode),typeof a.primaryChatId=="number"&&Number.isFinite(a.primaryChatId)&&(l.primaryChatId=a.primaryChatId),Array.isArray(a.targets)){let c=a.targets.filter(u=>typeof u=="number"&&Number.isFinite(u));c.length>0&&(l.targets=c)}i.notify=l}typeof r.telegram.verifyDone=="boolean"&&(i.verifyDone=r.telegram.verifyDone),o.telegram=i}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.hooks!==null&&typeof r.hooks=="object"&&!Array.isArray(r.hooks)&&(o.hooks=r.hooks),typeof r.enableShellHooks=="boolean"&&(o.enableShellHooks=r.enableShellHooks),t!==$a(process.cwd(),"afk.config.json")){let i=Ma(r.importFrom);i!==void 0&&(o.importFrom=i)}if(r.interactive&&typeof r.interactive=="object"){let i={};typeof r.interactive.worktreeAutoname=="boolean"&&(i.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(i.worktreeBranchPrefix=bg(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(wg(r.interactive.worktreeBase,`${t}#/interactive/worktreeBase`),i.worktreeBase=r.interactive.worktreeBase),typeof r.interactive.suggestGhost=="boolean"&&(i.suggestGhost=r.interactive.suggestGhost),Object.keys(i).length>0&&(o.interactive=i)}return Ws={config:o,sourcePath:t,modelsPartial:s},Ws}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return Ws={config:{},sourcePath:void 0,modelsPartial:{}},Ws}function C1(){if(Ks!==void 0)return Ks.value;let e=[$a(process.cwd(),"AFK.md"),$a($e(),"AFK.md")];for(let t of e)if(Eg(t))try{let n=zk(t,"utf-8").trim();if(n.length>0)return Ks={value:{content:n,path:t}},Ks.value}catch{}return Ks={value:null},Ks.value}function lu(){return Tg().config.telegram??{}}function Gs(){return Tg().config.permissionMode??Jk}function Tt(e){let t=R1(),{config:n,sourcePath:r,modelsPartial:o}=Tg(),s={...Oa,...t,...n,...e},i;if(t.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=C1();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??Oa.model,maxTokens:s.maxTokens??Oa.maxTokens,temperature:s.temperature??Oa.temperature,updatePolicy:s.updatePolicy??Oa.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??Jk,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{}},l=e?.models??_f(o);if(Ac(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var Oa,Jk,Gk,kg,qk,Ws,Ks,It=_(()=>{"use strict";zn();tn();tt();G();js();Pa();q();sr();Oa={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},Jk="bypassPermissions",Gk=!1;qk=new Set});function A1(e,t){return t!==void 0&&Number.isFinite(t)&&t!==0?t:e.find(r=>r>0)??e[0]}function _1(e,t={}){let n=[...e],r=t.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(t.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=A1(n,t.primaryChatId);return o!==void 0?[o]:[]}function I1(e){if(!e)return;let t=e.trim();if(!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isFinite(n)&&n!==0?n:void 0}function P1(e){if(!e)return;let t=e.trim().toLowerCase();return t==="primary"||t==="broadcast"||t==="custom"?t:void 0}function M1(){let e=lu().notify??{},t=e.mode??P1(v.AFK_TELEGRAM_NOTIFY_MODE),n=e.primaryChatId??I1(v.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...t!==void 0?{mode:t}:{},...n!==void 0?{primaryChatId:n}:{},...e.targets!==void 0?{targets:e.targets}:{}}}function qs(){let e=Ck(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return _1(e,M1())}var cu=_(()=>{"use strict";Ak();It();q()});function Rg(e,t=4096){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let o=t,s=r.lastIndexOf(`
|
|
1079
1079
|
`,t);if(s>t-500&&s>0)o=s+1;else{let i=r.slice(0,t).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let a=i[i.length-1];if(a){let l=r.lastIndexOf(a,t);l>t-200&&l>0&&(o=l+2)}}else{let a=r.lastIndexOf(" ",t);a>t-100&&a>0&&(o=a+1)}}n.push(r.slice(0,o).trim()),r=r.slice(o).trim()}return n}function Vk(e){e=e.replace(/[\x02\x03]/g,"");let t=e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),n=[];t=t.replace(/^ {0,3}```([\w]*)\n([\s\S]*?)```/gm,(o,s,i)=>{let a=n.length;if(i.trim()===""){let l=s?`(empty ${s} block)`:"(empty code block)";n.push(`<i>${l}</i>`)}else n.push(`<pre>${i}</pre>`);return`FENCED${a}`});let r=[];return t=t.replace(/`([^`]+)`/g,(o,s)=>{let i=r.length;return r.push(`<code>${s}</code>`),`CODE${i}`}),t=t.replace(/\*\*([^*]+)\*\*/g,"<b>$1</b>"),t=t.replace(/__([^_]+)__/g,"<b>$1</b>"),t=t.replace(/\*([^*]+)\*/g,"<i>$1</i>"),t=t.replace(/(^|[^\w])_([^_\n]+?)_(?!\w)/gm,"$1<i>$2</i>"),t=t.replace(/~~([^~]+)~~/g,"<s>$1</s>"),t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,s,i)=>'<a href="'+i.replace(/"/g,""")+'">'+s+"</a>"),t=t.replace(/^#{1,6}\s+/gm,""),t=t.replace(/\x02CODE(\d+)\x03/g,(o,s)=>r[Number(s)]??o),t=t.replace(/\x02FENCED(\d+)\x03/g,(o,s)=>n[Number(s)]??o),t}var Yk=_(()=>{"use strict"});var Cg={};oc(Cg,{push:()=>zs,pushIfConfigured:()=>Mr,pushMarkdown:()=>Xk});async function zs(e){if(!e.token)throw new Error("push: token is required");if(e.chatId===""||e.chatId==null||e.chatId===0)throw new Error("push: chatId is required");let t=e.fetchImpl??fetch,r=`${e.apiBase??O1}/bot${e.token}/sendMessage`,o={chat_id:e.chatId,text:e.text.slice(0,4096)};e.parseMode&&(o.parse_mode=e.parseMode),e.replyMarkup&&(o.reply_markup=e.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await t(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function Xk(e){let t=Vk(e.text),n=Rg(t),r={ok:!0,status:200};for(let o of n)if(r=await zs({...e,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?zs({...e}):r;return r}async function Mr(e,t={}){let n=v.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=qs();if(r.length===0)return null;let o=Rg(e),s=[];for(let i of r)for(let a=0;a<o.length;a++){let l={token:n,chatId:i,text:o[a]??"",...t.replyMarkup!==void 0&&a===0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}};s.push(t.markdown?await Xk(l):await zs({...l,...t.parseMode!==void 0?{parseMode:t.parseMode}:{}}))}return s}var O1,Ro=_(()=>{"use strict";cu();Yk();q();O1="https://api.telegram.org"});function $1(e=zs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>Zk)return{content:`Invalid input: message exceeds Telegram's ${Zk}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=qs();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of i){let c=await e({token:s,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var Zk,Qk,eE=_(()=>{"use strict";q();Ro();cu();Zk=4096;Qk=$1()});import{JSDOM as D1}from"jsdom";import{Readability as L1}from"@mozilla/readability";import F1 from"turndown";function tE(e){return e.replace(/\n{3,}/g,`
|
|
1080
1080
|
|
|
1081
|
-
`).trim()}function N1(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function rE(e,t){let r=new D1(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new L1(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=tE(Ag.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=tE(Ag.turndown(a));return{title:o,markdown:l,textLength:N1(i),usedFallback:!0}}var nE,Ag,oE=_(()=>{"use strict";nE=200,Ag=new F1({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Ag.remove(["script","style","noscript","iframe"])});import{readFileSync as B1}from"node:fs";import{join as U1}from"path";function j1(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function sE(e,t){return j1(t).test(e)}function K1(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(H1.has(t))return!0;if(W1.has(t))return!1}return!1}function iE(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function G1(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function q1(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function z1(e){try{return B1(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function J1(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return n}function aE(e){let t=e?.env??v,n=e?.readFileSync??z1,r=e?.surface??t.AGENT_SURFACE,o=K1(t.AFK_BROWSER_HEADLESS,r),s=iE(t.AFK_BROWSER_ALLOWED_DOMAINS),i=iE(t.AFK_BROWSER_BLOCKED_DOMAINS),a=q1(t.AFK_BROWSER_DOM_SNAPSHOTS),l=G1(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():U1(en(),"browser.json"),p=n(d);if(p===void 0)return c;let m;try{m=JSON.parse(p)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${d} must be a JSON object`);let g=J1(c,m);return g.configPath=d,g}function _g(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(sE(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>sE(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var H1,W1,Ig=_(()=>{"use strict";q();G();H1=new Set(["daemon","subagent","telegram","afk"]),W1=new Set(["repl","interactive","cli"])});import V1 from"node:fs";import Y1 from"node:path";import{chromium as X1}from"playwright";function Z1(){try{return"4.44.0"}catch{}try{let e=Y1.resolve(import.meta.dirname,"../../../package.json"),t=V1.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Q1,uu,lE=_(()=>{"use strict";Q1=Z1(),uu=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=X1.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${Q1}`}}}});import{createHash as eH}from"crypto";function Pg(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of tH)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function cE(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&nH.test(e.label))}function uE(e){return eH("sha256").update(e,"utf8").digest("hex").slice(0,8)}function dE(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var tH,nH,Da=_(()=>{"use strict";tH=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];nH=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as rH}from"node:crypto";function oH(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function sH(e,t,n){return`el_${rH("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function iH(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function pE(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function fE(e,t){let n=e.role??"",r=e.name??"";mE.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])fE(s,t)}async function aH(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},gE).catch(()=>[])}async function lH(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},gE).catch(()=>[])}function cH(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function du(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=cH(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=aH(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],fE(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await lH(e)).filter(F=>mE.has(F.role??"")));let S=new Map;for(let P of p){let F=pE(P.name),$=S.get(F);(!$||$.bbox.w===0&&P.bbox.w>0)&&S.set(F,P)}let w=b.map(P=>({ax:P,dom:S.get(pE(P.name??""))})),x=r?w:w.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);x.sort((P,F)=>{let $=P.dom?.bbox.y??0,N=F.dom?.bbox.y??0;if($!==N)return $-N;let B=P.dom?.bbox.x??0,H=F.dom?.bbox.x??0;return B-H}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let C=x.slice(0,n).map((P,F)=>{let $=P.ax.role??"generic",N=P.ax.name??"",B=sH($,N,F),H=P.dom?.bbox??{x:0,y:0,w:0,h:0},D=P.dom?.type??null,I=null;P.ax.value!==void 0&&P.ax.value!==null&&(I=String(P.ax.value)),P.ax.checked!==void 0&&(I=String(P.ax.checked)),cE({role:$,kind:D})&&(I="[redacted]");let U={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(U.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(U.selected=P.ax.selected),P.ax.expanded!==void 0&&(U.expanded=P.ax.expanded);let M;P.dom?.testId?M=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(M=`#${P.dom.id}`);let j={id:B,role:$,label:oH(N),kind:D,value:I,state:U,bbox:H};return M!==void 0&&(j.selector=M),j}),R="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?R="loading":P==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let k=iH(m),L=`obs_${t.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:L,url:g,title:h,textSummary:k,interactive:C,status:{httpStatus:t.httpStatus??null,loadingState:R,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:A}}var mE,gE,hE=_(()=>{"use strict";Da();mE=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);gE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function yE(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Mg(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>yE(e,s)))).filter(o=>o!==null)}async function uH(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Og(e,t,n){switch(t.kind){case"element_id":return dH(e,t,n);case"selector":return pH(e,t);case"semantic":return mH(e,t)}}async function dH(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await Mg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function pH(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 Mg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function mH(e,t){return t.role!==void 0?fH(e,t.text,t.role):gH(e,t.text,t)}async function fH(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Mg(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function gH(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await uH(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await yE(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let x=0;x<S.length;x++)w=w*31+S.charCodeAt(x)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var bE=_(()=>{"use strict"});import{randomBytes as hH}from"crypto";import{mkdir as yH,stat as bH,writeFile as wH}from"fs/promises";import{join as $g}from"path";import{gzip as SH}from"zlib";import{promisify as vH}from"util";function kH(e){return $g(Ss(e),"browser")}function EH(e){return $g(kH(e),"screenshots")}function xH(){return new Date().toISOString().replace(/[:.]/g,"-")}function TH(){return hH(3).toString("hex")}async function Dg(e,t,n){if(t.length>wE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${wE} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=EH(e);await yH(r,{recursive:!0});let o=`${xH()}-${TH()}-${n}.png`,s=$g(r,o);await wH(s,t);let{size:i}=await bH(s);return{path:s,bytes:i}}var Dce,wE,SE=_(()=>{"use strict";G();Da();Dce=vH(SH);wE=5*1024*1024});var kE={};oc(kE,{PlaywrightProvider:()=>Lg});function vE(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 Lg,EE=_(()=>{"use strict";lE();hE();bE();Ig();Da();SE();Lg=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new uu(t)}async open(t){let n=_g(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await du(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await du(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=t.timeoutMs??3e4,a=await Og(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${vE(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=Pg(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=_g(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await du(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(t.target!==void 0){let u=await Og(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${vE(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var Ao={};oc(Ao,{__resetBrowserRegistryForTests:()=>IH,browserProviderActive:()=>AH,closeBrowserProvider:()=>Fg,getBrowserProvider:()=>CH,peekBrowserProvider:()=>_H});function xE(){Promise.resolve(Fg()).then(()=>{process.exit(130)})}function TE(){Promise.resolve(Fg()).then(()=>{process.exit(143)})}function RE(){xn=null}function RH(){pu||(process.on("SIGINT",xE),process.on("SIGTERM",TE),process.on("exit",RE),pu=!0)}function CE(){pu&&(process.removeListener("SIGINT",xE),process.removeListener("SIGTERM",TE),process.removeListener("exit",RE),pu=!1)}async function CH(e){return xn!==null?xn:(Co!==null||(Co=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(EE(),kE)),n=aE(e),r=new t(n);return RH(),xn=r,Co=null,r})()),Co)}async function Fg(){if(xn===null)return;let e=xn;xn=null,Co=null,CE(),await e.shutdown()}function AH(){return xn!==null}function _H(){return xn}function IH(){xn=null,Co=null,CE()}var xn,Co,pu,_o=_(()=>{"use strict";Ig();xn=null,Co=null,pu=!1});function AE(e,t){try{return rE(e,t)}catch(n){return J("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function DH(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(_o(),Ao));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function _E(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??DH,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:$H,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(OH.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(MH.test(u)&&!PH.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=AE(d,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<nE)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=AE(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var PH,MH,OH,$H,IE=_(()=>{"use strict";oE();Pe();PH=/(text\/html|application\/xhtml\+xml)/i,MH=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,OH=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,$H={"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 NH(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(LH,{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),FH),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=xo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function PE(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?NH({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 ME(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1081
|
+
`).trim()}function N1(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function rE(e,t){let r=new D1(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new L1(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=tE(Ag.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=tE(Ag.turndown(a));return{title:o,markdown:l,textLength:N1(i),usedFallback:!0}}var nE,Ag,oE=_(()=>{"use strict";nE=200,Ag=new F1({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Ag.remove(["script","style","noscript","iframe"])});import{readFileSync as B1}from"node:fs";import{join as U1}from"path";function j1(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function sE(e,t){return j1(t).test(e)}function K1(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(H1.has(t))return!0;if(W1.has(t))return!1}return!1}function iE(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function G1(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function q1(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function z1(e){try{return B1(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function J1(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return n}function aE(e){let t=e?.env??v,n=e?.readFileSync??z1,r=e?.surface??t.AGENT_SURFACE,o=K1(t.AFK_BROWSER_HEADLESS,r),s=iE(t.AFK_BROWSER_ALLOWED_DOMAINS),i=iE(t.AFK_BROWSER_BLOCKED_DOMAINS),a=q1(t.AFK_BROWSER_DOM_SNAPSHOTS),l=G1(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():U1(en(),"browser.json"),p=n(d);if(p===void 0)return c;let m;try{m=JSON.parse(p)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof m!="object"||m===null||Array.isArray(m))throw new Error(`Browser config at ${d} must be a JSON object`);let g=J1(c,m);return g.configPath=d,g}function _g(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(sE(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>sE(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var H1,W1,Ig=_(()=>{"use strict";q();G();H1=new Set(["daemon","subagent","telegram","afk"]),W1=new Set(["repl","interactive","cli"])});import V1 from"node:fs";import Y1 from"node:path";import{chromium as X1}from"playwright";function Z1(){try{return"4.44.2"}catch{}try{let e=Y1.resolve(import.meta.dirname,"../../../package.json"),t=V1.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var Q1,uu,lE=_(()=>{"use strict";Q1=Z1(),uu=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=X1.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${Q1}`}}}});import{createHash as eH}from"crypto";function Pg(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of tH)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function cE(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&nH.test(e.label))}function uE(e){return eH("sha256").update(e,"utf8").digest("hex").slice(0,8)}function dE(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var tH,nH,Da=_(()=>{"use strict";tH=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];nH=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as rH}from"node:crypto";function oH(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function sH(e,t,n){return`el_${rH("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function iH(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function pE(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function fE(e,t){let n=e.role??"",r=e.name??"";mE.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])fE(s,t)}async function aH(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},gE).catch(()=>[])}async function lH(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},gE).catch(()=>[])}function cH(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function du(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=cH(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=aH(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],fE(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await lH(e)).filter(F=>mE.has(F.role??"")));let S=new Map;for(let P of p){let F=pE(P.name),$=S.get(F);(!$||$.bbox.w===0&&P.bbox.w>0)&&S.set(F,P)}let w=b.map(P=>({ax:P,dom:S.get(pE(P.name??""))})),x=r?w:w.filter(P=>P.dom?P.dom.bbox.w>0||P.dom.bbox.h>0:!0);x.sort((P,F)=>{let $=P.dom?.bbox.y??0,N=F.dom?.bbox.y??0;if($!==N)return $-N;let B=P.dom?.bbox.x??0,H=F.dom?.bbox.x??0;return B-H}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let C=x.slice(0,n).map((P,F)=>{let $=P.ax.role??"generic",N=P.ax.name??"",B=sH($,N,F),H=P.dom?.bbox??{x:0,y:0,w:0,h:0},D=P.dom?.type??null,I=null;P.ax.value!==void 0&&P.ax.value!==null&&(I=String(P.ax.value)),P.ax.checked!==void 0&&(I=String(P.ax.checked)),cE({role:$,kind:D})&&(I="[redacted]");let U={disabled:P.ax.disabled??!1};P.ax.checked!==void 0&&(U.checked=P.ax.checked===!0||P.ax.checked==="mixed"),P.ax.selected!==void 0&&(U.selected=P.ax.selected),P.ax.expanded!==void 0&&(U.expanded=P.ax.expanded);let M;P.dom?.testId?M=`[data-testid="${P.dom.testId}"]`:P.dom?.id&&(M=`#${P.dom.id}`);let j={id:B,role:$,label:oH(N),kind:D,value:I,state:U,bbox:H};return M!==void 0&&(j.selector=M),j}),R="idle";try{let P=await e.evaluate(()=>document.readyState);P==="loading"?R="loading":P==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let k=iH(m),L=`obs_${t.observationCounter.toString(36)}`,A=new Date().toISOString();return{observationId:L,url:g,title:h,textSummary:k,interactive:C,status:{httpStatus:t.httpStatus??null,loadingState:R,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:A}}var mE,gE,hE=_(()=>{"use strict";Da();mE=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);gE="a[href], button, input, select, textarea, [role], [tabindex], label"});async function yE(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Mg(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>yE(e,s)))).filter(o=>o!==null)}async function uH(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function Og(e,t,n){switch(t.kind){case"element_id":return dH(e,t,n);case"selector":return pH(e,t);case"semantic":return mH(e,t)}}async function dH(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await Mg(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function pH(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 Mg(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function mH(e,t){return t.role!==void 0?fH(e,t.text,t.role):gH(e,t.text,t)}async function fH(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Mg(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function gH(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await uH(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await yE(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let x=0;x<S.length;x++)w=w*31+S.charCodeAt(x)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var bE=_(()=>{"use strict"});import{randomBytes as hH}from"crypto";import{mkdir as yH,stat as bH,writeFile as wH}from"fs/promises";import{join as $g}from"path";import{gzip as SH}from"zlib";import{promisify as vH}from"util";function kH(e){return $g(Ss(e),"browser")}function EH(e){return $g(kH(e),"screenshots")}function xH(){return new Date().toISOString().replace(/[:.]/g,"-")}function TH(){return hH(3).toString("hex")}async function Dg(e,t,n){if(t.length>wE)throw new Error(`writeScreenshotSidecar: buffer exceeds ${wE} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=EH(e);await yH(r,{recursive:!0});let o=`${xH()}-${TH()}-${n}.png`,s=$g(r,o);await wH(s,t);let{size:i}=await bH(s);return{path:s,bytes:i}}var Dce,wE,SE=_(()=>{"use strict";G();Da();Dce=vH(SH);wE=5*1024*1024});var kE={};oc(kE,{PlaywrightProvider:()=>Lg});function vE(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 Lg,EE=_(()=>{"use strict";lE();hE();bE();Ig();Da();SE();Lg=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new uu(t)}async open(t){let n=_g(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await du(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await du(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=t.timeoutMs??3e4,a=await Og(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${vE(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=Pg(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=_g(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await du(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(t.target!==void 0){let u=await Og(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${vE(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Dg(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await Dg(n,o,r);return s}catch{return null}}}});var Ao={};oc(Ao,{__resetBrowserRegistryForTests:()=>IH,browserProviderActive:()=>AH,closeBrowserProvider:()=>Fg,getBrowserProvider:()=>CH,peekBrowserProvider:()=>_H});function xE(){Promise.resolve(Fg()).then(()=>{process.exit(130)})}function TE(){Promise.resolve(Fg()).then(()=>{process.exit(143)})}function RE(){xn=null}function RH(){pu||(process.on("SIGINT",xE),process.on("SIGTERM",TE),process.on("exit",RE),pu=!0)}function CE(){pu&&(process.removeListener("SIGINT",xE),process.removeListener("SIGTERM",TE),process.removeListener("exit",RE),pu=!1)}async function CH(e){return xn!==null?xn:(Co!==null||(Co=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(EE(),kE)),n=aE(e),r=new t(n);return RH(),xn=r,Co=null,r})()),Co)}async function Fg(){if(xn===null)return;let e=xn;xn=null,Co=null,CE(),await e.shutdown()}function AH(){return xn!==null}function _H(){return xn}function IH(){xn=null,Co=null,CE()}var xn,Co,pu,_o=_(()=>{"use strict";Ig();xn=null,Co=null,pu=!1});function AE(e,t){try{return rE(e,t)}catch(n){return J("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function DH(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(_o(),Ao));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function _E(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??DH,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:$H,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(OH.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(MH.test(u)&&!PH.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=AE(d,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<nE)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=AE(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var PH,MH,OH,$H,IE=_(()=>{"use strict";oE();Pe();PH=/(text\/html|application\/xhtml\+xml)/i,MH=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,OH=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,$H={"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 NH(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(LH,{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),FH),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=xo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function PE(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?NH({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 ME(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1082
1082
|
|
|
1083
1083
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
1084
1084
|
`).trimEnd()}var LH,FH,OE=_(()=>{"use strict";To();LH="https://api.exa.ai/search",FH=10});function qH(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=BH;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(t.timeout_ms,UH)}let a=jH;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,HH)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Ng(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+WH}function zH(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return GH.some(o=>r.includes(o))}function JH(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=qH(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let u=i.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let d;try{d=await t(s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(m){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await d.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}return{content:Ng(p,s.maxBytes)}}if(s.mode==="markdown")try{let d=await _E(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return d.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:Ng(d.markdown,s.maxBytes)}}catch(d){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=d instanceof Error?d.message:String(d),m=zH(d)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${m}`,isError:!0}}let u=PE({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let d=await u.search(s.query,{limit:KH,timeoutMs:s.timeoutMs,signal:i.signal});return{content:Ng(ME(s.query,d),s.maxBytes)}}catch(d){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${d instanceof Error?d.message:String(d)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var BH,UH,jH,HH,WH,KH,GH,$E,DE=_(()=>{"use strict";IE();OE();BH=3e4,UH=12e4,jH=1e6,HH=1e7,WH=`
|
|
@@ -1508,7 +1508,7 @@ ${t.body}`)}var R2,zh=_(()=>{"use strict";R2=/(?<![a-zA-Z0-9_/-])--([a-z][a-z0-9
|
|
|
1508
1508
|
`);for(let c=0;c<l.length;c++){let u=l[c];if(!u)continue;let d=u.indexOf(":");if(d===-1)continue;let p=u.slice(0,d).trim(),m=u.slice(d+1).trim();if(p==="name")a.name=m.replace(/^["']|["']$/g,"");else if(p==="description")a.description=m.replace(/^["']|["']$/g,"");else if(p==="argumentHint")a.argumentHint=m.replace(/^["']|["']$/g,"");else if(p==="tools"){let g=l.slice(c+1),h=j2(m,g),b=W2(t),y=[];for(let S of h){let w=U2(S,b);w!==void 0?y.includes(w)||y.push(w):process.stderr.write(`[afk] plugin skill at ${e}: unknown tool "${S}" in \`tools:\` frontmatter \u2014 ignored
|
|
1509
1509
|
`)}y.length===0&&h.length>0&&process.stderr.write(`[afk] plugin skill at ${e}: \`tools:\` declared but no valid tools resolved \u2014 subagent will be blocked from all tools
|
|
1510
1510
|
`),a.allowedTools=y}else if(p==="audience"){let g=m.replace(/^["']|["']$/g,"");(g==="public"||g==="internal")&&(a.audience=g)}else p==="context"?a.context=m.replace(/^["']|["']$/g,""):(p==="read-only"||p==="readOnly")&&m.replace(/^["']|["']$/g,"").trim()==="true"&&(a.readOnly=!0)}return i.length>0&&(a.body=i),a}catch{return{}}}function W2(e){return e!==void 0?e:new Set([...Kt,...ut,"memory_search","agent","skill"])}var B2,lC=_(()=>{"use strict";vn();En();B2={read:"read_file",edit:"edit_file",write:"write_file",bash:"bash",grep:"grep",glob:"glob",ls:"list_directory",list:"list_directory",webfetch:"web_scrape",websearch:"web_scrape",webbrowse:"web_scrape"}});function cC(e){let t=lr(e);if(t.length===0)return"";let n=[];for(let r of t){let o=r.argumentHint?`${r.argumentHint}`:"",s=o?`- \`${r.name} ${o}\`: ${r.description}`:`- ${r.name}: ${r.description}`;n.push(s),r.whenToUse&&n.push(` When to use: ${r.whenToUse}`)}return["Available skills (invoke via the `skill` tool):","","Each skill either dispatches one or more context-isolated subagents (delegation \u2014 preserves the main session's context) or loads its instructions directly into your current context (`load` mode). Calling `skill` is the entry point for both; the executor picks the mode per skill. Prefer a skill over inline investigation when the task shape matches.","",...n].join(`
|
|
1511
|
-
`)}function lr(e){let t=[],n=new Set,r=v.AFK_INTERNAL==="1",o=on(_t());pr(ic(),"user"),pr(ac(),"project");for(let{dir:i,origin:a}of o.skillRoots)pr(i,a);for(let i of Jn()){let a=Ke(i);rn(a,r)&&(t.push({name:i,description:a.description,source:a.origin==="user"?"user":a.origin==="project"?"project":a.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:a.argumentHint,whenToUse:a.whenToUse}),n.add(i))}let s=e??[...Dt(da()),...Dt(),...Dt(mo()),...o.pluginRoots.flatMap(i=>Dt(i,{trustAll:!0}))];for(let i of s){if(i.type!=="local")continue;let a=Xh(i.path);for(let l of a)!l.name||n.has(l.name)||rn({audience:l.audience},r)&&(t.push({name:l.name,description:l.description??`Skill from plugin at ${i.path}`,source:"plugin"}),n.add(l.name))}return t}function Vu(e){let t=new Map,n=e??[...Dt(da()),...Dt(),...Dt(mo()),...on(_t()).pluginRoots.flatMap(r=>Dt(r,{trustAll:!0}))];for(let r of n){if(r.type!=="local")continue;let o=Xh(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&!t.has(s.name)&&t.set(s.name,{body:s.body,pluginPath:r.path,...s.allowedTools!==void 0?{allowedTools:s.allowedTools}:{},...s.context!==void 0?{context:s.context}:{},...s.readOnly===!0?{readOnly:!0}:{}})}return t}var Mo=_(()=>{"use strict";Yh();gt();Vh();Wr();lC();G();q();sr()});function uC(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}var dC=_(()=>{"use strict"});function pC(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var mC=_(()=>{"use strict"});var K2,ud,fC=_(()=>{"use strict";K2="__closed__",ud=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(t=>{this.closeResolve=()=>t(K2)})}begin(){let t=new AbortController;return this.current=t,this.pendingReason!==null&&!t.signal.aborted&&(t.abort(this.pendingReason),this.pendingReason=null),t}clear(t){this.current===t&&(this.current=null)}requestAbort(t){let n=this.current;if(n&&!n.signal.aborted){n.abort(t);return}this.pendingReason=t}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}}});function q2(e,t,n,r,o){let s=G2.get(e);if(!s)return;let i=1e6,l=Math.max(0,t-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,u=s.cacheWritePerMTok??s.inputPerMTok*1.25,d=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*u,m=r/i*d;return l+c+p+m}function gC(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=q2(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var G2,hC=_(()=>{"use strict";oh();G2=new Map([["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]])});function z2(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function J2(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):r.push({type:"tool_use",id:a.id,name:a.name,input:z2(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:t,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*yC(e,t){let n=[],r=null,o=null,s=!1,i=!!v.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(i&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}i&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(a){i&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:J2(n,r,o)}}var bC=_(()=>{"use strict";q()});import{randomUUID as V2}from"node:crypto";function X2(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}function Z2(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function wC(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}function vC(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=setTimeout(n,e);r.unref(),t.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})})}async function Q2(e,t,n,r){for(let o=0;;o++){if(o>0){let s=SC*Math.pow(2,o-1);if(await vC(s,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let i=s instanceof Error?s:new Error(String(s));if(Z2(i)&&o<Zh)continue;throw i}}}function eq(e,t){if(!t||typeof t!="object")return"";let n=t;if(e==="skill"||e==="Skill"){let i=n.name;return typeof i=="string"&&i.length>0?`(${i.length>60?i.slice(0,59)+"\u2026":i})`:""}let r=n.file_path??n.path??n.filePath;if(typeof r=="string")return" "+r;let o=n.command??n.cmd;if(typeof o=="string"){let i=o.split(`
|
|
1511
|
+
`)}function lr(e){let t=[],n=new Set,r=v.AFK_INTERNAL==="1",o=on(_t());pr(ic(),"user"),pr(ac(),"project");for(let{dir:i,origin:a}of o.skillRoots)pr(i,a);for(let i of Jn()){let a=Ke(i);rn(a,r)&&(t.push({name:i,description:a.description,source:a.origin==="user"?"user":a.origin==="project"?"project":a.origin?.startsWith("imported:")?"imported":"builtin",argumentHint:a.argumentHint,whenToUse:a.whenToUse}),n.add(i))}let s=e??[...Dt(da()),...Dt(),...Dt(mo()),...o.pluginRoots.flatMap(i=>Dt(i,{trustAll:!0}))];for(let i of s){if(i.type!=="local")continue;let a=Xh(i.path);for(let l of a)!l.name||n.has(l.name)||rn({audience:l.audience},r)&&(t.push({name:l.name,description:l.description??`Skill from plugin at ${i.path}`,source:"plugin"}),n.add(l.name))}return t}function Vu(e){let t=new Map,n=e??[...Dt(da()),...Dt(),...Dt(mo()),...on(_t()).pluginRoots.flatMap(r=>Dt(r,{trustAll:!0}))];for(let r of n){if(r.type!=="local")continue;let o=Xh(r.path);for(let s of o)s.name&&s.body&&s.body.length>0&&!t.has(s.name)&&t.set(s.name,{body:s.body,pluginPath:r.path,...s.allowedTools!==void 0?{allowedTools:s.allowedTools}:{},...s.context!==void 0?{context:s.context}:{},...s.readOnly===!0?{readOnly:!0}:{}})}return t}var Mo=_(()=>{"use strict";Yh();gt();Vh();Wr();lC();G();q();sr()});function uC(e){if(e.length===0)return;let t=e[e.length-1];if(!t||t.role!=="assistant"||typeof t.content=="string")return;let n=t.content,r=[];for(let s of n)s.type==="tool_use"&&typeof s.id=="string"&&r.push(s.id);if(r.length===0)return;let o={role:"user",content:r.map(s=>({type:"tool_result",tool_use_id:s,content:"Tool call interrupted before completing \u2014 no result recorded.",is_error:!0}))};e.push(o)}var dC=_(()=>{"use strict"});function pC(e){return{messages:e.initialMessages?[...e.initialMessages]:[],currentModel:e.model,requestedModel:e.requestedModel??e.model,currentPermissionMode:e.permissionMode,userSystem:e.userSystem,toolDispatcher:e.toolDispatcher,lastUsage:null,closed:!1,autoCompactThreshold:e.autoCompactThreshold}}var mC=_(()=>{"use strict"});var K2,ud,fC=_(()=>{"use strict";K2="__closed__",ud=class{current=null;pendingReason=null;closedPromise;closeResolve=null;constructor(){this.closedPromise=new Promise(t=>{this.closeResolve=()=>t(K2)})}begin(){let t=new AbortController;return this.current=t,this.pendingReason!==null&&!t.signal.aborted&&(t.abort(this.pendingReason),this.pendingReason=null),t}clear(t){this.current===t&&(this.current=null)}requestAbort(t){let n=this.current;if(n&&!n.signal.aborted){n.abort(t);return}this.pendingReason=t}isIdle(){return this.current===null}markClosed(){this.closeResolve?.()}}});function q2(e,t,n,r,o){let s=G2.get(e);if(!s)return;let i=1e6,l=Math.max(0,t-r-o)/i*s.inputPerMTok,c=n/i*s.outputPerMTok,u=s.cacheWritePerMTok??s.inputPerMTok*1.25,d=s.cacheReadPerMTok??s.inputPerMTok*.1,p=o/i*u,m=r/i*d;return l+c+p+m}function gC(e,t,n){if(!e)return{stopReason:t??null};let r={inputTokens:e.input_tokens,outputTokens:e.output_tokens,stopReason:t??null};if(e.cache_read_input_tokens!=null&&(r.cachedInputTokens=e.cache_read_input_tokens),e.cache_creation_input_tokens!=null&&(r.cacheCreationTokens=e.cache_creation_input_tokens),r.totalTokens=(e.input_tokens??0)+(e.output_tokens??0),n){let o=q2(n,e.input_tokens??0,e.output_tokens??0,e.cache_read_input_tokens??0,e.cache_creation_input_tokens??0);o!==void 0&&(r.totalCostUsd=o)}return r}var G2,hC=_(()=>{"use strict";oh();G2=new Map([["claude-sonnet-4-5-20250929",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-opus-4-5-20250929",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-haiku-4-5-20250929",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-haiku-4-5-20251001",{inputPerMTok:1,outputPerMTok:5,cacheWritePerMTok:1.25,cacheReadPerMTok:.1}],["claude-3-7-sonnet-20250219",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20241022",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-sonnet-20240620",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-5-haiku-20241022",{inputPerMTok:.8,outputPerMTok:4,cacheWritePerMTok:1,cacheReadPerMTok:.08}],["claude-3-opus-20240229",{inputPerMTok:15,outputPerMTok:75,cacheWritePerMTok:18.75,cacheReadPerMTok:1.5}],["claude-3-sonnet-20240229",{inputPerMTok:3,outputPerMTok:15,cacheWritePerMTok:3.75,cacheReadPerMTok:.3}],["claude-3-haiku-20240307",{inputPerMTok:.25,outputPerMTok:1.25,cacheWritePerMTok:.3,cacheReadPerMTok:.03}]])});function z2(e){let t=e.trim();if(t.length===0)return{};try{return JSON.parse(t)}catch{return{}}}function J2(e,t,n){let r=[],o=[];for(let a of e)a&&(a.kind==="text"?(r.push({type:"text",text:a.text}),o.push(a.text)):a.kind==="thinking"?a.thinking&&a.signature&&r.push({type:"thinking",thinking:a.thinking,signature:a.signature}):a.kind==="redacted_thinking"?r.push({type:"redacted_thinking",data:a.data}):r.push({type:"tool_use",id:a.id,name:a.name,input:z2(a.partialJson)}));let s=a=>a.type==="tool_use",i=r.filter(s);return{stopReason:t,assistantBlocks:r,toolUseBlocks:i,usage:n,text:o.join("")}}async function*yC(e,t){let n=[],r=null,o=null,s=!1,i=!!v.AFK_TELEGRAM_TRACE;try{i&&console.log("[translate] starting SDK event iteration");for await(let a of e){switch(i&&console.log("[translate] SDK evt:",a.type),a.type){case"message_start":{let l=a.message?.usage;l&&(o={...l});break}case"content_block_start":{let l=a.content_block;l.type==="text"?n[a.index]={kind:"text",text:""}:l.type==="thinking"?n[a.index]={kind:"thinking",thinking:"",signature:""}:l.type==="redacted_thinking"?n[a.index]={kind:"redacted_thinking",data:l.data}:l.type==="tool_use"&&(n[a.index]={kind:"tool_use",id:l.id,name:l.name,partialJson:""},yield{kind:"event",event:{type:"tool.use.start",toolUseId:l.id,toolName:l.name,toolInput:" \u2026",sessionId:t.sessionId}});break}case"content_block_delta":{let l=n[a.index],c=a.delta;c.type==="text_delta"?(l&&l.kind==="text"&&(l.text+=c.text),yield{kind:"event",event:{type:"delta.text",text:c.text,sessionId:t.sessionId}}):c.type==="input_json_delta"?l&&l.kind==="tool_use"&&(l.partialJson+=c.partial_json):c.type==="thinking_delta"?(l&&l.kind==="thinking"&&(l.thinking+=c.thinking),yield{kind:"event",event:{type:"delta.reasoning",text:c.thinking,sessionId:t.sessionId}}):c.type==="signature_delta"&&l&&l.kind==="thinking"&&(l.signature=c.signature);break}case"content_block_stop":{let l=n[a.index];l&&l.kind==="tool_use"&&(yield{kind:"event",event:{type:"tool.use",summary:l.name,toolUseIds:[l.id],sessionId:t.sessionId}});break}case"message_delta":{a.delta&&a.delta.stop_reason!==void 0&&(r=a.delta.stop_reason);let l=a.usage;l&&(o!==null?(o.output_tokens=l.output_tokens,l.cache_creation_input_tokens!=null&&(o.cache_creation_input_tokens=l.cache_creation_input_tokens),l.cache_read_input_tokens!=null&&(o.cache_read_input_tokens=l.cache_read_input_tokens),l.input_tokens!=null&&(o.input_tokens=l.input_tokens)):o={cache_creation:null,cache_creation_input_tokens:l.cache_creation_input_tokens??null,cache_read_input_tokens:l.cache_read_input_tokens??null,inference_geo:null,input_tokens:l.input_tokens??0,output_tokens:l.output_tokens,server_tool_use:null,service_tier:null});break}case"message_stop":{s=!0;break}default:break}if(s)break}i&&console.log("[translate] SDK iteration ended naturally, stopped=",s)}catch(a){i&&console.log("[translate] SDK iteration threw:",a.message),yield{kind:"event",event:{type:"error",error:a instanceof Error?a:new Error(String(a))}};return}i&&console.log("[translate] yielding turn-result"),yield{kind:"turn-result",result:J2(n,r,o)}}var bC=_(()=>{"use strict";q()});import{randomUUID as V2}from"node:crypto";function X2(e){let{name:t,description:n,input_schema:r}=e;return{name:t,...n!==void 0?{description:n}:{},input_schema:r}}function Z2(e){if(!("status"in e))return!1;let t=e.status;return t===529||t===503}function wC(e){if(e===null||typeof e!="object")return!1;let t=e;if(t.status===529||t.status===503)return!0;let n=t.error;if(n===null||typeof n!="object")return!1;let r=n;return((r.error!==null&&typeof r.error=="object"?r.error.type:void 0)??r.type)==="overloaded_error"}function vC(e,t){return new Promise(n=>{if(t.aborted){n();return}let r=setTimeout(n,e);r.unref(),t.addEventListener("abort",()=>{clearTimeout(r),n()},{once:!0})})}async function Q2(e,t,n,r){for(let o=0;;o++){if(o>0){let s=SC*Math.pow(2,o-1);if(await vC(s,r),r.aborted)throw new Error("aborted")}try{return await Promise.resolve(e.messages.create(t,{headers:n,signal:r}))}catch(s){if(r.aborted)throw s;let i=s instanceof Error?s:new Error(String(s));if(Z2(i)&&o<Zh)continue;throw i}}}function eq(e,t){if(!t||typeof t!="object")return"";let n=t;if(e==="skill"||e==="Skill"){let i=n.name;return typeof i=="string"&&i.length>0?`(${i.length>60?i.slice(0,59)+"\u2026":i})`:""}let r=n.file_path??n.path??n.filePath;if(typeof r=="string")return" "+r;let o=n.command??n.cmd;if(typeof o=="string"){let i=o.split(`
|
|
1512
1512
|
`)[0];return" "+(i.length>80?i.slice(0,77)+"\u2026":i)}let s=n.query??n.pattern??n.url??n.description;return typeof s=="string"?" "+s:""}async function*Qh(e){let t=e.maxToolUseIterations??Y2,n={stopReason:null},r=0,o=0,s=V2(),i=Date.now(),a=l=>({...l,durationMs:Date.now()-i});De(e.traceWriter,{phase:"loop_start"});try{for(;;){if(e.signal.aborted){yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId};return}let l=Ic({baseUrl:e.baseUrl})?Tv(e.messages,Pc()):e.messages,c={model:e.model,max_tokens:e.maxTokens,messages:l,stream:!0,...e.system!==null?{system:e.system}:{},...e.tools!==null&&e.tools.length>0?{tools:e.tools.map(X2)}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{output_config:{effort:e.effort}}:{}},u=Date.now(),d;try{d=await Q2(e.client,c,e.headers,e.signal)}catch(w){if(e.signal.aborted){yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId};return}let x=w instanceof Error?w:new Error(String(w));x.message.includes("thinking")&&tq(e.messages,x),yield{type:"error",error:x};return}let p=null,m=!1,g=!1,h=!1;try{v.AFK_TELEGRAM_TRACE&&console.log("[loop] awaiting translateMessageStream events");for await(let w of yC(d,e.ctx))if(h||(h=!0,De(e.traceWriter,{phase:"model_ttfb",durationMs:Date.now()-u,resolvedModel:e.model})),v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate yielded:",w.kind,w.kind==="event"?w.event.type:""),w.kind==="event"){if(w.event.type==="error"){if(wC(w.event.error)&&o<Zh&&!e.signal.aborted){g=!0;break}yield w.event,m=!0;break}yield w.event}else{p=w.result;break}v.AFK_TELEGRAM_TRACE&&console.log("[loop] translate loop exited, turnResult=",p?"set":"null")}catch(w){if(e.signal.aborted){yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId};return}let x=w instanceof Error?w:new Error(String(w));if(wC(x)&&o<Zh&&!e.signal.aborted)g=!0;else{yield{type:"error",error:x};return}}if(g){if(o+=1,yield{type:"stream.retry",sessionId:e.ctx.sessionId},await vC(SC*Math.pow(2,o-1),e.signal),e.signal.aborted){yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId};return}continue}if(o=0,m){e.signal.aborted&&(yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId});return}if(p===null){yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId};return}let b=gC(p.usage,p.stopReason,e.model);if(n=Ba(n,b),n.contextWindowTokens=(b.inputTokens??0)+(b.outputTokens??0)+(b.cachedInputTokens??0)+(b.cacheCreationTokens??0),e.onUsageProgress?.(n),p.stopReason!=="tool_use"){p.text.length>0&&(yield{type:"assistant.message",text:p.text,sessionId:e.ctx.sessionId},p.text.length<=200&&(yield{type:"suggestion",suggestion:p.text,sessionId:e.ctx.sessionId}));let w=p.assistantBlocks.filter(x=>x.type!=="tool_use");w.length>0&&e.messages.push({role:"assistant",content:w}),yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId};return}let y=e.messages.length;e.messages.push({role:"assistant",content:p.assistantBlocks});try{let w=[],x=new Map;for(let k of p.toolUseBlocks){w.push({id:k.id,name:k.name,input:k.input,signal:e.signal});let L=Date.now();x.set(k.id,L),Rs(e.traceWriter,{phase:"started",toolUseId:k.id,name:k.name,inputBytes:Buffer.byteLength(JSON.stringify(k.input??{}),"utf8")}),yield{type:"tool.use.start",toolUseId:k.id,toolName:k.name,toolInput:eq(k.name,k.input),toolInputRaw:Fu(k.input),sessionId:e.ctx.sessionId}}if(e.signal.aborted){let k=w.map(L=>({type:"tool_result",tool_use_id:L.id,content:"Tool call aborted",is_error:!0}));e.messages.push({role:"user",content:k}),yield{type:"turn.completed",usage:a(n),sessionId:e.ctx.sessionId};return}let T;if(e.toolDispatcher.executeBatch)try{T=await e.toolDispatcher.executeBatch(w)}catch(k){T=w.map(()=>({content:`Tool batch execution failed: ${k instanceof Error?k.message:String(k)}`,isError:!0}))}else{T=[];for(let k of w){if(e.signal.aborted){T.push({content:"Tool call aborted",isError:!0});continue}try{T.push(await e.toolDispatcher.execute(k))}catch(L){let A=L instanceof Error?L.message:String(L);T.push({content:`Tool execution threw: ${A}`,isError:!0})}}}let C=[];for(let k=0;k<w.length;k++){let L=w[k],A=T[k],P=x.get(L.id),F=typeof P=="number"?Date.now()-P:0,$=A.truncated===!0||A.content.includes("[output truncated");Rs(e.traceWriter,{phase:"completed",toolUseId:L.id,name:L.name,resultBytes:Buffer.byteLength(A.content,"utf8"),isError:A.isError===!0,truncated:$,durationMs:F,...A.circuitBreaker===!0?{circuitBreaker:!0}:{},...A.failureClass?{failureClass:A.failureClass}:{}}),yield{type:"tool.output",toolUseId:L.id,toolName:L.name,content:A.content,...A.isError===!0?{isError:!0}:{},...$?{truncated:!0}:{},sessionId:e.ctx.sessionId},A.render?.diff&&(yield{type:"tool.diff",toolUseId:L.id,diff:A.render.diff,sessionId:e.ctx.sessionId});let{content:N,isError:B,image:H}=A,D=H!==void 0?[{type:"image",source:{type:"base64",media_type:H.mediaType,data:H.data}},...N.length>0?[{type:"text",text:N}]:[]]:N;C.push({type:"tool_result",tool_use_id:L.id,content:D,...B===!0?{is_error:!0}:{}})}let R={role:"user",content:C};e.messages.push(R)}catch(w){throw e.messages.splice(y),w}r+=1;let S=p.toolUseBlocks[p.toolUseBlocks.length-1];if(yield{type:"progress",progress:{taskId:s,description:"Tool-use loop",summary:`Iteration ${r}: used ${S?.name??"unknown"}`,lastToolName:S?.name,totalTokens:n.totalTokens??0,toolUses:r,durationMs:Date.now()-i},sessionId:e.ctx.sessionId},t>0&&r>=t){yield{type:"turn.completed",usage:a({...n,stopReason:"tool_use_loop_capped"}),sessionId:e.ctx.sessionId};return}}}finally{De(e.traceWriter,{phase:"loop_end",durationMs:Date.now()-i})}}function tq(e,t){try{let n=[];for(let r=0;r<e.length;r++){let o=e[r];if(o.role!=="assistant"||typeof o.content=="string")continue;let s=o.content;for(let i=0;i<s.length;i++){let a=s[i];if(a.type==="thinking"){let l=a;(!l.thinking||!l.signature)&&n.push({msgIdx:r,blockIdx:i,thinking:l.thinking?`(${l.thinking.length} chars)`:"(empty)",sigLen:l.signature?.length??0})}}}console.error("[afk] thinking-block diagnostic \u2014 API rejected request with:",t.message),console.error(`[afk] messages.length=${e.length}, invalid thinking blocks:`,n.length>0?JSON.stringify(n):"none found (cause may be elsewhere)")}catch{}}var Y2,Zh,SC,kC=_(()=>{"use strict";hC();$f();bC();We();sh();q();Y2=0;Zh=3,SC=5e3});function ey(e){if(!("status"in e))return null;let t=e.status;if(t===429){let n=e.message.split("|");if(n.length>=2){let r=parseInt(n[1].trim(),10);if(!isNaN(r)&&r>0)return{kind:"oauth-limit",resetsAt:new Date(r*1e3)}}return{kind:"oauth-limit-no-ts"}}return t===400&&e.message.includes("invalid_request_error")&&e.message.includes("credit balance")?{kind:"credit-exhausted"}:null}async function EC(e){let{resetsAt:t,signal:n,readToken:r=ft}=e,o=r(),s=t.getTime()+3e4;return new Promise(i=>{let a,l=!1,c=p=>{l||(l=!0,a!==void 0&&clearInterval(a),n.removeEventListener("abort",u),i(p))},u=()=>{c("aborted")},d=()=>n.aborted?(c("aborted"),!0):Date.now()>=s?(c("timer"),!0):r()!==o?(c("hot-swap"),!0):!1;d()||(a=setInterval(()=>{d()},3e4),a.unref(),n.addEventListener("abort",u,{once:!0}))})}async function xC(e){let{signal:t,readToken:n=ft,retryAfterMs:r}=e,o=n(),s=r!==void 0?Date.now()+r:void 0;return new Promise(i=>{let a,l=!1,c=p=>{l||(l=!0,a!==void 0&&clearInterval(a),t.removeEventListener("abort",u),i(p))},u=()=>{c("aborted")},d=()=>t.aborted?(c("aborted"),!0):n()!==o?(c("hot-swap"),!0):s!==void 0&&Date.now()>=s?(c("timer"),!0):!1;d()||(a=setInterval(()=>{d()},3e4),a.unref(),t.addEventListener("abort",u,{once:!0}))})}var TC=_(()=>{"use strict";$s()});var RC=_(()=>{"use strict";$s()});import{randomUUID as ty}from"node:crypto";var CC,nq,dd,AC=_(()=>{"use strict";kC();_s();TC();RC();CC=7200*1e3,nq=60*1e3,dd=class{_client;_authMode;initSessionId;tokenRefresher;autoResumeOnUsageLimit;refreshPromise=null;usageLimitWaitPromise=null;constructor(t){this._client=t.client,this._authMode=t.authMode,this.initSessionId=t.initSessionId,this.tokenRefresher=t.tokenRefresher,this.autoResumeOnUsageLimit=t.autoResumeOnUsageLimit}get client(){return this._client}get authMode(){return this._authMode}async forceClientRefresh(){if(!this.tokenRefresher)return null;let t=ft(),n=null;try{if(this.refreshPromise)n=await this.refreshPromise;else{this.refreshPromise=this.tokenRefresher();try{n=await this.refreshPromise??null}finally{this.refreshPromise=null}}}catch{return this.refreshPromise=null,null}if(!n)return null;this._client=n;let r=ft();return{accountId:Rr(r??""),swapped:t!==r}}async*turnWithRetries(t,n){yield*this.turnWithUsageLimitRetry(t,n)}async*turnWithUsageLimitRetry(t,n){let r=null,o=null,s=!1;for await(let c of this.turnWithAuthRetry(t,n)){if(c.type==="error"){let u=ey(c.error);if(u&&u.kind==="oauth-limit"){o=u.resetsAt,r=c;break}if(u&&u.kind==="oauth-limit-no-ts"){s=!0,r=c;break}}yield c}if(!r)return;if(s){let c=Rr(ft()??"");if(yield{type:"paused",reason:"usage-limit",accountId:c,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let u=Date.now(),d=!1;for(;;){let p;if(this.usageLimitWaitPromise)p="aborted";else{this.usageLimitWaitPromise=xC({signal:t.signal,retryAfterMs:nq});try{p=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(p==="aborted")return;let m=c;if(p==="hot-swap"){let h=await this.forceClientRefresh();h&&(t.client=this._client,m=h.accountId)}t.headers=wn(this._authMode,this.initSessionId,ty());let g=null;for await(let h of this.turnWithAuthRetry(t,n)){if(!d&&h.type==="error"){let b=ey(h.error);if(b&&(b.kind==="oauth-limit"||b.kind==="oauth-limit-no-ts")){g=h;break}}d||(yield{type:"resumed",hotSwapped:p==="hot-swap",accountId:m},d=!0),yield h}if(!g)return;if(Date.now()-u>CC){yield g;return}}}if(!o)return;if(o.getTime()-Date.now()>CC){yield r;return}let i=Rr(ft()??"");if(yield{type:"paused",reason:"usage-limit",resetsAt:o,accountId:i,autoResume:this.autoResumeOnUsageLimit},!this.autoResumeOnUsageLimit){yield r;return}let a;if(this.usageLimitWaitPromise)a=await this.usageLimitWaitPromise;else{this.usageLimitWaitPromise=EC({resetsAt:o,signal:t.signal});try{a=await this.usageLimitWaitPromise}finally{this.usageLimitWaitPromise=null}}if(a==="aborted")return;let l=i;if(a==="hot-swap"){let c=await this.forceClientRefresh();c&&(t.client=this._client,l=c.accountId)}t.headers=wn(this._authMode,this.initSessionId,ty()),yield{type:"resumed",hotSwapped:a==="hot-swap",accountId:l},yield*this.turnWithAuthRetry(t,n)}async*turnWithAuthRetry(t,n){let r=null;for await(let s of Qh(t)){if(n())return;if(s.type==="error"&&this.isRetryableAuth(s.error)){r=s;break}yield s}if(!r)return;if(!await this.forceClientRefresh()){yield r;return}t.client=this._client,t.headers=wn(this._authMode,this.initSessionId,ty()),yield*Qh(t)}isRetryableAuth(t){return this._authMode==="oauth"&&this.tokenRefresher!==void 0&&"status"in t&&t.status===401}}});function oq(e){if(e.role!=="user")return!1;let t=e.content;if(typeof t=="string")return!0;if(!Array.isArray(t))return!1;for(let n of t)if(n.type==="tool_result")return!1;return!0}function PC(e,t){if(t<=0)return e.length;let n=0;for(let r=e.length-1;r>=0;r--){let o=e[r];if(o&&oq(o)&&(n+=1,n===t))return r}return-1}function MC(e,t,n){let r=sq(e);return{model:t,max_tokens:n,system:rq,messages:[{role:"user",content:`Summarize the following conversation transcript. Follow the system instructions exactly.
|
|
1513
1513
|
|
|
1514
1514
|
<transcript>
|
|
@@ -2003,7 +2003,7 @@ _ended: ${new Date().toISOString()}_
|
|
|
2003
2003
|
${x}${S}
|
|
2004
2004
|
${w}
|
|
2005
2005
|
${x}`})}return{fileBlocks:a,warnings:l}}async function VO(e,t,n,r,o="summary",s,i){let a=KP(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,u=!1,d=!1,p=!1,m=!1,g,h=!1,b=!1,y={abort:null},S=0,w=3e3,x=[],T=new Map,C=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,R=()=>{let $=r.subagentControl;$?.hasPromotableForeground()&&$.promoteActiveForeground().then(N=>{for(let B of N)(s??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${B.jobId}: ${B.label}`))}).catch(()=>{})},k=r.getCompositor?r.getCompositor():null,L=()=>new Hi({out:Wi(s),thinkingMode:o,...C?{activeSkillName:C}:{},onCancel:()=>{t.interrupt().catch($=>{He()&&console.error(" "+f.error("session.interrupt() failed:"),$)})},...r.subagentControl?{onBackground:R}:{},...i?.history?{history:i.history}:{},...i?.autocompleteState?{autocompleteState:i.autocompleteState}:{},...i?.promptText!==void 0?{promptText:i.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...k?{compositor:k}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),A=L(),P=async()=>{if(!p){p=!0;try{await A.dispose()}catch{}}},F=async()=>{await A.arm();let $=A.getCompositor();if(s&&$){let N=$;s.fn=B=>N.commitAbove(B)}r.setActiveCompositor?.($),r.setInterruptNotifier?.(N=>A.setInterrupting(N)),r.rearmStatus?.()};try{k?k.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(I=>{He()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),I)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(I=>{He()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),I)})}),await F(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(R);let{fileBlocks:$,warnings:N}=JO(e.text,{rootDir:process.cwd()});for(let I of N)(s??{fn:console.log}).fn(f.dim(` @-file: ${I}`));let B=$.length>0||e.attachments.length>0?qO(e.text,e.attachments,void 0,$):e.text,H=t.sendMessageStream(B);if(await Ds((I,U)=>{A.process(I,U)},async()=>{for await(let I of H){if(h||b)break;if(I.type==="chunk"&&I.chunk.type==="content"?(l+=I.chunk.content,u=!0):I.type==="message"&&!u&&(l=I.message.content),I.type==="stream_retry"&&(l=l.slice(0,c)),I.type==="chunk"&&I.chunk.type==="tool_use_detail"){let U=I.chunk,M={toolName:U.toolName,toolUseId:U.toolUseId,input:U.toolInput,...U.toolInputRaw!==void 0&&{inputRaw:U.toolInputRaw}};T.set(U.toolUseId,M),x.push(M)}else if(I.type==="chunk"&&I.chunk.type==="tool_result"){let U=I.chunk;c=l.length;let M=T.get(U.toolUseId);if(M&&(M.result=U.content,M.isError=U.isError,T.delete(U.toolUseId)),r.onContextProgress){let j=Date.now();if(j-S>=w){S=j;try{let Y=r.onContextProgress();Y instanceof Promise&&await Y}catch(Y){He()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),Y)}}}}if(I.type==="paused"){if(r.setPausedState?.(!0),await P(),k&&I.autoResume===!0){let U=new AbortController;y.abort=U;let M=I.resetsAt?I.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,j=M?`Keep waiting \u2014 auto-resumes at ${M}`:"Keep waiting \u2014 auto-resume in progress",Y="Switch model / provider (type /model after)",oe="Stop waiting",X=[f.warning(" \u23F3 Usage limit reached.")+(M?f.dim(` Auto-resumes at ${M}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];pm(k,{header:X,options:[j,Y,oe],signal:U.signal,initialIndex:0}).then(W=>{if(y.abort=null,!W)return;let ke=W[0];ke===void 0||ke===j||(b=!0,ke===Y&&(s??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Je=>{He()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),Je)}))}).catch(W=>{He()&&console.error(" "+f.error("picker promise rejected:"),W)})}else(s??{fn:console.log}).fn(rv({reason:I.reason,...I.resetsAt!==void 0?{resetsAt:I.resetsAt}:{},...I.accountId!==void 0?{accountId:I.accountId}:{},...I.autoResume!==void 0?{autoResume:I.autoResume}:{}}));continue}if(I.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let U=I.hotSwapped&&I.accountId?`\u25B6 Resumed on ${I.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,x.length=0,T.clear(),m=!1,g=void 0,d=!1,A=L(),p=!1,await F(),(s??{fn:console.log}).fn(f.success(U));continue}if(I.type==="error"){await P(),Ts(vs(I.error)),d=!0;continue}A.process(I),I.type==="done"&&(m=!0,g=I.metadata)}}),await P(),h){let I=s?s.fn:console.log;I(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),I("")}if(b){let I=s?s.fn:console.log;I(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),I("")}if(m&&!h&&!b){Lo(n,a,l,g,x),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),zd(process.stdout);let I=M=>{s?s.fn(M):console.log(M)},U=KO(l);if(U){if(I(GO(U)),I(""),r.onTerminalState)try{r.onTerminalState(U)}catch{}if(n.permissionMode==="autonomous"){let M=U.kind==="done"&&lu().verifyDone===!0&&!fI(x);hI(U,void 0,{unverified:M})}}if(f9(g,n,I),r.onAfterTurn){let M=r.onAfterTurn();M instanceof Promise&&await M.catch(()=>{})}}}catch($){await P(),d||Ts(vs($))}finally{await P(),s&&(s.fn=s.idleFn),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),y.abort?.abort(),y.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function f9(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(fe(e.durationMs)),e.totalCostUsd!==void 0&&r.push(rt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(ie(o+s)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Ly(t),a=Mt(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${ie(l)} tok \u2014 model output may be silently truncated`))}else if(i>.5){let l=i>.8?f.error:f.warning;n(l(` context ${Math.round(i*100)}% used of ${ie(a)}`))}n("")}var g9=5e3;async function h9(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(f.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function YO(e,t,n,r,o,s,i,a){let{contextPane:l,loopStageBar:c,verdictLedger:u,shellPassthrough:d}=i,p=null,m=[];e.session.current.waitForInitialization().then(async y=>{He()&&(p=np(y)),await qp(e.session.current),He()&&(m=K0())}).catch(()=>{});let g,h=!1,b=!1;for(;;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),m.length>0){for(let k of m)e.replRenderer.writeLine(k);e.replRenderer.writeLine(""),m=[]}let y=d.drainNotifications();for(let{job:k,result:L}of y){let A=L.errorReason===void 0?"\u2713":"\u2717",P=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,F=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${A} [${k.id}] ${P} \xB7 ${F}s \xB7 `)+k.command)}let S=l.renderIfChanged(e.stats.sessionId);if(S.length>0){for(let k of S)e.replRenderer.writeLine(k);e.replRenderer.writeLine("")}let w,x;if(g!==void 0){let k=g;g=void 0;let L=zi(e.stats.permissionMode),A=Ko({buffer:k.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:Di([...k.attachments])});e.replRenderer.writeLine(A),w=k.text.trim(),x=k.attachments}else{let k=await o.readLine({promptFn:()=>zi(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{mm(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});w=k.text.trim(),x=k.attachments}if(!w&&x.length===0)continue;if(w.startsWith("!")){let k=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!k&&(h||(h=!0,e.replRenderer.writeLine(f.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await d.dispatch(w))){e.statusLine.rearm();continue}}let T=!1;if(w.startsWith("/")){let k=await iI(w,e.slashCtx,x);if(k.handled){if(k.result==="exit"){e.rl.close();return}if((w==="/clear"||w.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),u.reset()),k.result!==null&&typeof k.result=="object"&&"kind"in k.result&&k.result.kind==="submit"){g={text:k.result.message,attachments:x??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}T=!0}a.push(w),await h9(e,w);let C=w;if(T){let k=Dy(w);if(k){let L=k.name.replace(/^\//,"").split(":").pop()??"";if(L&&Hb(L)){let A={skillName:L,rawArgs:k.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},P=e.session.current.sessionId,F=Qo(P),$=Date.now();J(`[afk trace] preflight.start commandName=${L}`);let N=!1,B=await Zo(A,{cwd:e.stats.cwd??process.cwd(),artifactDir:F},H=>{He()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${L}) failed: `)+(H instanceof Error?H.message:String(H)))});N=B!==null,J(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-$} success=${N}`),C=Kb(B?.manifestBlock,w)}}}let R=d.drainInjections();if(R.length>0&&(C=R+C),e.hookRegistry)try{let k={event:"UserPromptSubmit",prompt:C,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(k);L.injectContext&&(C=L.injectContext+C)}catch(k){if(k instanceof Ce){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(k.reason?f.dim(`: ${xo(k.reason)}`):"")),e.statusLine.rearm();continue}if(k instanceof Sn){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${k.timeoutMs}ms`)),e.statusLine.rearm();continue}throw k}if(await VO({text:C,attachments:x},e.session.current,e.stats,{setInFlight(k){n.turnInFlight=k},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(k){await t.appendUser(k)},async onTurnComplete(k,L){if(await t.appendTurn(k,L),e.stats.sessionId)try{On(e.stats)}catch(A){b||(b=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(A instanceof Error?A.message:String(A))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:k=>u?.push(k),setActiveCompositor:k=>{n.activeCompositor=k},setInterruptNotifier:k=>{n.notifyInterrupting=k},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:k=>o.setBackgroundHandler(k),setSoftStopHandler:s,setPausedState:k=>o.setPausedState(k),setPauseInterruptHandler:k=>o.setPauseInterruptHandler(k),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Ln(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:k=>c.repaint(k)}:{}},e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(zi(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,g9)}catch(k){if(k instanceof kt)throw k;k instanceof Sn?(J("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):k instanceof Ce?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${xo(k.reason??"no reason given")}`)):J("[stop hook] unexpected error: "+String(k))}}}function y9(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 XO(e,t,n,r){let o=await AO(),s=new dm({rl:e.rl,history:o,statusLine:e.statusLine}),i=y9(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await $O(e,s,n,t,r,i,{getLoopStageBar:()=>a?.loopStageBar});a=WO(e,n),await YO(e,t,n,r,s,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await s.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Pa();import{execFile as b9}from"node:child_process";import{dirname as w9,isAbsolute as S9,resolve as v9}from"node:path";import{promisify as k9}from"node:util";var ZO=k9(b9),E9=3e3,x9=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function T9(){let t=(await ZO("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=S9(t)?t:v9(process.cwd(),t);return w9(n)}async function QO(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await T9()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),E9)});try{let o=Nn({execFile:ZO,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),s=await Promise.race([o,r]);if(s==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let i=s;return i.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:i.candidates.filter(c=>x9.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}_c();Pa();import{promises as R9}from"node:fs";import{dirname as C9,join as n$}from"node:path";import{randomBytes as A9}from"node:crypto";var _9=["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(`
|
|
2006
|
-
`),e$=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pw=30,I9=1024,P9=8e3,M9="haiku";async function O9(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=F9(n,I9),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??P9),i=t.signal?N9([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Os({token:t.token,model:t.model??M9,system:_9,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=$9(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=C9(t.worktreePath);return await D9(l,c)}function $9(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(e$.test(t)&&t.length<=pw)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>pw)break;o=i}return e$.test(o)?o:null}async function D9(e,t){if(!await L9(n$(t,e)))return e;let n=A9(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pw-5)}-${n}`}async function L9(e){try{return await R9.access(e),!0}catch{return!1}}function F9(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 N9(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 r$(e){let t,n,r=n$(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await O9(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${ou(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return t$(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return t$(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function t$(e,t){e&&e.setCwd(t),B9(t)}function B9(e){try{process.chdir(e)}catch{}}ze();It();G();import{spawn as s$}from"child_process";import{existsSync as i$,mkdirSync as K9,readFileSync as a$,unlinkSync as o$,writeFileSync as G9}from"fs";import{get as q9}from"https";import{join as l$}from"path";import{readFileSync as U9}from"fs";import{dirname as j9,join as H9}from"path";import{fileURLToPath as W9}from"url";function Sr(){try{return"4.44.
|
|
2006
|
+
`),e$=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pw=30,I9=1024,P9=8e3,M9="haiku";async function O9(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=F9(n,I9),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??P9),i=t.signal?N9([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Os({token:t.token,model:t.model??M9,system:_9,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=$9(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=C9(t.worktreePath);return await D9(l,c)}function $9(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(e$.test(t)&&t.length<=pw)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>pw)break;o=i}return e$.test(o)?o:null}async function D9(e,t){if(!await L9(n$(t,e)))return e;let n=A9(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pw-5)}-${n}`}async function L9(e){try{return await R9.access(e),!0}catch{return!1}}function F9(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 N9(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 r$(e){let t,n,r=n$(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await O9(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${ou(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return t$(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return t$(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function t$(e,t){e&&e.setCwd(t),B9(t)}function B9(e){try{process.chdir(e)}catch{}}ze();It();G();import{spawn as s$}from"child_process";import{existsSync as i$,mkdirSync as K9,readFileSync as a$,unlinkSync as o$,writeFileSync as G9}from"fs";import{get as q9}from"https";import{join as l$}from"path";import{readFileSync as U9}from"fs";import{dirname as j9,join as H9}from"path";import{fileURLToPath as W9}from"url";function Sr(){try{return"4.44.2"}catch{}try{let e=j9(W9(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(U9(H9(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}q();var z9=64*1024,J9=1440*60*1e3,V9=3600*1e3,Y9="update-check.json",X9="pending-update.json";function c$(){return l$(lc(),Y9)}function Kl(){return l$(lc(),X9)}function u$(){let e=lc();i$(e)||K9(e,{recursive:!0})}function Z9(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),s=n(t).split(".").map(Number),i=Math.max(o.length,s.length);for(let a=0;a<i;a++){let l=o[a]??0,c=s[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function Q9(){try{let e=a$(c$(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function e7(){try{u$();let e=`
|
|
2007
2007
|
const https = require('https');
|
|
2008
2008
|
const fs = require('fs');
|
|
2009
2009
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|