agent-afk 5.15.2 → 5.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +2 -2
- package/dist/index.mjs +179 -179
- package/dist/telegram.mjs +205 -205
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -1079,7 +1079,7 @@ ${o}`;return s.includes("already checked out")||s.includes("is already used by w
|
|
|
1079
1079
|
Effective base URL: ${r}`)),r}return t}function VH(){if(ch!==void 0)return ch;if(!YE){let o=[za(process.cwd(),".env"),St(),Fv()];for(let s of o)uh(s)&&zH({path:s,override:!1});YE=!0}let e={},t=v.AFK_MODEL??v.CLAUDE_MODEL;if(t){let o=t.toLowerCase();e.model=wg(o)?o:t}if(se(t)==="anthropic-direct"){let o=dh();o!==void 0&&(e.apiKey=o)}let r=v.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=v.AFK_LOCAL_API_KEY||"local"),v.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(v.AFK_MAX_TOKENS,10)),v.AFK_TEMPERATURE&&(e.temperature=parseFloat(v.AFK_TEMPERATURE)),v.AFK_SYSTEM_PROMPT&&(e.systemPrompt=v.AFK_SYSTEM_PROMPT),v.AFK_AUTO_ROUTING){let o=v.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return v.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=JH(v.AFK_OPENAI_BASE_URL)),ch=e,e}function ph(){if(Vs!==void 0)return Vs;let e=[za(process.cwd(),"afk.config.json"),Kt(),Dc()];for(let t of e)if(uh(t))try{let n=ZE(t,"utf-8"),r=JSON.parse(n),o={},s=wk(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=wg(i)?i:r.model}if(typeof r.maxTokens=="number"&&(o.maxTokens=r.maxTokens),typeof r.temperature=="number"&&(o.temperature=r.temperature),r.systemPrompt&&(o.systemPrompt=r.systemPrompt),typeof r.permissionMode=="string"){let i=r.permissionMode;(i==="default"||i==="plan"||i==="autonomous"||i==="bypassPermissions")&&(o.permissionMode=i)}if(r.autoRouting&&typeof r.autoRouting=="object"){let i={};typeof r.autoRouting.interactive=="boolean"&&(i.interactive=r.autoRouting.interactive),typeof r.autoRouting.chat=="boolean"&&(i.chat=r.autoRouting.chat),typeof r.autoRouting.telegram=="boolean"&&(i.telegram=r.autoRouting.telegram),typeof r.autoRouting.daemon=="boolean"&&(i.daemon=r.autoRouting.daemon),o.autoRouting=i}if(r.daemon&&typeof r.daemon=="object"){let i={};typeof r.daemon.task=="string"&&(i.task=r.daemon.task),typeof r.daemon.taskId=="string"&&(i.taskId=r.daemon.taskId);let a=r.daemon.worktreePrune;a&&typeof a=="object"&&(i.worktreePrune={enabled:typeof a.enabled=="boolean"?a.enabled:!0,cron:typeof a.cron=="string"?a.cron:"0 4 * * *",maxAgeDaysClean:typeof a.maxAgeDaysClean=="number"?a.maxAgeDaysClean:14,maxAgeDaysDirty:typeof a.maxAgeDaysDirty=="number"?a.maxAgeDaysDirty:30,scope:typeof a.scope=="string"?a.scope:"all"}),o.daemon=i}if(r.telegram&&typeof r.telegram=="object"){let i={},a=r.telegram.notify;if(a&&typeof a=="object"){let l={};if((a.mode==="primary"||a.mode==="broadcast"||a.mode==="custom")&&(l.mode=a.mode),typeof a.primaryChatId=="number"&&Number.isFinite(a.primaryChatId)&&(l.primaryChatId=a.primaryChatId),Array.isArray(a.targets)){let c=a.targets.filter(u=>typeof u=="number"&&Number.isFinite(u));c.length>0&&(l.targets=c)}i.notify=l}typeof r.telegram.verifyDone=="boolean"&&(i.verifyDone=r.telegram.verifyDone),o.telegram=i}if(r.updatePolicy&&["notify","auto","off"].includes(r.updatePolicy)&&(o.updatePolicy=r.updatePolicy),typeof r.autoResumeOnUsageLimit=="boolean"&&(o.autoResumeOnUsageLimit=r.autoResumeOnUsageLimit),typeof r.bgSummaries=="boolean"&&(o.bgSummaries=r.bgSummaries),typeof r.maxSummaryCallsPerSession=="number"&&(o.maxSummaryCallsPerSession=Math.min(500,Math.max(1,r.maxSummaryCallsPerSession))),r.hooks!==null&&typeof r.hooks=="object"&&!Array.isArray(r.hooks)&&(o.hooks=r.hooks),typeof r.enableShellHooks=="boolean"&&(o.enableShellHooks=r.enableShellHooks),t!==za(process.cwd(),"afk.config.json")){let i=Ga(r.importFrom);i!==void 0&&(o.importFrom=i)}if(r.interactive&&typeof r.interactive=="object"){let i={};typeof r.interactive.worktreeAutoname=="boolean"&&(i.worktreeAutoname=r.interactive.worktreeAutoname),typeof r.interactive.worktreeBranchPrefix=="string"&&(i.worktreeBranchPrefix=sh(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(ih(r.interactive.worktreeBase,`${t}#/interactive/worktreeBase`),i.worktreeBase=r.interactive.worktreeBase),typeof r.interactive.suggestGhost=="boolean"&&(i.suggestGhost=r.interactive.suggestGhost),Object.keys(i).length>0&&(o.interactive=i)}return Vs={config:o,sourcePath:t,modelsPartial:s},Vs}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return Vs={config:{},sourcePath:void 0,modelsPartial:{}},Vs}function YH(){if(Ys!==void 0)return Ys.value;let e=[za(process.cwd(),"AFK.md"),za(Le(),"AFK.md")];for(let t of e)if(uh(t))try{let n=ZE(t,"utf-8").trim();if(n.length>0)return Ys={value:{content:n,path:t}},Ys.value}catch{}return Ys={value:null},Ys.value}function $u(){return ph().config.telegram??{}}function Xs(){return ph().config.permissionMode??QE}function It(e){let t=VH(),{config:n,sourcePath:r,modelsPartial:o}=ph(),s={...qa,...t,...n,...e},i;if(t.systemPrompt!==void 0)i="env:AFK_SYSTEM_PROMPT";else if(n.systemPrompt!==void 0&&r!==void 0)i=`file:${r}`;else if(s.systemPrompt===void 0){let c=YH();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??qa.model,maxTokens:s.maxTokens??qa.maxTokens,temperature:s.temperature??qa.temperature,updatePolicy:s.updatePolicy??qa.updatePolicy,...s.apiKey!==void 0?{apiKey:s.apiKey}:{},...s.baseUrl!==void 0?{baseUrl:s.baseUrl}:{},...s.openaiBaseUrl!==void 0?{openaiBaseUrl:s.openaiBaseUrl}:{},...s.systemPrompt!==void 0?{systemPrompt:s.systemPrompt}:{},...i!==void 0?{systemPromptSource:i}:{},permissionMode:s.permissionMode??QE,...s.autoRouting!==void 0?{autoRouting:s.autoRouting}:{},...s.daemon!==void 0?{daemon:s.daemon}:{},...s.telegram!==void 0?{telegram:s.telegram}:{},...s.bgSummaries!==void 0?{bgSummaries:s.bgSummaries}:{},...s.maxSummaryCallsPerSession!==void 0?{maxSummaryCallsPerSession:s.maxSummaryCallsPerSession}:{},...s.interactive!==void 0?{interactive:s.interactive}:{},...s.hooks!==void 0?{hooks:s.hooks}:{},...s.enableShellHooks!==void 0?{enableShellHooks:s.enableShellHooks}:{},...s.importFrom!==void 0?{importFrom:s.importFrom}:{}},l=e?.models??hg(o);if(Xc(l),a.models=l,typeof a.model=="string"&&a.model.toLowerCase().startsWith("local-")&&(a.baseUrl===void 0||a.baseUrl.length===0))throw new Error(`Model '${a.model}' requires AFK_LOCAL_BASE_URL to be set (e.g. AFK_LOCAL_BASE_URL=http://127.0.0.1:8080). Point it at your local Anthropic-Messages-compatible server.`);return a}var qa,QE,YE,ch,XE,Vs,Ys,Ft=P(()=>{"use strict";Zn();sn();it();q();zs();Ka();J();ur();qa={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},QE="bypassPermissions",YE=!1;XE=new Set});function XH(e,t){return t!==void 0&&Number.isFinite(t)&&t!==0?t:e.find(r=>r>0)??e[0]}function ZH(e,t={}){let n=[...e],r=t.mode??"primary";if(r==="broadcast")return n;if(r==="custom"){let s=(t.targets??[]).filter(i=>typeof i=="number"&&Number.isFinite(i)&&i!==0);if(s.length>0)return[...new Set(s)]}let o=XH(n,t.primaryChatId);return o!==void 0?[o]:[]}function QH(e){if(!e)return;let t=e.trim();if(!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isFinite(n)&&n!==0?n:void 0}function eW(e){if(!e)return;let t=e.trim().toLowerCase();return t==="primary"||t==="broadcast"||t==="custom"?t:void 0}function tW(){let e=$u().notify??{},t=e.mode??eW(v.AFK_TELEGRAM_NOTIFY_MODE),n=e.primaryChatId??QH(v.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...t!==void 0?{mode:t}:{},...n!==void 0?{primaryChatId:n}:{},...e.targets!==void 0?{targets:e.targets}:{}}}function Zs(){let e=ME(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return ZH(e,tW())}var Du=P(()=>{"use strict";OE();Ft();J()});function mh(e,t=4096){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let o=t,s=r.lastIndexOf(`
|
|
1080
1080
|
`,t);if(s>t-500&&s>0)o=s+1;else{let i=r.slice(0,t).match(/[.!?]\s+(?=[A-Z])/g);if(i&&i.length>0){let a=i[i.length-1];if(a){let l=r.lastIndexOf(a,t);l>t-200&&l>0&&(o=l+2)}}else{let a=r.lastIndexOf(" ",t);a>t-100&&a>0&&(o=a+1)}}n.push(r.slice(0,o).trim()),r=r.slice(o).trim()}return n}function eT(e){e=e.replace(/[\x02\x03]/g,"");let t=e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),n=[];t=t.replace(/^ {0,3}```([\w]*)\n([\s\S]*?)```/gm,(o,s,i)=>{let a=n.length;if(i.trim()===""){let l=s?`(empty ${s} block)`:"(empty code block)";n.push(`<i>${l}</i>`)}else n.push(`<pre>${i}</pre>`);return`FENCED${a}`});let r=[];return t=t.replace(/`([^`]+)`/g,(o,s)=>{let i=r.length;return r.push(`<code>${s}</code>`),`CODE${i}`}),t=t.replace(/\*\*([^*]+)\*\*/g,"<b>$1</b>"),t=t.replace(/__([^_]+)__/g,"<b>$1</b>"),t=t.replace(/\*([^*]+)\*/g,"<i>$1</i>"),t=t.replace(/(^|[^\w])_([^_\n]+?)_(?!\w)/gm,"$1<i>$2</i>"),t=t.replace(/~~([^~]+)~~/g,"<s>$1</s>"),t=t.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(o,s,i)=>'<a href="'+i.replace(/"/g,""")+'">'+s+"</a>"),t=t.replace(/^#{1,6}\s+/gm,""),t=t.replace(/\x02CODE(\d+)\x03/g,(o,s)=>r[Number(s)]??o),t=t.replace(/\x02FENCED(\d+)\x03/g,(o,s)=>n[Number(s)]??o),nW(t)||(t=t.replace(/<\/?[bis]>/g,"")),t}function nW(e){let t=[],n=/<(\/?)([a-zA-Z][a-zA-Z0-9-]*)\b[^>]*>/g,r;for(;(r=n.exec(e))!==null;){let o=(r[2]??"").toLowerCase();if(r[1]==="/"){if(t.pop()!==o)return!1}else t.push(o)}return t.length===0}var tT=P(()=>{"use strict"});var fh={};xc(fh,{push:()=>Qs,pushIfConfigured:()=>An,pushMarkdown:()=>nT});async function Qs(e){if(!e.token)throw new Error("push: token is required");if(e.chatId===""||e.chatId==null||e.chatId===0)throw new Error("push: chatId is required");let t=e.fetchImpl??fetch,r=`${e.apiBase??rW}/bot${e.token}/sendMessage`,o={chat_id:e.chatId,text:e.text.slice(0,4096)};e.parseMode&&(o.parse_mode=e.parseMode),e.replyMarkup&&(o.reply_markup=e.replyMarkup);let s=new AbortController,i=setTimeout(()=>s.abort(),1e4);try{let a=await t(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o),signal:s.signal});if(a.ok)return{ok:!0,status:a.status};let l;try{l=(await a.json()).description}catch{l=`HTTP ${a.status}`}return{ok:!1,status:a.status,...l!==void 0?{errorMessage:l}:{}}}catch(a){return{ok:!1,status:0,errorMessage:a instanceof Error?a.message:String(a)}}finally{clearTimeout(i)}}async function nT(e){let t=eT(e.text),n=mh(t),r={ok:!0,status:200};for(let o of n)if(r=await Qs({...e,text:o,parseMode:"HTML"}),!r.ok)return r.status===400&&/can't parse entities/i.test(r.errorMessage??"")?Qs({...e}):r;return r}async function An(e,t={}){let n=v.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=Zs();if(r.length===0)return null;let o=mh(e),s=[];for(let i of r)for(let a=0;a<o.length;a++){let l={token:n,chatId:i,text:o[a]??"",...t.replyMarkup!==void 0&&a===0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}};s.push(t.markdown?await nT(l):await Qs({...l,...t.parseMode!==void 0?{parseMode:t.parseMode}:{}}))}return s}var rW,Nr=P(()=>{"use strict";Du();tT();J();rW="https://api.telegram.org"});function oW(e=Qs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let o=t.message;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>rT)return{content:`Invalid input: message exceeds Telegram's ${rT}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let i=Zs();if(i.length===0)return{content:"Telegram is not configured: AFK_TELEGRAM_ALLOWED_CHAT_IDS is empty or unset. Add the operator chat ID(s) before using send_telegram.",isError:!0};let a=[];for(let l of i){let c=await e({token:s,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===i.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${i.length-a.length}/${i.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:i.length===1?`Sent Telegram message to chat ${i[0]}.`:`Sent Telegram message to ${i.length} chats.`}}}var rT,oT,sT=P(()=>{"use strict";J();Nr();Du();rT=4096;oT=oW()});import{JSDOM as sW}from"jsdom";import{Readability as iW}from"@mozilla/readability";import aW from"turndown";function iT(e){return e.replace(/\n{3,}/g,`
|
|
1081
1081
|
|
|
1082
|
-
`).trim()}function lW(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function lT(e,t){let r=new sW(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new iW(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=iT(gh.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=iT(gh.turndown(a));return{title:o,markdown:l,textLength:lW(i),usedFallback:!0}}var aT,gh,cT=P(()=>{"use strict";aT=200,gh=new aW({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});gh.remove(["script","style","noscript","iframe"])});function uW(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(t?.reason??new Error("aborted"))},s=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function uT(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function dW(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function Fu(e,t,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??uW,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!cW.has(d.status)||u===o)return d;let p=dW(d,i)??uT(u,s,i);W("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=uT(u,s,i);W("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var cW,hh=P(()=>{"use strict";Pe();cW=new Set([429,502,503,504])});import{readFileSync as pW}from"node:fs";import{join as mW}from"path";function fW(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function dT(e,t){return fW(t).test(e)}function yW(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(gW.has(t))return!0;if(hW.has(t))return!1}return!1}function pT(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function bW(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function mT(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ra(t),t}function wW(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function SW(e){try{return pW(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function vW(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=mT(t.defaultProfile)),n}function fT(e){let t=e?.env??v,n=e?.readFileSync??SW,r=e?.surface??t.AGENT_SURFACE,o=yW(t.AFK_BROWSER_HEADLESS,r),s=pT(t.AFK_BROWSER_ALLOWED_DOMAINS),i=pT(t.AFK_BROWSER_BLOCKED_DOMAINS),a=wW(t.AFK_BROWSER_DOM_SNAPSHOTS),l=bW(t.AFK_BROWSER_BACKEND),c=mT(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():mW(rn(),"browser.json"),m=n(p);if(m===void 0)return u;let g;try{g=JSON.parse(m)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=vW(u,g);return h.configPath=p,h}function yh(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(dT(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>dT(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var gW,hW,bh=P(()=>{"use strict";J();q();gW=new Set(["daemon","subagent","telegram","afk"]),hW=new Set(["repl","interactive","cli"])});import $o from"node:fs";import Lu from"node:path";import{randomBytes as kW}from"node:crypto";import{chromium as EW}from"playwright";function TW(){try{return"5.15.2"}catch{}try{let e=Lu.resolve(import.meta.dirname,"../../../package.json"),t=$o.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var xW,Nu,gT=P(()=>{"use strict";q();Pe();xW=TW(),Nu=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=EW.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,i),s}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${xW}`}}loadStorageState(t){let n=Ca(t);try{if(!$o.existsSync(n))return;let r=JSON.parse($o.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ca(t);if(!$o.existsSync(r))return;let o=await n.storageState(),s=Lu.join(Lu.dirname(r),`.${Lu.basename(r)}.${process.pid}.${kW(4).toString("hex")}.tmp`);$o.writeFileSync(s,JSON.stringify(o),{mode:384}),$o.chmodSync(s,384),$o.renameSync(s,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as RW}from"crypto";function wh(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of CW)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function hT(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&AW.test(e.label))}function yT(e){return RW("sha256").update(e,"utf8").digest("hex").slice(0,8)}function bT(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var CW,AW,Ja=P(()=>{"use strict";CW=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];AW=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as _W}from"node:crypto";function PW(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function IW(e,t,n){return`el_${_W("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function MW(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function wT(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function vT(e,t){let n=e.role??"",r=e.name??"";ST.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])vT(s,t)}async function OW(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},kT).catch(()=>[])}async function $W(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},kT).catch(()=>[])}function DW(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Bu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=DW(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=OW(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],vT(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await $W(e)).filter(L=>ST.has(L.role??"")));let S=new Map;for(let I of p){let L=wT(I.name),N=S.get(L);(!N||N.bbox.w===0&&I.bbox.w>0)&&S.set(L,I)}let w=b.map(I=>({ax:I,dom:S.get(wT(I.name??""))})),k=r?w:w.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,L)=>{let N=I.dom?.bbox.y??0,F=L.dom?.bbox.y??0;if(N!==F)return N-F;let U=I.dom?.bbox.x??0,H=L.dom?.bbox.x??0;return U-H}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=k.slice(0,n).map((I,L)=>{let N=I.ax.role??"generic",F=I.ax.name??"",U=IW(N,F,L),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},D=I.dom?.type??null,C=null;I.ax.value!==void 0&&I.ax.value!==null&&(C=String(I.ax.value)),I.ax.checked!==void 0&&(C=String(I.ax.checked)),hT({role:N,kind:D})&&(C="[redacted]");let B={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(B.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(B.selected=I.ax.selected),I.ax.expanded!==void 0&&(B.expanded=I.ax.expanded);let M;I.dom?.testId?M=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(M=`#${I.dom.id}`);let j={id:U,role:N,label:PW(F),kind:D,value:C,state:B,bbox:H};return M!==void 0&&(j.selector=M),j}),A="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?A="loading":I==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let E=MW(m),O=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:O,url:g,title:h,textSummary:E,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var ST,kT,ET=P(()=>{"use strict";Ja();ST=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kT="a[href], button, input, select, textarea, [role], [tabindex], label"});async function TT(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Sh(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>TT(e,s)))).filter(o=>o!==null)}async function FW(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function vh(e,t,n){switch(t.kind){case"element_id":return LW(e,t,n);case"selector":return NW(e,t);case"semantic":return BW(e,t)}}async function LW(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await Sh(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function NW(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await Sh(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function BW(e,t){return t.role!==void 0?UW(e,t.text,t.role):jW(e,t.text,t)}async function UW(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Sh(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function jW(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await FW(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await TT(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let k=0;k<S.length;k++)w=w*31+S.charCodeAt(k)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var xT=P(()=>{"use strict"});import{randomBytes as HW}from"crypto";import{mkdir as WW,stat as KW,writeFile as GW}from"fs/promises";import{join as kh}from"path";import{gzip as qW}from"zlib";import{promisify as zW}from"util";function JW(e){return kh(Cs(e),"browser")}function VW(e){return kh(JW(e),"screenshots")}function YW(){return new Date().toISOString().replace(/[:.]/g,"-")}function XW(){return HW(3).toString("hex")}async function Eh(e,t,n){if(t.length>RT)throw new Error(`writeScreenshotSidecar: buffer exceeds ${RT} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=VW(e);await WW(r,{recursive:!0});let o=`${YW()}-${XW()}-${n}.png`,s=kh(r,o);await GW(s,t);let{size:i}=await KW(s);return{path:s,bytes:i}}var Zde,RT,CT=P(()=>{"use strict";q();Ja();Zde=zW(qW);RT=5*1024*1024});var _T={};xc(_T,{PlaywrightProvider:()=>Th});function AT(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var Th,PT=P(()=>{"use strict";gT();ET();xT();bh();Ja();CT();Th=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Nu(t)}async open(t){let n=yh(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Bu(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Bu(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=t.timeoutMs??3e4,a=await vh(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${AT(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=wh(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=yh(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await Bu(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(t.target!==void 0){let u=await vh(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${AT(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Eh(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await Eh(n,o,r);return s}catch{return null}}}});var Fo={};xc(Fo,{__resetBrowserRegistryForTests:()=>nK,browserProviderActive:()=>eK,closeBrowserProvider:()=>xh,getBrowserProvider:()=>QW,peekBrowserProvider:()=>tK});function IT(){Promise.resolve(xh()).then(()=>{process.exit(130)})}function MT(){Promise.resolve(xh()).then(()=>{process.exit(143)})}function OT(){_n=null}function ZW(){Uu||(process.on("SIGINT",IT),process.on("SIGTERM",MT),process.on("exit",OT),Uu=!0)}function $T(){Uu&&(process.removeListener("SIGINT",IT),process.removeListener("SIGTERM",MT),process.removeListener("exit",OT),Uu=!1)}async function QW(e){return _n!==null?_n:(Do!==null||(Do=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(PT(),_T)),n=fT(e),r=new t(n);return ZW(),_n=r,Do=null,r})()),Do)}async function xh(){if(_n===null)return;let e=_n;_n=null,Do=null,$T(),await e.shutdown()}function eK(){return _n!==null}function tK(){return _n}function nK(){_n=null,Do=null,$T()}var _n,Do,Uu,Lo=P(()=>{"use strict";bh();_n=null,Do=null,Uu=!1});function DT(e,t){try{return lT(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function aK(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Lo(),Fo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function FT(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??aK,o=null,s=e,i=null,a=null;try{let c=await Fu(n,e,{headers:iK,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(sK.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(oK.test(u)&&!rK.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=DT(d,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<aT)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=DT(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var rK,oK,sK,iK,LT=P(()=>{"use strict";cT();hh();Pe();rK=/(text\/html|application\/xhtml\+xml)/i,oK=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,sK=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,iK={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function uK(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(lK,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),cK),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=Mo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function NT(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?uK({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function BT(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1082
|
+
`).trim()}function lW(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function lT(e,t){let r=new sW(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new iW(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=iT(gh.turndown(s.content)),u=(s.title??"").trim()||o,d=typeof s.length=="number"&&s.length>0?s.length:(s.textContent??"").replace(/\s+/g," ").trim().length;return{title:u,markdown:c,textLength:d,usedFallback:!1}}let i=r.body,a=i?.innerHTML??"",l=iT(gh.turndown(a));return{title:o,markdown:l,textLength:lW(i),usedFallback:!0}}var aT,gh,cT=P(()=>{"use strict";aT=200,gh=new aW({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});gh.remove(["script","style","noscript","iframe"])});function uW(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(s),r(t?.reason??new Error("aborted"))},s=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function uT(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function dW(e,t){let n=e.headers.get("retry-after");if(n===null)return null;let r=Number(n.trim());return!Number.isFinite(r)||r<0?null:Math.min(r*1e3,t)}async function Fu(e,t,n={},r={}){let o=r.retries??3,s=r.baseDelayMs??500,i=r.maxDelayMs??1e4,a=r.sleep??uW,l=n.signal??void 0,c;for(let u=0;u<=o;u++){if(l?.aborted)throw l.reason??new Error("aborted");try{let d=await e(t,n);if(!cW.has(d.status)||u===o)return d;let p=dW(d,i)??uT(u,s,i);W("[web/retryFetch] retrying",{url:t,attempt:u,status:d.status,waitMs:p}),await d.body?.cancel().catch(()=>{}),await a(p,l)}catch(d){if(l?.aborted||(c=d,u===o))throw d;let p=uT(u,s,i);W("[web/retryFetch] retrying after error",{url:t,attempt:u,waitMs:p}),await a(p,l)}}throw c??new Error("retryFetch: exhausted without a result")}var cW,hh=P(()=>{"use strict";Pe();cW=new Set([429,502,503,504])});import{readFileSync as pW}from"node:fs";import{join as mW}from"path";function fW(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function dT(e,t){return fW(t).test(e)}function yW(e,t){if(e!==void 0){let n=e.trim().toLowerCase();if(n==="1"||n==="true"||n==="yes")return!0;if(n==="0"||n==="false"||n==="no")return!1}if(t!==void 0){if(gW.has(t))return!0;if(hW.has(t))return!1}return!1}function pT(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function bW(e){if(e===void 0||e===""||e==="playwright")return"playwright";throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${e}`)}function mT(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ra(t),t}function wW(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function SW(e){try{return pW(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function vW(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return typeof t.defaultProfile=="string"&&(n.defaultProfile=mT(t.defaultProfile)),n}function fT(e){let t=e?.env??v,n=e?.readFileSync??SW,r=e?.surface??t.AGENT_SURFACE,o=yW(t.AFK_BROWSER_HEADLESS,r),s=pT(t.AFK_BROWSER_ALLOWED_DOMAINS),i=pT(t.AFK_BROWSER_BLOCKED_DOMAINS),a=wW(t.AFK_BROWSER_DOM_SNAPSHOTS),l=bW(t.AFK_BROWSER_BACKEND),c=mT(t.AFK_BROWSER_DEFAULT_PROFILE),u={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},d=t.AFK_BROWSER_CONFIG,p=d!==void 0&&d.trim()!==""?d.trim():mW(rn(),"browser.json"),m=n(p);if(m===void 0)return u;let g;try{g=JSON.parse(m)}catch(b){throw new Error(`Failed to parse browser config at ${p}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${p} must be a JSON object`);let h=vW(u,g);return h.configPath=p,h}function yh(e,t){let n;try{n=new URL(e).hostname.toLowerCase()}catch{return{allowed:!1,reason:`invalid URL: ${e}`}}for(let r of t.blockedDomains)if(dT(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>dT(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var gW,hW,bh=P(()=>{"use strict";J();q();gW=new Set(["daemon","subagent","telegram","afk"]),hW=new Set(["repl","interactive","cli"])});import $o from"node:fs";import Lu from"node:path";import{randomBytes as kW}from"node:crypto";import{chromium as EW}from"playwright";function TW(){try{return"5.15.3"}catch{}try{let e=Lu.resolve(import.meta.dirname,"../../../package.json"),t=$o.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var xW,Nu,gT=P(()=>{"use strict";q();Pe();xW=TW(),Nu=class{config;browser;sessions=new Map;launchPromise;shutdownComplete=!1;constructor(t){this.config=t}async ensureBrowser(){return this.browser!==void 0&&this.browser.isConnected()?this.browser:(this.browser!==void 0&&!this.browser.isConnected()&&(this.browser=void 0,this.launchPromise=void 0),this.launchPromise!==void 0?this.launchPromise:(this.launchPromise=EW.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let r=await this.ensureBrowser(),o=this.loadStorageState(this.config.defaultProfile),s=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),i={context:s,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,i),s}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),await this.saveStorageState(this.config.defaultProfile,n.context),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${xW}`}}loadStorageState(t){let n=Ca(t);try{if(!$o.existsSync(n))return;let r=JSON.parse($o.readFileSync(n,"utf8"));return W("[browser/vault] restored session",{profile:t,file:n}),r}catch(r){W("[browser/vault] ignoring unreadable vault",{profile:t,file:n,err:r});return}}async saveStorageState(t,n){try{let r=Ca(t);if(!$o.existsSync(r))return;let o=await n.storageState(),s=Lu.join(Lu.dirname(r),`.${Lu.basename(r)}.${process.pid}.${kW(4).toString("hex")}.tmp`);$o.writeFileSync(s,JSON.stringify(o),{mode:384}),$o.chmodSync(s,384),$o.renameSync(s,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as RW}from"crypto";function wh(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of CW)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function hT(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&AW.test(e.label))}function yT(e){return RW("sha256").update(e,"utf8").digest("hex").slice(0,8)}function bT(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var CW,AW,Ja=P(()=>{"use strict";CW=[{name:"aws-access-key",regex:/AKIA[0-9A-Z]{16}/g},{name:"github-pat",regex:/ghp_[a-zA-Z0-9]{36}/g},{name:"openai-bearer",regex:/sk-[a-zA-Z0-9_-]{20,}/g},{name:"slack-token",regex:/xox[abp]-[a-zA-Z0-9-]{10,}/g},{name:"jwt",regex:/eyJ[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}\.[a-zA-Z0-9_-]{20,}/g},{name:"form-password",regex:/password=[^&\s]+/gi}];AW=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as _W}from"node:crypto";function PW(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function IW(e,t,n){return`el_${_W("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function MW(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function wT(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function vT(e,t){let n=e.role??"",r=e.name??"";ST.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])vT(s,t)}async function OW(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let s=o.getBoundingClientRect(),i=o;if(s.width===0&&s.height===0){let u=window.getComputedStyle(i);if(u.display==="none"||u.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(s.left),y:Math.round(s.top),w:Math.round(s.width),h:Math.round(s.height)}})}return r},kT).catch(()=>[])}async function $W(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let s of r){let i=s.tagName.toLowerCase(),a=s.getAttribute("role")??"",l=s.getAttribute("aria-label")??s.getAttribute("placeholder")??(s.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[i]??"");if(i==="input"){let h=s.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let u="value"in s?s.value:void 0,d=u!==void 0?String(u):void 0,p=s.disabled??!1,m=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:p};d!==void 0&&(g.value=d),m!==void 0&&(g.checked=m),o.push(g)}return o},kT).catch(()=>[])}function DW(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Bu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=DW(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=OW(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,p,m,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],vT(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await $W(e)).filter(L=>ST.has(L.role??"")));let S=new Map;for(let I of p){let L=wT(I.name),N=S.get(L);(!N||N.bbox.w===0&&I.bbox.w>0)&&S.set(L,I)}let w=b.map(I=>({ax:I,dom:S.get(wT(I.name??""))})),k=r?w:w.filter(I=>I.dom?I.dom.bbox.w>0||I.dom.bbox.h>0:!0);k.sort((I,L)=>{let N=I.dom?.bbox.y??0,F=L.dom?.bbox.y??0;if(N!==F)return N-F;let U=I.dom?.bbox.x??0,H=L.dom?.bbox.x??0;return U-H}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let R=k.slice(0,n).map((I,L)=>{let N=I.ax.role??"generic",F=I.ax.name??"",U=IW(N,F,L),H=I.dom?.bbox??{x:0,y:0,w:0,h:0},D=I.dom?.type??null,C=null;I.ax.value!==void 0&&I.ax.value!==null&&(C=String(I.ax.value)),I.ax.checked!==void 0&&(C=String(I.ax.checked)),hT({role:N,kind:D})&&(C="[redacted]");let B={disabled:I.ax.disabled??!1};I.ax.checked!==void 0&&(B.checked=I.ax.checked===!0||I.ax.checked==="mixed"),I.ax.selected!==void 0&&(B.selected=I.ax.selected),I.ax.expanded!==void 0&&(B.expanded=I.ax.expanded);let M;I.dom?.testId?M=`[data-testid="${I.dom.testId}"]`:I.dom?.id&&(M=`#${I.dom.id}`);let j={id:U,role:N,label:PW(F),kind:D,value:C,state:B,bbox:H};return M!==void 0&&(j.selector=M),j}),A="idle";try{let I=await e.evaluate(()=>document.readyState);I==="loading"?A="loading":I==="interactive"?A="navigating":A="idle"}catch{A="navigating"}A!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let E=MW(m),O=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:O,url:g,title:h,textSummary:E,interactive:R,status:{httpStatus:t.httpStatus??null,loadingState:A,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var ST,kT,ET=P(()=>{"use strict";Ja();ST=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);kT="a[href], button, input, select, textarea, [role], [tabindex], label"});async function TT(e,t){try{let n=await e.nth(t).evaluate(i=>{let a=i,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",u=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(u.x),y:Math.round(u.y),w:Math.round(u.width),h:Math.round(u.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let i=0;i<r.length;i++)o=o*31+r.charCodeAt(i)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function Sh(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>TT(e,s)))).filter(o=>o!==null)}async function FW(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let s=0;s<o;s++){let i;try{i=await r.nth(s).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(i)||(t.add(i),n.push({key:i,locator:r,index:s}))}return n}async function vh(e,t,n){switch(t.kind){case"element_id":return LW(e,t,n);case"selector":return NW(e,t);case"semantic":return BW(e,t)}}async function LW(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),s=await o.count();if(s===0)return{outcome:"not_found",query:t};if(s===1)return{outcome:"resolved",locator:o};let i=await Sh(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function NW(e,t){let n=e.locator(t.selector),r=await n.count();if(r===0)return{outcome:"not_found",query:t};if(r===1)return{outcome:"resolved",locator:n};let o=await Sh(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function BW(e,t){return t.role!==void 0?UW(e,t.text,t.role):jW(e,t.text,t)}async function UW(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let s=await Sh(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function jW(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),s=e.getByLabel(t,{exact:!1}),[i,a,l]=await Promise.all([r.count(),o.count(),s.count()]);if(i+a+l===0)return{outcome:"not_found",query:n};let u=[];i>0&&u.push({loc:r,count:i}),a>0&&u.push({loc:o,count:a}),l>0&&u.push({loc:s,count:l});let d=await FW(u);if(d.length===0)return{outcome:"not_found",query:n};if(d.length===1){let h=d[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let p=d.slice(0,5),m=[];for(let h=0;h<p.length;h++){let b=p[h];if(b===void 0)continue;let y=await TT(b.locator,b.index);if(y!==null){let S=`${y.role}:${y.label}:${h}`,w=0;for(let k=0;k<S.length;k++)w=w*31+S.charCodeAt(k)>>>0;m.push({...y,id:`el_${w.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:m}}var xT=P(()=>{"use strict"});import{randomBytes as HW}from"crypto";import{mkdir as WW,stat as KW,writeFile as GW}from"fs/promises";import{join as kh}from"path";import{gzip as qW}from"zlib";import{promisify as zW}from"util";function JW(e){return kh(Cs(e),"browser")}function VW(e){return kh(JW(e),"screenshots")}function YW(){return new Date().toISOString().replace(/[:.]/g,"-")}function XW(){return HW(3).toString("hex")}async function Eh(e,t,n){if(t.length>RT)throw new Error(`writeScreenshotSidecar: buffer exceeds ${RT} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=VW(e);await WW(r,{recursive:!0});let o=`${YW()}-${XW()}-${n}.png`,s=kh(r,o);await GW(s,t);let{size:i}=await KW(s);return{path:s,bytes:i}}var Zde,RT,CT=P(()=>{"use strict";q();Ja();Zde=zW(qW);RT=5*1024*1024});var _T={};xc(_T,{PlaywrightProvider:()=>Th});function AT(e){switch(e.kind){case"semantic":return e.role!==void 0?`semantic('${e.text}', role='${e.role}')`:`semantic('${e.text}')`;case"element_id":return`element_id(${e.elementId})`;case"selector":return`selector(${e.selector})`}}var Th,PT=P(()=>{"use strict";gT();ET();xT();bh();Ja();CT();Th=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new Nu(t)}async open(t){let n=yh(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),s=this.ensureSessionState(r),i=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(i=await this.captureScreenshot(o,r,"browser_open")),s.observationCounter+=1;let l=await Bu(o,{observationCounter:s.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(s,l.interactive,l.url,l.title,"browser_open"),a!==null)throw a;return l}async observe(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_observe: no page open for session ${n}`);let o=this.ensureSessionState(n),s=null;t.screenshot===!0&&(s=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let i=await Bu(r,{observationCounter:o.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,i.interactive,i.url,i.title,"browser_observe"),i}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),s=r.url(),i=t.timeoutMs??3e4,a=await vh(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${AT(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,u=async()=>{switch(t.action){case"click":await l.click({timeout:i});break;case"fill":{let h=wh(t.value??"");await l.fill(t.value??"");break}case"press":await l.press(t.value??"");break;case"select":await l.selectOption(t.value??"");break;case"hover":await l.hover({timeout:i});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:i});break;case"wait_for":await l.waitFor({timeout:i,state:"visible"});break}};try{await u()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await u()}catch(b){c=b}else c=h}let d=r.url();if(d!==s){let h=yh(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let p=null;(t.screenshot===!0||c!==null)&&(p=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let m=await Bu(r,{observationCounter:o.observationCounter,screenshotPath:p,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,m.interactive,m.url,m.title,g),c!==null)throw c;return m}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),s;if(t.target!==void 0){let u=await vh(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${AT(t.target)}`);if(u.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");s=await u.locator.screenshot()}else s=await r.screenshot({fullPage:t.fullPage??!1});let{path:i,bytes:a}=await Eh(n,s,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let u=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=u.w,c=u.h}catch{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}else{let u=r.viewportSize();l=u?.width??0,c=u?.height??0}return{path:i,bytes:a,width:l,height:c,dataBase64:s.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,s){t.knownElements=new Map(n.map(i=>[i.id,i])),t.currentUrl=r,t.currentTitle=o,t.lastAction=s,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:s}=await Eh(n,o,r);return s}catch{return null}}}});var Fo={};xc(Fo,{__resetBrowserRegistryForTests:()=>nK,browserProviderActive:()=>eK,closeBrowserProvider:()=>xh,getBrowserProvider:()=>QW,peekBrowserProvider:()=>tK});function IT(){Promise.resolve(xh()).then(()=>{process.exit(130)})}function MT(){Promise.resolve(xh()).then(()=>{process.exit(143)})}function OT(){_n=null}function ZW(){Uu||(process.on("SIGINT",IT),process.on("SIGTERM",MT),process.on("exit",OT),Uu=!0)}function $T(){Uu&&(process.removeListener("SIGINT",IT),process.removeListener("SIGTERM",MT),process.removeListener("exit",OT),Uu=!1)}async function QW(e){return _n!==null?_n:(Do!==null||(Do=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(PT(),_T)),n=fT(e),r=new t(n);return ZW(),_n=r,Do=null,r})()),Do)}async function xh(){if(_n===null)return;let e=_n;_n=null,Do=null,$T(),await e.shutdown()}function eK(){return _n!==null}function tK(){return _n}function nK(){_n=null,Do=null,$T()}var _n,Do,Uu,Lo=P(()=>{"use strict";bh();_n=null,Do=null,Uu=!1});function DT(e,t){try{return lT(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function aK(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Lo(),Fo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function FT(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??aK,o=null,s=e,i=null,a=null;try{let c=await Fu(n,e,{headers:iK,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(sK.test(u))throw new Error(`web_scrape markdown mode received binary content (${u.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let d=await c.text();if(oK.test(u)&&!rK.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=DT(d,s)}}catch(c){if(t.signal.aborted||c instanceof Error&&c.message.startsWith("web_scrape markdown mode received binary"))throw c;a=c}if(!(o===null||o.textLength<aT)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),u=DT(c.html,c.finalUrl);if(o===null||u.textLength>=o.textLength)return{title:u.title,markdown:u.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let u=c instanceof Error?c.message:String(c),d=a instanceof Error?a.message:`HTTP ${i??"error"}`,p=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw p.cause=c,p}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:s,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${i??"error"}).`)}var rK,oK,sK,iK,LT=P(()=>{"use strict";cT();hh();Pe();rK=/(text\/html|application\/xhtml\+xml)/i,oK=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,sK=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,iK={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/web_scrape",Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}});function uK(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let s=await t(lK,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-api-key":e.apiKey,"User-Agent":"agent-afk/web_scrape"},body:JSON.stringify({query:n,type:"auto",numResults:Math.min(Math.max(r,1),cK),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!s.ok){let l="";try{let u=await s.text(),d=Mo(u);d&&(l=`: ${d.length>200?d.slice(0,200)+"\u2026":d}`)}catch{}let c=s.statusText?` ${s.statusText}`:"";throw new Error(`Exa Search HTTP ${s.status}${c}${l}`)}let i;try{i=await s.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(i.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function NT(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?uK({apiKey:e.exaApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set EXA_API_KEY (free tier at https://exa.ai) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function BT(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1083
1083
|
|
|
1084
1084
|
(no results)`;let n=[`# Search results for "${e}"`,""];return t.forEach((r,o)=>{n.push(`## ${o+1}. ${r.title}`),r.url&&n.push(r.url),r.description&&n.push(r.description),n.push("")}),n.join(`
|
|
1085
1085
|
`).trimEnd()}var lK,cK,UT=P(()=>{"use strict";Oo();lK="https://api.exa.ai/search",cK=10});function bK(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,s;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};s=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let i=dK;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};i=Math.min(t.timeout_ms,pK)}let a=mK;if(t.max_bytes!==void 0){if(typeof t.max_bytes!="number"||!Number.isFinite(t.max_bytes)||t.max_bytes<=0)return{error:"Invalid input: max_bytes must be a positive finite number"};a=Math.min(t.max_bytes,fK)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Rh(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+gK}function wK(e){let t=[],n=e;for(let o=0;o<4&&n instanceof Error;o++)t.push(n.message),n=n.cause;let r=t.join(" | ");return yK.some(o=>r.includes(o))}function SK(e={}){let t=e.fetchFn??globalThis.fetch,n=e.env??process.env;return async(r,o)=>{if(typeof t!="function")return{content:"web_scrape unavailable: global fetch() is not present in this runtime (agent-afk requires Node 20+).",isError:!0};let s=bK(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let u=i.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let d;try{d=await Fu(t,s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(m){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let p;try{p=await d.text()}catch(m){return{content:`web_scrape read error: ${m instanceof Error?m.message:String(m)}`,isError:!0}}return{content:Rh(p,s.maxBytes)}}if(s.mode==="markdown")try{let d=await FT(s.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:s.timeoutMs,signal:i.signal});return d.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${s.url}.`,isError:!0}:{content:Rh(d.markdown,s.maxBytes)}}catch(d){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let p=d instanceof Error?d.message:String(d),m=wK(d)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${p}${m}`,isError:!0}}let u=NT({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let d=await u.search(s.query,{limit:hK,timeoutMs:s.timeoutMs,signal:i.signal});return{content:Rh(BT(s.query,d),s.maxBytes)}}catch(d){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${u.name}): ${d instanceof Error?d.message:String(d)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var dK,pK,mK,fK,gK,hK,yK,jT,HT=P(()=>{"use strict";LT();UT();hh();dK=3e4,pK=12e4,mK=1e6,fK=1e7,gK=`
|
|
@@ -2012,7 +2012,7 @@ _ended: ${new Date().toISOString()}_
|
|
|
2012
2012
|
${k}${S}
|
|
2013
2013
|
${w}
|
|
2014
2014
|
${k}`})}return{fileBlocks:a,warnings:l}}async function gD(e,t,n,r,o="summary",s,i){let a=d0(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,u=!1,d=!1,p=!1,m=!1,g,h=!1,b=!1,y={abort:null},S=0,w=3e3,k=[],T=new Map,R=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=()=>{let N=r.subagentControl;N?.hasPromotableForeground()&&N.promoteActiveForeground().then(F=>{for(let U of F)(s??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${U.jobId}: ${U.label}`))}).catch(()=>{})},E=r.getCompositor?r.getCompositor():null,O=()=>new Xi({out:Zi(s),thinkingMode:o,...R?{activeSkillName:R}:{},onCancel:()=>{t.interrupt().catch(N=>{qe()&&console.error(" "+f.error("session.interrupt() failed:"),N)})},...r.subagentControl?{onBackground:A}:{},...i?.history?{history:i.history}:{},...i?.autocompleteState?{autocompleteState:i.autocompleteState}:{},...i?.promptText!==void 0?{promptText:i.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...E?{compositor:E}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=O(),I=async()=>{if(!p){p=!0;try{await _.dispose()}catch{}}},L=async()=>{await _.arm();let N=_.getCompositor();if(s&&N){let F=N;s.fn=U=>F.commitAbove(U)}r.setActiveCompositor?.(N),r.setInterruptNotifier?.(F=>_.setInterrupting(F)),r.rearmStatus?.()};try{E?E.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(C=>{qe()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),C)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(C=>{qe()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),C)})}),await L(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(A);let{fileBlocks:N,warnings:F}=fD(e.text,{rootDir:process.cwd()});for(let C of F)(s??{fn:console.log}).fn(f.dim(` @-file: ${C}`));let U=N.length>0||e.attachments.length>0?pD(e.text,e.attachments,void 0,N):e.text,H=t.sendMessageStream(U);if(await js((C,B)=>{_.process(C,B)},async()=>{for await(let C of H){if(h||b)break;if(C.type==="chunk"&&C.chunk.type==="content"?(l+=C.chunk.content,u=!0):C.type==="message"&&!u&&(l=C.message.content),C.type==="stream_retry"&&(l=l.slice(0,c)),C.type==="chunk"&&C.chunk.type==="tool_use_detail"){let B=C.chunk,M={toolName:B.toolName,toolUseId:B.toolUseId,input:B.toolInput,...B.toolInputRaw!==void 0&&{inputRaw:B.toolInputRaw}};T.set(B.toolUseId,M),k.push(M)}else if(C.type==="chunk"&&C.chunk.type==="tool_result"){let B=C.chunk;c=l.length;let M=T.get(B.toolUseId);if(M&&(M.result=B.content,M.isError=B.isError,T.delete(B.toolUseId)),r.onContextProgress){let j=Date.now();if(j-S>=w){S=j;try{let X=r.onContextProgress();X instanceof Promise&&await X}catch(X){qe()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),X)}}}}if(C.type==="paused"){if(r.setPausedState?.(!0),await I(),E&&C.autoResume===!0){let B=new AbortController;y.abort=B;let M=C.resetsAt?C.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,j=M?`Keep waiting \u2014 auto-resumes at ${M}`:"Keep waiting \u2014 auto-resume in progress",X="Switch model / provider (type /model after)",ie="Stop waiting",Z=[f.warning(" \u23F3 Usage limit reached.")+(M?f.dim(` Auto-resumes at ${M}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Xm(E,{header:Z,options:[j,X,ie],signal:B.signal,initialIndex:0}).then(fe=>{if(y.abort=null,!fe)return;let V=fe[0];V===void 0||V===j||(b=!0,V===X&&(s??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(_e=>{qe()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),_e)}))}).catch(fe=>{qe()&&console.error(" "+f.error("picker promise rejected:"),fe)})}else(s??{fn:console.log}).fn(ik({reason:C.reason,...C.resetsAt!==void 0?{resetsAt:C.resetsAt}:{},...C.accountId!==void 0?{accountId:C.accountId}:{},...C.autoResume!==void 0?{autoResume:C.autoResume}:{}}));continue}if(C.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let B=C.hotSwapped&&C.accountId?`\u25B6 Resumed on ${C.accountId}`:"\u25B6 Resumed";l="",c=0,u=!1,k.length=0,T.clear(),m=!1,g=void 0,d=!1,_=O(),p=!1,await L(),(s??{fn:console.log}).fn(f.success(B));continue}if(C.type==="error"){await I(),Ms(As(C.error)),d=!0;continue}_.process(C),C.type==="done"&&(m=!0,g=C.metadata)}}),await I(),h){let C=s?s.fn:console.log;C(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),C("")}if(b){let C=s?s.fn:console.log;C(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),C("")}if(m&&!h&&!b){Go(n,a,l,g,k),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Pp(process.stdout);let C=M=>{s?s.fn(M):console.log(M)},B=uD(l);if(B){if(C(dD(B)),C(""),r.onTerminalState)try{r.onTerminalState(B)}catch{}if(n.permissionMode==="autonomous"){let M=B.kind==="done"&&$u().verifyDone===!0&&!LI(k);BI(B,void 0,{unverified:M})}}if(bZ(g,n,C),r.onAfterTurn){let M=r.onAfterTurn();M instanceof Promise&&await M.catch(()=>{})}}}catch(N){await I(),d||Ms(As(N))}finally{await I(),s&&(s.fn=s.idleFn),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),y.abort?.abort(),y.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function bZ(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(he(e.durationMs)),e.totalCostUsd!==void 0&&r.push(lt(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),s=Number(e.usage?.output_tokens??0);o+s>0&&r.push(ae(o+s)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let i=Lb(t),a=Lt(t.model);if(i>=1){let l=Math.round((i-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${ae(l)} tok \u2014 model output may be silently truncated`))}else if(i>.5){let l=i>.8?f.error:f.warning;n(l(` context ${Math.round(i*100)}% used of ${ae(a)}`))}n("")}var wZ=5e3;async function SZ(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(f.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function hD(e,t,n,r,o,s,i,a){let{contextPane:l,loopStageBar:c,verdictLedger:u,shellPassthrough:d}=i,p=null,m=[];e.session.current.waitForInitialization().then(async y=>{qe()&&(p=Bp(y)),await Im(e.session.current),qe()&&(m=u$())}).catch(()=>{});let g,h=!1,b=!1;for(;;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),m.length>0){for(let E of m)e.replRenderer.writeLine(E);e.replRenderer.writeLine(""),m=[]}let y=d.drainNotifications();for(let{job:E,result:O}of y){let _=O.errorReason===void 0?"\u2713":"\u2717",I=O.errorReason==="abort"?"killed":O.errorReason==="timeout"?"timed out":O.errorReason==="signal-killed"?"killed by signal":`exit ${O.exitCode??0}`,L=Math.max(0,Math.round(O.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${_} [${E.id}] ${I} \xB7 ${L}s \xB7 `)+E.command)}let S=l.renderIfChanged(e.stats.sessionId);if(S.length>0){for(let E of S)e.replRenderer.writeLine(E);e.replRenderer.writeLine("")}let w,k;if(g===void 0){let E=await e.session.current.takePendingPlanExitSeed();E!==void 0&&(g={text:E,attachments:[]})}if(g!==void 0){let E=g;g=void 0;let O=na(e.stats.permissionMode),_=Qo({buffer:E.text,promptText:O,isTTY:!!process.stdout.isTTY,attachmentSummary:Wi([...E.attachments])});e.replRenderer.writeLine(_),w=E.text.trim(),k=E.attachments}else{let E=await o.readLine({promptFn:()=>na(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Zm(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});w=E.text.trim(),k=E.attachments}if(!w&&k.length===0)continue;if(w.startsWith("!")){let E=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!E&&(h||(h=!0,e.replRenderer.writeLine(f.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await d.dispatch(w))){e.statusLine.rearm();continue}}let T=!1;if(w.startsWith("/")){let E=await _I(w,e.slashCtx,k);if(E.handled){if(E.result==="exit"){e.rl.close();return}if((w==="/clear"||w.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),u.reset()),E.result!==null&&typeof E.result=="object"&&"kind"in E.result&&E.result.kind==="submit"){g={text:E.result.message,attachments:k??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}T=!0}a.push(w),await SZ(e,w);let R=w;if(T){let E=Fb(w);if(E){let O=E.name.replace(/^\//,"").split(":").pop()??"";if(O&&Hw(O)){let _={skillName:O,rawArgs:E.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},I=e.session.current.sessionId,L=ls(I),N=Date.now();W(`[afk trace] preflight.start commandName=${O}`);let F=!1,U=await as(_,{cwd:e.stats.cwd??process.cwd(),artifactDir:L},H=>{qe()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${O}) failed: `)+(H instanceof Error?H.message:String(H)))});F=U!==null,W(`[afk trace] preflight.end commandName=${O} durationMs=${Date.now()-N} success=${F}`),R=Kw(U?.manifestBlock,w)}}}let A=d.drainInjections();if(A.length>0&&(R=A+R),e.hookRegistry)try{let E={event:"UserPromptSubmit",prompt:R,sessionId:e.stats.sessionId},O=await e.hookRegistry.dispatch(E);O.injectContext&&(R=O.injectContext+R)}catch(E){if(E instanceof me){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(E.reason?f.dim(`: ${Mo(E.reason)}`):"")),e.statusLine.rearm();continue}if(E instanceof Tn){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+f.dim(`: handler timed out after ${E.timeoutMs}ms`)),e.statusLine.rearm();continue}throw E}if(await gD({text:R,attachments:k},e.session.current,e.stats,{setInFlight(E){n.turnInFlight=E},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(E){await t.appendUser(E)},async onTurnComplete(E,O){if(await t.appendTurn(E,O),e.stats.sessionId)try{Nn(e.stats)}catch(_){b||(b=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(_ instanceof Error?_.message:String(_))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:E=>u?.push(E),setActiveCompositor:E=>{n.activeCompositor=E},setInterruptNotifier:E=>{n.notifyInterrupting=E},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:E=>o.setBackgroundHandler(E),setSoftStopHandler:s,setPausedState:E=>o.setPausedState(E),setPauseInterruptHandler:E=>o.setPauseInterruptHandler(E),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(jn(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:E=>c.repaint(E)}:{}},e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(na(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,wZ)}catch(E){if(E instanceof ut)throw E;E instanceof Tn?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):E instanceof me?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${Mo(E.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(E))}}}function vZ(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function yD(e,t,n,r){let o=await J$(),s=new Ym({rl:e.rl,history:o,statusLine:e.statusLine}),i=vZ(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await eD(e,s,n,t,r,i,{getLoopStageBar:()=>a?.loopStageBar});a=cD(e,n),await hD(e,t,n,r,s,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.loopStageBar.stop(),a?.bgStatusBar.stop(),a?.verdictLedger.stop(),a?.contextPane.dispose();let l=c=>console.log(c);e.completionWriter.fn=l,e.completionWriter.idleFn=l,await s.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Ka();import{execFile as kZ}from"node:child_process";import{dirname as EZ,isAbsolute as TZ,resolve as xZ}from"node:path";import{promisify as RZ}from"node:util";var bD=RZ(kZ),CZ=3e3,AZ=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function _Z(){let t=(await bD("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=TZ(t)?t:xZ(process.cwd(),t);return EZ(n)}async function wD(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await _Z()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),CZ)});try{let o=Wn({execFile:bD,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),s=await Promise.race([o,r]);if(s==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let i=s;return i.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:i.candidates.filter(c=>AZ.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Zc();Ka();import{promises as PZ}from"node:fs";import{dirname as IZ,join as kD}from"node:path";import{randomBytes as MZ}from"node:crypto";var OZ=["Generate a 2-4 word kebab-case slug describing this work request.","Rules:","- ASCII lowercase letters and digits only, separated by single hyphens","- 2 to 4 hyphen-separated words","- Maximum 30 characters total","- No prefix, no quotes, no punctuation other than hyphens","- Output ONLY the slug \u2014 no explanation, no preamble","Examples: fix-cleanup-race, add-telegram-allowlist, refactor-prompt-loader, debug-flaky-test"].join(`
|
|
2015
|
-
`),SD=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pS=30,$Z=1024,DZ=8e3,FZ="haiku";async function LZ(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=jZ(n,$Z),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??DZ),i=t.signal?HZ([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Bs({token:t.token,model:t.model??FZ,system:OZ,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=NZ(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=IZ(t.worktreePath);return await BZ(l,c)}function NZ(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(SD.test(t)&&t.length<=pS)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>pS)break;o=i}return SD.test(o)?o:null}async function BZ(e,t){if(!await UZ(kD(t,e)))return e;let n=MZ(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pS-5)}-${n}`}async function UZ(e){try{return await PZ.access(e),!0}catch{return!1}}function jZ(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function HZ(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function ED(e){let t,n,r=kD(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await LZ(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${Pu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return vD(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return vD(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function vD(e,t){e&&e.setCwd(t),WZ(t)}function WZ(e){try{process.chdir(e)}catch{}}Ve();Ft();q();import{spawn as xD}from"child_process";import{existsSync as RD,mkdirSync as JZ,readFileSync as CD,unlinkSync as TD,writeFileSync as VZ}from"fs";import{get as YZ}from"https";import{join as AD}from"path";import{readFileSync as KZ}from"fs";import{dirname as GZ,join as qZ}from"path";import{fileURLToPath as zZ}from"url";function Cr(){try{return"5.15.
|
|
2015
|
+
`),SD=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,pS=30,$Z=1024,DZ=8e3,FZ="haiku";async function LZ(e,t){let n=e.trim();if(n.length===0)return t.onSkip?.("empty-message"),null;if(n.startsWith("/"))return t.onSkip?.("slash-command"),null;let r=jZ(n,$Z),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??DZ),i=t.signal?HZ([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Bs({token:t.token,model:t.model??FZ,system:OZ,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=NZ(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=IZ(t.worktreePath);return await BZ(l,c)}function NZ(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(SD.test(t)&&t.length<=pS)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>pS)break;o=i}return SD.test(o)?o:null}async function BZ(e,t){if(!await UZ(kD(t,e)))return e;let n=MZ(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,pS-5)}-${n}`}async function UZ(e){try{return await PZ.access(e),!0}catch{return!1}}function jZ(e,t){let n=Buffer.from(e,"utf8");if(n.length<=t)return e;let r=t;for(;r>0&&n[r]!==void 0&&(n[r]&192)===128;)r--;return n.slice(0,r).toString("utf8")}function HZ(e){let t=AbortSignal.any;if(typeof t=="function")return t.call(AbortSignal,e);let n=new AbortController;for(let r of e){if(r.aborted)return n.abort(r.reason),n.signal;r.addEventListener("abort",()=>n.abort(r.reason),{once:!0})}return n.signal}async function ED(e){let t,n,r=kD(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await LZ(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${Pu(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return vD(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return vD(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function vD(e,t){e&&e.setCwd(t),WZ(t)}function WZ(e){try{process.chdir(e)}catch{}}Ve();Ft();q();import{spawn as xD}from"child_process";import{existsSync as RD,mkdirSync as JZ,readFileSync as CD,unlinkSync as TD,writeFileSync as VZ}from"fs";import{get as YZ}from"https";import{join as AD}from"path";import{readFileSync as KZ}from"fs";import{dirname as GZ,join as qZ}from"path";import{fileURLToPath as zZ}from"url";function Cr(){try{return"5.15.3"}catch{}try{let e=GZ(zZ(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(KZ(qZ(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}J();var XZ=64*1024,ZZ=1440*60*1e3,QZ=3600*1e3,eQ="update-check.json",tQ="pending-update.json";function _D(){return AD(Pc(),eQ)}function lc(){return AD(Pc(),tQ)}function PD(){let e=Pc();RD(e)||JZ(e,{recursive:!0})}function nQ(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),s=n(t).split(".").map(Number),i=Math.max(o.length,s.length);for(let a=0;a<i;a++){let l=o[a]??0,c=s[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function rQ(){try{let e=CD(_D(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function oQ(){try{PD();let e=`
|
|
2016
2016
|
const https = require('https');
|
|
2017
2017
|
const fs = require('fs');
|
|
2018
2018
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|