agent-afk 5.25.5 → 5.25.6

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 CHANGED
@@ -1088,7 +1088,7 @@ Note: this search ran in basic-regex (BRE) mode, where '|' is a literal pipe \u2
1088
1088
  [output truncated]`,A=!0),d({content:S,...A?{truncated:!0}:{}})}),m.on("error",k=>{d({content:`Failed to execute grep: ${k.message}`,isError:!0})})})}}var $x,Dx=R(()=>{"use strict";ur();Jr();Ko();$x=hy()});import{promises as wG}from"fs";var Fx,Lx=R(()=>{"use strict";Jr();Fx=async(e,t,n)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let o=e.path;if(typeof o!="string")throw new Error("Invalid input: path must be a string");let i;try{i=cn(o,n,"read")}catch(s){return{content:s instanceof Error?s.message:String(s),isError:!0}}try{let s=await wG.readdir(i,{withFileTypes:!0}),a=s.filter(u=>u.isDirectory()).map(u=>`${u.name}/`),l=s.filter(u=>!u.isDirectory()).map(u=>u.name);a.sort(),l.sort();let c=[...a,...l];return c.length===0?{content:"(empty directory)"}:{content:c.join(`
1089
1089
  `)}}catch(s){if(s instanceof Error){let a=s;return a.code==="ENOENT"?{content:`Directory not found: ${i}`,isError:!0}:a.code==="ENOTDIR"?{content:`Not a directory: ${i}`,isError:!0}:a.code==="EACCES"?{content:`Permission denied: ${i}`,isError:!0}:{content:`Error listing directory: ${s.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}}});function SG(e=ss){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>Nx)return{content:`Invalid input: message exceeds Telegram's ${Nx}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let i=T.TELEGRAM_BOT_TOKEN;if(!i)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 s=is();if(s.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 s){let c=await e({token:i,chatId:l,text:o});c.ok||a.push(`chat ${l}: ${c.errorMessage??`HTTP ${c.status}`}`)}return a.length===s.length?{content:`Failed to send Telegram message to any chat. ${a.join("; ")}`,isError:!0}:a.length>0?{content:`Sent Telegram message to ${s.length-a.length}/${s.length} chat(s); ${a.length} failed: ${a.join("; ")}`}:{content:s.length===1?`Sent Telegram message to chat ${s[0]}.`:`Sent Telegram message to ${s.length} chats.`}}}var Nx,Bx,Ux=R(()=>{"use strict";J();Kr();Gd();Nx=4096;Bx=SG()});import{JSDOM as vG}from"jsdom";import{Readability as kG}from"@mozilla/readability";import EG from"turndown";function jx(e){return e.replace(/\n{3,}/g,`
1090
1090
 
1091
- `).trim()}function TG(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function Wx(e,t){let r=new vG(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new kG(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=jx(yy.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=jx(yy.turndown(a));return{title:o,markdown:l,textLength:TG(s),usedFallback:!0}}var Hx,yy,Kx=R(()=>{"use strict";Hx=200,yy=new EG({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});yy.remove(["script","style","noscript","iframe"])});function RG(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function Gx(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function AG(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 Su(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??RG,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!xG.has(u.status)||d===o)return u;let m=AG(u,s)??Gx(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=Gx(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var xG,by=R(()=>{"use strict";Re();xG=new Set([429,502,503,504])});import{readFileSync as CG}from"node:fs";import{join as _G}from"path";function IG(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function qx(e,t){return IG(t).test(e)}function OG(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(PG.has(t))return!0;if(MG.has(t))return!1}return!1}function zx(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function $G(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 Jx(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ya(t),t}function DG(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function FG(e){try{return CG(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function LG(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=Jx(t.defaultProfile)),n}function Vx(e){let t=e?.env??T,n=e?.readFileSync??FG,r=e?.surface??t.AGENT_SURFACE,o=OG(t.AFK_BROWSER_HEADLESS,r),i=zx(t.AFK_BROWSER_ALLOWED_DOMAINS),s=zx(t.AFK_BROWSER_BLOCKED_DOMAINS),a=DG(t.AFK_BROWSER_DOM_SNAPSHOTS),l=$G(t.AFK_BROWSER_BACKEND),c=Jx(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():_G(hn(),"browser.json"),p=n(m);if(p===void 0)return d;let g;try{g=JSON.parse(p)}catch(b){throw new Error(`Failed to parse browser config at ${m}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=LG(d,g);return h.configPath=m,h}function wy(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(qx(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>qx(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var PG,MG,Sy=R(()=>{"use strict";J();G();PG=new Set(["daemon","subagent","telegram","afk"]),MG=new Set(["repl","interactive","cli"])});import Go from"node:fs";import vu from"node:path";import{randomBytes as NG}from"node:crypto";import{chromium as BG}from"playwright";function UG(){try{return"5.25.5"}catch{}try{let e=vu.resolve(import.meta.dirname,"../../../package.json"),t=Go.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var jG,ku,Yx=R(()=>{"use strict";G();Re();jG=UG(),ku=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=BG.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),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{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",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),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/${jG}`}}loadStorageState(t){let n=Xa(t);try{if(!Go.existsSync(n))return;let r=JSON.parse(Go.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=Xa(t);if(!Go.existsSync(r))return;let o=await n.storageState(),i=vu.join(vu.dirname(r),`.${vu.basename(r)}.${process.pid}.${NG(4).toString("hex")}.tmp`);Go.writeFileSync(i,JSON.stringify(o),{mode:384}),Go.chmodSync(i,384),Go.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as HG}from"crypto";function vy(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of WG)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function Xx(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&KG.test(e.label))}function Zx(e){return HG("sha256").update(e,"utf8").digest("hex").slice(0,8)}function Qx(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var WG,KG,kl=R(()=>{"use strict";WG=[{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}];KG=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as GG}from"node:crypto";function qG(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function zG(e,t,n){return`el_${GG("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function JG(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function eR(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function nR(e,t){let n=e.role??"",r=e.name??"";tR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])nR(i,t)}async function VG(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},rR).catch(()=>[])}async function YG(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,p=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),p!==void 0&&(g.checked=p),o.push(g)}return o},rR).catch(()=>[])}function XG(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Eu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=XG(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=VG(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,p,g,h]=await Promise.all([s,a,l,c,d]),b,y=!1;u!==null?(b=[],nR(u,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await YG(e)).filter(M=>tR.has(M.role??"")));let w=new Map;for(let E of m){let M=eR(E.name),N=w.get(M);(!N||N.bbox.w===0&&E.bbox.w>0)&&w.set(M,E)}let v=b.map(E=>({ax:E,dom:w.get(eR(E.name??""))})),k=r?v:v.filter(E=>E.dom?E.dom.bbox.w>0||E.dom.bbox.h>0:!0);k.sort((E,M)=>{let N=E.dom?.bbox.y??0,L=M.dom?.bbox.y??0;if(N!==L)return N-L;let B=E.dom?.bbox.x??0,H=M.dom?.bbox.x??0;return B-H}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=k.slice(0,n).map((E,M)=>{let N=E.ax.role??"generic",L=E.ax.name??"",B=zG(N,L,M),H=E.dom?.bbox??{x:0,y:0,w:0,h:0},$=E.dom?.type??null,I=null;E.ax.value!==void 0&&E.ax.value!==null&&(I=String(E.ax.value)),E.ax.checked!==void 0&&(I=String(E.ax.checked)),Xx({role:N,kind:$})&&(I="[redacted]");let O={disabled:E.ax.disabled??!1};E.ax.checked!==void 0&&(O.checked=E.ax.checked===!0||E.ax.checked==="mixed"),E.ax.selected!==void 0&&(O.selected=E.ax.selected),E.ax.expanded!==void 0&&(O.expanded=E.ax.expanded);let F;E.dom?.testId?F=`[data-testid="${E.dom.testId}"]`:E.dom?.id&&(F=`#${E.dom.id}`);let U={id:B,role:N,label:qG(L),kind:$,value:I,state:O,bbox:H};return F!==void 0&&(U.selector=F),U}),_="idle";try{let E=await e.evaluate(()=>document.readyState);E==="loading"?_="loading":E==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="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 C=JG(p),j=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:j,url:g,title:h,textSummary:C,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var tR,rR,oR=R(()=>{"use strict";kl();tR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);rR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function iR(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function ky(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>iR(e,i)))).filter(o=>o!==null)}async function ZG(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function Ey(e,t,n){switch(t.kind){case"element_id":return QG(e,t,n);case"selector":return e2(e,t);case"semantic":return t2(e,t)}}async function QG(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await ky(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function e2(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 ky(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function t2(e,t){return t.role!==void 0?n2(e,t.text,t.role):r2(e,t.text,t)}async function n2(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await ky(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function r2(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await ZG(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),p=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let y=await iR(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,v=0;for(let k=0;k<w.length;k++)v=v*31+w.charCodeAt(k)>>>0;p.push({...y,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:p}}var sR=R(()=>{"use strict"});import{randomBytes as o2}from"crypto";import{mkdir as i2,stat as s2,writeFile as a2}from"fs/promises";import{join as Ty}from"path";import{gzip as l2}from"zlib";import{promisify as c2}from"util";function d2(e){return Ty(ji(e),"browser")}function u2(e){return Ty(d2(e),"screenshots")}function p2(){return new Date().toISOString().replace(/[:.]/g,"-")}function m2(){return o2(3).toString("hex")}async function xy(e,t,n){if(t.length>aR)throw new Error(`writeScreenshotSidecar: buffer exceeds ${aR} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=u2(e);await i2(r,{recursive:!0});let o=`${p2()}-${m2()}-${n}.png`,i=Ty(r,o);await a2(i,t);let{size:s}=await s2(i);return{path:i,bytes:s}}var kge,aR,lR=R(()=>{"use strict";G();kl();kge=c2(l2);aR=5*1024*1024});var dR={};ld(dR,{PlaywrightProvider:()=>Ry});function cR(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 Ry,uR=R(()=>{"use strict";Yx();oR();sR();Sy();kl();lR();Ry=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new ku(t)}async open(t){let n=wy(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Eu(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Eu(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await Ey(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${cR(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=vy(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:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(b){c=b}else c=h}let u=r.url();if(u!==i){let h=wy(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let p=await Eu(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,p.interactive,p.url,p.title,g),c!==null)throw c;return p}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),i;if(t.target!==void 0){let d=await Ey(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${cR(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await xy(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await xy(n,o,r);return i}catch{return null}}}});var zo={};ld(zo,{__resetBrowserRegistryForTests:()=>b2,browserProviderActive:()=>h2,closeBrowserProvider:()=>Ay,getBrowserProvider:()=>g2,peekBrowserProvider:()=>y2});function pR(){Promise.resolve(Ay()).then(()=>{process.exit(130)})}function mR(){Promise.resolve(Ay()).then(()=>{process.exit(143)})}function fR(){Nn=null}function f2(){Tu||(process.on("SIGINT",pR),process.on("SIGTERM",mR),process.on("exit",fR),Tu=!0)}function gR(){Tu&&(process.removeListener("SIGINT",pR),process.removeListener("SIGTERM",mR),process.removeListener("exit",fR),Tu=!1)}async function g2(e){return Nn!==null?Nn:(qo!==null||(qo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(uR(),dR)),n=Vx(e),r=new t(n);return f2(),Nn=r,qo=null,r})()),qo)}async function Ay(){if(Nn===null)return;let e=Nn;Nn=null,qo=null,gR(),await e.shutdown()}function h2(){return Nn!==null}function y2(){return Nn}function b2(){Nn=null,qo=null,gR()}var Nn,qo,Tu,Jo=R(()=>{"use strict";Sy();Nn=null,qo=null,Tu=!1});function hR(e,t){try{return Wx(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function E2(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Jo(),zo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function yR(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??E2,o=null,i=e,s=null,a=null;try{let c=await Su(n,e,{headers:k2,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(v2.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(S2.test(d)&&!w2.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=hR(u,i)}}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<Hx)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=hR(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var w2,S2,v2,k2,bR=R(()=>{"use strict";Kx();by();Re();w2=/(text\/html|application\/xhtml\+xml)/i,S2=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,v2=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,k2={"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 R2(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(T2,{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),x2),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Wo(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function wR(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?R2({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 SR(e,t){if(t.length===0)return`# Search results for "${e}"
1091
+ `).trim()}function TG(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}function Wx(e,t){let r=new vG(e,{url:t}).window.document,o=(r.title??"").trim(),i=null;try{let c=r.cloneNode(!0);i=new kG(c).parse()}catch{i=null}if(i&&typeof i.content=="string"&&i.content.trim().length>0){let c=jx(yy.turndown(i.content)),d=(i.title??"").trim()||o,u=typeof i.length=="number"&&i.length>0?i.length:(i.textContent??"").replace(/\s+/g," ").trim().length;return{title:d,markdown:c,textLength:u,usedFallback:!1}}let s=r.body,a=s?.innerHTML??"",l=jx(yy.turndown(a));return{title:o,markdown:l,textLength:TG(s),usedFallback:!0}}var Hx,yy,Kx=R(()=>{"use strict";Hx=200,yy=new EG({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});yy.remove(["script","style","noscript","iframe"])});function RG(e,t){return new Promise((n,r)=>{if(t?.aborted){r(t.reason??new Error("aborted"));return}let o=()=>{clearTimeout(i),r(t?.reason??new Error("aborted"))},i=setTimeout(()=>{t?.removeEventListener("abort",o),n()},e);t?.addEventListener("abort",o,{once:!0})})}function Gx(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function AG(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 Su(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??RG,l=n.signal??void 0,c;for(let d=0;d<=o;d++){if(l?.aborted)throw l.reason??new Error("aborted");try{let u=await e(t,n);if(!xG.has(u.status)||d===o)return u;let m=AG(u,s)??Gx(d,i,s);W("[web/retryFetch] retrying",{url:t,attempt:d,status:u.status,waitMs:m}),await u.body?.cancel().catch(()=>{}),await a(m,l)}catch(u){if(l?.aborted||(c=u,d===o))throw u;let m=Gx(d,i,s);W("[web/retryFetch] retrying after error",{url:t,attempt:d,waitMs:m}),await a(m,l)}}throw c??new Error("retryFetch: exhausted without a result")}var xG,by=R(()=>{"use strict";Re();xG=new Set([429,502,503,504])});import{readFileSync as CG}from"node:fs";import{join as _G}from"path";function IG(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function qx(e,t){return IG(t).test(e)}function OG(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(PG.has(t))return!0;if(MG.has(t))return!1}return!1}function zx(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function $G(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 Jx(e){let t=e===void 0||e.trim()===""?"default":e.trim();return Ya(t),t}function DG(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function FG(e){try{return CG(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function LG(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=Jx(t.defaultProfile)),n}function Vx(e){let t=e?.env??T,n=e?.readFileSync??FG,r=e?.surface??t.AGENT_SURFACE,o=OG(t.AFK_BROWSER_HEADLESS,r),i=zx(t.AFK_BROWSER_ALLOWED_DOMAINS),s=zx(t.AFK_BROWSER_BLOCKED_DOMAINS),a=DG(t.AFK_BROWSER_DOM_SNAPSHOTS),l=$G(t.AFK_BROWSER_BACKEND),c=Jx(t.AFK_BROWSER_DEFAULT_PROFILE),d={headless:o,allowedDomains:i,blockedDomains:s,domSnapshots:a,backend:l,configPath:null,defaultProfile:c},u=t.AFK_BROWSER_CONFIG,m=u!==void 0&&u.trim()!==""?u.trim():_G(hn(),"browser.json"),p=n(m);if(p===void 0)return d;let g;try{g=JSON.parse(p)}catch(b){throw new Error(`Failed to parse browser config at ${m}: ${String(b)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=LG(d,g);return h.configPath=m,h}function wy(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(qx(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>qx(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var PG,MG,Sy=R(()=>{"use strict";J();G();PG=new Set(["daemon","subagent","telegram","afk"]),MG=new Set(["repl","interactive","cli"])});import Go from"node:fs";import vu from"node:path";import{randomBytes as NG}from"node:crypto";import{chromium as BG}from"playwright";function UG(){try{return"5.25.6"}catch{}try{let e=vu.resolve(import.meta.dirname,"../../../package.json"),t=Go.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var jG,ku,Yx=R(()=>{"use strict";G();Re();jG=UG(),ku=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=BG.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),i=await r.newContext({...this.contextOptions(),...o!==void 0?{storageState:o}:{}}),s={context:i,page:void 0,consoleErrors:0,lastHttpStatus:null,openDialog:void 0};return this.sessions.set(t,s),i}async ensurePage(t){let n=this.sessions.get(t);if(n!==void 0&&n.page!==void 0)return n.page;await this.ensureContext(t);let r=this.sessions.get(t);if(r===void 0)throw new Error(`[BrowserLauncher] session entry disappeared for sessionId=${t}`);if(r.page!==void 0)return r.page;let o=await r.context.newPage();return r.page=o,o.on("console",i=>{i.type()==="error"&&(r.consoleErrors+=1)}),o.on("request",i=>{i.isNavigationRequest()&&i.frame()===o.mainFrame()&&(r.lastHttpStatus=null)}),o.on("response",i=>{i.frame()===o.mainFrame()&&i.request().isNavigationRequest()&&(r.lastHttpStatus=i.status())}),o.on("dialog",i=>{r.openDialog=i}),o}getPage(t){return this.sessions.get(t)?.page}async renderHtml(t,n){let o=await(await this.ensureBrowser()).newContext(this.contextOptions()),i=()=>{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",i,{once:!0});try{let s=await o.newPage(),a=await s.goto(t,{timeout:n.timeoutMs,waitUntil:n.waitUntil}),l=await s.content(),c=s.url(),d=a!==null?a.status():null;return{html:l,finalUrl:c,httpStatus:d}}finally{n.signal!==void 0&&n.signal.removeEventListener("abort",i),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/${jG}`}}loadStorageState(t){let n=Xa(t);try{if(!Go.existsSync(n))return;let r=JSON.parse(Go.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=Xa(t);if(!Go.existsSync(r))return;let o=await n.storageState(),i=vu.join(vu.dirname(r),`.${vu.basename(r)}.${process.pid}.${NG(4).toString("hex")}.tmp`);Go.writeFileSync(i,JSON.stringify(o),{mode:384}),Go.chmodSync(i,384),Go.renameSync(i,r),W("[browser/vault] saved session",{profile:t,file:r})}catch(r){W("[browser/vault] save failed",{profile:t,err:r})}}}});import{createHash as HG}from"crypto";function vy(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of WG)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function Xx(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&KG.test(e.label))}function Zx(e){return HG("sha256").update(e,"utf8").digest("hex").slice(0,8)}function Qx(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var WG,KG,kl=R(()=>{"use strict";WG=[{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}];KG=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as GG}from"node:crypto";function qG(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function zG(e,t,n){return`el_${GG("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function JG(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function eR(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function nR(e,t){let n=e.role??"",r=e.name??"";tR.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])nR(i,t)}async function VG(e){return e.evaluate(t=>{let n=Array.from(document.querySelectorAll(t)),r=[];for(let o of n){let i=o.getBoundingClientRect(),s=o;if(i.width===0&&i.height===0){let d=window.getComputedStyle(s);if(d.display==="none"||d.visibility==="hidden")continue}let a=o.tagName.toLowerCase(),l=o.getAttribute("aria-label")??o.getAttribute("placeholder")??(o.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a==="input"?o.type||null:o.getAttribute("type");r.push({name:l,tagName:a,type:c,id:o.id||null,testId:o.getAttribute("data-testid"),bbox:{x:Math.round(i.left),y:Math.round(i.top),w:Math.round(i.width),h:Math.round(i.height)}})}return r},rR).catch(()=>[])}async function YG(e){return e.evaluate(t=>{let n={button:"button",a:"link",input:"textbox",textarea:"textbox",select:"combobox"},r=Array.from(document.querySelectorAll(t)),o=[];for(let i of r){let s=i.tagName.toLowerCase(),a=i.getAttribute("role")??"",l=i.getAttribute("aria-label")??i.getAttribute("placeholder")??(i.textContent??"").replace(/\s+/g," ").trim().slice(0,100),c=a||(n[s]??"");if(s==="input"){let h=i.type;h==="checkbox"?c="checkbox":h==="radio"?c="radio":h==="button"||h==="submit"||h==="reset"?c="button":h==="search"?c="searchbox":c="textbox"}if(!c)continue;let d="value"in i?i.value:void 0,u=d!==void 0?String(d):void 0,m=i.disabled??!1,p=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),p!==void 0&&(g.checked=p),o.push(g)}return o},rR).catch(()=>[])}function XG(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function Eu(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=XG(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=VG(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,p,g,h]=await Promise.all([s,a,l,c,d]),b,y=!1;u!==null?(b=[],nR(u,b)):(o.push("observation skipped accessibility tree (returned null)"),y=!0,b=(await YG(e)).filter(M=>tR.has(M.role??"")));let w=new Map;for(let E of m){let M=eR(E.name),N=w.get(M);(!N||N.bbox.w===0&&E.bbox.w>0)&&w.set(M,E)}let v=b.map(E=>({ax:E,dom:w.get(eR(E.name??""))})),k=r?v:v.filter(E=>E.dom?E.dom.bbox.w>0||E.dom.bbox.h>0:!0);k.sort((E,M)=>{let N=E.dom?.bbox.y??0,L=M.dom?.bbox.y??0;if(N!==L)return N-L;let B=E.dom?.bbox.x??0,H=M.dom?.bbox.x??0;return B-H}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=k.slice(0,n).map((E,M)=>{let N=E.ax.role??"generic",L=E.ax.name??"",B=zG(N,L,M),H=E.dom?.bbox??{x:0,y:0,w:0,h:0},$=E.dom?.type??null,I=null;E.ax.value!==void 0&&E.ax.value!==null&&(I=String(E.ax.value)),E.ax.checked!==void 0&&(I=String(E.ax.checked)),Xx({role:N,kind:$})&&(I="[redacted]");let O={disabled:E.ax.disabled??!1};E.ax.checked!==void 0&&(O.checked=E.ax.checked===!0||E.ax.checked==="mixed"),E.ax.selected!==void 0&&(O.selected=E.ax.selected),E.ax.expanded!==void 0&&(O.expanded=E.ax.expanded);let F;E.dom?.testId?F=`[data-testid="${E.dom.testId}"]`:E.dom?.id&&(F=`#${E.dom.id}`);let U={id:B,role:N,label:qG(L),kind:$,value:I,state:O,bbox:H};return F!==void 0&&(U.selector=F),U}),_="idle";try{let E=await e.evaluate(()=>document.readyState);E==="loading"?_="loading":E==="interactive"?_="navigating":_="idle"}catch{_="navigating"}_!=="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 C=JG(p),j=`obs_${t.observationCounter.toString(36)}`,P=new Date().toISOString();return{observationId:j,url:g,title:h,textSummary:C,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:_,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:P}}var tR,rR,oR=R(()=>{"use strict";kl();tR=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);rR="a[href], button, input, select, textarea, [role], [tabindex], label"});async function iR(e,t){try{let n=await e.nth(t).evaluate(s=>{let a=s,l=a.getAttribute("role")??a.tagName.toLowerCase(),c=a.getAttribute("aria-label")??a.getAttribute("placeholder")??(a.innerText!=null?a.innerText.trim().slice(0,200):"")??a.getAttribute("title")??"",d=a.getBoundingClientRect();return{role:l,label:c,x:Math.round(d.x),y:Math.round(d.y),w:Math.round(d.width),h:Math.round(d.height)}}),r=`${n.role}:${n.label}:${t}`,o=0;for(let s=0;s<r.length;s++)o=o*31+r.charCodeAt(s)>>>0;return{id:`el_${o.toString(16).padStart(6,"0").slice(0,6)}`,role:n.role,label:n.label,kind:null,value:null,state:{disabled:!1},bbox:{x:n.x,y:n.y,w:n.w,h:n.h}}}catch{return null}}async function ky(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>iR(e,i)))).filter(o=>o!==null)}async function ZG(e){let t=new Set,n=[];for(let{loc:r,count:o}of e)for(let i=0;i<o;i++){let s;try{s=await r.nth(i).evaluate(a=>{let l=a,c=l.getBoundingClientRect();return`${l.tagName}@${Math.round(c.x)},${Math.round(c.y)}`})}catch{continue}t.has(s)||(t.add(s),n.push({key:s,locator:r,index:i}))}return n}async function Ey(e,t,n){switch(t.kind){case"element_id":return QG(e,t,n);case"selector":return e2(e,t);case"semantic":return t2(e,t)}}async function QG(e,t,n){let r=n.get(t.elementId);if(r===void 0)return{outcome:"not_found",query:t};if(r.selector!==void 0){let l=e.locator(r.selector);if(await l.count()===1)return{outcome:"resolved",locator:l}}let o=e.getByRole(r.role,{name:r.label,exact:!0}),i=await o.count();if(i===0)return{outcome:"not_found",query:t};if(i===1)return{outcome:"resolved",locator:o};let s=await ky(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function e2(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 ky(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function t2(e,t){return t.role!==void 0?n2(e,t.text,t.role):r2(e,t.text,t)}async function n2(e,t,n){let r=e.getByRole(n,{name:t}),o=await r.count();if(o===0)return{outcome:"not_found",query:{kind:"semantic",text:t,role:n}};if(o===1)return{outcome:"resolved",locator:r};let i=await ky(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function r2(e,t,n){let r=e.getByRole("button",{name:t}),o=e.getByRole("link",{name:t}),i=e.getByLabel(t,{exact:!1}),[s,a,l]=await Promise.all([r.count(),o.count(),i.count()]);if(s+a+l===0)return{outcome:"not_found",query:n};let d=[];s>0&&d.push({loc:r,count:s}),a>0&&d.push({loc:o,count:a}),l>0&&d.push({loc:i,count:l});let u=await ZG(d);if(u.length===0)return{outcome:"not_found",query:n};if(u.length===1){let h=u[0];return h===void 0?{outcome:"not_found",query:n}:{outcome:"resolved",locator:h.locator.nth(h.index)}}let m=u.slice(0,5),p=[];for(let h=0;h<m.length;h++){let b=m[h];if(b===void 0)continue;let y=await iR(b.locator,b.index);if(y!==null){let w=`${y.role}:${y.label}:${h}`,v=0;for(let k=0;k<w.length;k++)v=v*31+w.charCodeAt(k)>>>0;p.push({...y,id:`el_${v.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:p}}var sR=R(()=>{"use strict"});import{randomBytes as o2}from"crypto";import{mkdir as i2,stat as s2,writeFile as a2}from"fs/promises";import{join as Ty}from"path";import{gzip as l2}from"zlib";import{promisify as c2}from"util";function d2(e){return Ty(ji(e),"browser")}function u2(e){return Ty(d2(e),"screenshots")}function p2(){return new Date().toISOString().replace(/[:.]/g,"-")}function m2(){return o2(3).toString("hex")}async function xy(e,t,n){if(t.length>aR)throw new Error(`writeScreenshotSidecar: buffer exceeds ${aR} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=u2(e);await i2(r,{recursive:!0});let o=`${p2()}-${m2()}-${n}.png`,i=Ty(r,o);await a2(i,t);let{size:s}=await s2(i);return{path:i,bytes:s}}var kge,aR,lR=R(()=>{"use strict";G();kl();kge=c2(l2);aR=5*1024*1024});var dR={};ld(dR,{PlaywrightProvider:()=>Ry});function cR(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 Ry,uR=R(()=>{"use strict";Yx();oR();sR();Sy();kl();lR();Ry=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new ku(t)}async open(t){let n=wy(t.url,this.config);if(!n.allowed)return{outcome:"blocked_by_policy",url:t.url,reason:n.reason};let{sessionId:r}=t,o=await this.launcher.ensurePage(r),i=this.ensureSessionState(r),s=null,a=null;try{await o.goto(t.url,{timeout:t.timeoutMs??3e4,waitUntil:t.waitFor??"load"})}catch(c){a=c}(t.screenshot===!0||a!==null)&&(s=await this.captureScreenshot(o,r,"browser_open")),i.observationCounter+=1;let l=await Eu(o,{observationCounter:i.observationCounter,screenshotPath:s,consoleErrors:this.launcher.getConsoleErrorCount(r),httpStatus:this.launcher.getLastHttpStatus(r),hasDialog:this.launcher.hasOpenDialog(r)});if(this.updateSessionFromObservation(i,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),i=null;t.screenshot===!0&&(i=await this.captureScreenshot(r,n,"browser_observe")),o.observationCounter+=1;let s=await Eu(r,{observationCounter:o.observationCounter,screenshotPath:i,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n),includeHidden:t.includeHidden,maxElements:t.maxElements});return this.updateSessionFromObservation(o,s.interactive,s.url,s.title,"browser_observe"),s}async act(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_act: no page open for session ${n}`);let o=this.ensureSessionState(n),i=r.url(),s=t.timeoutMs??3e4,a=await Ey(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${cR(t.target)}`);if(a.outcome==="ambiguous_target")return a;let{locator:l}=a,c=null,d=async()=>{switch(t.action){case"click":await l.click({timeout:s});break;case"fill":{let h=vy(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:s});break;case"scroll_to":await l.scrollIntoViewIfNeeded({timeout:s});break;case"wait_for":await l.waitFor({timeout:s,state:"visible"});break}};try{await d()}catch(h){if(h instanceof Error&&/navigation|net::ERR/i.test(h.message))try{await d()}catch(b){c=b}else c=h}let u=r.url();if(u!==i){let h=wy(u,this.config);if(!h.allowed)return await r.goBack().catch(()=>{}),{outcome:"blocked_by_policy",url:u,reason:h.reason}}let m=null;(t.screenshot===!0||c!==null)&&(m=await this.captureScreenshot(r,n,"browser_act")),o.observationCounter+=1;let p=await Eu(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,p.interactive,p.url,p.title,g),c!==null)throw c;return p}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),i;if(t.target!==void 0){let d=await Ey(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${cR(t.target)}`);if(d.outcome==="ambiguous_target")throw new Error("screenshot target ambiguous; specify element_id or selector");i=await d.locator.screenshot()}else i=await r.screenshot({fullPage:t.fullPage??!1});let{path:s,bytes:a}=await xy(n,i,"browser_screenshot"),l=0,c=0;if(t.fullPage===!0)try{let d=await r.evaluate(()=>({w:document.documentElement.scrollWidth,h:document.documentElement.scrollHeight}));l=d.w,c=d.h}catch{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}else{let d=r.viewportSize();l=d?.width??0,c=d?.height??0}return{path:s,bytes:a,width:l,height:c,dataBase64:i.toString("base64"),mediaType:"image/png"}}async extract(t){throw new Error("browser_extract not implemented in Phase 1")}async close(t){await this.launcher.closeSession(t.sessionId),this.sessions.delete(t.sessionId)}describe(t){let n=this.sessions.get(t);if(n===void 0)return null;let r=this.launcher.getPage(t);return{active:r!==void 0,url:n.currentUrl,title:n.currentTitle,lastAction:n.lastAction,lastActionAt:n.lastActionAt,openTabs:r!==void 0?1:0}}async shutdown(){this.sessions.clear(),await this.launcher.shutdown()}ensureSessionState(t){let n=this.sessions.get(t);if(n!==void 0)return n;let r={observationCounter:0,knownElements:new Map,lastAction:null,lastActionAt:null,currentUrl:null,currentTitle:null};return this.sessions.set(t,r),r}updateSessionFromObservation(t,n,r,o,i){t.knownElements=new Map(n.map(s=>[s.id,s])),t.currentUrl=r,t.currentTitle=o,t.lastAction=i,t.lastActionAt=new Date().toISOString()}async captureScreenshot(t,n,r){try{let o=await t.screenshot({fullPage:!1}),{path:i}=await xy(n,o,r);return i}catch{return null}}}});var zo={};ld(zo,{__resetBrowserRegistryForTests:()=>b2,browserProviderActive:()=>h2,closeBrowserProvider:()=>Ay,getBrowserProvider:()=>g2,peekBrowserProvider:()=>y2});function pR(){Promise.resolve(Ay()).then(()=>{process.exit(130)})}function mR(){Promise.resolve(Ay()).then(()=>{process.exit(143)})}function fR(){Nn=null}function f2(){Tu||(process.on("SIGINT",pR),process.on("SIGTERM",mR),process.on("exit",fR),Tu=!0)}function gR(){Tu&&(process.removeListener("SIGINT",pR),process.removeListener("SIGTERM",mR),process.removeListener("exit",fR),Tu=!1)}async function g2(e){return Nn!==null?Nn:(qo!==null||(qo=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(uR(),dR)),n=Vx(e),r=new t(n);return f2(),Nn=r,qo=null,r})()),qo)}async function Ay(){if(Nn===null)return;let e=Nn;Nn=null,qo=null,gR(),await e.shutdown()}function h2(){return Nn!==null}function y2(){return Nn}function b2(){Nn=null,qo=null,gR()}var Nn,qo,Tu,Jo=R(()=>{"use strict";Sy();Nn=null,qo=null,Tu=!1});function hR(e,t){try{return Wx(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function E2(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(Jo(),zo));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function yR(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??E2,o=null,i=e,s=null,a=null;try{let c=await Su(n,e,{headers:k2,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(v2.test(d))throw new Error(`web_scrape markdown mode received binary content (${d.split(";")[0]}). Use mode: "raw" to fetch the bytes, or a different tool.`);let u=await c.text();if(S2.test(d)&&!w2.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};o=hR(u,i)}}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<Hx)&&o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};try{let c=await r(e,{timeoutMs:t.timeoutMs,signal:t.signal}),d=hR(c.html,c.finalUrl);if(o===null||d.textLength>=o.textLength)return{title:d.title,markdown:d.markdown,finalUrl:c.finalUrl,usedRender:!0}}catch(c){if(t.signal.aborted)throw c;if(o===null){let d=c instanceof Error?c.message:String(c),u=a instanceof Error?a.message:`HTTP ${s??"error"}`,m=new Error(`web_scrape could not retrieve ${e}: fetch failed (${u}) and render failed (${d}).`);throw m.cause=c,m}}if(o!==null)return{title:o.title,markdown:o.markdown,finalUrl:i,usedRender:!1};throw new Error(`web_scrape could not retrieve any content from ${e} (HTTP ${s??"error"}).`)}var w2,S2,v2,k2,bR=R(()=>{"use strict";Kx();by();Re();w2=/(text\/html|application\/xhtml\+xml)/i,S2=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,v2=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,k2={"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 R2(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(T2,{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),x2),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=Wo(d);u&&(l=`: ${u.length>200?u.slice(0,200)+"\u2026":u}`)}catch{}let c=i.statusText?` ${i.statusText}`:"";throw new Error(`Exa Search HTTP ${i.status}${c}${l}`)}let s;try{s=await i.json()}catch(l){throw new Error(`Exa Search response was not JSON: ${l instanceof Error?l.message:String(l)}`)}return(s.results??[]).slice(0,r).map(l=>({title:(l.title??"").trim()||"(untitled)",url:l.url??"",description:(l.highlights?.[0]??"").trim()})).filter(l=>l.url.length>0)}}}function wR(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?R2({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 SR(e,t){if(t.length===0)return`# Search results for "${e}"
1092
1092
 
1093
1093
  (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(`
1094
1094
  `).trimEnd()}var T2,x2,vR=R(()=>{"use strict";Ko();T2="https://api.exa.ai/search",x2=10});function $2(e){if(!e||typeof e!="object")return{error:"Invalid input: expected an object"};let t=e,n=t.mode??"markdown";if(n!=="markdown"&&n!=="raw"&&n!=="search")return{error:`Invalid input: mode must be one of "markdown", "raw", "search" (got ${JSON.stringify(n)})`};let r=n,o,i;if(r==="search"){if(typeof t.query!="string"||t.query.length===0)return{error:'Invalid input: search mode requires a non-empty "query" string'};i=t.query}else{if(typeof t.url!="string"||t.url.length===0)return{error:`Invalid input: ${r} mode requires a non-empty "url" string`};let l;try{l=new URL(t.url)}catch{return{error:`Invalid input: "${t.url}" is not a valid absolute URL`}}if(l.protocol!=="http:"&&l.protocol!=="https:")return{error:`Invalid input: protocol "${l.protocol}" not supported (http/https only)`};o=l.toString()}let s=A2;if(t.timeout_ms!==void 0){if(typeof t.timeout_ms!="number"||!Number.isFinite(t.timeout_ms)||t.timeout_ms<=0)return{error:"Invalid input: timeout_ms must be a positive finite number"};s=Math.min(t.timeout_ms,C2)}let a=_2;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,I2)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function Cy(e,t){let n=Buffer.from(e,"utf8");return n.byteLength<=t?e:n.subarray(0,t).toString("utf8")+P2}function D2(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 O2.some(o=>r.includes(o))}function F2(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 i=$2(r);if("error"in i)return{content:i.error,isError:!0};if(o.aborted){let d=o.reason;return{content:`web_scrape aborted: ${d instanceof Error?d.message:String(d??"aborted")}`,isError:!0}}let s=new AbortController,a=()=>{s.abort(o.reason)},l,c=()=>{let d=s.signal.reason;return d instanceof Error?d.message:String(d??"aborted")};try{if(o.addEventListener("abort",a,{once:!0}),l=setTimeout(()=>{s.abort(new Error(`web_scrape timeout after ${i.timeoutMs}ms`))},i.timeoutMs),i.mode==="raw"){let u;try{u=await Su(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(p){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}if(!u.ok)return{content:`web_scrape HTTP ${u.status} ${u.statusText||""}`.trimEnd()+` for ${i.url}`,isError:!0};let m;try{m=await u.text()}catch(p){return{content:`web_scrape read error: ${p instanceof Error?p.message:String(p)}`,isError:!0}}return{content:Cy(m,i.maxBytes)}}if(i.mode==="markdown")try{let u=await yR(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});return u.markdown.trim().length===0?{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0}:{content:Cy(u.markdown,i.maxBytes)}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),p=D2(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${p}`,isError:!0}}let d=wR({exaApiKey:n.EXA_API_KEY,fetchFn:t});if("error"in d)return{content:d.error,isError:!0};try{let u=await d.search(i.query,{limit:M2,timeoutMs:i.timeoutMs,signal:s.signal});return{content:Cy(SR(i.query,u),i.maxBytes)}}catch(u){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape search error (${d.name}): ${u instanceof Error?u.message:String(u)}`,isError:!0}}}finally{l!==void 0&&clearTimeout(l),o.removeEventListener("abort",a)}}}var A2,C2,_2,I2,P2,M2,O2,kR,ER=R(()=>{"use strict";bR();vR();by();A2=3e4,C2=12e4,_2=1e6,I2=1e7,P2=`
@@ -1263,7 +1263,7 @@ Reply compactly: the answer first, then evidence as file:line citations, then op
1263
1263
 
1264
1264
  Available agent types (pass via \`agent_type\`):
1265
1265
  `+t+"\nWhen `agent_type` is omitted, a general child agent with the default tool surface is dispatched.",input_schema:{...Ht.input_schema,properties:{...Ht.input_schema.properties,agent_type:{type:"string",description:"Named agent type to dispatch \u2014 one of the \"Available agent types\" listed in this tool's description. The type supplies the child's system prompt, tool allowlist (mechanically enforced), and default model/turn budget. Explicit `model`/`max_turns` on this call override the type's defaults. Unknown types fail with the available list. Alias: `subagent_type`."}}}}}var hC=R(()=>{"use strict";sn()});var ks=R(()=>{"use strict";jl();fC();Tb();Rb();hC()});import{isAbsolute as AJ}from"node:path";function yC(e){if(typeof e!="object"||e===null)throw new Error("Agent tool input must be an object");let t=e,n=t.prompt;if(typeof n!="string")throw new Error('Agent tool input must have a "prompt" field of type string');if(n.trim().length===0)throw new Error("Agent tool prompt cannot be empty");let r,o=t.model;if(o!==void 0){if(typeof o!="string")throw new Error("Agent tool model must be a string");r=o}let i=0,s=!1,a=t.max_turns;if(a!==void 0){if(typeof a!="number")throw new Error("Agent tool max_turns must be a number");i=Math.max(0,Math.floor(a)),s=!0}let l=0,c=!1,d=t.max_tool_use_iterations;if(d!==void 0){if(typeof d!="number")throw new Error("Agent tool max_tool_use_iterations must be a number");l=Math.max(0,Math.floor(d)),c=!0}let u,m=t.agent_type??t.subagent_type;if(m!==void 0){if(typeof m!="string")throw new Error("Agent tool agent_type must be a string");let v=m.trim();v.length>0&&(u=v)}let p="agent-tool",g=t.id_prefix;if(g!==void 0){if(typeof g!="string")throw new Error("Agent tool id_prefix must be a string");p=g}let h="foreground",b=t.mode;if(b!==void 0){if(b!=="foreground"&&b!=="background")throw new Error(`Agent tool mode must be "foreground" or "background", got: ${JSON.stringify(b)}`);h=b}let y,w=t.cwd;if(w!==void 0){if(typeof w!="string")throw new Error(`Agent tool cwd must be a string, got: ${JSON.stringify(w)}`);if(w.length===0)throw new Error("Agent tool cwd must be a non-empty string");if(!AJ(w))throw new Error(`Agent tool cwd must be an absolute path, got: ${JSON.stringify(w)}`);if(w.split(/[/\\]/).includes(".."))throw new Error(`Agent tool cwd must not contain '..' segments, got: ${JSON.stringify(w)}`);y=w}return{prompt:n,model:r,max_turns:i,max_turns_explicit:s,max_tool_use_iterations:l,max_tool_use_iterations_explicit:c,id_prefix:p,mode:h,...u!==void 0?{agent_type:u}:{},...y!==void 0?{cwd:y}:{}}}var bC=R(()=>{"use strict"});function Es(e){try{return He(e).catch(()=>{})}catch{return Promise.resolve()}}function ro(e,t=240){return e.length<=t?e:e.slice(0,t)+"\u2026"}function Cb(e){if(e!=null){if(typeof e=="string")return e.length;try{return JSON.stringify(e).length}catch{return}}}function _J(e){if(e==null)return;let t=Cb(e);return t!==void 0&&t>CJ?{truncated:!0,chars:t}:e}function SC(e){let t={status:e.status,error:ro(e.errorMessage,wC),subagent_id:e.subagentId};e.schemaErrorMessage&&(t.schemaError=ro(e.schemaErrorMessage,wC));let n=_J(e.partialOutput);return n!==void 0&&(t.partialOutput=n),t}var CJ,wC,_b=R(()=>{"use strict";ur();CJ=4096,wC=1024});function vC(e){return typeof e=="string"&&e.startsWith("sk-ant-")}function Hl(e){let{childModel:t,resolved:n,parentApiKey:r}=e;return n!==void 0&&n.length>0||oe(t)==="openai-compatible"?n:vC(r)?r:n}function kC(e){let{childModel:t,configApiKey:n,parentApiKey:r,parentProvider:o}=e;if(n!==void 0&&n.length>0)return n;if(r===void 0)return;let i=o??(vC(r)?"anthropic-direct":void 0);return i===void 0||oe(t)===i?r:void 0}var gp=R(()=>{"use strict";et()});function EC(e){let{parsed:t,namedAgent:n,depth:r,maxDepth:o,currentCwd:i,signal:s,defaultConfig:a,createChildExecutor:l}=e,c;if(n!==void 0){let S=n.definition.model;c=S!==void 0&&S!=="inherit"?S:e.parentModel}let d=t.model??c??e.defaultSubagentModel??"sonnet",u=oe(d)==="openai-compatible",m=n!==void 0?vb(n,hp):void 0,p=e.allowedTools;if(m?.allowedTools!==void 0){let S=e.allowedTools;p=S!==void 0?m.allowedTools.filter(A=>S.includes(A)):m.allowedTools}let g=e.readOnlyBash===!0||m?.bashReadOnly===!0;m!==void 0&&m.droppedTokens.length>0&&process.stderr.write(`[afk] agents: agent_type ${JSON.stringify(n?.name)}: unknown tool token(s) dropped fail-closed: ${m.droppedTokens.join(", ")}
1266
- `);let h=!t.max_turns_explicit&&n?.definition.maxTurns!==void 0?Math.max(1,Math.floor(n.definition.maxTurns)):t.max_turns,b=!t.max_tool_use_iterations_explicit&&n?.definition.maxToolUseIterations!==void 0?Math.max(1,Math.floor(n.definition.maxToolUseIterations)):t.max_tool_use_iterations??0,y=Hl({childModel:d,resolved:e.resolveApiKeyForModel?e.resolveApiKeyForModel(d):Ne(d),parentApiKey:a.apiKey}),w={model:d,apiKey:u?void 0:y,systemPrompt:n!==void 0?n.definition.prompt:a.systemPrompt,baseUrl:u?void 0:a.baseUrl,maxTurns:h,maxToolUseIterations:b,depth:r+1,maxDepth:o,...t.cwd!==void 0?{cwd:t.cwd}:{}},v,k;if(e.childProviderFactory&&r<o){k=new ae({parentAbortSignal:s,...i!==void 0?{cwd:i}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{}}),v=ni(s);let S=l({subagentManager:k,parentSession:v,defaultConfig:a,...e.surface!==void 0?{surface:e.surface}:{},defaultSubagentModel:e.defaultSubagentModel,childProviderFactory:e.childProviderFactory,childSkillExecutorFactory:e.childSkillExecutorFactory,...e.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:e.resolveApiKeyForModel}:{},depth:r+1,maxDepth:o,...i!==void 0?{cwd:i}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.allowedTools!==void 0?{allowedTools:e.allowedTools}:{},...e.readOnlyBash?{readOnlyBash:!0}:{},...e.agentRegistry!==void 0?{agentRegistry:e.agentRegistry}:{},...m?.nestedAgentTypes!==void 0?{nestedAgentAllowlist:m.nestedAgentTypes}:{},parentModel:d}),A=e.childSkillExecutorFactory?e.childSkillExecutorFactory(r+1,o,s,i):void 0;w.provider=e.childProviderFactory({childExecutor:S,...A!==void 0?{childSkillExecutor:A}:{},...w.model!==void 0?{model:w.model}:{},...p!==void 0?{allowedTools:p}:{},...g?{readOnlyBash:!0}:{}})}else(p!==void 0||g)&&(w.provider=yp(p??[...hp],w.model,g,a.openaiBaseUrl));return{childConfig:w,childParentSession:v,childManager:k}}var TC=R(()=>{"use strict";qe();et();gp();Lt();Sr();ks()});function bp(e){let t=IJ(e);return t!==void 0?t:PJ(e)}function IJ(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return xC(n.trim())}function PJ(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=MJ(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=xC(r);if(o!==void 0)return o}}function MJ(e,t){let n=0,r=!1,o=!1;for(let i=t;i>=0;i--){let s=e[i];if(o){o=!1;continue}if(r){if(s==="\\"){o=!0;continue}s==='"'&&(r=!1);continue}if(s==='"'){r=!0;continue}if(s==="}")n++;else if(s==="{"&&(n--,n===0))return i}return-1}function xC(e){try{return JSON.parse(e)}catch{return}}var Ib=R(()=>{"use strict"});import{z as oo}from"zod";function FJ(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n;for(;(n=t.exec(e))!==null;){let r=n[1];if(r===void 0)continue;let o=RC(r.trim());if(AC(o))return o}for(let r=0;r<e.length;r++){if(e[r]!=="{"||LJ(e,r))continue;let o=NJ(e,r);if(o===-1)continue;let i=e.slice(r,o+1),s=RC(i);if(AC(s))return s;r=o}}function LJ(e,t){for(let n=t-1;n>=0;n--){let r=e[n];if(!(r===" "||r===" "||r===`
1266
+ `);let h=!t.max_turns_explicit&&n?.definition.maxTurns!==void 0?Math.max(1,Math.floor(n.definition.maxTurns)):t.max_turns,b=!t.max_tool_use_iterations_explicit&&n?.definition.maxToolUseIterations!==void 0?Math.max(1,Math.floor(n.definition.maxToolUseIterations)):t.max_tool_use_iterations??0,y=Hl({childModel:d,resolved:e.resolveApiKeyForModel?e.resolveApiKeyForModel(d):Ne(d),parentApiKey:a.apiKey}),w={model:d,apiKey:u?void 0:y,systemPrompt:n!==void 0?n.definition.prompt:a.systemPrompt,baseUrl:u?void 0:a.baseUrl,maxTurns:h,maxToolUseIterations:b,depth:r+1,maxDepth:o,...t.cwd!==void 0?{cwd:t.cwd}:{}},v,k;if(e.childProviderFactory&&r<o){k=new ae({parentAbortSignal:s,...i!==void 0?{cwd:i}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.surface!==void 0?{surface:e.surface}:{}}),v=ni(s);let S=l({subagentManager:k,parentSession:v,defaultConfig:a,...e.surface!==void 0?{surface:e.surface}:{},defaultSubagentModel:e.defaultSubagentModel,childProviderFactory:e.childProviderFactory,childSkillExecutorFactory:e.childSkillExecutorFactory,...e.resolveApiKeyForModel!==void 0?{resolveApiKeyForModel:e.resolveApiKeyForModel}:{},depth:r+1,maxDepth:o,...i!==void 0?{cwd:i}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.allowedTools!==void 0?{allowedTools:e.allowedTools}:{},...e.readOnlyBash?{readOnlyBash:!0}:{},...e.agentRegistry!==void 0?{agentRegistry:e.agentRegistry}:{},...m?.nestedAgentTypes!==void 0?{nestedAgentAllowlist:m.nestedAgentTypes}:{},parentModel:d}),A=e.childSkillExecutorFactory?e.childSkillExecutorFactory(r+1,o,s,i):void 0;w.provider=e.childProviderFactory({childExecutor:S,...A!==void 0?{childSkillExecutor:A}:{},...w.model!==void 0?{model:w.model}:{},...p!==void 0?{allowedTools:p}:{},...g?{readOnlyBash:!0}:{}})}else(p!==void 0||g)&&(w.provider=yp(p??[...hp],w.model,g,a.openaiBaseUrl));return{childConfig:w,childParentSession:v,childManager:k}}var TC=R(()=>{"use strict";qe();et();gp();Lt();Sr();ks()});function bp(e){let t=IJ(e);return t!==void 0?t:PJ(e)}function IJ(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n,r;for(;(r=t.exec(e))!==null;)n=r[1];if(n)return xC(n.trim())}function PJ(e){for(let t=e.length-1;t>=0;t--){if(e[t]!=="}")continue;let n=MJ(e,t);if(n===-1)continue;let r=e.slice(n,t+1),o=xC(r);if(o!==void 0)return o}}function MJ(e,t){let n=0,r=!1,o=!1;for(let i=t;i>=0;i--){let s=e[i];if(o){o=!1;continue}if(r){if(s==="\\"){o=!0;continue}s==='"'&&(r=!1);continue}if(s==='"'){r=!0;continue}if(s==="}")n++;else if(s==="{"&&(n--,n===0))return i}return-1}function xC(e){try{return JSON.parse(e)}catch{return}}var Ib=R(()=>{"use strict"});import{z as oo}from"zod";function FJ(e){let t=/```(?:json)?\s*([\s\S]*?)```/gi,n;for(;(n=t.exec(e))!==null;){let r=n[1];if(r===void 0)continue;let o=RC(r.trim());if(AC(o))return o}for(let r=0;r<e.length;r++){if(e[r]!=="{"||LJ(e,r))continue;let o=NJ(e,r);if(o===-1)continue;let i=e.slice(r,o+1),s=RC(i);if(AC(s))return s;r=o}}function LJ(e,t){for(let n=t-1;n>=0;n--){let r=e[n];if(!(r===" "||r===" "||r===`
1267
1267
  `||r==="\r"))return r==="["||r===","}return!1}function CC(e){let t=FJ(e);if(t===void 0)return{ok:!1,reason:"absent"};let n=DJ.safeParse(t);return n.success?{ok:!0,signal:n.data.signal}:{ok:!1,reason:"malformed"}}function RC(e){try{return JSON.parse(e)}catch{return}}function AC(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&"signal"in e}function NJ(e,t){let n=0,r=!1,o=!1;for(let i=t;i<e.length;i++){let s=e[i];if(o){o=!1;continue}if(r){if(s==="\\"){o=!0;continue}s==='"'&&(r=!1);continue}if(s==='"'){r=!0;continue}if(s==="{")n++;else if(s==="}"&&(n--,n===0))return i}return-1}var OJ,$J,DJ,_C=R(()=>{"use strict";OJ=oo.enum(["supports","opposes","uncertain","blocks"]),$J=oo.object({issue:oo.string().min(1),stance:OJ,confidence:oo.number().min(0).max(1),evidence:oo.array(oo.string()),claim:oo.string().min(1)}),DJ=oo.object({signal:$J}).passthrough()});function Wl(){return{toolCalls:[],toolResults:[],thinkingPresent:!1,turnCount:0}}function IC(e,t,n,r,o,i){let s=CC(n.content),a=s.ok?s.signal:void 0;if(!r)return{id:e,status:t,message:n,trace:o,...a!==void 0&&{signal:a},...i!==void 0&&{stopReason:i}};let l=bp(n.content),c=r.safeParse(l);return c.success?{id:e,status:t,message:n,output:c.data,trace:o,...a!==void 0&&{signal:a},...i!==void 0&&{stopReason:i}}:{id:e,status:"failed",message:n,error:new Error(`structured output did not match schema: ${c.error.message}`,{cause:c.error}),schemaError:c.error,trace:o,...a!==void 0&&{signal:a},...i!==void 0&&{stopReason:i}}}function wp(e,t,n,r,o){let i=n instanceof Error?n:new Error(String(n));return{id:e,status:t,error:i,trace:r,...o!==void 0&&{stopReason:o}}}function tt(e){return`${e.status}${e.error?`: ${e.error.message}`:""}`}function PC(e,t){let n=e;return t.partialOutput!==void 0&&t.partialOutput!==null&&(n.partialOutput=t.partialOutput),t.subagentId!==void 0&&(n.subagentId=t.subagentId),n}var qt=R(()=>{"use strict";Ib();_C()});import*as Ts from"node:fs";import*as lt from"node:fs/promises";import*as MC from"node:readline";import{randomBytes as BJ}from"node:crypto";var Sp,qn,vp=R(()=>{"use strict";G();Sp=class{jobId;logPath;metaPath;stream=null;errored=!1;closed=!1;streamReady=!1;pendingLines=[];readyPromise=null;readyResolve=null;metaWriteQueue=Promise.resolve();constructor(t){this.jobId=t,this.logPath=wd(t),this.metaPath=zg(t);try{Ts.mkdirSync(Po(t),{recursive:!0})}catch(n){process.stderr.write(`[afk] bg-job-log: mkdir failed for ${t}: ${String(n)}
1268
1268
  `),this.errored=!0}}write(t){if(this.errored||this.closed)return;let n=JSON.stringify(t)+`
1269
1269
  `;if(!this.stream){this.pendingLines.push(n),this._openStream();return}if(!this.streamReady){this.pendingLines.push(n);return}this._writeLine(n)}_openStream(){if(!this.stream){this.readyPromise=new Promise(t=>{this.readyResolve=t});try{let t=Ts.createWriteStream(this.logPath,{flags:"a",encoding:"utf8",mode:384});this.stream=t,t.once("open",()=>{this.streamReady=!0;for(let n of this.pendingLines)this._writeLine(n);this.pendingLines=[],this.readyResolve?.(),this.readyResolve=null}),t.once("error",n=>{process.stderr.write(`[afk] bg-job-log: stream error for ${this.jobId}: ${String(n)}
@@ -1697,7 +1697,7 @@ ${s}`:i;n.push(`## ${o.id} [FAILED]
1697
1697
  ${a}`)}return e.skipped.length>0&&n.push(`## Skipped
1698
1698
  ${e.skipped.join(", ")}`),{content:n.join(`
1699
1699
 
1700
- `),truncations:r}}function zP(e){if(e)try{let t=Nw(Et(),e,"compose");x8(t,{recursive:!0,force:!0})}catch{}}function P8(e){let t=`node "${e.nodeId}" output truncated: emitted ${e.emittedChars} of ${e.totalChars} chars`;return e.spillPath!==void 0?`${t}; full output at ${e.spillPath} (use read_file to retrieve)`:`${t}; full output unavailable (spill write failed)`}var po=class{constructor(t){this.ctx=t;this.currentCwd=t.cwd}ctx;currentCwd;setCwd(t){this.currentCwd=t}async execute(t){if(t.signal.aborted)return{content:"Compose tool call aborted",isError:!0};let n,r;try{({parsed:n,warnings:r}=A8(t.input))}catch(m){return{content:`Compose tool input validation failed: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!this.ctx.resolveApiKeyForModel&&(!this.ctx.apiKey||this.ctx.apiKey.length===0))return{content:"Compose tool requires an API key (ctx.apiKey is missing or empty)",isError:!0};let o=this.ctx.surface!==void 0?{origin:Zr(this.ctx.surface),actor:jn(this.ctx.depth)}:{},i=n.max_tool_calls_per_node,s=new Map,a=new Set,l=on(),c,d=(m,p)=>{if(l!==void 0)try{l(m,p)}catch{}if(!c||i===void 0||m.type!=="chunk"||m.chunk.type!=="tool_use_detail")return;let g=(s.get(p.subagentId)??0)+1;s.set(p.subagentId,g),g>i&&!a.has(p.subagentId)&&(a.add(p.subagentId),c.kill(p.subagentId).catch(()=>{}))};c=new ae({parentAbortSignal:t.signal,apiKey:this.ctx.apiKey,parentModel:this.ctx.defaultModel,progressSink:d,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.currentCwd!==void 0?{cwd:this.currentCwd}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{}});let u=Date.now();He({...o,event:"compose.started",parent_session_id:this.ctx.parentSession.sessionId,node_count:n.nodes.length,edge_count:n.edges?.length??0}).catch(()=>{});try{let m=t.id,p=n.nodes.length,g=n.nodes.map((C,j)=>{let P=C.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",E=oe(typeof P=="string"?P:void 0),M=oe(typeof this.ctx.defaultModel=="string"?this.ctx.defaultModel:void 0),N=E==="openai-compatible",L=this.ctx.apiKey!==void 0&&E===M,B=N?void 0:L?this.ctx.apiKey:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(P):this.ctx.apiKey;return{id:C.id,agentType:`${C.id} [${j+1}/${p}]`,parentId:m,systemPrompt:this.ctx.systemPrompt,promptBuilder:H=>{let $=Object.entries(H).map(([I,O])=>{let F=typeof O=="string"?O:JSON.stringify(O);return`<<<UPSTREAM_OUTPUT_BEGIN node="${I}">>>
1700
+ `),truncations:r}}function zP(e){if(e)try{let t=Nw(Et(),e,"compose");x8(t,{recursive:!0,force:!0})}catch{}}function P8(e){let t=`node "${e.nodeId}" output truncated: emitted ${e.emittedChars} of ${e.totalChars} chars`;return e.spillPath!==void 0?`${t}; full output at ${e.spillPath} (use read_file to retrieve)`:`${t}; full output unavailable (spill write failed)`}var po=class{constructor(t){this.ctx=t;this.currentCwd=t.cwd}ctx;currentCwd;setCwd(t){this.currentCwd=t}async execute(t){if(t.signal.aborted)return{content:"Compose tool call aborted",isError:!0};let n,r;try{({parsed:n,warnings:r}=A8(t.input))}catch(m){return{content:`Compose tool input validation failed: ${m instanceof Error?m.message:String(m)}`,isError:!0}}if(!this.ctx.resolveApiKeyForModel&&(!this.ctx.apiKey||this.ctx.apiKey.length===0))return{content:"Compose tool requires an API key (ctx.apiKey is missing or empty)",isError:!0};let o=this.ctx.surface!==void 0?{origin:Zr(this.ctx.surface),actor:jn(this.ctx.depth)}:{},i=n.max_tool_calls_per_node,s=new Map,a=new Set,l=on(),c,d=(m,p)=>{if(l!==void 0)try{l(m,p)}catch{}if(!c||i===void 0||m.type!=="chunk"||m.chunk.type!=="tool_use_detail")return;let g=(s.get(p.subagentId)??0)+1;s.set(p.subagentId,g),g>i&&!a.has(p.subagentId)&&(a.add(p.subagentId),c.kill(p.subagentId).catch(()=>{}))};c=new ae({parentAbortSignal:t.signal,apiKey:this.ctx.apiKey,parentModel:this.ctx.defaultModel,progressSink:d,...this.ctx.baseUrl!==void 0?{baseUrl:this.ctx.baseUrl}:{},...this.currentCwd!==void 0?{cwd:this.currentCwd}:{},...this.ctx.traceWriter!==void 0?{traceWriter:this.ctx.traceWriter}:{},...this.ctx.surface!==void 0?{surface:this.ctx.surface}:{}});let u=Date.now();He({...o,event:"compose.started",parent_session_id:this.ctx.parentSession.sessionId,node_count:n.nodes.length,edge_count:n.edges?.length??0}).catch(()=>{});try{let m=t.id,p=n.nodes.length,g=n.nodes.map((C,j)=>{let P=C.model??this.ctx.defaultSubagentModel??this.ctx.defaultModel??"sonnet",E=oe(typeof P=="string"?P:void 0),M=oe(typeof this.ctx.defaultModel=="string"?this.ctx.defaultModel:void 0),N=E==="openai-compatible",L=this.ctx.apiKey!==void 0&&E===M,B=N?void 0:L?this.ctx.apiKey:this.ctx.resolveApiKeyForModel?this.ctx.resolveApiKeyForModel(P):this.ctx.apiKey;return{id:C.id,agentType:`${C.id} [${j+1}/${p}]`,parentId:m,systemPrompt:this.ctx.systemPrompt,promptBuilder:H=>{let $=Object.entries(H).map(([I,O])=>{let F=typeof O=="string"?O:JSON.stringify(O);return`<<<UPSTREAM_OUTPUT_BEGIN node="${I}">>>
1701
1701
  ${F}
1702
1702
  <<<UPSTREAM_OUTPUT_END node="${I}">>>`}).join(`
1703
1703
 
@@ -1781,7 +1781,7 @@ ${o.join(`
1781
1781
  `),process.exitCode=1;return}if(o.trim()===""){process.stderr.write(`Error: message is empty \u2014 stdin contained only whitespace
1782
1782
  `),process.exitCode=1;return}let s=J3("Initializing agent...").start(),a=null,l,c,d,u,m=!1,p,g=hm(n.model),h=!1,b;try{if(n.worktree!==void 0)try{c=await jd(n.worktree,n.worktreeBase!==void 0?{baseRef:n.worktreeBase}:void 0),d=c.path,s.text=`Worktree ready at ${c.path} (branch: ${c.branch})`}catch(de){s.fail("Failed to create worktree"),V(de)}let y,w,v,k,S,A,_;try{y=co(n.thinking)??Os(),w=uo(n.effort)??$s(),v=Ds(n.maxBudgetUsd)??iw(),k=Ds(n.taskBudget)??sw(),S=Fs(n.maxOutputTokens)??Zl(),A=Ls(),_=void 0}catch(de){s.fail("Invalid options"),V(de)}if(n.dumpPrompt!==void 0){let de=n.dumpPrompt===!0?y0.join(h0.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):String(n.dumpPrompt);process.env.AFK_DUMP_PROMPT=de,n.provider!==void 0&&n.provider!=="anthropic"&&n.provider!=="anthropic-direct"&&console.error(`[--dump-prompt] WARNING: active provider (${n.provider}) does not support prompt dumping. No file will be written.`)}let C=Dt(),{prompt:j,source:P}=Ms(),E=Ot(),M=E.autoRouting?.chat??!1,N=lm(j,M,"one-shot"),L={},B=Zs({resume:n.resume,continue:n.continue});if(n.resume&&B&&!B.stored){s.fail("Session not found"),process.stderr.write(`Error: session not found: ${JSON.stringify(n.resume)}
1783
1783
  Run \`afk i\` then \`/resume\` to list saved sessions.
1784
- `),process.exitCode=1;return}B&&(L=Qs(B),m=!0,p=B.id),n.sessionId!==void 0&&(L={sessionId:n.sessionId},m=!0,p=n.sessionId);let H=B?.stored?.model??n.model,$=Zi(H);if($)throw new Error($);g.model=H,B?.stored&&(g.totalTurns=B.stored.totalTurns,g.totalCostUsd=B.stored.totalCostUsd,g.totalTokens=B.stored.totalTokens,g.totalDurationMs=B.stored.totalDurationMs,g.turns=[...B.stored.turns],g.sessionId=B.stored.sessionId??B.resumeId,g.sessionStartTime=B.stored.startedAt??Date.now()),n.sessionId!==void 0&&(g.sessionId=n.sessionId);let I,O=fo();b=O?.tracePath;let F=new ae({apiKey:C,parentModel:ze(),...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...d!==void 0?{cwd:d}:{},...O?.writer!==void 0?{traceWriter:O.writer}:{}}),U=As(E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}),Y={get sessionId(){return I?.sessionId},getInputStreamRef(){return I?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return I?.abortSignal??new AbortController().signal},get hookRegistry(){return I?.hookRegistry}},ne=ti({...d!==void 0?{cwd:d}:{},pluginAgents:js()}),te=Cs(n.model,C,U,E.baseUrl,O?.writer,void 0,d,Xe,"cli",_t(n.model),ne,E.openaiBaseUrl),Z=new zn({subagentManager:F,parentSession:Y,surface:"cli",defaultConfig:{apiKey:C,systemPrompt:j,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}},defaultSubagentModel:_t(n.model),childProviderFactory:U,childSkillExecutorFactory:te,resolveApiKeyForModel:Xe,depth:0,...d!==void 0?{cwd:d}:{},agentRegistry:ne,parentModel:n.model,...O?.writer!==void 0?{traceWriter:O.writer}:{}}),K=new Jn({parentSession:Y,surface:"cli",defaultModel:n.model,defaultSubagentModel:_t(n.model),apiKey:C,childProviderFactory:U,childSkillExecutorFactory:te,agentRegistry:ne,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{},resolveApiKeyForModel:Xe,...O?.writer!==void 0?{traceWriter:O.writer}:{},...d!==void 0?{cwd:d}:{}}),Ce=new po({parentSession:Y,defaultModel:n.model,defaultSubagentModel:_t(n.model),apiKey:C,resolveApiKeyForModel:Xe,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...d!==void 0?{cwd:d}:{},systemPrompt:j??"",surface:"cli",depth:0,...O?.writer!==void 0?{traceWriter:O.writer}:{}});l=new mt;{let de=d??process.cwd(),$e=wn(Bt()).mcpConfigs.filter(Le=>Le.format==="json").map(Le=>Le.source),Ve=li({cwd:de,...$e.length>0?{importedMcpConfigs:$e}:{},...n.mcpConfig!==void 0?{cliOverride:n.mcpConfig}:{}}),Pe=Object.values(Ve.mcpServers).filter(Le=>!Le.disabled).length;if(Pe>0){let Le=Date.now();be(O?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Pe}});try{u=await Cr.fromConfig(Ve.mcpServers,{warnings:Ve.warnings,...O?.writer!==void 0?{traceWriter:O.writer}:{}})}finally{be(O?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-Le,metadata:{serverCount:Pe}})}}else if(Ve.warnings.length>0)for(let Le of Ve.warnings)process.stderr.write(`[mcp] ${Le}
1784
+ `),process.exitCode=1;return}B&&(L=Qs(B),m=!0,p=B.id),n.sessionId!==void 0&&(L={sessionId:n.sessionId},m=!0,p=n.sessionId);let H=B?.stored?.model??n.model,$=Zi(H);if($)throw new Error($);g.model=H,B?.stored&&(g.totalTurns=B.stored.totalTurns,g.totalCostUsd=B.stored.totalCostUsd,g.totalTokens=B.stored.totalTokens,g.totalDurationMs=B.stored.totalDurationMs,g.turns=[...B.stored.turns],g.sessionId=B.stored.sessionId??B.resumeId,g.sessionStartTime=B.stored.startedAt??Date.now()),n.sessionId!==void 0&&(g.sessionId=n.sessionId);let I,O=fo();b=O?.tracePath;let F=new ae({apiKey:C,parentModel:ze(),...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...d!==void 0?{cwd:d}:{},...O?.writer!==void 0?{traceWriter:O.writer}:{},surface:"cli"}),U=As(E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}),Y={get sessionId(){return I?.sessionId},getInputStreamRef(){return I?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return I?.abortSignal??new AbortController().signal},get hookRegistry(){return I?.hookRegistry}},ne=ti({...d!==void 0?{cwd:d}:{},pluginAgents:js()}),te=Cs(n.model,C,U,E.baseUrl,O?.writer,void 0,d,Xe,"cli",_t(n.model),ne,E.openaiBaseUrl),Z=new zn({subagentManager:F,parentSession:Y,surface:"cli",defaultConfig:{apiKey:C,systemPrompt:j,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{}},defaultSubagentModel:_t(n.model),childProviderFactory:U,childSkillExecutorFactory:te,resolveApiKeyForModel:Xe,depth:0,...d!==void 0?{cwd:d}:{},agentRegistry:ne,parentModel:n.model,...O?.writer!==void 0?{traceWriter:O.writer}:{}}),K=new Jn({parentSession:Y,surface:"cli",defaultModel:n.model,defaultSubagentModel:_t(n.model),apiKey:C,childProviderFactory:U,childSkillExecutorFactory:te,agentRegistry:ne,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{},resolveApiKeyForModel:Xe,...O?.writer!==void 0?{traceWriter:O.writer}:{},...d!==void 0?{cwd:d}:{}}),Ce=new po({parentSession:Y,defaultModel:n.model,defaultSubagentModel:_t(n.model),apiKey:C,resolveApiKeyForModel:Xe,...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...d!==void 0?{cwd:d}:{},systemPrompt:j??"",surface:"cli",depth:0,...O?.writer!==void 0?{traceWriter:O.writer}:{}});l=new mt;{let de=d??process.cwd(),$e=wn(Bt()).mcpConfigs.filter(Le=>Le.format==="json").map(Le=>Le.source),Ve=li({cwd:de,...$e.length>0?{importedMcpConfigs:$e}:{},...n.mcpConfig!==void 0?{cliOverride:n.mcpConfig}:{}}),Pe=Object.values(Ve.mcpServers).filter(Le=>!Le.disabled).length;if(Pe>0){let Le=Date.now();be(O?.writer,{phase:"mcp_connect_start",metadata:{serverCount:Pe}});try{u=await Cr.fromConfig(Ve.mcpServers,{warnings:Ve.warnings,...O?.writer!==void 0?{traceWriter:O.writer}:{}})}finally{be(O?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-Le,metadata:{serverCount:Pe}})}}else if(Ve.warnings.length>0)for(let Le of Ve.warnings)process.stderr.write(`[mcp] ${Le}
1785
1785
  `)}let Mt=u?.getMcpToolWireNames()??[];_=Ns(n.provider,{subagentExecutor:Z,skillExecutor:K,composeExecutor:Ce,memoryStore:l,model:String(n.model),...E.openaiBaseUrl!==void 0?{openaiBaseUrl:E.openaiBaseUrl}:{},...u!==void 0?{mcpManager:u}:{}})??new nt({permissions:{allowedTools:am(Mt)},subagentExecutor:Z,skillExecutor:K,composeExecutor:Ce,memoryStore:l,surface:"cli",...u!==void 0?{mcpManager:u}:{}}),await Hs(),a=new Ct(wr({model:H,surface:"cli",apiKey:Xe(H),maxTurns:parseInt(n.maxTurns,10),isNonInteractive:!0,...n.dangerouslySkipPermissions?{permissionMode:"bypassPermissions"}:E.permissionMode!==void 0?{permissionMode:E.permissionMode}:{},hookRegistry:zs(de=>{console.log(Gw(de))},"cli",l,void 0,qs({cwd:d}),{cwd:d,...O?.writer!==void 0?{traceWriter:O.writer}:{}}).registry,...N!==void 0?{systemPrompt:N}:{},...P!==void 0?{systemPromptSource:P}:{},...y!==void 0?{thinking:y}:{},...w!==void 0?{effort:w}:{},...v!==void 0?{maxBudgetUsd:v}:{},...k!==void 0?{taskBudget:k}:{},...S!==void 0?{maxOutputTokens:S}:{},...A!==void 0?{maxToolUseIterations:A}:{},...E.baseUrl!==void 0?{baseUrl:E.baseUrl}:{},...O?{traceWriter:O.writer}:{},...E.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:E.autoResumeOnUsageLimit}:{},...d!==void 0?{cwd:d}:{},...L,provider:_})),I=a,s.text="Sending message...";let vt=async(de,$e)=>{if(r.length===0||$e)return;let Ve={line:Pe=>{process.stderr.write(`${Pe??""}
1786
1786
  `)},raw:Pe=>{process.stderr.write(Pe)},success:Pe=>{process.stderr.write(`\u2714 ${Pe}
1787
1787
  `)},info:Pe=>{process.stderr.write(`\u2139 ${Pe}
@@ -1958,7 +1958,7 @@ ${t}`}var ZD=!1;function QD(){ZD||(ZD=!0,sv("review",qD),JD())}J();var LZ=new Se
1958
1958
  `)},setCompositor(o){n=o}}}var Kf=class{entries=new Map;record(t){let n=this.entries.get(t.skillName);n?(n.runs+=1,n.totalDurationMs+=t.durationMs,t.claimsTotal!==void 0&&(n.totalClaims=(n.totalClaims??0)+t.claimsTotal),t.claimsConfirmed!==void 0&&(n.totalConfirmed=(n.totalConfirmed??0)+t.claimsConfirmed),t.claimsRefuted!==void 0&&(n.totalRefuted=(n.totalRefuted??0)+t.claimsRefuted),t.claimsInconclusive!==void 0&&(n.totalInconclusive=(n.totalInconclusive??0)+t.claimsInconclusive)):this.entries.set(t.skillName,{skillName:t.skillName,runs:1,totalDurationMs:t.durationMs,...t.claimsTotal!==void 0?{totalClaims:t.claimsTotal}:{},...t.claimsConfirmed!==void 0?{totalConfirmed:t.claimsConfirmed}:{},...t.claimsRefuted!==void 0?{totalRefuted:t.claimsRefuted}:{},...t.claimsInconclusive!==void 0?{totalInconclusive:t.claimsInconclusive}:{}})}summary(){return this.entries.size===0?null:new Map(this.entries)}clear(){this.entries=new Map}};Lb();var Gf=class{source;sampleEveryNTurns;cachedRatio;cachedDetail;inFlight=null;disposed=!1;generation=0;constructor(t,n={}){this.source=t,this.sampleEveryNTurns=n.sampleEveryNTurns??3}attach(t){return this.source=t,this.generation+=1,this.reset(),this}getRatio(){return this.cachedRatio}getDetail(){return this.cachedDetail}async refresh(){if(this.disposed)return;if(this.inFlight)return this.inFlight;let t=this.doFetch().finally(()=>{this.inFlight=null});return this.inFlight=t,t}async onTurn(t){this.disposed||t%this.sampleEveryNTurns===1&&await this.refresh()}reset(){this.cachedRatio=void 0,this.cachedDetail=void 0,this.inFlight=null}dispose(){this.disposed=!0}async doFetch(){let t=this.generation;try{let n=await this.source.getContextUsage();if(this.generation!==t)return;let r=fee(n.apiUsage),o=n.maxTokens??0,i=n.percentage;typeof i=="number"&&(this.cachedRatio=Math.min(1,Math.max(0,i/100)),this.cachedDetail={used:r,limit:o,percentage:i})}catch{}}};function fee(e){return e?e.input_tokens+e.output_tokens+e.cache_creation_input_tokens+e.cache_read_input_tokens:0}qe();Gl();Mb();Re();Dd();var gee="claude-haiku-4-5",hee=15e3,yee=1e3,bee=80,wee=200,See=3e3,vee='Summarize what this background subagent is currently doing in \u226480 tokens. Be concrete: name specific tools used, files examined, decisions made. Avoid filler ("appears to be working on\u2026").';function kee(e){return e.replace(/\bauthorization:\s*bearer\s+\S+/gi,"Authorization: Bearer [REDACTED]").replace(/\bsk-ant-[A-Za-z0-9_-]{20,}/g,"[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,"[REDACTED]").replace(/\b(?:AKIA|ASIA|AROA|AIDA|AGPA|AIPA|ANPA|ANVA|APKA|ABIA|ACCA)[A-Z0-9]{16}\b/g,"[REDACTED]").replace(/(?<![/.\w])[A-Za-z0-9+/=_-]{32,}(?![/.\w])/g,"[REDACTED]")}var qf=class{registry;apiKey;model;intervalMs;maxInputTokens;maxOutputTokens;maxCallsPerSession;callLLM;getTranscriptFn;summaries=new Map;jobIndexMap=new Map;jobIndexCounter=0;callsThisSession=0;lastRefreshedAt=new Map;abortController=new AbortController;tickTimer;tickIntervalMs;constructor(t){this.registry=t.registry,this.apiKey=t.apiKey,this.model=t.model??gee,this.intervalMs=t.intervalMs??hee,this.maxInputTokens=t.maxInputTokens??yee,this.maxOutputTokens=t.maxOutputTokens??bee,this.maxCallsPerSession=t.maxCallsPerSession??wee,this.tickIntervalMs=Math.max(1e3,Math.floor(this.intervalMs/10)),t.callLLM!==void 0?this.callLLM=t.callLLM:this.callLLM=(n,r)=>Qi({token:this.apiKey,model:this.model,system:vee,user:n,maxTokens:this.maxOutputTokens,signal:r}),this.getTranscriptFn=t.getTranscript??(n=>this.registry.getTranscript(n)),this.registry.on("started",n=>{this.jobIndexMap.set(n.jobId,this.jobIndexCounter++)}),this.registry.on("settled",n=>{this.summaries.delete(n.jobId),this.jobIndexMap.delete(n.jobId),this.lastRefreshedAt.delete(n.jobId)})}start(){this.tickTimer===void 0&&(this.abortController=new AbortController,this.tickTimer=setInterval(()=>{this.tick()},this.tickIntervalMs))}stop(){this.tickTimer!==void 0&&(clearInterval(this.tickTimer),this.tickTimer=void 0),this.abortController.abort()}getSummary(t){return this.summaries.get(t)}async tick(){let t=Date.now(),n=this.registry.list().filter(o=>o.status==="running"),r=[];for(let o of n){let s=(this.jobIndexMap.get(o.jobId)??0)*See%this.intervalMs,a=this.intervalMs-1e3-s,l=this.lastRefreshedAt.get(o.jobId)??0;if(!(t-l<a)){if(this.callsThisSession>=this.maxCallsPerSession){W(`[BackgroundSummarizer] budget cap (${this.callsThisSession}/${this.maxCallsPerSession}) \u2014 skipping ${o.jobId}`);continue}this.callsThisSession++,r.push(o.jobId)}}await Promise.allSettled(r.map(o=>this.refreshJob(o,t)))}async refreshJob(t,n){let r=!1;try{let o=this.getTranscriptFn(t);if(o===void 0||o.trim().length===0)return;let i=this.maxInputTokens*4,s=o.length>i?o.slice(-i):o,l=`Transcript tail:
1959
1959
  <transcript>
1960
1960
  ${kee(s)}
1961
- </transcript>`;this.lastRefreshedAt.set(t,n);let c=await this.callLLM(l,this.abortController.signal);this.summaries.set(t,{text:c.trim(),refreshedAt:n,stale:!1}),r=!0}catch(o){if(W(`[BackgroundSummarizer] Haiku call failed for ${t}:`,o),!this.abortController.signal.aborted){let i=this.summaries.get(t);i!==void 0&&this.summaries.set(t,{...i,stale:!0})}}finally{r||this.callsThisSession--}}};ql();Sr();ks();oi();et();function LF(e,t){let n=new Map;return r=>{let o=t(r),i=n.get(o);if(i!==void 0)return i;let s=e(r);return n.set(o,s),s}}Kn();dr();J();Ie();function vv(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function jc(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(f.warning(`\u26A0 [resume-swap] ${t}: ${vv(r)}`))}async function NF(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(s){let a=s instanceof Error?s.message:String(s);return{ok:!1,reason:`buildSession failed: ${vv(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,s=>(r=vv(s instanceof Error?s.message:String(s)),!1))){await n.close().catch(a=>{jc(t.completionWriter,"new session close after init failure",a)});let s=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(f.warning(`\u26A0 ${s}`)),{ok:!1,reason:s}}await t.backgroundRegistry.cancelAll().catch(s=>{jc(t.completionWriter,"cancelAll failed",s)}),await t.sessionRef.current.close().catch(s=>{jc(t.completionWriter,"session close failed",s)}),t.sessionRef.current=n,e.stored?(Nm(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.permissionMode="default";try{t.onSwapped(e)}catch(s){jc(t.completionWriter,"onSwapped callback threw",s)}t.contextSampler.attach(n),await If(n).catch(s=>{jc(t.completionWriter,"autoRegisterPluginPassthroughs failed",s)});let i=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&i.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&i.push(ct(t.stats.totalCostUsd)),t.stats.totalTokens>0&&i.push(le(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(f.brand(i.join(" \xB7 "))),Bm(t.stats,t.completionWriter),t.statusLine.repaint(Qn(t.stats,t.contextSampler,t.gitStatusSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function BF(e){return new Ct(wr({model:e.model,surface:"cli",apiKey:Xe(e.model),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory}))}async function jF(e,t){let n=Date.now(),r=Zs(e),o=Qs(r),i=r?.stored?.model??e.model,s=Zi(i);if(s)throw new Error(s);let a,l,c;a=co(e.thinking)??Os(),l=uo(e.effort)??$s(),c=Fs(e.maxOutputTokens)??Zl();let d=Ls(),{prompt:u,source:m}=Ms(),p=Ot(),g=p.autoRouting?.interactive??!0,h=lm(u,g,"repl"),b={current:null},y=r?.stored?.sessionId,w=fo(y?{sessionLabel:y}:{}),v=Dt(),k=new ae({apiKey:v,parentModel:ze(),...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{},...w?.writer!==void 0?{traceWriter:w.writer}:{}});be(w?.writer,{phase:"bootstrap_start"});let S=new kp(w?{traceWriter:w.writer}:{});kO(S);let _=p.bgSummaries===!0&&v?new qf({registry:S,apiKey:v,maxCallsPerSession:p.maxSummaryCallsPerSession??200}):void 0;_?.start(),EO(_);let C=As(p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{}),j={get sessionId(){return b.current?.sessionId},getInputStreamRef(){return b.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return b.current?.abortSignal??new AbortController().signal},get hookRegistry(){return b.current?.hookRegistry}},P=ti({...t?.cwd!==void 0?{cwd:t.cwd}:{},pluginAgents:js()}),E=Cs(i,v,C,p.baseUrl,w?.writer,S,t?.cwd,Xe,"cli",_t(i),P,p.openaiBaseUrl),M=new zn({subagentManager:k,parentSession:j,surface:"cli",defaultConfig:{apiKey:v,systemPrompt:u,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{}},defaultSubagentModel:_t(i),childProviderFactory:C,childSkillExecutorFactory:E,backgroundRegistry:S,resolveApiKeyForModel:Xe,depth:0,...t?.cwd!==void 0?{cwd:t.cwd}:{},agentRegistry:P,parentModel:i,...w?.writer!==void 0?{traceWriter:w.writer}:{}}),N=new Jn({parentSession:j,surface:"cli",defaultModel:i,defaultSubagentModel:_t(i),apiKey:v,childProviderFactory:C,childSkillExecutorFactory:E,agentRegistry:P,backgroundRegistry:S,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{},resolveApiKeyForModel:Xe,...w?.writer!==void 0?{traceWriter:w.writer}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),L=new po({parentSession:j,defaultModel:i,defaultSubagentModel:_t(i),apiKey:v,resolveApiKeyForModel:Xe,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{},systemPrompt:u??"",surface:"cli",depth:0,...w?.writer!==void 0?{traceWriter:w.writer}:{}}),B=new mt,H;{let ke=t?.cwd??process.cwd(),gn=wn(Bt()).mcpConfigs.filter(ir=>ir.format==="json").map(ir=>ir.source),In=li({cwd:ke,...gn.length>0?{importedMcpConfigs:gn}:{},...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),ad=Object.values(In.mcpServers).filter(ir=>!ir.disabled).length;if(ad>0){let ir=In.sources.length===1?In.sources[0]:`${In.sources.length} source(s)`;console.log(f.dim(` mcp: ${ad} server(s) from ${ir??ai()}`));let YU=Date.now();be(w?.writer,{phase:"mcp_connect_start",metadata:{serverCount:ad}});try{H=await Cr.fromConfig(In.mcpServers,{warnings:In.warnings,...w?.writer!==void 0?{traceWriter:w.writer}:{}})}finally{be(w?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-YU,metadata:{serverCount:ad}})}}else if(In.warnings.length>0)for(let ir of In.warnings)console.warn(`[mcp] ${ir}`)}let $=H?.getMcpToolWireNames()??[],O=LF(ke=>Ns(e.provider,{subagentExecutor:M,skillExecutor:N,composeExecutor:L,memoryStore:B,model:ke!==void 0?ke:String(i),...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{},...H!==void 0?{mcpManager:H}:{}})??new nt({permissions:{allowedTools:am($)},subagentExecutor:M,skillExecutor:N,composeExecutor:L,memoryStore:B,surface:"cli",...H!==void 0?{mcpManager:H}:{}}),ke=>e.provider??oe(ke!==void 0?ke:String(i),p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:void 0)),F=O(String(i)),U=hm(i);r?.stored&&Nm(U,r.stored,r.resumeId);let Y=e.dangerouslySkipPermissions?"bypassPermissions":p.permissionMode;Y!==void 0&&(U.permissionMode=Y),e.thinkingUi!==void 0&&(U.thinkingUi=e.thinkingUi),U.cwd=t?.cwd??process.cwd(),w&&console.log(f.dim(` trace: ${w.tracePath}`));let ne={fn:ke=>console.log(ke),idleFn:ke=>console.log(ke)},te=new Fm,Z=FF(process.stdout,{statusLine:te}),K=zs(ke=>{gM(ne,ke)},"cli",B,()=>U.permissionMode,qs({cwd:t?.cwd}),{cwd:t?.cwd,...w?.writer!==void 0?{traceWriter:w.writer}:{}},()=>t?.cwd??process.cwd()),Ce=K.registry,Mt=K.pathApprovalGrantRef,vt={model:i,resumeConfig:o,systemPrompt:h,systemPromptSource:m,thinking:a,effort:l,maxOutputTokens:c,maxToolUseIterations:d,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},providerFactory:O,hookRegistry:Ce,traceWriter:w?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:p.autoResumeOnUsageLimit,...Y!==void 0?{permissionMode:Y}:{}};await Hs();let Qt=BF(vt);b.current=Qt,k.setOnSubagentSucceeded((ke,gn)=>{b.current?.recordSubagentCompletion(ke,gn)});let xe=new Kf,de=va(ne),$e=new Gf(Qt),Ve=new Lm({cwd:U.cwd??process.cwd(),branchTtlMs:1e3}),Pe={session:b,stats:U,out:de,ui:{clearScreen:()=>{let ke=Pe.getCompositor?.();ke?.setOverlay(""),ke?.resetCommittedBand(),te.stop(),$e.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),te.start(),te.repaint(Qn(U,$e,Ve))},repaintStatusLine:()=>te.repaint(Qn(U,$e,Ve))},ledger:xe,...H!==void 0?{mcpManager:H}:{}},Le=ke=>(xe.clear(),NF(ke,{sessionRef:b,stats:U,contextSampler:$e,gitStatusSampler:Ve,statusLine:te,backgroundRegistry:S,completionWriter:ne,isInFlight:()=>kt.getInFlight?.()??!1,onSwapped:gn=>{kt.resumeTarget=gn,kt.clearVerdictLedger?.(),kt.clearBgResultBuffer?.()},buildSession:gn=>BF({...vt,model:gn.stored?.model??vt.model,resumeConfig:Qs(gn),permissionMode:U.permissionMode})})),kt={session:b,memoryStore:B,stats:U,statusLine:te,contextSampler:$e,gitStatusSampler:Ve,completionWriter:ne,replRenderer:Z,slashCtx:Pe,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:S,subagentControl:M,..._!==void 0?{bgSummarizer:_}:{},requestResume:Le,getInFlight:()=>!1,...H!==void 0?{mcpManager:H}:{},suggestApiKey:v,...p.openaiBaseUrl!==void 0?{suggestBaseUrl:p.openaiBaseUrl}:{},...p.interactive?.suggestGhost!==void 0?{suggestGhostConfig:p.interactive.suggestGhost}:{},hookRegistry:K.registry},jk=ke=>{ne.fn(vD(ke,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},Hk=ke=>{ne.fn(SD(ke,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),xe.record(ke)};qC(jk),KC(Hk),kt.teardownTrustedSkillEvents=()=>{zC(jk),GC(Hk)},DF(),W_(F)?(AD(F),Mt.current=F,tM(F)):T.AFK_DISABLE_PATH_APPROVAL!=="1"&&console.warn("[path-approval] active provider does not implement GrantManager \u2014 path-approval elicitation and bash restricted-path checks will not fire.");let Lg=UF.createInterface({input:process.stdin,output:process.stdout,terminal:!1});kt.rl=Lg;let Ng={current:null};return kt.inputSurfaceRef=Ng,pt.install(Dm({readLine:ke=>new Promise((gn,In)=>{Lg.question(ke,gn),Lg.once("close",()=>In(new Error("readline closed")))}),writer:{line:(ke="")=>process.stdout.write(ke+`
1961
+ </transcript>`;this.lastRefreshedAt.set(t,n);let c=await this.callLLM(l,this.abortController.signal);this.summaries.set(t,{text:c.trim(),refreshedAt:n,stale:!1}),r=!0}catch(o){if(W(`[BackgroundSummarizer] Haiku call failed for ${t}:`,o),!this.abortController.signal.aborted){let i=this.summaries.get(t);i!==void 0&&this.summaries.set(t,{...i,stale:!0})}}finally{r||this.callsThisSession--}}};ql();Sr();ks();oi();et();function LF(e,t){let n=new Map;return r=>{let o=t(r),i=n.get(o);if(i!==void 0)return i;let s=e(r);return n.set(o,s),s}}Kn();dr();J();Ie();function vv(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function jc(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(f.warning(`\u26A0 [resume-swap] ${t}: ${vv(r)}`))}async function NF(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(s){let a=s instanceof Error?s.message:String(s);return{ok:!1,reason:`buildSession failed: ${vv(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,s=>(r=vv(s instanceof Error?s.message:String(s)),!1))){await n.close().catch(a=>{jc(t.completionWriter,"new session close after init failure",a)});let s=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(f.warning(`\u26A0 ${s}`)),{ok:!1,reason:s}}await t.backgroundRegistry.cancelAll().catch(s=>{jc(t.completionWriter,"cancelAll failed",s)}),await t.sessionRef.current.close().catch(s=>{jc(t.completionWriter,"session close failed",s)}),t.sessionRef.current=n,e.stored?(Nm(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.permissionMode="default";try{t.onSwapped(e)}catch(s){jc(t.completionWriter,"onSwapped callback threw",s)}t.contextSampler.attach(n),await If(n).catch(s=>{jc(t.completionWriter,"autoRegisterPluginPassthroughs failed",s)});let i=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&i.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&i.push(ct(t.stats.totalCostUsd)),t.stats.totalTokens>0&&i.push(le(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(f.brand(i.join(" \xB7 "))),Bm(t.stats,t.completionWriter),t.statusLine.repaint(Qn(t.stats,t.contextSampler,t.gitStatusSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function BF(e){return new Ct(wr({model:e.model,surface:"cli",apiKey:Xe(e.model),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.permissionMode!==void 0?{permissionMode:e.permissionMode}:{},...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.maxToolUseIterations!==void 0?{maxToolUseIterations:e.maxToolUseIterations}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},providerFactory:e.providerFactory}))}async function jF(e,t){let n=Date.now(),r=Zs(e),o=Qs(r),i=r?.stored?.model??e.model,s=Zi(i);if(s)throw new Error(s);let a,l,c;a=co(e.thinking)??Os(),l=uo(e.effort)??$s(),c=Fs(e.maxOutputTokens)??Zl();let d=Ls(),{prompt:u,source:m}=Ms(),p=Ot(),g=p.autoRouting?.interactive??!0,h=lm(u,g,"repl"),b={current:null},y=r?.stored?.sessionId,w=fo(y?{sessionLabel:y}:{}),v=Dt(),k=new ae({apiKey:v,parentModel:ze(),...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{},...w?.writer!==void 0?{traceWriter:w.writer}:{},surface:"cli"});be(w?.writer,{phase:"bootstrap_start"});let S=new kp(w?{traceWriter:w.writer}:{});kO(S);let _=p.bgSummaries===!0&&v?new qf({registry:S,apiKey:v,maxCallsPerSession:p.maxSummaryCallsPerSession??200}):void 0;_?.start(),EO(_);let C=As(p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{}),j={get sessionId(){return b.current?.sessionId},getInputStreamRef(){return b.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return b.current?.abortSignal??new AbortController().signal},get hookRegistry(){return b.current?.hookRegistry}},P=ti({...t?.cwd!==void 0?{cwd:t.cwd}:{},pluginAgents:js()}),E=Cs(i,v,C,p.baseUrl,w?.writer,S,t?.cwd,Xe,"cli",_t(i),P,p.openaiBaseUrl),M=new zn({subagentManager:k,parentSession:j,surface:"cli",defaultConfig:{apiKey:v,systemPrompt:u,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{}},defaultSubagentModel:_t(i),childProviderFactory:C,childSkillExecutorFactory:E,backgroundRegistry:S,resolveApiKeyForModel:Xe,depth:0,...t?.cwd!==void 0?{cwd:t.cwd}:{},agentRegistry:P,parentModel:i,...w?.writer!==void 0?{traceWriter:w.writer}:{}}),N=new Jn({parentSession:j,surface:"cli",defaultModel:i,defaultSubagentModel:_t(i),apiKey:v,childProviderFactory:C,childSkillExecutorFactory:E,agentRegistry:P,backgroundRegistry:S,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{},resolveApiKeyForModel:Xe,...w?.writer!==void 0?{traceWriter:w.writer}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),L=new po({parentSession:j,defaultModel:i,defaultSubagentModel:_t(i),apiKey:v,resolveApiKeyForModel:Xe,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{},systemPrompt:u??"",surface:"cli",depth:0,...w?.writer!==void 0?{traceWriter:w.writer}:{}}),B=new mt,H;{let ke=t?.cwd??process.cwd(),gn=wn(Bt()).mcpConfigs.filter(ir=>ir.format==="json").map(ir=>ir.source),In=li({cwd:ke,...gn.length>0?{importedMcpConfigs:gn}:{},...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),ad=Object.values(In.mcpServers).filter(ir=>!ir.disabled).length;if(ad>0){let ir=In.sources.length===1?In.sources[0]:`${In.sources.length} source(s)`;console.log(f.dim(` mcp: ${ad} server(s) from ${ir??ai()}`));let YU=Date.now();be(w?.writer,{phase:"mcp_connect_start",metadata:{serverCount:ad}});try{H=await Cr.fromConfig(In.mcpServers,{warnings:In.warnings,...w?.writer!==void 0?{traceWriter:w.writer}:{}})}finally{be(w?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-YU,metadata:{serverCount:ad}})}}else if(In.warnings.length>0)for(let ir of In.warnings)console.warn(`[mcp] ${ir}`)}let $=H?.getMcpToolWireNames()??[],O=LF(ke=>Ns(e.provider,{subagentExecutor:M,skillExecutor:N,composeExecutor:L,memoryStore:B,model:ke!==void 0?ke:String(i),...p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:{},...H!==void 0?{mcpManager:H}:{}})??new nt({permissions:{allowedTools:am($)},subagentExecutor:M,skillExecutor:N,composeExecutor:L,memoryStore:B,surface:"cli",...H!==void 0?{mcpManager:H}:{}}),ke=>e.provider??oe(ke!==void 0?ke:String(i),p.openaiBaseUrl!==void 0?{openaiBaseUrl:p.openaiBaseUrl}:void 0)),F=O(String(i)),U=hm(i);r?.stored&&Nm(U,r.stored,r.resumeId);let Y=e.dangerouslySkipPermissions?"bypassPermissions":p.permissionMode;Y!==void 0&&(U.permissionMode=Y),e.thinkingUi!==void 0&&(U.thinkingUi=e.thinkingUi),U.cwd=t?.cwd??process.cwd(),w&&console.log(f.dim(` trace: ${w.tracePath}`));let ne={fn:ke=>console.log(ke),idleFn:ke=>console.log(ke)},te=new Fm,Z=FF(process.stdout,{statusLine:te}),K=zs(ke=>{gM(ne,ke)},"cli",B,()=>U.permissionMode,qs({cwd:t?.cwd}),{cwd:t?.cwd,...w?.writer!==void 0?{traceWriter:w.writer}:{}},()=>t?.cwd??process.cwd()),Ce=K.registry,Mt=K.pathApprovalGrantRef,vt={model:i,resumeConfig:o,systemPrompt:h,systemPromptSource:m,thinking:a,effort:l,maxOutputTokens:c,maxToolUseIterations:d,...p.baseUrl!==void 0?{baseUrl:p.baseUrl}:{},providerFactory:O,hookRegistry:Ce,traceWriter:w?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:p.autoResumeOnUsageLimit,...Y!==void 0?{permissionMode:Y}:{}};await Hs();let Qt=BF(vt);b.current=Qt,k.setOnSubagentSucceeded((ke,gn)=>{b.current?.recordSubagentCompletion(ke,gn)});let xe=new Kf,de=va(ne),$e=new Gf(Qt),Ve=new Lm({cwd:U.cwd??process.cwd(),branchTtlMs:1e3}),Pe={session:b,stats:U,out:de,ui:{clearScreen:()=>{let ke=Pe.getCompositor?.();ke?.setOverlay(""),ke?.resetCommittedBand(),te.stop(),$e.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),te.start(),te.repaint(Qn(U,$e,Ve))},repaintStatusLine:()=>te.repaint(Qn(U,$e,Ve))},ledger:xe,...H!==void 0?{mcpManager:H}:{}},Le=ke=>(xe.clear(),NF(ke,{sessionRef:b,stats:U,contextSampler:$e,gitStatusSampler:Ve,statusLine:te,backgroundRegistry:S,completionWriter:ne,isInFlight:()=>kt.getInFlight?.()??!1,onSwapped:gn=>{kt.resumeTarget=gn,kt.clearVerdictLedger?.(),kt.clearBgResultBuffer?.()},buildSession:gn=>BF({...vt,model:gn.stored?.model??vt.model,resumeConfig:Qs(gn),permissionMode:U.permissionMode})})),kt={session:b,memoryStore:B,stats:U,statusLine:te,contextSampler:$e,gitStatusSampler:Ve,completionWriter:ne,replRenderer:Z,slashCtx:Pe,rl:null,options:e,...r!==void 0?{resumeTarget:r}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:S,subagentControl:M,..._!==void 0?{bgSummarizer:_}:{},requestResume:Le,getInFlight:()=>!1,...H!==void 0?{mcpManager:H}:{},suggestApiKey:v,...p.openaiBaseUrl!==void 0?{suggestBaseUrl:p.openaiBaseUrl}:{},...p.interactive?.suggestGhost!==void 0?{suggestGhostConfig:p.interactive.suggestGhost}:{},hookRegistry:K.registry},jk=ke=>{ne.fn(vD(ke,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},Hk=ke=>{ne.fn(SD(ke,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),xe.record(ke)};qC(jk),KC(Hk),kt.teardownTrustedSkillEvents=()=>{zC(jk),GC(Hk)},DF(),W_(F)?(AD(F),Mt.current=F,tM(F)):T.AFK_DISABLE_PATH_APPROVAL!=="1"&&console.warn("[path-approval] active provider does not implement GrantManager \u2014 path-approval elicitation and bash restricted-path checks will not fire.");let Lg=UF.createInterface({input:process.stdin,output:process.stdout,terminal:!1});kt.rl=Lg;let Ng={current:null};return kt.inputSurfaceRef=Ng,pt.install(Dm({readLine:ke=>new Promise((gn,In)=>{Lg.question(ke,gn),Lg.once("close",()=>In(new Error("readline closed")))}),writer:{line:(ke="")=>process.stdout.write(ke+`
1962
1962
  `)},pendingCount:()=>pt.pendingCount(),suspendInput:()=>Ng.current?.suspendForElicitation(),resumeInput:()=>Ng.current?.resumeAfterElicitation()})),Pe.requestResume=Le,be(w?.writer,{phase:"bootstrap_done",durationMs:Date.now()-n}),kt}Gr();G();import{promises as kv}from"node:fs";import*as WF from"node:path";async function HF(e,t,n=!1){await kv.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=WF.join(e,`${r}.md`),i=n?" (continued)":"";return await kv.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${i}
1963
1963
 
1964
1964
  - model: ${t}
@@ -2041,7 +2041,7 @@ ${t.partialOutput}`:"";return`Subagent failed \u2014 ${r}${o}`}let n=t.message?.
2041
2041
  ${k}${w}
2042
2042
  ${v}
2043
2043
  ${k}`})}return{fileBlocks:a,warnings:l}}async function hL(e,t,n,r,o="summary",i,s){let a=d$(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0);let l="",c=0,d=!1,u=!1,m=!1,p=!1,g,h=!1,b=!1,y={abort:null},w=0,v=3e3,k=[],S=new Map,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,_=()=>{let N=r.subagentControl;N?.hasPromotableForeground()&&N.promoteActiveForeground().then(L=>{for(let B of L)(i??{fn:console.log}).fn(f.dim(` \u2192 subagent backgrounded as ${B.jobId}: ${B.label}`))}).catch(()=>{})},C=r.getCompositor?r.getCompositor():null,j=()=>new Sa({out:va(i),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(N=>{Ke()&&console.error(" "+f.error("session.interrupt() failed:"),N)})},...r.subagentControl?{onBackground:_}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...C?{compositor:C}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),P=j(),E=async()=>{if(!m){m=!0;try{await P.dispose()}catch{}}},M=async()=>{await P.arm();let N=P.getCompositor();if(i&&N){let L=N;i.fn=B=>L.commitAbove(B),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(N),r.setInterruptNotifier?.(L=>P.setInterrupting(L)),r.rearmStatus?.()};try{C?C.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,t.interrupt().catch(O=>{Ke()&&console.error(" "+f.error("soft-stop session.interrupt() failed:"),O)});let I=r.subagentControl;I?.hasActiveForeground()&&I.cancelActiveForeground().catch(O=>{Ke()&&console.error(" "+f.error("soft-stop cancelActiveForeground() failed:"),O)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{b=!0,t.interrupt().catch(I=>{Ke()&&console.error(" "+f.error("pause-interrupt session.interrupt() failed:"),I)})}),await M(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(_);let{fileBlocks:N,warnings:L}=gL(e.text,{rootDir:process.cwd()});for(let I of L)(i??{fn:console.log}).fn(f.dim(` @-file: ${I}`));let B=N.length>0||e.attachments.length>0?mL(e.text,e.attachments,void 0,N):e.text,H=t.sendMessageStream(B);if(await cs((I,O)=>{P.process(I,O)},async()=>{for await(let I of H){if(h||b)break;if(I.type==="chunk"&&I.chunk.type==="content"?(l+=I.chunk.content,d=!0):I.type==="message"&&!d&&(l=I.message.content),I.type==="stream_retry"&&(l=l.slice(0,c)),I.type==="chunk"&&I.chunk.type==="tool_use_detail"){let O=I.chunk,F={toolName:O.toolName,toolUseId:O.toolUseId,input:O.toolInput,...O.toolInputRaw!==void 0&&{inputRaw:O.toolInputRaw}};S.set(O.toolUseId,F),k.push(F)}else if(I.type==="chunk"&&I.chunk.type==="tool_result"){let O=I.chunk;c=l.length;let F=S.get(O.toolUseId);if(F&&(F.result=O.content,F.isError=O.isError,S.delete(O.toolUseId)),r.onContextProgress){let U=Date.now();if(U-w>=v){w=U;try{let Y=r.onContextProgress();Y instanceof Promise&&await Y}catch(Y){Ke()&&console.error(" "+f.error("onContextProgress (status refresh) failed:"),Y)}}}}if(I.type==="paused"){if(r.setPausedState?.(!0),await E(),C&&I.autoResume===!0){let O=new AbortController;y.abort=O;let F=I.resetsAt?I.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,U=F?`Keep waiting \u2014 auto-resumes at ${F}`:"Keep waiting \u2014 auto-resume in progress",Y="Switch model / provider (type /model after)",ne="Stop waiting",te=[f.warning(" \u23F3 Usage limit reached.")+(F?f.dim(` Auto-resumes at ${F}.`):""),f.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];Yf(C,{header:te,options:[U,Y,ne],signal:O.signal,initialIndex:0}).then(Z=>{if(y.abort=null,!Z)return;let K=Z[0];K===void 0||K===U||(b=!0,K===Y&&(i??{fn:console.log}).fn(f.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(Ce=>{Ke()&&console.error(" "+f.error("picker pause-interrupt session.interrupt() failed:"),Ce)}))}).catch(Z=>{Ke()&&console.error(" "+f.error("picker promise rejected:"),Z)})}else(i??{fn:console.log}).fn(xE({reason:I.reason,...I.resetsAt!==void 0?{resetsAt:I.resetsAt}:{},...I.accountId!==void 0?{accountId:I.accountId}:{},...I.autoResume!==void 0?{autoResume:I.autoResume}:{}}));continue}if(I.type==="resumed"){r.setPausedState?.(!1),y.abort?.abort(),y.abort=null;let O=I.hotSwapped&&I.accountId?`\u25B6 Resumed on ${I.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,k.length=0,S.clear(),p=!1,g=void 0,u=!1,P=j(),m=!1,await M(),(i??{fn:console.log}).fn(f.success(O));continue}if(I.type==="error"){await E(),qi(Hi(I.error)),u=!0;continue}P.process(I),I.type==="done"&&(p=!0,g=I.metadata)}}),await E(),h){let I=i?i.fn:console.log;I(f.warning("\u23F8 Stopped \u2014 work so far kept.")+f.dim(" Send a message to continue.")),I("")}if(b){let I=i?i.fn:console.log;I(f.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),I("")}if(p&&!h&&!b){si(n,a,l,g,k),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),Pm(process.stdout);let I=F=>{i?i.fn(F):console.log(F)},O=uL(l);if(O){if(I(pL(O)),I(""),r.onTerminalState)try{r.onTerminalState(O)}catch{}if(n.permissionMode==="autonomous"){let F=O.kind==="done"&&Kd().verifyDone===!0&&!F0(k);N0(O,void 0,{unverified:F})}}if(Ete(g,n,I),r.onAfterTurn){let F=r.onAfterTurn();F instanceof Promise&&await F.catch(()=>{})}}}catch(N){await E(),u||qi(Hi(N))}finally{await E(),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),y.abort?.abort(),y.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function Ete(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ge(e.durationMs)),e.totalCostUsd!==void 0&&r.push(ct(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(le(o+i)+" tok"),r.length>0&&n(f.dim(" \u25E6 "+r.join(" \xB7 ")));let s=iS(t),a=Kt(t.model);if(s>=1){let l=Math.round((s-1)*a),c=Math.round(a/1e3);n(f.error(` context OVER ${c}k tok by ~${le(l)} tok \u2014 model output may be silently truncated`))}else if(s>.5){let l=s>.8?f.error:f.warning;n(l(` context ${Math.round(s*100)}% used of ${le(a)}`))}n("")}var Tte=5e3;async function xte(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 yL(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,p=null,g=[];e.session.current.waitForInitialization().then(async w=>{Ke()&&(p=Um(w)),await If(e.session.current),Ke()&&(g=dF())}).catch(()=>{});let h,b=!1,y=!1;for(;;){if(p&&(e.replRenderer.writeLine(p),e.replRenderer.writeLine(""),p=null),g.length>0){for(let E of g)e.replRenderer.writeLine(E);e.replRenderer.writeLine(""),g=[]}let w=u.drainNotifications();for(let{job:E,result:M}of w){let N=M.errorReason===void 0?"\u2713":"\u2717",L=M.errorReason==="abort"?"killed":M.errorReason==="timeout"?"timed out":M.errorReason==="signal-killed"?"killed by signal":`exit ${M.exitCode??0}`,B=Math.max(0,Math.round(M.durationMs/100)/10);e.replRenderer.writeLine(f.dim(` ${N} [${E.id}] ${L} \xB7 ${B}s \xB7 `)+E.command)}let v=m.drainNotifications();for(let{job:E}of v){let M=E.status==="completed"?"\u2713":E.status==="failed"?"\u2717":"\u2298",N=E.endedAt!==void 0?Math.max(0,Math.round((E.endedAt-E.startedAt)/100)/10):0,L=E.label.length>60?`${E.label.slice(0,60)}\u2026`:E.label;e.replRenderer.writeLine(f.dim(` ${M} [${E.jobId}] subagent ${E.status} \xB7 ${N}s \xB7 `)+L)}let k=l.renderIfChanged(e.stats.sessionId);if(k.length>0){for(let E of k)e.replRenderer.writeLine(E);e.replRenderer.writeLine("")}let S,A;if(h===void 0){let E=await e.session.current.takePendingPlanExitSeed();E!==void 0&&(h={text:E,attachments:[]})}if(h!==void 0){let E=h;h=void 0;let M=xa(e.stats.permissionMode),N=fi({buffer:E.text,promptText:M,isTTY:!!process.stdout.isTTY,attachmentSummary:ua([...E.attachments])});e.replRenderer.writeLine(N),S=E.text.trim(),A=E.attachments}else{let E=await o.readLine({promptFn:()=>xa(e.stats.permissionMode),onSigint:r,onShiftTab:()=>{Xf(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});S=E.text.trim(),A=E.attachments}if(!S&&A.length===0)continue;if(S.startsWith("!")){let E=/^(0|false|off|no)$/i.test(T.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!E&&(b||(b=!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 u.dispatch(S))){e.statusLine.rearm();continue}}let _=!1;if(S.startsWith("/")){let E=await A0(S,e.slashCtx,A);if(E.handled){if(E.result==="exit"){e.rl.close();return}if((S==="/clear"||S.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(f.dim(` transcript: ${t.path()}`)),d.reset()),E.result!==null&&typeof E.result=="object"&&"kind"in E.result&&E.result.kind==="submit"){h={text:E.result.message,attachments:A??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}_=!0}a.push(S),await xte(e,S);let C=S;if(_){let E=oS(S);if(E){let M=E.name.replace(/^\//,"").split(":").pop()??"";if(M&&av(M)){let N={skillName:M,rawArgs:E.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},L=e.session.current.sessionId,B=ki(L),H=Date.now();W(`[afk trace] preflight.start commandName=${M}`);let $=!1,I=await vi(N,{cwd:e.stats.cwd??process.cwd(),artifactDir:B},O=>{Ke()&&e.replRenderer.writeLine(f.warning(`\u26A0 preflight(${M}) failed: `)+(O instanceof Error?O.message:String(O)))});$=I!==null,W(`[afk trace] preflight.end commandName=${M} durationMs=${Date.now()-H} success=${$}`),C=cv(I?.manifestBlock,S)}}}let j=u.drainInjections();j.length>0&&(C=j+C);let P=m.drainInjections();if(P.length>0&&(C=P+C),e.hookRegistry)try{let E={event:"UserPromptSubmit",prompt:C,sessionId:e.stats.sessionId},M=await e.hookRegistry.dispatch(E);M.injectContext&&(C=M.injectContext+C)}catch(E){if(E instanceof he){e.replRenderer.writeLine(f.warning("\u2298 Turn blocked by hook")+(E.reason?f.dim(`: ${Wo(E.reason)}`):"")),e.statusLine.rearm();continue}if(E instanceof Dn){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 hL({text:C,attachments:A},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,M){if(await t.appendTurn(E,M),e.stats.sessionId)try{Yn(e.stats)}catch(N){y||(y=!0,e.replRenderer.writeLine(f.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(N instanceof Error?N.message:String(N))))}},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=>d?.push(E),setActiveCompositor:E=>{n.activeCompositor=E},setInterruptNotifier:E=>{n.notifyInterrupting=E},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:E=>o.setBackgroundHandler(E),setSoftStopHandler:i,setPausedState:E=>o.setPausedState(E),setPauseInterruptHandler:E=>o.setPauseInterruptHandler(E),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Qn(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:E=>c.repaint(E)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(xa(e.stats.permissionMode))),e.hookRegistry)try{await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId},void 0,Tte)}catch(E){if(E instanceof ut)throw E;E instanceof Dn?(W("[stop hook] handler timed out"),e.completionWriter.fn(f.dim(" [stop hook] timed out"))):E instanceof he?e.completionWriter.fn(f.dim(` [stop hook] blocked: ${Wo(E.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(E))}}}function Rte(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 bL(e,t,n,r){let o=await JF(),i=new Vf({rl:e.rl,history:o,statusLine:e.statusLine}),s=Rte(T.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await eL(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=dL(e,n),await yL(e,t,n,r,i,l,a,o)}finally{n.tryAbortShellForeground=null,a?.shellPassthrough.drainOnExit(),a?.bgResultNotifier.dispose(),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 i.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}il();gs();import{execFile as Ate}from"node:child_process";import{dirname as Cte,isAbsolute as _te,resolve as Ite}from"node:path";import{promisify as Pte}from"node:util";var wL=Pte(Ate),Mte=3e3,Ote=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function $te(){let t=(await wL("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=_te(t)?t:Ite(process.cwd(),t);return Cte(n)}async function SL(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await $te()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Mte)});try{let o=un({execFile:wL,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),i=await Promise.race([o,r]);if(i==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let s=i;return s.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:s.candidates.filter(c=>Ote.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}Dd();il();import{promises as Dte}from"node:fs";import{dirname as Fte,join as EL}from"node:path";import{randomBytes as Lte}from"node:crypto";var Nte=["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(`
2044
- `),vL=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Mv=30,Bte=1024,Ute=8e3,jte="haiku";async function Hte(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=qte(n,Bte),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Ute),s=t.signal?zte([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Qi({token:t.token,model:t.model??jte,system:Nte,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Wte(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Fte(t.worktreePath);return await Kte(l,c)}function Wte(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(vL.test(t)&&t.length<=Mv)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>Mv)break;o=s}return vL.test(o)?o:null}async function Kte(e,t){if(!await Gte(EL(t,e)))return e;let n=Lte(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Mv-5)}-${n}`}async function Gte(e){try{return await Dte.access(e),!0}catch{return!1}}function qte(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 zte(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 TL(e){let t,n,r=EL(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Hte(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ud(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return kL(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return kL(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function kL(e,t){e&&e.setCwd(t),Jte(t)}function Jte(e){try{process.chdir(e)}catch{}}Jt();Ut();G();import{spawn as RL}from"child_process";import{existsSync as AL,mkdirSync as Qte,readFileSync as CL,unlinkSync as xL,writeFileSync as ene}from"fs";import{get as tne}from"https";import{join as _L}from"path";import{readFileSync as Vte}from"fs";import{dirname as Yte,join as Xte}from"path";import{fileURLToPath as Zte}from"url";function $r(){try{return"5.25.5"}catch{}try{let e=Yte(Zte(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Vte(Xte(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}J();var nne=64*1024,rne=1440*60*1e3,one=3600*1e3,ine="update-check.json",sne="pending-update.json";function IL(){return _L(md(),ine)}function Kc(){return _L(md(),sne)}function PL(){let e=md();AL(e)||Qte(e,{recursive:!0})}function ane(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function lne(){try{let e=CL(IL(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function cne(){try{PL();let e=`
2044
+ `),vL=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Mv=30,Bte=1024,Ute=8e3,jte="haiku";async function Hte(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=qte(n,Bte),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Ute),s=t.signal?zte([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Qi({token:t.token,model:t.model??jte,system:Nte,user:r,maxTokens:32,signal:s})}catch(u){let m=u instanceof Error?u.message:String(u);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(i)}let l=Wte(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=Fte(t.worktreePath);return await Kte(l,c)}function Wte(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(vL.test(t)&&t.length<=Mv)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(i=>i.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let i=1;i<r.length;i++){let s=`${o}-${r[i]}`;if(s.length>Mv)break;o=s}return vL.test(o)?o:null}async function Kte(e,t){if(!await Gte(EL(t,e)))return e;let n=Lte(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Mv-5)}-${n}`}async function Gte(e){try{return await Dte.access(e),!0}catch{return!1}}function qte(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 zte(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 TL(e){let t,n,r=EL(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await Hte(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),i=t??"unknown",s=n;if(o!==null){let l=`${Ud(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return kL(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){i="create-failed",s=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return kL(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:i,...s!==void 0?{detail:s}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function kL(e,t){e&&e.setCwd(t),Jte(t)}function Jte(e){try{process.chdir(e)}catch{}}Jt();Ut();G();import{spawn as RL}from"child_process";import{existsSync as AL,mkdirSync as Qte,readFileSync as CL,unlinkSync as xL,writeFileSync as ene}from"fs";import{get as tne}from"https";import{join as _L}from"path";import{readFileSync as Vte}from"fs";import{dirname as Yte,join as Xte}from"path";import{fileURLToPath as Zte}from"url";function $r(){try{return"5.25.6"}catch{}try{let e=Yte(Zte(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(Vte(Xte(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}J();var nne=64*1024,rne=1440*60*1e3,one=3600*1e3,ine="update-check.json",sne="pending-update.json";function IL(){return _L(md(),ine)}function Kc(){return _L(md(),sne)}function PL(){let e=md();AL(e)||Qte(e,{recursive:!0})}function ane(e,t){let n=a=>a.split(/[-+]/,1)[0]??a,r=a=>a.includes("-"),o=n(e).split(".").map(Number),i=n(t).split(".").map(Number),s=Math.max(o.length,i.length);for(let a=0;a<s;a++){let l=o[a]??0,c=i[a]??0;if(c>l)return!0;if(c<l)return!1}return r(e)&&!r(t)}function lne(){try{let e=CL(IL(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function cne(){try{PL();let e=`
2045
2045
  const https = require('https');
2046
2046
  const fs = require('fs');
2047
2047
  const url = 'https://registry.npmjs.org/agent-afk/latest';
@@ -2082,7 +2082,7 @@ Run \`afk i\` then \`/resume\` to list saved sessions.
2082
2082
  ${Xr}.`))}catch(s){_i(s.message)}}),t.command("unset <key>").description("Remove an afk.config.json key").option("--json","Output JSON").action((r,o)=>{try{let i=Ku(r,{allowHumanOnly:!0});o.json?console.log(JSON.stringify({ok:!0,...i})):console.log(i.removed?f.success(`\u2713 removed ${i.path} \u2192 ${i.persistedTo}`):f.meta(`(${i.path} was not set)`))}catch(i){_i(i.message)}});let n=t.command("env").description("View or edit afk.env environment variables");n.command("get [key]").description("Read afk.env \u2014 one var or all present (secrets masked)").option("--all","Include every known var, not just those set").option("--json","Output JSON").action((r,o)=>{try{if(r){let i=Bu(r);o.json?console.log(JSON.stringify(i)):console.log(`${i.key} [${i.class}]: ${i.persisted??f.meta("(unset)")}`)}else{let i=Uu({all:o.all});if(o.json)console.log(JSON.stringify(i,null,2));else for(let s of i)console.log(`${s.key} [${s.class}]: ${s.persisted??f.meta("(unset)")}`)}}catch(i){_i(i.message)}}),n.command("set <key> [value]").description("Set an afk.env var. Secret vars are prompted (masked) unless --stdin is given.").option("--stdin","Read the value from stdin (for scripted secret entry)").option("--json","Output JSON").action(async(r,o,i)=>{try{let s=hs(r),a=o;if(s==="secret")i.stdin?a=UL():a=await Ra(`${r} (input hidden): `),o!==void 0&&console.error(f.warning(" note: positional value ignored for a secret var \u2014 use the prompt or --stdin"));else if(a===void 0)if(i.stdin)a=UL();else{_i(`${r} requires a value`);return}let l=Lu(r,a??"",{allowSecret:!0,allowProtected:!0});i.json?console.log(JSON.stringify({ok:!0,...l})):console.log(f.success(`\u2713 ${l.key} = ${l.display} \u2192 ${l.persistedTo}
2083
2083
  ${Xr}.`))}catch(s){_i(s.message)}}),n.command("unset <key>").description("Remove an afk.env var").option("--json","Output JSON").action((r,o)=>{try{let i=Nu(r,{allowSecret:!0,allowProtected:!0});o.json?console.log(JSON.stringify({ok:!0,...i})):console.log(i.removed?f.success(`\u2713 removed ${i.key} \u2192 ${i.persistedTo}`):f.meta(`(${i.key} was not set)`))}catch(i){_i(i.message)}})}J();import zne from"path";import Jne from"os";import{createServer as Pne}from"node:http";import{writeFileSync as Mne,unlinkSync as One,mkdirSync as $ne,readFileSync as Dne}from"node:fs";import{dirname as Fne,join as Lne}from"node:path";J();gs();import{mkdirSync as Tne,appendFileSync as xne}from"node:fs";import{dirname as Rne}from"node:path";import{execFile as Ane}from"node:child_process";import{promisify as Cne}from"node:util";import{randomUUID as _ne}from"node:crypto";import*as tN from"node-cron";var rg=class{_count=0;increment(){this._count++}decrement(){this._count>0&&this._count--}isIdle(){return this._count===0}count(){return this._count}};G();Ws();import{mkdirSync as Aa,readdirSync as Gc,readFileSync as Bv,renameSync as Lv,statSync as GL,unlinkSync as qc,writeFileSync as wne}from"node:fs";import{randomBytes as Nv}from"node:crypto";import{join as or}from"node:path";function qL(e,t={},n=gt()){Aa(n,{recursive:!0});let o=Gc(n).filter(p=>p.endsWith(".json")).length+1,i=`q-${Date.now()}-${Nv(3).toString("hex")}`,s=new Date().toISOString(),a={id:i,command:e,enqueuedAt:s,sequence:o,...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{}},c=`${String(o).padStart(4,"0")}-${i}.json`,d=or(n,c),u=Nv(4).toString("hex"),m=or(n,`.tmp-${u}.json`);try{wne(m,JSON.stringify(a),"utf-8"),Lv(m,d)}catch(p){try{qc(m)}catch{}throw p}return a}var HL="poison",WL=new Map,Sne=10;function zL(e=gt()){Aa(e,{recursive:!0});let t=Gc(e).filter(n=>n.endsWith(".json")&&!n.startsWith(".tmp-")).sort();for(let n of t){let r=or(e,n),o;try{o=Bv(r,"utf-8")}catch(s){KL(e,n,s);continue}let i;try{i=JSON.parse(o)}catch(s){KL(e,n,s);continue}return qc(r),i}return null}function KL(e,t,n){let r=Ze(t),o=n instanceof SyntaxError?"SyntaxError: invalid JSON":Ze(n instanceof Error?n.message:String(n)),i=or(e,HL),s=or(e,t);try{Aa(i,{recursive:!0});let a=or(i,t);try{Lv(s,a)}catch{a=or(i,`${Date.now()}-${Nv(3).toString("hex")}-${t}`),Lv(s,a)}console.error(`[daemon] pull-queue: quarantined malformed entry ${r} \u2192 ${HL}/ (${o})`)}catch(a){let l=Ze(a instanceof Error?a.message:String(a));console.error(`[daemon] pull-queue: failed to quarantine malformed entry ${r}; removing to unblock queue (${l})`);try{qc(s)}catch(c){let d=`${e}/${t}`,u=(WL.get(d)??0)+1;if(WL.set(d,u),u===1||u%Sne===0){let m=Ze(c instanceof Error?c.message:String(c));console.error(`[daemon] pull-queue: could not remove unquarantinable entry ${r}; will retry next tick (${m}) [seen ${u}x]`)}}}}function Uv(e=gt()){try{Aa(e,{recursive:!0})}catch{return[]}let t=Gc(e).filter(r=>r.endsWith(".json")&&!r.startsWith(".tmp-")).sort(),n=[];for(let r of t){let o=or(e,r);try{n.push(JSON.parse(Bv(o,"utf-8")))}catch(i){let s=Ze(r),a=i instanceof SyntaxError?"SyntaxError: invalid JSON":Ze(i instanceof Error?i.message:String(i));console.error(`[daemon] pull-queue: skipping unreadable entry ${s} in listPending (${a})`)}}return n}function JL(e=gt(),t){try{Aa(e,{recursive:!0})}catch{return!1}let n=Gc(e).filter(r=>r.endsWith(".json")&&!r.startsWith(".tmp-")).sort();for(let r of n){let o=or(e,r);try{if(GL(o).isDirectory())continue}catch{continue}let i;try{i=JSON.parse(Bv(o,"utf-8"))}catch{continue}if(i.id===t)return qc(o),!0}return!1}function VL(e=gt()){try{Aa(e,{recursive:!0})}catch{return 0}let t=Gc(e).filter(r=>r.endsWith(".json")&&!r.startsWith(".tmp-")).sort(),n=0;for(let r of t){let o=or(e,r);try{if(GL(o).isDirectory())continue}catch{continue}try{qc(o),n+=1}catch(i){let s=Ze(r),a=Ze(i instanceof Error?i.message:String(i));console.error(`[daemon] pull-queue: failed to remove entry ${s} in clearPending (${a})`)}}return n}G();Lw();Tn();dr();Ie();G();Ws();function YL(e){if(!e.taskId)throw new Error("ScheduledTask.taskId is required");if(!e.command)throw new Error(`task ${e.taskId}: command is required`);if((e.trigger==="cron"||e.trigger==="both")&&!e.cronExpression)throw new Error(`task ${e.taskId}: cronExpression required for trigger=${e.trigger}`);if(e.trigger==="pull"&&e.cronExpression!==void 0)throw new Error(`task ${e.taskId}: cronExpression must not be set when trigger='pull' \u2014 pull tasks are dequeued from the queue directory, not scheduled via cron`)}import{existsSync as vne,readFileSync as kne}from"node:fs";var XL=360*60*1e3;function Ene(e,t){if(!vne(t))return null;let n;try{n=kne(t,"utf-8")}catch{return null}let r=n.split(`
2084
2084
  `);for(let o=r.length-1;o>=0;o-=1){let i=r[o];if(i)try{let s=JSON.parse(i);if(s.taskId!==e||typeof s.triggeredAt!="string")continue;let a=Date.parse(s.triggeredAt);if(Number.isNaN(a))continue;return a}catch{continue}}return null}function ZL(e){let t=Ene(e.taskId,e.telemetryPath);if(t!==null&&e.cooldownMs>0){let n=e.nowMs-t;if(n<e.cooldownMs)return{fire:!1,skipReason:"cooldown",lastFiredAtMs:t,cooldownRemainingMs:e.cooldownMs-n}}return{fire:!0,...t!==null?{lastFiredAtMs:t}:{}}}var QL=Cne(Ane);async function Ine(e,t,n){if(n!==void 0&&n.length>0)return n;try{let o=(await e("git",["rev-parse","--show-toplevel"],{cwd:t})).stdout.trim();return o.length>0?o:null}catch{return null}}function eN(e){return`${e.replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"task"}-${_ne()}`}var og=class{registry=new Map;options;defaultCooldownMs;now;idleDetector=new rg;pullPollTimer;isDequeuing=!1;queueDir;constructor(t={}){this.options=t,this.defaultCooldownMs=t.cooldownMs??XL,this.now=t.now??Date.now,this.queueDir=t.queueDir??gt(),this.ensureTelemetrySink()}register(t){if(YL(t),this.registry.has(t.taskId))throw new Error(`task ${t.taskId} is already registered`);let n;(t.trigger==="cron"||t.trigger==="both")&&(n=tN.schedule(t.cronExpression,()=>{this.runOnce(t,"cron").catch(()=>{})},{name:t.taskId})),this.registry.set(t.taskId,{task:t,cronTask:n})}unregister(t){let n=this.registry.get(t);n&&(n.cronTask&&(Promise.resolve(n.cronTask.stop()).catch(()=>{}),Promise.resolve(n.cronTask.destroy()).catch(()=>{})),this.registry.delete(t))}list(){return Array.from(this.registry.values()).map(t=>t.task)}async tick(t){let n=this.registry.get(t);if(!n)throw new Error(`task ${t} is not registered`);return this.runOnce(n.task,"cron")}async fireOnStart(){let t=Array.from(this.registry.values()).map(r=>r.task).filter(r=>r.trigger==="sessionstart"||r.trigger==="both"),n=[];for(let r of t){let o=r.debounceMs??this.defaultCooldownMs,i=ZL({taskId:r.taskId,cooldownMs:o,nowMs:this.now(),telemetryPath:this.telemetryPath()});i.fire?n.push(await this.runOnce(r,"sessionstart")):n.push(this.recordSkip(r,i))}return n}async stop(){this.pullPollTimer!==void 0&&(clearInterval(this.pullPollTimer),this.pullPollTimer=void 0);for(let t of Array.from(this.registry.keys()))this.unregister(t)}startPullLoop(){if(this.pullPollTimer!==void 0)return;let t=this.options.pullPollIntervalMs;!t||t<=0||(this.pullPollTimer=setInterval(()=>{this.pullTick()},t).unref())}async pullTick(){if(this.idleDetector.isIdle()&&!this.isDequeuing){this.isDequeuing=!0;try{let t=zL(this.queueDir);if(t===null)return;let n={taskId:t.id,command:t.command,trigger:"pull",...t.notifyOn!==void 0?{notifyOn:t.notifyOn}:{}};await this.runOnce(n,"pull")}catch(t){let n=Ze(t instanceof Error?t.message:String(t));console.error(`[daemon] pull tick failed: ${n}`)}finally{this.isDequeuing=!1}}}async runOnce(t,n){if(t.command==="__BUILTIN_WORKTREE_PRUNE__")return this.runBuiltinWorktreePrune(t,n);let r=new Date(this.now()),o=this.now(),i={taskId:t.taskId,command:Ze(t.command),trigger:n,...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString()},s=null,a=null,l=null;this.idleDetector.increment();try{let c=await this.spawnSession(t.taskId);s=c.session,a=c.memoryStore,l=c.mcpManager??null;let d=await s.sendMessage(t.command),u=Ze(d.content),m={...i,durationMs:this.now()-o,status:"success",responseExcerpt:u.slice(0,280)};return this.writeTelemetry(m,t,{responseText:u}),m}catch(c){let d={...i,durationMs:this.now()-o,status:"error",errorMessage:Ze(c instanceof Error?c.message:String(c))};return this.writeTelemetry(d,t),d}finally{if(this.idleDetector.decrement(),s)try{await s.close()}catch{}if(l)try{await l.disconnectAll()}catch{}a?.close()}}recordSkip(t,n){let r=new Date(this.now()),o={taskId:t.taskId,command:t.command,trigger:"sessionstart",...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString(),durationMs:0,status:"skipped",...n.skipReason!==void 0?{skipReason:n.skipReason}:{}};return this.writeTelemetry(o,t),o}async runBuiltinWorktreePrune(t,n){let r=new Date(this.now()),o=this.now(),i={taskId:t.taskId,command:t.command,trigger:n,...t.cronExpression!==void 0?{cronExpression:t.cronExpression}:{},triggeredAt:r.toISOString()};try{let s=await Ine(QL,process.cwd(),T.AFK_WORKTREE_SWEEP_ROOT);if(s===null){let p={...i,durationMs:this.now()-o,status:"skipped",responseExcerpt:"worktree-prune skipped: daemon cwd is not inside a git repository (set AFK_WORKTREE_SWEEP_ROOT to target a repo)"};return this.writeTelemetry(p,t),p}let a=parseInt(T.AFK_WORKTREE_MAX_AGE_CLEAN??"",10)||14,l=parseInt(T.AFK_WORKTREE_MAX_AGE_DIRTY??"",10)||30,c=await un({execFile:QL,repoRoot:s,dryRun:!1,maxAgeDaysClean:a,maxAgeDaysDirty:l,scope:"all",telemetryPath:this.telemetryPath()}),d=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]),u=c.dryRun?`\u{1F50D} worktree-prune (dry-run): would remove ${c.candidates.filter(p=>d.has(p.verdict)).length} worktree(s)`:`\u2702\uFE0F worktree-prune: removed ${c.removed.length}, warned ${c.warnings.length}`,m={...i,durationMs:this.now()-o,status:"success",responseExcerpt:u};return this.writeTelemetry(m,t),m}catch(s){let a={...i,durationMs:this.now()-o,status:"error",errorMessage:Ze(s instanceof Error?s.message:String(s))};return this.writeTelemetry(a,t),a}}async spawnSession(t){let n=eN(t),r=this.options.sessionConfig?.cwd??process.cwd(),o=fo({sessionLabel:eN(t)}),{registry:i,memoryStore:s}=zs(void 0,"daemon",void 0,void 0,qs({cwd:r}),{cwd:r,sessionId:n,...o?.writer!==void 0?{traceWriter:o.writer}:{}}),a,l=wn(Bt()).mcpConfigs.filter(g=>g.format==="json").map(g=>g.source),c=li({cwd:r,...l.length>0?{importedMcpConfigs:l}:{}}),d=Object.values(c.mcpServers).filter(g=>!g.disabled).length;try{if(d>0){let g=Date.now();be(o?.writer,{phase:"mcp_connect_start",metadata:{serverCount:d}});try{a=await Cr.fromConfig(c.mcpServers,{warnings:c.warnings,...o?.writer!==void 0?{traceWriter:o.writer}:{}})}finally{be(o?.writer,{phase:"mcp_connect_done",durationMs:Date.now()-g,metadata:{serverCount:d}})}}else if(c.warnings.length>0)for(let g of c.warnings)console.warn(`[mcp] ${g}`)}catch(g){throw s.close(),g}let u=T.AFK_MAX_TOOL_USE_ITERATIONS,m=u!==void 0&&Number.isFinite(Number(u))&&Number(u)>0?Math.floor(Number(u)):void 0,p={model:"sonnet",permissionMode:"bypassPermissions",hookRegistry:i,isNonInteractive:!0,surface:"daemon",...o?{traceWriter:o.writer}:{},...a!==void 0?{mcpManager:a}:{},...m!==void 0?{maxToolUseIterations:m}:{},...this.options.sessionConfig};try{return{session:this.options.sessionFactory?this.options.sessionFactory(p):new Ct(wr(p)),memoryStore:s,...a!==void 0?{mcpManager:a}:{}}}catch(g){throw a&&await a.disconnectAll().catch(()=>{}),s.close(),g}}telemetryPath(){return this.options.telemetryPath??Fr()}ensureTelemetrySink(){try{Tne(Rne(this.telemetryPath()),{recursive:!0})}catch{}}writeTelemetry(t,n,r){try{xne(this.telemetryPath(),`${JSON.stringify(t)}
2085
- `,"utf-8"),this.fireOnTaskComplete(t,n,r)}catch(o){let i=o instanceof Error?o.message:String(o);console.error(`[daemon] telemetry write failed: ${i}`)}}fireOnTaskComplete(t,n,r){let o=this.options.onTaskComplete;if(o&&!(n!==void 0&&(n.notifyOn==="never"||n.notifyOn==="failure"&&t.status!=="error")))try{let i=o(t,r);i instanceof Promise&&i.catch(s=>{let a=s instanceof Error?s.message:String(s);console.error(`[daemon] onTaskComplete callback failed: ${a}`)})}catch(i){let s=i instanceof Error?i.message:String(i);console.error(`[daemon] onTaskComplete callback failed: ${s}`)}}};G();var Nne=7777,Bne="127.0.0.1";async function nN(e={}){let t=new og({...e.sessionConfig!==void 0?{sessionConfig:e.sessionConfig}:{},...e.telemetryPath!==void 0?{telemetryPath:e.telemetryPath}:{},...e.sessionFactory!==void 0?{sessionFactory:e.sessionFactory}:{},...e.cooldownMs!==void 0?{cooldownMs:e.cooldownMs}:{},...e.now!==void 0?{now:e.now}:{},...e.onTaskComplete!==void 0?{onTaskComplete:e.onTaskComplete}:{},...e.pullPollIntervalMs!==void 0?{pullPollIntervalMs:e.pullPollIntervalMs}:{},...e.queueDir!==void 0?{queueDir:e.queueDir}:{}});e.pullPollIntervalMs!==void 0&&e.pullPollIntervalMs>0&&t.startPullLoop();for(let a of e.tasks??[])t.register(a);let n=e.writePortFile!==!1,r=Lne(yd("default"),"port"),o=Pne((a,l)=>jne(a,l,t)),{port:i,address:s}=await Wne(o,e.port??Nne,e.host??Bne);if(n)try{$ne(Fne(r),{recursive:!0}),Mne(r,String(i),"utf-8")}catch{}return{port:i,host:s,scheduler:t,registerTask(a){t.register(a)},unregisterTask(a){t.unregister(a)},tickOnce(a){return t.tick(a)},fireOnStart(){return t.fireOnStart()},async stop(){if(await t.stop(),n)try{Dne(r,"utf-8").trim()===String(i)&&One(r)}catch{}await Kne(o)}}}function Une(e){return new Promise((t,n)=>{let r=[];e.on("data",o=>r.push(o)),e.on("end",()=>t(Buffer.concat(r).toString("utf-8"))),e.on("error",n)})}function jne(e,t,n){Hne(e,t,n).catch(r=>{let o=r instanceof Error?r.message:String(r);t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:o}))})}async function Hne(e,t,n){let r=e.url??"/";if(e.method==="GET"&&r==="/health"){let o=JSON.stringify({status:"ok",tasks:n.list().length});t.writeHead(200,{"Content-Type":"application/json"}),t.end(o);return}if(e.method==="GET"&&r==="/tasks"){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(n.list()));return}if(e.method==="POST"&&r==="/tasks"){let o=await Une(e),i;try{i=JSON.parse(o)}catch{t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"invalid JSON body"}));return}if(!i||typeof i!="object"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"body must be an object"}));return}let s=i,a=s.cron??s.cronExpression;if(typeof s.taskId!="string"||typeof s.command!="string"||typeof a!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId, command, and cron (or cronExpression) are required strings"}));return}let l={taskId:s.taskId,command:s.command,trigger:s.trigger??"cron",cronExpression:a,...s.notifyOn!==void 0?{notifyOn:s.notifyOn}:{}};try{n.register(l)}catch(c){let d=c instanceof Error?c.message:String(c),u=d.includes("already registered")?409:400;t.writeHead(u,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:d}));return}t.writeHead(201,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}if(e.method==="DELETE"&&r.startsWith("/tasks/")){let o=r.slice(7);if(!o){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId required in URL"}));return}if(!n.list().some(s=>s.taskId===o)){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}));return}n.unregister(o),t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}))}function Wne(e,t,n){return new Promise((r,o)=>{e.once("error",o),e.listen(t,n,()=>{e.removeListener("error",o);let i=e.address();r(typeof i=="object"&&i?{port:i.port,address:i.address}:{port:t,address:n})})})}function Kne(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}G();Kr();function rN(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<=0)throw new Error(`Invalid timeout-ms: '${n}' \u2014 must be a positive integer (milliseconds).`);return r}function oN(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<0)throw new Error(`Invalid sessionstart-cooldown-ms: '${n}' \u2014 must be a non-negative integer (milliseconds).`);return r}function iN(e,t){if(e!==void 0&&e!==""){if(e==="cron"||e==="sessionstart"||e==="both"||e==="pull")return e;throw new Error(`Invalid trigger: '${e}' \u2014 must be one of cron | sessionstart | both | pull.`)}return t!==void 0&&t!==""?"cron":"sessionstart"}var Gne="",jv="default";function To(e){if(e!==void 0&&e.trim()!=="")return e}function sN(e,t,n){return To(e)??To(t)??To(n)??Gne}function aN(e,t,n){return To(e)??To(t)??To(n)??jv}var qne="127.0.0.1";function lN(e,t){return To(e)??To(t)??qne}function cN(e){let t=e.trim().toLowerCase();return t==="127.0.0.1"||t==="localhost"||t==="::1"}Ut();Jt();Au();_s();Tn();qe();Gl();ql();Kn();Sr();ks();oi();sn();Tn();ln();function Vne(e){let t;return n=>{let r=new AbortController,o=ni(r.signal),i=new ae({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},parentModel:e.model,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),s=As(e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}),a=ti({...e.cwd!==void 0?{cwd:e.cwd}:{},pluginAgents:js()}),l=Cs(e.model,e.apiKey,s,e.baseUrl,void 0,void 0,e.cwd,Xe,"daemon",_t(e.model),a,e.openaiBaseUrl),c=new zn({subagentManager:i,parentSession:o,surface:"daemon",defaultConfig:{...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}},defaultSubagentModel:_t(e.model),childProviderFactory:s,childSkillExecutorFactory:l,resolveApiKeyForModel:Xe,depth:0,...e.cwd!==void 0?{cwd:e.cwd}:{},agentRegistry:a,parentModel:e.model}),d=new Jn({parentSession:o,surface:"daemon",defaultModel:e.model,defaultSubagentModel:_t(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},childProviderFactory:s,childSkillExecutorFactory:l,agentRegistry:a,resolveApiKeyForModel:Xe,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),u=new po({parentSession:o,defaultModel:e.model,defaultSubagentModel:_t(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},resolveApiKeyForModel:Xe,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},systemPrompt:"",surface:"daemon",depth:0});t??=new mt;let m=n.mcpManager,p=m?.getMcpToolWireNames()??[],g=Ns(void 0,{subagentExecutor:c,skillExecutor:d,composeExecutor:u,memoryStore:t,model:String(e.model),...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{},...m!==void 0?{mcpManager:m}:{}})??new nt({permissions:{allowedTools:[...$t,...jo,...at,"agent","skill","compose",...p]},subagentExecutor:c,skillExecutor:d,composeExecutor:u,memoryStore:t,surface:"daemon",...m!==void 0?{mcpManager:m}:{}}),h=n.maxToolUseIterations??Ls();return new Ct(wr({...n,provider:g,isNonInteractive:!0,surface:"daemon",...h!==void 0?{maxToolUseIterations:h}:{}}))}}function Yne(e,t={}){let n=e.status==="success"?"\u2705":e.status==="skipped"?"\u23ED\uFE0F":"\u274C",r=(e.durationMs/1e3).toFixed(1),o=[`${n} daemon task: ${e.taskId} (${e.status})`,`trigger=${e.trigger} duration=${r}s`];e.skipReason&&o.push(`skipReason=${e.skipReason}`),e.errorMessage&&o.push(`error: ${e.errorMessage.slice(0,400)}`);let i=t.responseText??e.responseExcerpt;return i&&o.push("",i),o.join(`
2085
+ `,"utf-8"),this.fireOnTaskComplete(t,n,r)}catch(o){let i=o instanceof Error?o.message:String(o);console.error(`[daemon] telemetry write failed: ${i}`)}}fireOnTaskComplete(t,n,r){let o=this.options.onTaskComplete;if(o&&!(n!==void 0&&(n.notifyOn==="never"||n.notifyOn==="failure"&&t.status!=="error")))try{let i=o(t,r);i instanceof Promise&&i.catch(s=>{let a=s instanceof Error?s.message:String(s);console.error(`[daemon] onTaskComplete callback failed: ${a}`)})}catch(i){let s=i instanceof Error?i.message:String(i);console.error(`[daemon] onTaskComplete callback failed: ${s}`)}}};G();var Nne=7777,Bne="127.0.0.1";async function nN(e={}){let t=new og({...e.sessionConfig!==void 0?{sessionConfig:e.sessionConfig}:{},...e.telemetryPath!==void 0?{telemetryPath:e.telemetryPath}:{},...e.sessionFactory!==void 0?{sessionFactory:e.sessionFactory}:{},...e.cooldownMs!==void 0?{cooldownMs:e.cooldownMs}:{},...e.now!==void 0?{now:e.now}:{},...e.onTaskComplete!==void 0?{onTaskComplete:e.onTaskComplete}:{},...e.pullPollIntervalMs!==void 0?{pullPollIntervalMs:e.pullPollIntervalMs}:{},...e.queueDir!==void 0?{queueDir:e.queueDir}:{}});e.pullPollIntervalMs!==void 0&&e.pullPollIntervalMs>0&&t.startPullLoop();for(let a of e.tasks??[])t.register(a);let n=e.writePortFile!==!1,r=Lne(yd("default"),"port"),o=Pne((a,l)=>jne(a,l,t)),{port:i,address:s}=await Wne(o,e.port??Nne,e.host??Bne);if(n)try{$ne(Fne(r),{recursive:!0}),Mne(r,String(i),"utf-8")}catch{}return{port:i,host:s,scheduler:t,registerTask(a){t.register(a)},unregisterTask(a){t.unregister(a)},tickOnce(a){return t.tick(a)},fireOnStart(){return t.fireOnStart()},async stop(){if(await t.stop(),n)try{Dne(r,"utf-8").trim()===String(i)&&One(r)}catch{}await Kne(o)}}}function Une(e){return new Promise((t,n)=>{let r=[];e.on("data",o=>r.push(o)),e.on("end",()=>t(Buffer.concat(r).toString("utf-8"))),e.on("error",n)})}function jne(e,t,n){Hne(e,t,n).catch(r=>{let o=r instanceof Error?r.message:String(r);t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:o}))})}async function Hne(e,t,n){let r=e.url??"/";if(e.method==="GET"&&r==="/health"){let o=JSON.stringify({status:"ok",tasks:n.list().length});t.writeHead(200,{"Content-Type":"application/json"}),t.end(o);return}if(e.method==="GET"&&r==="/tasks"){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify(n.list()));return}if(e.method==="POST"&&r==="/tasks"){let o=await Une(e),i;try{i=JSON.parse(o)}catch{t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"invalid JSON body"}));return}if(!i||typeof i!="object"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"body must be an object"}));return}let s=i,a=s.cron??s.cronExpression;if(typeof s.taskId!="string"||typeof s.command!="string"||typeof a!="string"){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId, command, and cron (or cronExpression) are required strings"}));return}let l={taskId:s.taskId,command:s.command,trigger:s.trigger??"cron",cronExpression:a,...s.notifyOn!==void 0?{notifyOn:s.notifyOn}:{}};try{n.register(l)}catch(c){let d=c instanceof Error?c.message:String(c),u=d.includes("already registered")?409:400;t.writeHead(u,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:d}));return}t.writeHead(201,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}if(e.method==="DELETE"&&r.startsWith("/tasks/")){let o=r.slice(7);if(!o){t.writeHead(400,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"taskId required in URL"}));return}if(!n.list().some(s=>s.taskId===o)){t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}));return}n.unregister(o),t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0}));return}t.writeHead(404,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:"not found"}))}function Wne(e,t,n){return new Promise((r,o)=>{e.once("error",o),e.listen(t,n,()=>{e.removeListener("error",o);let i=e.address();r(typeof i=="object"&&i?{port:i.port,address:i.address}:{port:t,address:n})})})}function Kne(e){return new Promise((t,n)=>{e.close(r=>{r?n(r):t()})})}G();Kr();function rN(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<=0)throw new Error(`Invalid timeout-ms: '${n}' \u2014 must be a positive integer (milliseconds).`);return r}function oN(e,t){let n=e??t;if(n===void 0||n==="")return;let r=Number(n);if(!Number.isFinite(r)||!Number.isInteger(r)||r<0)throw new Error(`Invalid sessionstart-cooldown-ms: '${n}' \u2014 must be a non-negative integer (milliseconds).`);return r}function iN(e,t){if(e!==void 0&&e!==""){if(e==="cron"||e==="sessionstart"||e==="both"||e==="pull")return e;throw new Error(`Invalid trigger: '${e}' \u2014 must be one of cron | sessionstart | both | pull.`)}return t!==void 0&&t!==""?"cron":"sessionstart"}var Gne="",jv="default";function To(e){if(e!==void 0&&e.trim()!=="")return e}function sN(e,t,n){return To(e)??To(t)??To(n)??Gne}function aN(e,t,n){return To(e)??To(t)??To(n)??jv}var qne="127.0.0.1";function lN(e,t){return To(e)??To(t)??qne}function cN(e){let t=e.trim().toLowerCase();return t==="127.0.0.1"||t==="localhost"||t==="::1"}Ut();Jt();Au();_s();Tn();qe();Gl();ql();Kn();Sr();ks();oi();sn();Tn();ln();function Vne(e){let t;return n=>{let r=new AbortController,o=ni(r.signal),i=new ae({...e.apiKey!==void 0?{apiKey:e.apiKey}:{},parentModel:e.model,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},surface:"daemon"}),s=As(e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}),a=ti({...e.cwd!==void 0?{cwd:e.cwd}:{},pluginAgents:js()}),l=Cs(e.model,e.apiKey,s,e.baseUrl,void 0,void 0,e.cwd,Xe,"daemon",_t(e.model),a,e.openaiBaseUrl),c=new zn({subagentManager:i,parentSession:o,surface:"daemon",defaultConfig:{...e.apiKey!==void 0?{apiKey:e.apiKey}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{}},defaultSubagentModel:_t(e.model),childProviderFactory:s,childSkillExecutorFactory:l,resolveApiKeyForModel:Xe,depth:0,...e.cwd!==void 0?{cwd:e.cwd}:{},agentRegistry:a,parentModel:e.model}),d=new Jn({parentSession:o,surface:"daemon",defaultModel:e.model,defaultSubagentModel:_t(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},childProviderFactory:s,childSkillExecutorFactory:l,agentRegistry:a,resolveApiKeyForModel:Xe,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{}}),u=new po({parentSession:o,defaultModel:e.model,defaultSubagentModel:_t(e.model),...e.apiKey!==void 0?{apiKey:e.apiKey}:{},resolveApiKeyForModel:Xe,...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},...e.cwd!==void 0?{cwd:e.cwd}:{},systemPrompt:"",surface:"daemon",depth:0});t??=new mt;let m=n.mcpManager,p=m?.getMcpToolWireNames()??[],g=Ns(void 0,{subagentExecutor:c,skillExecutor:d,composeExecutor:u,memoryStore:t,model:String(e.model),...e.openaiBaseUrl!==void 0?{openaiBaseUrl:e.openaiBaseUrl}:{},...m!==void 0?{mcpManager:m}:{}})??new nt({permissions:{allowedTools:[...$t,...jo,...at,"agent","skill","compose",...p]},subagentExecutor:c,skillExecutor:d,composeExecutor:u,memoryStore:t,surface:"daemon",...m!==void 0?{mcpManager:m}:{}}),h=n.maxToolUseIterations??Ls();return new Ct(wr({...n,provider:g,isNonInteractive:!0,surface:"daemon",...h!==void 0?{maxToolUseIterations:h}:{}}))}}function Yne(e,t={}){let n=e.status==="success"?"\u2705":e.status==="skipped"?"\u23ED\uFE0F":"\u274C",r=(e.durationMs/1e3).toFixed(1),o=[`${n} daemon task: ${e.taskId} (${e.status})`,`trigger=${e.trigger} duration=${r}s`];e.skipReason&&o.push(`skipReason=${e.skipReason}`),e.errorMessage&&o.push(`error: ${e.errorMessage.slice(0,400)}`);let i=t.responseText??e.responseExcerpt;return i&&o.push("",i),o.join(`
2086
2086
  `)}function dN(e){e.command("daemon").description("Run agent-afk as a daemon that fires scheduled tasks (e.g. /forge-friction --auto)").option("-p, --port <number>","Control HTTP port","7777").option("--host <address>","Bind address for the control HTTP surface. Overrides AFK_DAEMON_HOST. Defaults to 127.0.0.1 (loopback only). The control surface is UNAUTHENTICATED \u2014 bind a non-loopback address (e.g. 0.0.0.0) only on a trusted or firewalled network.").option("-t, --task <command>","Command to fire on each tick. Required for the cron and both triggers; optional otherwise.").option("-c, --cron <expression>",'Cron expression (e.g. "0 */6 * * *"). Required when --trigger includes cron.').option("-i, --task-id <id>",`Task identifier (default: ${jv})`).option("--once","Fire one tick and exit (for testing)",!1).option("--timeout-ms <ms>","Per-tick session timeout in ms. Overrides AFK_TIMEOUT_MS. Defaults to the session default (120000).").option("--thinking <mode>","Thinking mode: 'adaptive' | 'disabled' | 'enabled:<N>'").option("--effort <level>","Effort level: low|medium|high|xhigh|max").option("--trigger <mode>","Trigger mode: cron | sessionstart | both | pull. Defaults to 'cron' when --cron is set, else 'sessionstart'.").option("--sessionstart-cooldown-ms <ms>","Cooldown between Phase 6 sessionstart fires. Overrides AFK_SESSIONSTART_COOLDOWN_MS. Defaults to 6h.").option("--dump-prompt [path]",'Dump resolved SDK prompt+options+provenance to file (default: ~/.afk/logs/prompt-dump-<ISO>.json) or "stderr"').action(async t=>{let n=parseInt(t.port,10);(Number.isNaN(n)||n<=0)&&V(new Error(`Invalid port: ${t.port}`));let r=Ot(),o=sN(t.task,T.AFK_DAEMON_TASK,r.daemon?.task),i=aN(t.taskId,T.AFK_DAEMON_TASK_ID,r.daemon?.taskId),s=lN(t.host,T.AFK_DAEMON_HOST),a,l,c;try{a=rN(t.timeoutMs,T.AFK_TIMEOUT_MS),l=oN(t.sessionstartCooldownMs,T.AFK_SESSIONSTART_COOLDOWN_MS),c=iN(t.trigger,t.cron)}catch(P){V(P)}(c==="cron"||c==="both")&&!t.cron&&V(new Error(`--cron is required when --trigger is '${c}'.`)),(c==="cron"||c==="both")&&o.trim()===""&&V(new Error("A daemon task is required for the cron and both triggers. Provide one via --task, the AFK_DAEMON_TASK env var, or daemon.task in afk.config.json."));let d,u;try{d=co(t.thinking)??Os(),u=uo(t.effort)??$s()}catch(P){V(P)}let m=r.daemon?.worktreePrune,p=T.AFK_WORKTREE_PRUNE_DISABLE==="1",g=m?.cron??"0 4 * * *",h={taskId:"worktree-prune",command:"__BUILTIN_WORKTREE_PRUNE__",trigger:"cron",cronExpression:g},b=c==="pull"||o.trim()===""?[]:[{taskId:i,command:o,trigger:c,...t.cron!==void 0?{cronExpression:t.cron}:{}}];!p&&m?.enabled!==!1&&b.push(h);let y=dn();for(let P of y)P.enabled&&b.push(RR(P));if(t.dumpPrompt!==void 0&&t.dumpPrompt!==!1){let P=t.dumpPrompt===!0?zne.join(Jne.homedir(),".afk","logs",`prompt-dump-${new Date().toISOString().replace(/[:.]/g,"-")}.json`):t.dumpPrompt;process.env.AFK_DUMP_PROMPT=P}let w=0,v=6e4,k=(P,E)=>{let M=Date.now();if(M-w<v)return;w=M;let N=E instanceof Error?`${E.name}: ${E.message}`:String(E);On(`\u{1F6D1} agent-afk daemon ${P}
2087
2087
  ${N.slice(0,500)}`).catch(L=>{console.error("[daemon] crash notification push failed:",L instanceof Error?L.message:String(L))})};process.on("uncaughtException",P=>{k("uncaughtException",P),process.exit(1)}),process.on("unhandledRejection",P=>{k("unhandledRejection",P),process.exit(1)});let S=T.AFK_DAEMON_CWD,A=ze(),_=Dt(),C=S!==void 0&&S.length>0?S:void 0;await Hs();let j=Vne({model:A,..._!==void 0?{apiKey:_}:{},...r.baseUrl!==void 0?{baseUrl:r.baseUrl}:{},...r.openaiBaseUrl!==void 0?{openaiBaseUrl:r.openaiBaseUrl}:{},...C!==void 0?{cwd:C}:{}});try{let P=await nN({port:n,host:s,...t.once?{writePortFile:!1}:{},sessionConfig:{model:A,..._!==void 0?{apiKey:_}:{},...r.baseUrl!==void 0?{baseUrl:r.baseUrl}:{},...a!==void 0?{timeoutMs:a}:{},...d!==void 0?{thinking:d}:{},...u!==void 0?{effort:u}:{},...C!==void 0?{cwd:C}:{}},sessionFactory:j,...l!==void 0?{cooldownMs:l}:{},...c==="pull"?{pullPollIntervalMs:3e4,queueDir:gt()}:{},tasks:b,onTaskComplete:(M,N)=>{On(Yne(M,N),{markdown:!0}).catch(()=>{})}});if(t.once){console.log(f.info(`\u25B6 Firing task '${i}' once...`));let M=await P.tickOnce(i);console.log(JSON.stringify(M,null,2)),await P.stop(),process.exit(M.status==="success"?0:1)}if(c==="sessionstart"||c==="both"){let M=await P.fireOnStart();for(let N of M){let L=N.status==="success"?"\u2714":N.status==="skipped"?"\u23ED":"\u2717";console.log(f.info(`${L} sessionstart: ${JSON.stringify(N)}`))}}console.log(f.success(`\u2714 Daemon listening on http://${P.host}:${P.port}`)),cN(P.host)||console.log(f.warning(`\u26A0 Control surface bound to ${P.host} (non-loopback) and is UNAUTHENTICATED \u2014 anyone who can reach this port can schedule commands the daemon will run. Ensure the port is firewalled / on a trusted network.`)),c==="pull"?(console.log(f.success("\u2714 Daemon in pull mode")),console.log(f.dim(` polling queue: ${gt()} every 30s`))):console.log(f.dim(` task='${i}' command='${o}' trigger='${c}'${t.cron?` cron='${t.cron}'`:""}`)),b.length>1&&console.log(f.meta(` + built-in: worktree-prune (cron: ${g})`)),console.log(f.dim(" Press Ctrl+C to stop."));let E=async()=>{console.log(f.dim(`
2088
2088
  \xB7 Shutting down daemon...`)),await P.stop(),process.exit(0)};process.on("SIGINT",E),process.on("SIGTERM",E)}catch(P){V(P)}})}import{createInterface as Xne}from"node:readline/promises";import{mkdirSync as Zne}from"node:fs";import{join as Qne}from"node:path";G();function uN(e){let t=e.command("queue").description("Manage the pull-trigger task queue (used with `afk daemon --trigger pull`)");t.command("add <command>").description("Enqueue a command for the pull-trigger daemon to execute").option("--notify-on <mode>","When to send a notification: failure | always | never").action((n,r)=>{try{let o=gt();Zne(o,{recursive:!0});let i=r.notifyOn,s=qL(n,{notifyOn:i},o),a=String(s.sequence).padStart(4,"0"),l=Qne(o,`${a}-${s.id}.json`);console.log(f.success(`\u2714 Queued task #${a} (id: ${s.id})`)),console.log(f.dim(` command: ${n}`)),console.log(f.dim(` file: ${l}`))}catch(o){V(o)}}),t.command("list").description("List all pending queued tasks in FIFO order").action(()=>{try{let n=gt(),r=Uv(n);if(r.length===0){console.log(f.dim("No pending tasks in queue."));return}let o=`${"SEQ".padEnd(4)} ${"ID".padEnd(26)} ${"ENQUEUED".padEnd(24)} COMMAND`,i="\u2500".repeat(o.length);console.log(f.heading(o)),console.log(f.dim(i));for(let a of r){let l=String(a.sequence).padStart(4,"0"),c=a.id.padEnd(26).slice(0,26),d=a.enqueuedAt.padEnd(24).slice(0,24);console.log(`${l} ${c} ${d} ${a.command}`)}let s=r.length===1?"task":"tasks";console.log(f.dim(`