agent-afk 3.104.1 → 3.104.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +2 -2
- package/dist/index.mjs +3 -3
- package/dist/telegram.mjs +47 -47
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -1054,7 +1054,7 @@ ${o}`;return s.includes("already checked out")||s.includes("is already used by w
|
|
|
1054
1054
|
Effective base URL: ${r}`)),r}return t}function VF(){if(Am!==void 0)return Am;if(!lS){let o=[Hi(process.cwd(),".env"),mt(),rb()];for(let s of o)_m(s)&&JF({path:s,override:!1});lS=!0}let e={},t=k.AFK_MODEL??k.CLAUDE_MODEL;if(t){let o=t.toLowerCase();e.model=Kp(o)?o:t}if(ne(t)==="anthropic-direct"){let o=Im();o!==void 0&&(e.apiKey=o)}let r=k.AFK_LOCAL_BASE_URL;if(r&&r.length>0&&(e.baseUrl=r,e.apiKey=k.AFK_LOCAL_API_KEY||"local"),k.AFK_MAX_TOKENS&&(e.maxTokens=parseInt(k.AFK_MAX_TOKENS,10)),k.AFK_TEMPERATURE&&(e.temperature=parseFloat(k.AFK_TEMPERATURE)),k.AFK_SYSTEM_PROMPT&&(e.systemPrompt=k.AFK_SYSTEM_PROMPT),k.AFK_AUTO_ROUTING){let o=k.AFK_AUTO_ROUTING.toLowerCase()==="true";e.autoRouting={interactive:o,chat:o,telegram:o,daemon:o}}return k.AFK_OPENAI_BASE_URL&&(e.openaiBaseUrl=YF(k.AFK_OPENAI_BASE_URL)),Am=e,e}function dS(){if(as!==void 0)return as;let e=[Hi(process.cwd(),"afk.config.json"),Zt(),yl()];for(let t of e)if(_m(t))try{let n=uS(t,"utf-8"),r=JSON.parse(n),o={},s=Bb(r.models);if(typeof r.model=="string"&&r.model.length>0){let i=r.model.toLowerCase();o.model=Kp(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),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}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!==Hi(process.cwd(),"afk.config.json")){let i=Ui(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=Tm(r.interactive.worktreeBranchPrefix,`${t}#/interactive/worktreeBranchPrefix`)),typeof r.interactive.worktreeBase=="string"&&r.interactive.worktreeBase.trim().length>0&&(xm(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 as={config:o,sourcePath:t,modelsPartial:s},as}catch(n){console.error(`Warning: Failed to parse ${t}:`,n)}return as={config:{},sourcePath:void 0,modelsPartial:{}},as}function XF(){if(ls!==void 0)return ls.value;let e=[Hi(process.cwd(),"AFK.md"),Hi(Me(),"AFK.md")];for(let t of e)if(_m(t))try{let n=uS(t,"utf-8").trim();if(n.length>0)return ls={value:{content:n,path:t}},ls.value}catch{}return ls={value:null},ls.value}function pS(){return dS().config.telegram??{}}function pt(e){let t=VF(),{config:n,sourcePath:r,modelsPartial:o}=dS(),s={...ji,...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=XF();c!==null&&(s.systemPrompt=c.content,i=`afk-md:${c.path}`)}let a={model:s.model??ji.model,maxTokens:s.maxTokens??ji.maxTokens,temperature:s.temperature??ji.temperature,updatePolicy:s.updatePolicy??ji.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}:{},...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??jp(o);if(Il(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 ji,lS,Am,cS,as,ls,Fn=I(()=>{"use strict";ir();sr();Je();W();ss();Bi();z();eo();ji={model:"sonnet",maxTokens:4096,temperature:1,updatePolicy:"notify"},lS=!1;cS=new Set});function ZF(e,t){return t!==void 0&&Number.isFinite(t)&&t!==0?t:e.find(r=>r>0)??e[0]}function QF(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=ZF(n,t.primaryChatId);return o!==void 0?[o]:[]}function eN(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 tN(e){if(!e)return;let t=e.trim().toLowerCase();return t==="primary"||t==="broadcast"||t==="custom"?t:void 0}function nN(){let e=pS().notify??{},t=e.mode??tN(k.AFK_TELEGRAM_NOTIFY_MODE),n=e.primaryChatId??eN(k.AFK_TELEGRAM_PRIMARY_CHAT_ID);return{...t!==void 0?{mode:t}:{},...n!==void 0?{primaryChatId:n}:{},...e.targets!==void 0?{targets:e.targets}:{}}}function sc(){let e=Kw(k.AFK_TELEGRAM_ALLOWED_CHAT_IDS);return QF(e,nN())}var Pm=I(()=>{"use strict";Gw();Fn();z()});function mS(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(`
|
|
1055
1055
|
`,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}var fS=I(()=>{"use strict"});var Mm={};cl(Mm,{push:()=>ic,pushIfConfigured:()=>cs});async function ic(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??rN}/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 cs(e,t={}){let n=k.TELEGRAM_BOT_TOKEN;if(!n)return null;let r=sc();if(r.length===0)return null;let o=mS(e),s=[];for(let i of r)for(let a=0;a<o.length;a++)s.push(await ic({token:n,chatId:i,text:o[a]??"",...t.parseMode!==void 0?{parseMode:t.parseMode}:{},...t.replyMarkup!==void 0&&a===0?{replyMarkup:t.replyMarkup}:{},...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}}));return s}var rN,us=I(()=>{"use strict";Pm();fS();z();rN="https://api.telegram.org"});function oN(e=ic){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>gS)return{content:`Invalid input: message exceeds Telegram's ${gS}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=k.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=sc();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 gS,hS,yS=I(()=>{"use strict";z();us();Pm();gS=4096;hS=oN()});import{JSDOM as sN}from"jsdom";import{Readability as iN}from"@mozilla/readability";import aN from"turndown";function bS(e){return e.replace(/\n{3,}/g,`
|
|
1056
1056
|
|
|
1057
|
-
`).trim()}function lN(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function SS(e,t){let r=new sN(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new iN(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=bS(Om.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=bS(Om.turndown(a));return{title:o,markdown:l,textLength:lN(i),usedFallback:!0}}var wS,Om,vS=I(()=>{"use strict";wS=200,Om=new aN({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Om.remove(["script","style","noscript","iframe"])});import{readFileSync as cN}from"node:fs";import{join as uN}from"path";function dN(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function kS(e,t){return dN(t).test(e)}function fN(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(pN.has(t))return!0;if(mN.has(t))return!1}return!1}function ES(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function gN(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 hN(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function yN(e){try{return cN(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function bN(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return n}function TS(e){let t=e?.env??k,n=e?.readFileSync??yN,r=e?.surface??t.AGENT_SURFACE,o=fN(t.AFK_BROWSER_HEADLESS,r),s=ES(t.AFK_BROWSER_ALLOWED_DOMAINS),i=ES(t.AFK_BROWSER_BLOCKED_DOMAINS),a=hN(t.AFK_BROWSER_DOM_SNAPSHOTS),l=gN(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():uN(Vt(),"browser.json"),m=n(d);if(m===void 0)return c;let f;try{f=JSON.parse(m)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof f!="object"||f===null||Array.isArray(f))throw new Error(`Browser config at ${d} must be a JSON object`);let g=bN(c,f);return g.configPath=d,g}function $m(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(kS(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>kS(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var pN,mN,Dm=I(()=>{"use strict";z();W();pN=new Set(["daemon","subagent","telegram"]),mN=new Set(["repl","interactive","cli"])});import wN from"node:fs";import SN from"node:path";import{chromium as vN}from"playwright";function kN(){try{return"3.104.1"}catch{}try{let e=SN.resolve(import.meta.dirname,"../../../package.json"),t=wN.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var EN,ac,xS=I(()=>{"use strict";EN=kN(),ac=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=vN.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${EN}`}}}});import{createHash as TN}from"crypto";function Lm(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of xN)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function RS(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&RN.test(e.label))}function CS(e){return TN("sha256").update(e,"utf8").digest("hex").slice(0,8)}function AS(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var xN,RN,Wi=I(()=>{"use strict";xN=[{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}];RN=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as CN}from"node:crypto";function AN(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function _N(e,t,n){return`el_${CN("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function IN(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function _S(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function PS(e,t){let n=e.role??"",r=e.name??"";IS.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])PS(s,t)}async function PN(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},MS).catch(()=>[])}async function MN(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,m=s.disabled??!1,f=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:m};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},MS).catch(()=>[])}function ON(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function lc(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=ON(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=PN(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,m,f,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],PS(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await MN(e)).filter(C=>IS.has(C.role??"")));let w=new Map;for(let L of m){let C=_S(L.name),F=w.get(C);(!F||F.bbox.w===0&&L.bbox.w>0)&&w.set(C,L)}let S=b.map(L=>({ax:L,dom:w.get(_S(L.name??""))})),x=r?S:S.filter(L=>L.dom?L.dom.bbox.w>0||L.dom.bbox.h>0:!0);x.sort((L,C)=>{let F=L.dom?.bbox.y??0,N=C.dom?.bbox.y??0;if(F!==N)return F-N;let U=L.dom?.bbox.x??0,G=C.dom?.bbox.x??0;return U-G}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=x.slice(0,n).map((L,C)=>{let F=L.ax.role??"generic",N=L.ax.name??"",U=_N(F,N,C),G=L.dom?.bbox??{x:0,y:0,w:0,h:0},$=L.dom?.type??null,j=null;L.ax.value!==void 0&&L.ax.value!==null&&(j=String(L.ax.value)),L.ax.checked!==void 0&&(j=String(L.ax.checked)),RS({role:F,kind:$})&&(j="[redacted]");let A={disabled:L.ax.disabled??!1};L.ax.checked!==void 0&&(A.checked=L.ax.checked===!0||L.ax.checked==="mixed"),L.ax.selected!==void 0&&(A.selected=L.ax.selected),L.ax.expanded!==void 0&&(A.expanded=L.ax.expanded);let P;L.dom?.testId?P=`[data-testid="${L.dom.testId}"]`:L.dom?.id&&(P=`#${L.dom.id}`);let J={id:U,role:F,label:AN(N),kind:$,value:j,state:A,bbox:G};return P!==void 0&&(J.selector=P),J}),R="idle";try{let L=await e.evaluate(()=>document.readyState);L==="loading"?R="loading":L==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let T=IN(f),O=`obs_${t.observationCounter.toString(36)}`,D=new Date().toISOString();return{observationId:O,url:g,title:h,textSummary:T,interactive:_,status:{httpStatus:t.httpStatus??null,loadingState:R,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:D}}var IS,MS,OS=I(()=>{"use strict";Wi();IS=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);MS="a[href], button, input, select, textarea, [role], [tabindex], label"});async function $S(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 Fm(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>$S(e,s)))).filter(o=>o!==null)}async function $N(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 Nm(e,t,n){switch(t.kind){case"element_id":return DN(e,t,n);case"selector":return LN(e,t);case"semantic":return FN(e,t)}}async function DN(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 Fm(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function LN(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 Fm(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function FN(e,t){return t.role!==void 0?NN(e,t.text,t.role):BN(e,t.text,t)}async function NN(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 Fm(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function BN(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 $N(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 m=d.slice(0,5),f=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let y=await $S(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,S=0;for(let x=0;x<w.length;x++)S=S*31+w.charCodeAt(x)>>>0;f.push({...y,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var DS=I(()=>{"use strict"});import{randomBytes as UN}from"crypto";import{mkdir as jN,stat as HN,writeFile as WN}from"fs/promises";import{join as Bm}from"path";import{gzip as KN}from"zlib";import{promisify as GN}from"util";function zN(e){return Bm(Wo(e),"browser")}function qN(e){return Bm(zN(e),"screenshots")}function JN(){return new Date().toISOString().replace(/[:.]/g,"-")}function YN(){return UN(3).toString("hex")}async function Um(e,t,n){if(t.length>LS)throw new Error(`writeScreenshotSidecar: buffer exceeds ${LS} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=qN(e);await jN(r,{recursive:!0});let o=`${JN()}-${YN()}-${n}.png`,s=Bm(r,o);await WN(s,t);let{size:i}=await HN(s);return{path:s,bytes:i}}var zne,LS,FS=I(()=>{"use strict";W();Wi();zne=GN(KN);LS=5*1024*1024});var BS={};cl(BS,{PlaywrightProvider:()=>jm});function NS(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 jm,US=I(()=>{"use strict";xS();OS();DS();Dm();Wi();FS();jm=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new ac(t)}async open(t){let n=$m(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 lc(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 lc(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 Nm(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${NS(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=Lm(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=$m(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await lc(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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 Nm(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${NS(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 Um(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 Um(n,o,r);return s}catch{return null}}}});var no={};cl(no,{__resetBrowserRegistryForTests:()=>eB,browserProviderActive:()=>ZN,closeBrowserProvider:()=>Hm,getBrowserProvider:()=>XN,peekBrowserProvider:()=>QN});function jS(){Promise.resolve(Hm()).then(()=>{process.exit(130)})}function HS(){Promise.resolve(Hm()).then(()=>{process.exit(143)})}function WS(){nn=null}function VN(){cc||(process.on("SIGINT",jS),process.on("SIGTERM",HS),process.on("exit",WS),cc=!0)}function KS(){cc&&(process.removeListener("SIGINT",jS),process.removeListener("SIGTERM",HS),process.removeListener("exit",WS),cc=!1)}async function XN(e){return nn!==null?nn:(to!==null||(to=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(US(),BS)),n=TS(e),r=new t(n);return VN(),nn=r,to=null,r})()),to)}async function Hm(){if(nn===null)return;let e=nn;nn=null,to=null,KS(),await e.shutdown()}function ZN(){return nn!==null}function QN(){return nn}function eB(){nn=null,to=null,KS()}var nn,to,cc,ro=I(()=>{"use strict";Dm();nn=null,to=null,cc=!1});function GS(e,t){try{return SS(e,t)}catch(n){return Y("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function sB(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ro(),no));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function zS(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??sB,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:oB,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(rB.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(nB.test(u)&&!tB.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=GS(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<wS)&&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=GS(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"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw m.cause=c,m}}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 tB,nB,rB,oB,qS=I(()=>{"use strict";vS();De();tB=/(text\/html|application\/xhtml\+xml)/i,nB=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,rB=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,oB={"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 JS(e){return e.replace(/<[^>]*>/g,"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'").replace(/\s+/g," ").trim()}function lB(e){let t=e.fetchFn??globalThis.fetch;return{name:"brave",async search(n,{limit:r,signal:o}){let s=new URL(iB);s.searchParams.set("q",n),s.searchParams.set("count",String(Math.min(Math.max(r,1),aB)));let i=await t(s.toString(),{method:"GET",headers:{Accept:"application/json","Accept-Encoding":"gzip","X-Subscription-Token":e.apiKey,"User-Agent":"agent-afk/web_scrape"},signal:o});if(!i.ok){let c="";try{let d=await i.text(),m=Yl(d);m&&(c=`: ${m.length>200?m.slice(0,200)+"\u2026":m}`)}catch{}let u=i.statusText?` ${i.statusText}`:"";throw new Error(`Brave Search HTTP ${i.status}${u}${c}`)}let a;try{a=await i.json()}catch(c){throw new Error(`Brave Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(a.web?.results??[]).slice(0,r).map(c=>({title:JS(c.title??"")||"(untitled)",url:c.url??"",description:JS(c.description??"")})).filter(c=>c.url.length>0)}}}function YS(e){return e.braveApiKey!==void 0&&e.braveApiKey.trim()!==""?lB({apiKey:e.braveApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set BRAVE_SEARCH_API_KEY (free tier at https://brave.com/search/api/) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function VS(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1057
|
+
`).trim()}function lN(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function SS(e,t){let r=new sN(e,{url:t}).window.document,o=(r.title??"").trim(),s=null;try{let c=r.cloneNode(!0);s=new iN(c).parse()}catch{s=null}if(s&&typeof s.content=="string"&&s.content.trim().length>0){let c=bS(Om.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=bS(Om.turndown(a));return{title:o,markdown:l,textLength:lN(i),usedFallback:!0}}var wS,Om,vS=I(()=>{"use strict";wS=200,Om=new aN({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});Om.remove(["script","style","noscript","iframe"])});import{readFileSync as cN}from"node:fs";import{join as uN}from"path";function dN(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function kS(e,t){return dN(t).test(e)}function fN(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(pN.has(t))return!0;if(mN.has(t))return!1}return!1}function ES(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function gN(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 hN(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function yN(e){try{return cN(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function bN(e,t){let n={...e};if(typeof t.headless=="boolean"&&(n.headless=t.headless),Array.isArray(t.allowedDomains)&&(n.allowedDomains=t.allowedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),Array.isArray(t.blockedDomains)&&(n.blockedDomains=t.blockedDomains.filter(r=>typeof r=="string").map(r=>r.trim().toLowerCase()).filter(r=>r.length>0)),typeof t.domSnapshots=="boolean"&&(n.domSnapshots=t.domSnapshots),t.backend==="playwright")n.backend="playwright";else if(t.backend!==void 0)throw new Error(`AFK_BROWSER_BACKEND: only "playwright" is supported in Phase 1, got: ${String(t.backend)}`);return n}function TS(e){let t=e?.env??k,n=e?.readFileSync??yN,r=e?.surface??t.AGENT_SURFACE,o=fN(t.AFK_BROWSER_HEADLESS,r),s=ES(t.AFK_BROWSER_ALLOWED_DOMAINS),i=ES(t.AFK_BROWSER_BLOCKED_DOMAINS),a=hN(t.AFK_BROWSER_DOM_SNAPSHOTS),l=gN(t.AFK_BROWSER_BACKEND),c={headless:o,allowedDomains:s,blockedDomains:i,domSnapshots:a,backend:l,configPath:null},u=t.AFK_BROWSER_CONFIG,d=u!==void 0&&u.trim()!==""?u.trim():uN(Vt(),"browser.json"),m=n(d);if(m===void 0)return c;let f;try{f=JSON.parse(m)}catch(h){throw new Error(`Failed to parse browser config at ${d}: ${String(h)}`)}if(typeof f!="object"||f===null||Array.isArray(f))throw new Error(`Browser config at ${d} must be a JSON object`);let g=bN(c,f);return g.configPath=d,g}function $m(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(kS(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>kS(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var pN,mN,Dm=I(()=>{"use strict";z();W();pN=new Set(["daemon","subagent","telegram"]),mN=new Set(["repl","interactive","cli"])});import wN from"node:fs";import SN from"node:path";import{chromium as vN}from"playwright";function kN(){try{return"3.104.2"}catch{}try{let e=SN.resolve(import.meta.dirname,"../../../package.json"),t=wN.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var EN,ac,xS=I(()=>{"use strict";EN=kN(),ac=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=vN.launch({headless:this.config.headless}).then(t=>(this.browser=t,this.launchPromise=void 0,t)).catch(t=>{throw this.launchPromise=void 0,t}),this.launchPromise))}isBrowserActive(){return this.browser!==void 0&&this.browser.isConnected()}async ensureContext(t){let n=this.sessions.get(t);if(n!==void 0)return n.context;let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s={context:o,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),o}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",s=>{s.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",s=>{s.isNavigationRequest()&&s.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",s=>{s.frame()===o.mainFrame()&&s.request().isNavigationRequest()&&(r.lastHttpStatus=s.status())}),o.on("dialog",s=>{r.openDialog=s}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),s=()=>{o.close().catch(()=>{})};if(n.signal?.aborted===!0)throw await o.close().catch(()=>{}),new Error("render aborted");n.signal!==void 0&&n.signal.addEventListener("abort",s,{once:!0});try{let i=await o.newPage(),a=await i.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await i.content(),c=i.url(),u=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:u}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",s),await o.close().catch(()=>{})}}getConsoleErrorCount(t){return this.sessions.get(t)?.consoleErrors??0}getLastHttpStatus(t){return this.sessions.get(t)?.lastHttpStatus??null}hasOpenDialog(t){return this.sessions.get(t)?.openDialog!==void 0}async dismissDialog(t,n=!0){let r=this.sessions.get(t);if(r===void 0||r.openDialog===void 0)return;let o=r.openDialog;r.openDialog=void 0,n?await o.accept():await o.dismiss()}async closeSession(t){let n=this.sessions.get(t);n!==void 0&&(this.sessions.delete(t),n.page!==void 0&&await n.page.close().catch(()=>{}),await n.context.close().catch(()=>{}))}async shutdown(){if(this.shutdownComplete)return;this.shutdownComplete=!0;let t=[...this.sessions.keys()];if(await Promise.all(t.map(n=>this.closeSession(n))),this.browser!==void 0){let n=this.browser;this.browser=void 0,await n.close().catch(()=>{})}}activeSessions(){return this.sessions.size}contextOptions(){return{viewport:{width:1280,height:800},userAgent:`Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 agent-afk/${EN}`}}}});import{createHash as TN}from"crypto";function Lm(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of xN)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function RS(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&RN.test(e.label))}function CS(e){return TN("sha256").update(e,"utf8").digest("hex").slice(0,8)}function AS(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var xN,RN,Wi=I(()=>{"use strict";xN=[{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}];RN=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as CN}from"node:crypto";function AN(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function _N(e,t,n){return`el_${CN("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function IN(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function _S(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function PS(e,t){let n=e.role??"",r=e.name??"";IS.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let s of e.children??[])PS(s,t)}async function PN(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},MS).catch(()=>[])}async function MN(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,m=s.disabled??!1,f=i==="input"?s.checked:void 0,g={role:c,name:l,disabled:m};d!==void 0&&(g.value=d),f!==void 0&&(g.checked=f),o.push(g)}return o},MS).catch(()=>[])}function ON(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function lc(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],s=ON(e),i=s?s.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=PN(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),u=e.title().catch(()=>""),[d,m,f,g,h]=await Promise.all([i,a,l,c,u]),b,y=!1;d!==null?(b=[],PS(d,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await MN(e)).filter(C=>IS.has(C.role??"")));let w=new Map;for(let L of m){let C=_S(L.name),F=w.get(C);(!F||F.bbox.w===0&&L.bbox.w>0)&&w.set(C,L)}let S=b.map(L=>({ax:L,dom:w.get(_S(L.name??""))})),x=r?S:S.filter(L=>L.dom?L.dom.bbox.w>0||L.dom.bbox.h>0:!0);x.sort((L,C)=>{let F=L.dom?.bbox.y??0,N=C.dom?.bbox.y??0;if(F!==N)return F-N;let U=L.dom?.bbox.x??0,G=C.dom?.bbox.x??0;return U-G}),x.length>200&&o.push("page has 200+ interactive elements; consider scoping");let _=x.slice(0,n).map((L,C)=>{let F=L.ax.role??"generic",N=L.ax.name??"",U=_N(F,N,C),G=L.dom?.bbox??{x:0,y:0,w:0,h:0},$=L.dom?.type??null,j=null;L.ax.value!==void 0&&L.ax.value!==null&&(j=String(L.ax.value)),L.ax.checked!==void 0&&(j=String(L.ax.checked)),RS({role:F,kind:$})&&(j="[redacted]");let A={disabled:L.ax.disabled??!1};L.ax.checked!==void 0&&(A.checked=L.ax.checked===!0||L.ax.checked==="mixed"),L.ax.selected!==void 0&&(A.selected=L.ax.selected),L.ax.expanded!==void 0&&(A.expanded=L.ax.expanded);let P;L.dom?.testId?P=`[data-testid="${L.dom.testId}"]`:L.dom?.id&&(P=`#${L.dom.id}`);let J={id:U,role:F,label:AN(N),kind:$,value:j,state:A,bbox:G};return P!==void 0&&(J.selector=P),J}),R="idle";try{let L=await e.evaluate(()=>document.readyState);L==="loading"?R="loading":L==="interactive"?R="navigating":R="idle"}catch{R="navigating"}R!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),y&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let T=IN(f),O=`obs_${t.observationCounter.toString(36)}`,D=new Date().toISOString();return{observationId:O,url:g,title:h,textSummary:T,interactive:_,status:{httpStatus:t.httpStatus??null,loadingState:R,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:D}}var IS,MS,OS=I(()=>{"use strict";Wi();IS=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);MS="a[href], button, input, select, textarea, [role], [tabindex], label"});async function $S(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 Fm(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,s)=>$S(e,s)))).filter(o=>o!==null)}async function $N(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 Nm(e,t,n){switch(t.kind){case"element_id":return DN(e,t,n);case"selector":return LN(e,t);case"semantic":return FN(e,t)}}async function DN(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 Fm(o,s);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:i}}async function LN(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 Fm(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function FN(e,t){return t.role!==void 0?NN(e,t.text,t.role):BN(e,t.text,t)}async function NN(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 Fm(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:s}}async function BN(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 $N(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 m=d.slice(0,5),f=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let y=await $S(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,S=0;for(let x=0;x<w.length;x++)S=S*31+w.charCodeAt(x)>>>0;f.push({...y,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var DS=I(()=>{"use strict"});import{randomBytes as UN}from"crypto";import{mkdir as jN,stat as HN,writeFile as WN}from"fs/promises";import{join as Bm}from"path";import{gzip as KN}from"zlib";import{promisify as GN}from"util";function zN(e){return Bm(Wo(e),"browser")}function qN(e){return Bm(zN(e),"screenshots")}function JN(){return new Date().toISOString().replace(/[:.]/g,"-")}function YN(){return UN(3).toString("hex")}async function Um(e,t,n){if(t.length>LS)throw new Error(`writeScreenshotSidecar: buffer exceeds ${LS} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=qN(e);await jN(r,{recursive:!0});let o=`${JN()}-${YN()}-${n}.png`,s=Bm(r,o);await WN(s,t);let{size:i}=await HN(s);return{path:s,bytes:i}}var zne,LS,FS=I(()=>{"use strict";W();Wi();zne=GN(KN);LS=5*1024*1024});var BS={};cl(BS,{PlaywrightProvider:()=>jm});function NS(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 jm,US=I(()=>{"use strict";xS();OS();DS();Dm();Wi();FS();jm=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new ac(t)}async open(t){let n=$m(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 lc(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 lc(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 Nm(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${NS(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=Lm(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=$m(d,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:d,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let f=await lc(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}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 Nm(r,t.target,o.knownElements);if(u.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${NS(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 Um(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 Um(n,o,r);return s}catch{return null}}}});var no={};cl(no,{__resetBrowserRegistryForTests:()=>eB,browserProviderActive:()=>ZN,closeBrowserProvider:()=>Hm,getBrowserProvider:()=>XN,peekBrowserProvider:()=>QN});function jS(){Promise.resolve(Hm()).then(()=>{process.exit(130)})}function HS(){Promise.resolve(Hm()).then(()=>{process.exit(143)})}function WS(){nn=null}function VN(){cc||(process.on("SIGINT",jS),process.on("SIGTERM",HS),process.on("exit",WS),cc=!0)}function KS(){cc&&(process.removeListener("SIGINT",jS),process.removeListener("SIGTERM",HS),process.removeListener("exit",WS),cc=!1)}async function XN(e){return nn!==null?nn:(to!==null||(to=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(US(),BS)),n=TS(e),r=new t(n);return VN(),nn=r,to=null,r})()),to)}async function Hm(){if(nn===null)return;let e=nn;nn=null,to=null,KS(),await e.shutdown()}function ZN(){return nn!==null}function QN(){return nn}function eB(){nn=null,to=null,KS()}var nn,to,cc,ro=I(()=>{"use strict";Dm();nn=null,to=null,cc=!1});function GS(e,t){try{return SS(e,t)}catch(n){return Y("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function sB(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(ro(),no));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function zS(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??sB,o=null,s=e,i=null,a=null;try{let c=await n(e,{headers:oB,redirect:"follow",signal:t.signal});i=c.status,s=c.url||e;let u=c.headers.get("content-type")??"";if(c.ok){if(rB.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(nB.test(u)&&!tB.test(u))return{title:"",markdown:d.trim(),finalUrl:s,usedRender:!1};o=GS(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<wS)&&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=GS(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"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${d}) and render failed (${u}).`);throw m.cause=c,m}}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 tB,nB,rB,oB,qS=I(()=>{"use strict";vS();De();tB=/(text\/html|application\/xhtml\+xml)/i,nB=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,rB=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,oB={"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 JS(e){return e.replace(/<[^>]*>/g,"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'").replace(/\s+/g," ").trim()}function lB(e){let t=e.fetchFn??globalThis.fetch;return{name:"brave",async search(n,{limit:r,signal:o}){let s=new URL(iB);s.searchParams.set("q",n),s.searchParams.set("count",String(Math.min(Math.max(r,1),aB)));let i=await t(s.toString(),{method:"GET",headers:{Accept:"application/json","Accept-Encoding":"gzip","X-Subscription-Token":e.apiKey,"User-Agent":"agent-afk/web_scrape"},signal:o});if(!i.ok){let c="";try{let d=await i.text(),m=Yl(d);m&&(c=`: ${m.length>200?m.slice(0,200)+"\u2026":m}`)}catch{}let u=i.statusText?` ${i.statusText}`:"";throw new Error(`Brave Search HTTP ${i.status}${u}${c}`)}let a;try{a=await i.json()}catch(c){throw new Error(`Brave Search response was not JSON: ${c instanceof Error?c.message:String(c)}`)}return(a.web?.results??[]).slice(0,r).map(c=>({title:JS(c.title??"")||"(untitled)",url:c.url??"",description:JS(c.description??"")})).filter(c=>c.url.length>0)}}}function YS(e){return e.braveApiKey!==void 0&&e.braveApiKey.trim()!==""?lB({apiKey:e.braveApiKey,fetchFn:e.fetchFn}):{error:'web_scrape search mode requires a search backend. Set BRAVE_SEARCH_API_KEY (free tier at https://brave.com/search/api/) to enable it. Use mode: "markdown" to read a known URL, or mode: "raw" for a direct fetch.'}}function VS(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
1058
1058
|
|
|
1059
1059
|
(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(`
|
|
1060
1060
|
`).trimEnd()}var iB,aB,XS=I(()=>{"use strict";rs();iB="https://api.search.brave.com/res/v1/web/search",aB=20});function hB(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=cB;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,uB)}let a=dB;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,pB)}return{mode:r,url:o,query:s,timeoutMs:i,maxBytes:a}}function Wm(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+mB}function yB(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 gB.some(o=>r.includes(o))}function bB(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=hB(r);if("error"in s)return{content:s.error,isError:!0};if(o.aborted){let u=o.reason;return{content:`web_scrape aborted: ${u instanceof Error?u.message:String(u??"aborted")}`,isError:!0}}let i=new AbortController,a=()=>{i.abort(o.reason)},l,c=()=>{let u=i.signal.reason;return u instanceof Error?u.message:String(u??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{i.abort(new Error(`web_scrape timeout after ${s.timeoutMs}ms`))},s.timeoutMs),s.mode==="raw"){let d;try{d=await t(s.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:i.signal})}catch(f){return i.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}if(!d.ok)return{content:`web_scrape HTTP ${d.status} ${d.statusText||""}`.trimEnd()+` for ${s.url}`,isError:!0};let m;try{m=await d.text()}catch(f){return{content:`web_scrape read error: ${f instanceof Error?f.message:String(f)}`,isError:!0}}return{content:Wm(m,s.maxBytes)}}if(s.mode==="markdown")try{let d=await zS(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:Wm(d.markdown,s.maxBytes)}}catch(d){if(i.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=d instanceof Error?d.message:String(d),f=yB(d)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${f}`,isError:!0}}let u=YS({braveApiKey:n.BRAVE_SEARCH_API_KEY,fetchFn:t});if("error"in u)return{content:u.error,isError:!0};try{let d=await u.search(s.query,{limit:fB,timeoutMs:s.timeoutMs,signal:i.signal});return{content:Wm(VS(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 cB,uB,dB,pB,mB,fB,gB,ZS,QS=I(()=>{"use strict";qS();XS();cB=3e4,uB=12e4,dB=1e6,pB=1e7,mB=`
|
|
@@ -1910,7 +1910,7 @@ ${x}`})}return{fileBlocks:a,warnings:l}}async function MI(e,t,n,r,o="summary",s,
|
|
|
1910
1910
|
`))!==-1;){let u=n.slice(0,c);n=n.slice(c+1),this.opts.writeLine(u)}},s={command:t,mode:"foreground",onChunk:c=>{r||(n+=c.toString("utf8"),o())}},i=this.opts.getCwd();i!==void 0&&(s.cwd=i);let{job:a,handle:l}=this.registry.start(s);this.activeFgJobId=a.id;try{let c=await l.promise;r=!0,n.length>0&&(this.opts.writeLine(n),n=""),this.opts.writeLine(eV(a,c)),this.queueInjection({command:t,mode:"foreground",result:c})}finally{this.activeFgJobId=null}}startBackground(t){let n={command:t,mode:"background"},r=this.opts.getCwd();r!==void 0&&(n.cwd=r);let{job:o}=this.registry.start(n);this.opts.writeLine(p.dim(` [${o.id}] background: `)+t)}queueInjection(t){this.pendingInjections.push(t),this.pendingInjections.length>e.MAX_PENDING_INJECTIONS&&this.pendingInjections.shift()}};function nV(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 rV(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(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}function Dd(e,t){let n=p.brand("afk")+p.dim(` (${e})`),r=t?p.warning(" \u25CF plan"):"";return n+r+p.dim(" \u203A ")}async function UI(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async S=>{Ze()&&(o=pu(S)),await ld(e.session.current),Ze()&&(s=R_())}).catch(()=>{});let i=await SI(),a=new Md({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,u,d,m,f,g,h=!1,b=!1,y=mC({onError:S=>Y("[afk suggest] Tier-2 completion failed:",S)}),w=nV(k.AFK_SUGGEST_GHOST,e.suggestGhostConfig);try{await a.armCompositor({promptFn:()=>Dd(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{Rr(e.slashCtx).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...w?{suggest:{engine:y,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let C=a.history;return C.getEntries?[...C.getEntries()]:[]},getDropdownTopCandidate:C=>{let N=a.autocompleteState.candidates[0];return N&&N.value.startsWith(C)&&N.value.length>C.length?N.value:null},getTranscriptTail:()=>"",getRecentCommands:()=>[],llmEnabled:()=>/^(1|true|yes|on)$/i.test(k.AFK_SUGGEST_ENABLED??"")})}}:{}});let S=a.getCompositor();rn.install(lu({readLine:C=>a.readLine({promptFn:()=>C}).then(F=>F.text),writer:{line:(C="")=>{let F=a.getCompositor();F?F.commitAbove(C):process.stdout.write(C+`
|
|
1911
1911
|
`)}},pendingCount:()=>rn.pendingCount(),...S?{pickFromList:C=>xI(S,C),readTextOverlay:C=>RI(S,C)}:{}})),e.replRenderer.setCompositor(a.getCompositor()),e.slashCtx.getCompositor=()=>a.getCompositor();let x=a.getCompositor();if(x){let C=F=>x.commitAbove(F);e.completionWriter.fn=C,e.completionWriter.idleFn=C}let E=C=>{a.setSoftStopHandler(C),n.requestSoftStop=C};e.slashCtx.setSoftStopHandler=E,e.slashCtx.onStageChange=C=>m?.repaint(C),e.slashCtx.onContextProgress=async()=>{await e.contextSampler.refresh(),e.statusLine.repaint(xr(e.stats,e.contextSampler))},e.slashCtx.transcript=t,e.inputSurfaceRef&&(e.inputSurfaceRef.current=a),c=OI(),g=$I(),e.clearVerdictLedger=()=>g?.reset(),u=new wu,OR(u),HR(u),GR(u),WR(e.backgroundRegistry);let _=0,R=0,T=1,O=()=>e.statusLine.setExtraRows(T+_+R);g.setRowCountChangeHandler(C=>{R=C,O(),d?.redraw(),m?.redraw()}),d=new Od(u,e.backgroundRegistry,{getAdjacentRows:()=>R}),d.setRowCountChangeHandler(C=>{_=C,O()}),m=new Ku({getExtraRows:()=>e.statusLine.getExtraRows()}),m.setRowCountChangeHandler(C=>{O()}),e.statusLine.setAfterScrollRestore(()=>{g?.repaint(),d?.redraw(),m?.redraw()}),d.start(),m.start(),g.start({stream:process.stdout});let D=50,L=[];for(u.on("complete",C=>{L.length>=D&&L.shift(),L.push(C)}),f=new $d({writeLine:C=>e.replRenderer.writeLine(C),getCwd:()=>e.stats.cwd}),UR(f),n.tryAbortShellForeground=()=>f.abortActiveForeground();;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let A of s)e.replRenderer.writeLine(A);e.replRenderer.writeLine(""),s=[]}for(;L.length>0;){let A=L.shift(),P=A.status==="succeeded"?"\u2713":"\u2717",J=[];if(A.resultText){let te=A.resultText.trim().split(`
|
|
1912
1912
|
`)[0]?.slice(0,80)??"";te&&J.push(te)}A.error&&J.push(A.error.message);let V=[A.stats.toolUses>0?`${A.stats.toolUses} tools`:"",A.stats.tokens>0?`${Math.round(A.stats.tokens/1e3)}k tok`:"",A.stats.durationMs>0?`${Math.round(A.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");V&&J.push(V),e.replRenderer.writeLine(or({kind:A.status==="succeeded"?"checkpoint":"diagnosis",title:`${P} ${A.id} ${A.label}`,body:J})),e.replRenderer.writeLine("")}let C=f.drainNotifications();for(let{job:A,result:P}of C){let J=P.errorReason===void 0?"\u2713":"\u2717",V=P.errorReason==="abort"?"killed":P.errorReason==="timeout"?"timed out":P.errorReason==="signal-killed"?"killed by signal":`exit ${P.exitCode??0}`,te=Math.max(0,Math.round(P.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${J} [${A.id}] ${V} \xB7 ${te}s \xB7 `)+A.command)}let F=c.renderIfChanged(e.stats.sessionId);if(F.length>0){for(let A of F)e.replRenderer.writeLine(A);e.replRenderer.writeLine("")}let N,U;if(l!==void 0){let A=l;l=void 0;let P=Dd(e.stats.model,e.stats.planMode),J=fo({buffer:A.text,promptText:P,isTTY:!!process.stdout.isTTY,attachmentSummary:Ys([...A.attachments])});e.replRenderer.writeLine(J),N=A.text.trim(),U=A.attachments}else{let A=await a.readLine({promptFn:()=>Dd(e.stats.model,e.stats.planMode),onSigint:r,onShiftTab:()=>{Rr(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});N=A.text.trim(),U=A.attachments}if(!N&&U.length===0)continue;if(N.startsWith("!")){let A=/^(0|false|off|no)$/i.test(k.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!A&&(h||(h=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(N))){e.statusLine.rearm();continue}}let G=!1;if(N.startsWith("/")){let A=await Yx(N,e.slashCtx,U);if(A.handled){if(A.result==="exit"){e.rl.close();return}if((N==="/clear"||N.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),g.reset()),A.result!==null&&typeof A.result=="object"&&"kind"in A.result&&A.result.kind==="submit"){l={text:A.result.message,attachments:U??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}G=!0}i.push(N),await rV(e,N);let $=N;if(G){let A=ug(N);if(A){let P=A.name.replace(/^\//,"").split(":").pop()??"";if(P&&yh(P)){let J={skillName:P,rawArgs:A.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},V=e.session.current.sessionId,te=To(V),ye=Date.now();Y(`[afk trace] preflight.start commandName=${P}`);let B=!1,ee=await Eo(J,{cwd:e.stats.cwd??process.cwd(),artifactDir:te},me=>{Ze()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${P}) failed: `)+(me instanceof Error?me.message:String(me)))});B=ee!==null,Y(`[afk trace] preflight.end commandName=${P} durationMs=${Date.now()-ye} success=${B}`),$=wh(ee?.manifestBlock,N)}}}let j=f.drainInjections();j.length>0&&($=j+$),await MI({text:$,attachments:U},e.session.current,e.stats,{setInFlight(A){n.turnInFlight=A},async onTurnComplete(A,P){if(await t.appendTurn(A,P),e.stats.sessionId)try{dn(e.stats)}catch(J){b||(b=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(J instanceof Error?J.message:String(J))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),e.statusLine.rearm(),m?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:A=>g?.push(A),setActiveCompositor:A=>{n.activeCompositor=A},setInterruptNotifier:A=>{n.notifyInterrupting=A},scrollRegion:e.statusLine,getCompositor:()=>a.getCompositor(),setBackgroundHandler:A=>a.setBackgroundHandler(A),setSoftStopHandler:E,async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(xr(e.stats,e.contextSampler))},...m?{onStageChange:A=>m.repaint(A)}:{}},e.options.thinkingUi,e.completionWriter,u,a.toRunTurnRefs(Dd(e.stats.model,e.stats.planMode)))}}finally{if(u!==void 0)for(let x of u.running())u.cancel(x.id);n.tryAbortShellForeground=null,f?.drainOnExit(),m?.stop(),d?.stop(),g?.stop(),c?.dispose();let S=x=>console.log(x);e.completionWriter.fn=S,e.completionWriter.idleFn=S,await a.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}Bi();import{execFile as oV}from"node:child_process";import{dirname as sV,isAbsolute as iV,resolve as aV}from"node:path";import{promisify as lV}from"node:util";var jI=lV(oV),cV=3e3,uV=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function dV(){let t=(await jI("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=iV(t)?t:aV(process.cwd(),t);return sV(n)}async function HI(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await dV()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),cV)});try{let o=gn({execFile:jI,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=>uV.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Pl();Bi();import{promises as pV}from"node:fs";import{dirname as mV,join as GI}from"node:path";import{randomBytes as fV}from"node:crypto";var gV=["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(`
|
|
1913
|
-
`),WI=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,zh=30,hV=1024,yV=8e3,bV="haiku";async function wV(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=EV(n,hV),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??yV),i=t.signal?TV([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Xo({token:t.token,model:t.model??bV,system:gV,user:r,maxTokens:32,signal:i})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(s)}let l=SV(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=mV(t.worktreePath);return await vV(l,c)}function SV(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(WI.test(t)&&t.length<=zh)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>zh)break;o=i}return WI.test(o)?o:null}async function vV(e,t){if(!await kV(GI(t,e)))return e;let n=fV(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,zh-5)}-${n}`}async function kV(e){try{return await pV.access(e),!0}catch{return!1}}function EV(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 TV(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 zI(e){let t,n,r=GI(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await wV(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=`${tc(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return KI(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 KI(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 KI(e,t){e&&e.setCwd(t),xV(t)}function xV(e){try{process.chdir(e)}catch{}}Ue();Fn();W();import{spawn as qI}from"child_process";import{existsSync as IV,mkdirSync as PV,readFileSync as JI,unlinkSync as MV,writeFileSync as OV}from"fs";import{get as $V}from"https";import{join as YI}from"path";import{readFileSync as RV}from"fs";import{dirname as CV,join as AV}from"path";import{fileURLToPath as _V}from"url";function Xn(){try{return"3.104.
|
|
1913
|
+
`),WI=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,zh=30,hV=1024,yV=8e3,bV="haiku";async function wV(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=EV(n,hV),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??yV),i=t.signal?TV([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await Xo({token:t.token,model:t.model??bV,system:gV,user:r,maxTokens:32,signal:i})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(s)}let l=SV(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=mV(t.worktreePath);return await vV(l,c)}function SV(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(WI.test(t)&&t.length<=zh)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>zh)break;o=i}return WI.test(o)?o:null}async function vV(e,t){if(!await kV(GI(t,e)))return e;let n=fV(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,zh-5)}-${n}`}async function kV(e){try{return await pV.access(e),!0}catch{return!1}}function EV(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 TV(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 zI(e){let t,n,r=GI(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await wV(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=`${tc(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return KI(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 KI(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 KI(e,t){e&&e.setCwd(t),xV(t)}function xV(e){try{process.chdir(e)}catch{}}Ue();Fn();W();import{spawn as qI}from"child_process";import{existsSync as IV,mkdirSync as PV,readFileSync as JI,unlinkSync as MV,writeFileSync as OV}from"fs";import{get as $V}from"https";import{join as YI}from"path";import{readFileSync as RV}from"fs";import{dirname as CV,join as AV}from"path";import{fileURLToPath as _V}from"url";function Xn(){try{return"3.104.2"}catch{}try{let e=CV(_V(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(RV(AV(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}z();var DV=64*1024,LV=1440*60*1e3,FV="update-check.json",NV="pending-update.json";function VI(){return YI(ml(),FV)}function qh(){return YI(ml(),NV)}function XI(){let e=ml();IV(e)||PV(e,{recursive:!0})}function BV(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function UV(){try{let e=JI(VI(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function jV(){try{XI();let e=`
|
|
1914
1914
|
const https = require('https');
|
|
1915
1915
|
const fs = require('fs');
|
|
1916
1916
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|