agent-afk 5.80.1 → 5.80.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +14 -14
- package/dist/index.mjs +40 -40
- package/dist/skills/mint/_phases/build.d.ts +2 -1
- package/dist/skills/mint/_phases/heal.d.ts +2 -1
- package/dist/skills/mint/_phases/parallelize-dispatch.d.ts +2 -1
- package/dist/skills/mint/_phases/plan.d.ts +2 -1
- package/dist/skills/mint/_phases/research.d.ts +2 -1
- package/dist/skills/mint/_phases/ship.d.ts +2 -1
- package/dist/skills/mint/_phases/spec.d.ts +2 -1
- package/dist/skills/mint/_phases/verify.d.ts +2 -1
- package/dist/telegram.mjs +103 -103
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -868,7 +868,7 @@ Remedy: these paths are outside the fork's granted read roots. Re-dispatch with
|
|
|
868
868
|
[results capped at 500 entries]`),{content:d}}catch(l){return l instanceof Error?"code"in l&&l.code==="ENOENT"?{content:`Path not found: ${a}`,isError:!0}:"code"in l&&l.code==="EACCES"?{content:`Permission denied: ${a}`,isError:!0}:{content:`Error scanning directory: ${l.message}`,isError:!0}:{content:"Unknown error scanning directory",isError:!0}}}}var o4,D_,F_=x(()=>{"use strict";Xn();o4=new Set(["node_modules",".git",".hg",".svn"]);D_=SS()});import{accessSync as l4,constants as c4}from"node:fs";function L_(e){try{l4(e,c4.X_OK);return}catch(t){let n=t instanceof Error?t.message:String(t);return`ripgrep binary is missing or not executable: ${e} (the @vscode/ripgrep platform optional-dependency for ${process.platform}-${process.arch} may not be installed \u2014 e.g. an install with --no-optional, an unsupported platform/arch, or a corrupted node_modules) \u2014 underlying: ${n}`}}var N_=x(()=>{"use strict"});import{spawn as d4}from"child_process";function u4(e,t,n){if(typeof e!="object"||e===null)throw new Error("Input must be an object");let r=e;if(typeof r.pattern!="string")throw new Error('Input must have a "pattern" field of type string');let o=typeof r.path=="string"?r.path:t?.resolveBase??t?.cwd??n??process.cwd(),i=an(o,t,"read"),s;if(r.include!==void 0){if(typeof r.include!="string")throw new Error("include must be a string");s=r.include}return{pattern:r.pattern,path:i,include:s}}function vS(e){return async(t,n,r)=>{let{pattern:o,path:i,include:s}=u4(t,r,e);if(n.aborted)return{content:"Search aborted",isError:!0};let a;try{({rgPath:a}=await import("@vscode/ripgrep"))}catch(l){return{content:`Failed to execute grep: ripgrep is unavailable \u2014 ${l instanceof Error?l.message:String(l)}`,isError:!0}}return new Promise(l=>{let c=!1;function d(k){c||(c=!0,n.removeEventListener("abort",S),l(k))}let u=["-n","--no-heading","--color=never","--hidden"];s&&u.push("-g",s),u.push("-g","!.git"),u.push("--",o,i);let m=r?.resolveBase??r?.cwd??e,f=d4(a,u,m!==void 0?{cwd:m}:{}),g="",h="",y=0,b=!1;function w(k){if(b||c||y<8e6)return;b=!0,console.warn(`[grep] overflow kill: stream=${k} totalBytes=${y} pattern=${o} path=${i}`),$e({event:"tool.overflow_kill",tool:"grep",total_bytes:y,stream:k}),f.kill("SIGKILL");let T=Vn((g+h).trimEnd()),A=Rr(T,1e5)+zp;d({content:A,truncated:!0})}f.stdout.on("data",k=>{let T=8e6-y,A=k.length<=T?k:k.subarray(0,Math.max(0,T));y+=A.length,g+=A.toString("utf8"),w("stdout")}),f.stderr.on("data",k=>{let T=8e6-y,A=k.length<=T?k:k.subarray(0,Math.max(0,T));y+=A.length,h+=A.toString("utf8"),w("stderr")});let S=()=>{f.kill(),d({content:"Search aborted",isError:!0})};n.addEventListener("abort",S),f.on("close",k=>{if(b)return;if(k===1){let D=`No matches found for '${o}' in ${i}`;d({content:D});return}if(k===2){let D=Ks(h.trim());d({content:`grep error: ${D.content}`,isError:!0,...D.truncated?{truncated:!0}:{}});return}let T=Vn(g.trimEnd()),A=Ks(T);d({content:A.content,...A.truncated?{truncated:!0}:{}})}),f.on("error",k=>{let T=L_(a);if(T!==void 0){d({content:`Failed to execute grep: ${T}`,isError:!0});return}let A;if(m===void 0&&Ic(k))try{A=Vs(k,process.cwd())}catch{A=`working directory does not exist (process cwd deleted \u2014 deleted worktree?) \u2014 underlying: ${k.message}`}else A=Vs(k,m);d({content:`Failed to execute grep: ${A}`,isError:!0})})})}}var B_,U_=x(()=>{"use strict";Jn();Xn();po();mS();N_();Gs();B_=vS()});import{promises as p4}from"fs";function kS(e){return(t,n,r)=>m4(t,n,r,e)}var m4,j_,H_=x(()=>{"use strict";Xn();m4=async(e,t,n,r)=>{if(!e||typeof e!="object")throw new Error("Invalid input: expected an object");let i=e.path;if(typeof i!="string")throw new Error("Invalid input: path must be a string");let s;try{s=an(i,n,"read",r)}catch(a){return{content:a instanceof Error?a.message:String(a),isError:!0}}try{let a=await p4.readdir(s,{withFileTypes:!0}),l=a.filter(m=>m.isDirectory()).map(m=>`${m.name}/`),c=a.filter(m=>!m.isDirectory()).map(m=>m.name);l.sort(),c.sort();let d=[...l,...c];return d.length===0?{content:"(empty directory)"}:{content:d.join(`
|
|
869
869
|
`)}}catch(a){if(a instanceof Error){let l=a;return l.code==="ENOENT"?{content:`Directory not found: ${s}`,isError:!0}:l.code==="ENOTDIR"?{content:`Not a directory: ${s}`,isError:!0}:l.code==="EACCES"?{content:`Permission denied: ${s}`,isError:!0}:{content:`Error listing directory: ${a.message}`,isError:!0}}return{content:"Unknown error listing directory",isError:!0}}};j_=kS()});function f4(e=Bs){return async(t,n)=>{if(!t||typeof t!="object")return{content:"Invalid input: expected an object",isError:!0};let r=t,o=r.message,i=r.chat;if(typeof o!="string")return{content:"Invalid input: message must be a string",isError:!0};if(i!==void 0&&typeof i!="number"&&typeof i!="string")return{content:"Invalid input: chat must be a number (chat id) or string (chat id or alias name)",isError:!0};if(o.length===0)return{content:"Invalid input: message must be non-empty",isError:!0};if(o.length>W_)return{content:`Invalid input: message exceeds Telegram's ${W_}-character limit (got ${o.length}). Split into multiple sends or trim before calling.`,isError:!0};let s=v.TELEGRAM_BOT_TOKEN;if(!s)return{content:"Telegram is not configured: TELEGRAM_BOT_TOKEN is not set. Run the bot setup wizard or export the env var before using send_telegram.",isError:!0};let a;if(i!==void 0){let c=Mp(i,Op());if(!c.ok)return{content:c.message,isError:!0};let d=Os(v.AFK_TELEGRAM_ALLOWED_CHAT_IDS);if(!kp(c.id,d)){let u=[...d];return{content:`Refusing to send: chat ${c.id} is not in the allowlist (AFK_TELEGRAM_ALLOWED_CHAT_IDS). `+(u.length>0?`Allowed chat id(s): ${u.join(", ")}. `:"The allowlist is empty or unset. ")+"Add the chat id to the allowlist before targeting it.",isError:!0}}a=[c.id]}else a=Ns();if(a.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 l=[];for(let c of a){let d=await e({token:s,chatId:c,text:o});d.ok||l.push(`chat ${c}: ${d.errorMessage??`HTTP ${d.status}`}`)}return l.length===a.length?{content:`Failed to send Telegram message to any chat. ${l.join("; ")}`,isError:!0}:l.length>0?{content:`Sent Telegram message to ${a.length-l.length}/${a.length} chat(s); ${l.length} failed: ${l.join("; ")}`}:{content:a.length===1?`Sent Telegram message to chat ${a[0]}.`:`Sent Telegram message to ${a.length} chats.`}}}var W_,K_,G_=x(()=>{"use strict";G();Tr();bc();Tp();W_=4096;K_=f4()});async function g4(){let[{JSDOM:e},{Readability:t},{default:n}]=await Promise.all([import("jsdom"),import("@mozilla/readability"),import("turndown")]),r=new n({headingStyle:"atx",codeBlockStyle:"fenced",bulletListMarker:"-"});return r.remove(["script","style","noscript","iframe"]),{JSDOM:e,Readability:t,turndown:r}}function h4(){return TS===null&&(TS=g4()),TS}function q_(e){return e.replace(/\n{3,}/g,`
|
|
870
870
|
|
|
871
|
-
`).trim()}function y4(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function z_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await h4(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=q_(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=q_(o.turndown(d));return{title:a,markdown:u,textLength:y4(c),usedFallback:!0}}var TS,J_=x(()=>{"use strict";TS=null});function w4(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 Y_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function S4(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 mm(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??w4,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(!b4.has(u.status)||d===o)return u;let m=S4(u,s)??Y_(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=Y_(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 b4,ES=x(()=>{"use strict";ye();b4=new Set([429,502,503,504])});import{readFileSync as v4}from"node:fs";import{join as k4}from"path";function T4(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function V_(e,t){return T4(t).test(e)}function R4(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(E4.has(t))return!0;if(x4.has(t))return!1}return!1}function X_(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function A4(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 Q_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return ec(t),t}function C4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function _4(e){try{return v4(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function I4(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=Q_(t.defaultProfile)),n}function Z_(e){let t=e?.env??v,n=e?.readFileSync??_4,r=e?.surface??t.AGENT_SURFACE,o=R4(t.AFK_BROWSER_HEADLESS,r),i=X_(t.AFK_BROWSER_ALLOWED_DOMAINS),s=X_(t.AFK_BROWSER_BLOCKED_DOMAINS),a=C4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=A4(t.AFK_BROWSER_BACKEND),c=Q_(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():k4(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=I4(d,g);return h.configPath=m,h}function xS(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(V_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>V_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var E4,x4,RS=x(()=>{"use strict";G();q();E4=new Set(["daemon","subagent","telegram","afk"]),x4=new Set(["repl","interactive","cli"])});import hi from"node:fs";import fm from"node:path";import{randomBytes as P4}from"node:crypto";import{chromium as M4}from"playwright";function O4(){try{return"5.80.1"}catch{}try{let e=fm.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var $4,gm,eI=x(()=>{"use strict";q();ye();$4=O4(),gm=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=M4.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/${$4}`}}loadStorageState(t){let n=tc(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.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=tc(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=fm.join(fm.dirname(r),`.${fm.basename(r)}.${process.pid}.${P4(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.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 D4}from"crypto";function AS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of F4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function tI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&L4.test(e.label))}function nI(e){return D4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function rI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var F4,L4,Oc=x(()=>{"use strict";F4=[{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}];L4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as N4}from"node:crypto";function B4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function U4(e,t,n){return`el_${N4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function j4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function oI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function sI(e,t){let n=e.role??"",r=e.name??"";iI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])sI(i,t)}async function H4(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},aI).catch(()=>[])}async function W4(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,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},aI).catch(()=>[])}function K4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function hm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=K4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=H4(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],sI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await W4(e)).filter(U=>iI.has(U.role??"")));let w=new Map;for(let $ of m){let U=oI($.name),j=w.get(U);(!j||j.bbox.w===0&&$.bbox.w>0)&&w.set(U,$)}let S=y.map($=>({ax:$,dom:w.get(oI($.name??""))})),k=r?S:S.filter($=>$.dom?$.dom.bbox.w>0||$.dom.bbox.h>0:!0);k.sort(($,U)=>{let j=$.dom?.bbox.y??0,O=U.dom?.bbox.y??0;if(j!==O)return j-O;let H=$.dom?.bbox.x??0,C=U.dom?.bbox.x??0;return H-C}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=k.slice(0,n).map(($,U)=>{let j=$.ax.role??"generic",O=$.ax.name??"",H=U4(j,O,U),C=$.dom?.bbox??{x:0,y:0,w:0,h:0},L=$.dom?.type??null,P=null;$.ax.value!==void 0&&$.ax.value!==null&&(P=String($.ax.value)),$.ax.checked!==void 0&&(P=String($.ax.checked)),tI({role:j,kind:L})&&(P="[redacted]");let M={disabled:$.ax.disabled??!1};$.ax.checked!==void 0&&(M.checked=$.ax.checked===!0||$.ax.checked==="mixed"),$.ax.selected!==void 0&&(M.selected=$.ax.selected),$.ax.expanded!==void 0&&(M.expanded=$.ax.expanded);let I;$.dom?.testId?I=`[data-testid="${$.dom.testId}"]`:$.dom?.id&&(I=`#${$.dom.id}`);let B={id:H,role:j,label:B4(O),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(B.selector=I),B}),D="idle";try{let $=await e.evaluate(()=>document.readyState);$==="loading"?D="loading":$==="interactive"?D="navigating":D="idle"}catch{D="navigating"}D!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=j4(f),F=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:F,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:D,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var iI,aI,lI=x(()=>{"use strict";Oc();iI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);aI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function cI(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 CS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>cI(e,i)))).filter(o=>o!==null)}async function G4(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 _S(e,t,n){switch(t.kind){case"element_id":return q4(e,t,n);case"selector":return z4(e,t);case"semantic":return J4(e,t)}}async function q4(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 CS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function z4(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 CS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function J4(e,t){return t.role!==void 0?Y4(e,t.text,t.role):V4(e,t.text,t)}async function Y4(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 CS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function V4(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 G4(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),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await cI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let k=0;k<w.length;k++)S=S*31+w.charCodeAt(k)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var dI=x(()=>{"use strict"});import{randomBytes as X4}from"crypto";import{mkdir as Q4,stat as Z4,writeFile as e8}from"fs/promises";import{join as IS}from"path";import{gzip as t8}from"zlib";import{promisify as n8}from"util";function r8(e){return IS(Xo(e),"browser")}function o8(e){return IS(r8(e),"screenshots")}function i8(){return new Date().toISOString().replace(/[:.]/g,"-")}function s8(){return X4(3).toString("hex")}async function PS(e,t,n){if(t.length>uI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${uI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=o8(e);await Q4(r,{recursive:!0});let o=`${i8()}-${s8()}-${n}.png`,i=IS(r,o);await e8(i,t);let{size:s}=await Z4(i);return{path:i,bytes:s}}var tRe,uI,pI=x(()=>{"use strict";q();Oc();tRe=n8(t8);uI=5*1024*1024});var fI={};Nu(fI,{PlaywrightProvider:()=>MS});function mI(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 MS,gI=x(()=>{"use strict";eI();lI();dI();RS();Oc();pI();MS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new gm(t)}async open(t){let n=xS(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 hm(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 hm(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 _S(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mI(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=AS(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(y){c=y}else c=h}let u=r.url();if(u!==i){let h=xS(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 f=await hm(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await _S(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mI(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 PS(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 PS(n,o,r);return i}catch{return null}}}});var bi={};Nu(bi,{__resetBrowserRegistryForTests:()=>u8,browserProviderActive:()=>c8,closeBrowserProvider:()=>OS,getBrowserProvider:()=>l8,peekBrowserProvider:()=>d8});function hI(){Promise.resolve(OS()).then(()=>{process.exit(130)})}function yI(){Promise.resolve(OS()).then(()=>{process.exit(143)})}function bI(){Qn=null}function a8(){ym||(process.on("SIGINT",hI),process.on("SIGTERM",yI),process.on("exit",bI),ym=!0)}function wI(){ym&&(process.removeListener("SIGINT",hI),process.removeListener("SIGTERM",yI),process.removeListener("exit",bI),ym=!1)}async function l8(e){return Qn!==null?Qn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(gI(),fI)),n=Z_(e),r=new t(n);return a8(),Qn=r,yi=null,r})()),yi)}async function OS(){if(Qn===null)return;let e=Qn;Qn=null,yi=null,wI(),await e.shutdown()}function c8(){return Qn!==null}function d8(){return Qn}function u8(){Qn=null,yi=null,wI()}var Qn,yi,ym,wi=x(()=>{"use strict";RS();Qn=null,yi=null,ym=!1});async function SI(e,t){try{return await z_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function y8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function vI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??y8,o=null,i=e,s=null,a=null;try{let c=await mm(n,e,{headers:h8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(g8.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(f8.test(d)&&!m8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await SI(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}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<200)&&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=await SI(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");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 m8,f8,g8,h8,kI=x(()=>{"use strict";J_();ES();ye();m8=/(text\/html|application\/xhtml\+xml)/i,f8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,g8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,h8={"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 S8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(b8,{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),w8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(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 TI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?S8({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 EI(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
871
|
+
`).trim()}function y4(e){return(e?.textContent??"").replace(/\s+/g," ").trim().length}async function z_(e,t){let{JSDOM:n,Readability:r,turndown:o}=await h4(),s=new n(e,{url:t}).window.document,a=(s.title??"").trim(),l=(()=>{try{let m=s.cloneNode(!0);return new r(m).parse()}catch{return null}})();if(l&&typeof l.content=="string"&&l.content.trim().length>0){let m=q_(o.turndown(l.content)),f=(l.title??"").trim()||a,g=typeof l.length=="number"&&l.length>0?l.length:(l.textContent??"").replace(/\s+/g," ").trim().length;return{title:f,markdown:m,textLength:g,usedFallback:!1}}let c=s.body,d=c?.innerHTML??"",u=q_(o.turndown(d));return{title:a,markdown:u,textLength:y4(c),usedFallback:!0}}var TS,J_=x(()=>{"use strict";TS=null});function w4(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 Y_(e,t,n){let r=Math.min(t*2**e,n);return Math.round(Math.random()*r)}function S4(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 mm(e,t,n={},r={}){let o=r.retries??3,i=r.baseDelayMs??500,s=r.maxDelayMs??1e4,a=r.sleep??w4,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(!b4.has(u.status)||d===o)return u;let m=S4(u,s)??Y_(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=Y_(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 b4,ES=x(()=>{"use strict";ye();b4=new Set([429,502,503,504])});import{readFileSync as v4}from"node:fs";import{join as k4}from"path";function T4(e){let n=e.replace(/[.+?()[\]{}/\\^$|]/g,"\\$&").replace(/\*/g,"[^.]*");return new RegExp(`^${n}$`,"i")}function V_(e,t){return T4(t).test(e)}function R4(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(E4.has(t))return!0;if(x4.has(t))return!1}return!1}function X_(e){return e===void 0||e.trim()===""?[]:e.split(",").map(t=>t.trim().toLowerCase()).filter(t=>t.length>0)}function A4(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 Q_(e){let t=e===void 0||e.trim()===""?"default":e.trim();return ec(t),t}function C4(e){if(e===void 0)return!1;let t=e.trim().toLowerCase();return t==="1"||t==="true"||t==="yes"}function _4(e){try{return v4(e,"utf8")}catch(t){if(t.code==="ENOENT")return;throw t}}function I4(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=Q_(t.defaultProfile)),n}function Z_(e){let t=e?.env??v,n=e?.readFileSync??_4,r=e?.surface??t.AGENT_SURFACE,o=R4(t.AFK_BROWSER_HEADLESS,r),i=X_(t.AFK_BROWSER_ALLOWED_DOMAINS),s=X_(t.AFK_BROWSER_BLOCKED_DOMAINS),a=C4(t.AFK_BROWSER_DOM_SNAPSHOTS),l=A4(t.AFK_BROWSER_BACKEND),c=Q_(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():k4(bn(),"browser.json"),f=n(m);if(f===void 0)return d;let g;try{g=JSON.parse(f)}catch(y){throw new Error(`Failed to parse browser config at ${m}: ${String(y)}`)}if(typeof g!="object"||g===null||Array.isArray(g))throw new Error(`Browser config at ${m} must be a JSON object`);let h=I4(d,g);return h.configPath=m,h}function xS(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(V_(n,r))return{allowed:!1,reason:`blocked by AFK_BROWSER_BLOCKED_DOMAINS: ${r}`};return t.allowedDomains.length>0&&!t.allowedDomains.some(o=>V_(n,o))?{allowed:!1,reason:"not in AFK_BROWSER_ALLOWED_DOMAINS"}:{allowed:!0}}var E4,x4,RS=x(()=>{"use strict";G();q();E4=new Set(["daemon","subagent","telegram","afk"]),x4=new Set(["repl","interactive","cli"])});import hi from"node:fs";import fm from"node:path";import{randomBytes as P4}from"node:crypto";import{chromium as M4}from"playwright";function O4(){try{return"5.80.2"}catch{}try{let e=fm.resolve(import.meta.dirname,"../../../package.json"),t=hi.readFileSync(e,"utf8"),n=JSON.parse(t);return typeof n.version=="string"?n.version:"unknown"}catch{return"unknown"}}var $4,gm,eI=x(()=>{"use strict";q();ye();$4=O4(),gm=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=M4.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/${$4}`}}loadStorageState(t){let n=tc(t);try{if(!hi.existsSync(n))return;let r=JSON.parse(hi.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=tc(t);if(!hi.existsSync(r))return;let o=await n.storageState(),i=fm.join(fm.dirname(r),`.${fm.basename(r)}.${process.pid}.${P4(4).toString("hex")}.tmp`);hi.writeFileSync(i,JSON.stringify(o),{mode:384}),hi.chmodSync(i,384),hi.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 D4}from"crypto";function AS(e){if(e.length===0)return e;let t=e;for(let{regex:n,name:r}of F4)r==="form-password"?t=t.replace(n,"password=[redacted]"):t=t.replace(n,"[redacted]");return t}function tI(e){return!!(e.role==="textbox"&&e.kind==="password"||e.label&&L4.test(e.label))}function nI(e){return D4("sha256").update(e,"utf8").digest("hex").slice(0,8)}function rI(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:t.slice(0,77)+"..."}var F4,L4,Oc=x(()=>{"use strict";F4=[{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}];L4=/password|secret|token|api[_-]?key|otp|2fa/i});import{createHash as N4}from"node:crypto";function B4(e){return e?e.replace(/\s+/g," ").trim().slice(0,200):""}function U4(e,t,n){return`el_${N4("sha256").update(`${e}:${t}:${n}`).digest("hex").slice(0,6)}`}function j4(e){let t=e.replace(/\s+/g," ").trim(),n=4e3;return t.length<=n?t:t.slice(0,n)+"\u2026[truncated]"}function oI(e){return e.replace(/\s+/g," ").trim().toLowerCase().slice(0,100)}function sI(e,t){let n=e.role??"",r=e.name??"";iI.has(n)&&(n!=="searchbox"&&n!=="spinbutton"||r!=="")&&t.push(e);for(let i of e.children??[])sI(i,t)}async function H4(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},aI).catch(()=>[])}async function W4(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,f=s==="input"?i.checked:void 0,g={role:c,name:l,disabled:m};u!==void 0&&(g.value=u),f!==void 0&&(g.checked=f),o.push(g)}return o},aI).catch(()=>[])}function K4(e){let n=e.accessibility;return n!==null&&typeof n=="object"?n:null}async function hm(e,t){let n=t.maxElements??80,r=t.includeHidden??!1,o=[],i=K4(e),s=i?i.snapshot({interestingOnly:!1}).catch(()=>null):Promise.resolve(null),a=H4(e),l=e.evaluate(()=>document.body?.innerText??"").catch(()=>""),c=Promise.resolve(e.url()),d=e.title().catch(()=>""),[u,m,f,g,h]=await Promise.all([s,a,l,c,d]),y,b=!1;u!==null?(y=[],sI(u,y)):(o.push("observation skipped accessibility tree (returned null)"),b=!0,y=(await W4(e)).filter(U=>iI.has(U.role??"")));let w=new Map;for(let $ of m){let U=oI($.name),j=w.get(U);(!j||j.bbox.w===0&&$.bbox.w>0)&&w.set(U,$)}let S=y.map($=>({ax:$,dom:w.get(oI($.name??""))})),k=r?S:S.filter($=>$.dom?$.dom.bbox.w>0||$.dom.bbox.h>0:!0);k.sort(($,U)=>{let j=$.dom?.bbox.y??0,O=U.dom?.bbox.y??0;if(j!==O)return j-O;let H=$.dom?.bbox.x??0,C=U.dom?.bbox.x??0;return H-C}),k.length>200&&o.push("page has 200+ interactive elements; consider scoping");let A=k.slice(0,n).map(($,U)=>{let j=$.ax.role??"generic",O=$.ax.name??"",H=U4(j,O,U),C=$.dom?.bbox??{x:0,y:0,w:0,h:0},L=$.dom?.type??null,P=null;$.ax.value!==void 0&&$.ax.value!==null&&(P=String($.ax.value)),$.ax.checked!==void 0&&(P=String($.ax.checked)),tI({role:j,kind:L})&&(P="[redacted]");let M={disabled:$.ax.disabled??!1};$.ax.checked!==void 0&&(M.checked=$.ax.checked===!0||$.ax.checked==="mixed"),$.ax.selected!==void 0&&(M.selected=$.ax.selected),$.ax.expanded!==void 0&&(M.expanded=$.ax.expanded);let I;$.dom?.testId?I=`[data-testid="${$.dom.testId}"]`:$.dom?.id&&(I=`#${$.dom.id}`);let B={id:H,role:j,label:B4(O),kind:L,value:P,state:M,bbox:C};return I!==void 0&&(B.selector=I),B}),D="idle";try{let $=await e.evaluate(()=>document.readyState);$==="loading"?D="loading":$==="interactive"?D="navigating":D="idle"}catch{D="navigating"}D!=="idle"&&o.push("page is still loading \u2014 observation may be incomplete"),b&&!o.includes("observation skipped accessibility tree (returned null)")&&o.push("observation skipped accessibility tree (returned null)");let R=j4(f),F=`obs_${t.observationCounter.toString(36)}`,_=new Date().toISOString();return{observationId:F,url:g,title:h,textSummary:R,interactive:A,status:{httpStatus:t.httpStatus??null,loadingState:D,hasDialog:t.hasDialog??!1,consoleErrors:t.consoleErrors??0},warnings:o,screenshotPath:t.screenshotPath??null,capturedAt:_}}var iI,aI,lI=x(()=>{"use strict";Oc();iI=new Set(["button","link","textbox","combobox","checkbox","radio","tab","menuitem","menuitemcheckbox","menuitemradio","switch","option","searchbox","spinbutton"]);aI="a[href], button, input, select, textarea, [role], [tabindex], label"});async function cI(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 CS(e,t){let n=Math.min(t,5);return(await Promise.all(Array.from({length:n},(o,i)=>cI(e,i)))).filter(o=>o!==null)}async function G4(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 _S(e,t,n){switch(t.kind){case"element_id":return q4(e,t,n);case"selector":return z4(e,t);case"semantic":return J4(e,t)}}async function q4(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 CS(o,i);return{outcome:"ambiguous_target",query:{text:r.label,role:r.role},candidates:s}}async function z4(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 CS(n,r);return{outcome:"ambiguous_target",query:{text:`[selector: ${t.selector}]`},candidates:o}}async function J4(e,t){return t.role!==void 0?Y4(e,t.text,t.role):V4(e,t.text,t)}async function Y4(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 CS(r,o);return{outcome:"ambiguous_target",query:{text:t,role:n},candidates:i}}async function V4(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 G4(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),f=[];for(let h=0;h<m.length;h++){let y=m[h];if(y===void 0)continue;let b=await cI(y.locator,y.index);if(b!==null){let w=`${b.role}:${b.label}:${h}`,S=0;for(let k=0;k<w.length;k++)S=S*31+w.charCodeAt(k)>>>0;f.push({...b,id:`el_${S.toString(16).padStart(6,"0").slice(0,6)}`})}}return{outcome:"ambiguous_target",query:{text:t},candidates:f}}var dI=x(()=>{"use strict"});import{randomBytes as X4}from"crypto";import{mkdir as Q4,stat as Z4,writeFile as e8}from"fs/promises";import{join as IS}from"path";import{gzip as t8}from"zlib";import{promisify as n8}from"util";function r8(e){return IS(Xo(e),"browser")}function o8(e){return IS(r8(e),"screenshots")}function i8(){return new Date().toISOString().replace(/[:.]/g,"-")}function s8(){return X4(3).toString("hex")}async function PS(e,t,n){if(t.length>uI)throw new Error(`writeScreenshotSidecar: buffer exceeds ${uI} byte cap (received ${t.length} bytes). Refusing to write oversized screenshot.`);let r=o8(e);await Q4(r,{recursive:!0});let o=`${i8()}-${s8()}-${n}.png`,i=IS(r,o);await e8(i,t);let{size:s}=await Z4(i);return{path:i,bytes:s}}var tRe,uI,pI=x(()=>{"use strict";q();Oc();tRe=n8(t8);uI=5*1024*1024});var fI={};Nu(fI,{PlaywrightProvider:()=>MS});function mI(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 MS,gI=x(()=>{"use strict";eI();lI();dI();RS();Oc();pI();MS=class{name="playwright";config;launcher;sessions=new Map;constructor(t){this.config=t,this.launcher=new gm(t)}async open(t){let n=xS(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 hm(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 hm(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 _S(r,t.target,o.knownElements);if(a.outcome==="not_found")throw new Error(`browser_act: target not found: ${mI(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=AS(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(y){c=y}else c=h}let u=r.url();if(u!==i){let h=xS(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 f=await hm(r,{observationCounter:o.observationCounter,screenshotPath:m,consoleErrors:this.launcher.getConsoleErrorCount(n),httpStatus:this.launcher.getLastHttpStatus(n),hasDialog:this.launcher.hasOpenDialog(n)}),g=`browser_act:${t.action}`;if(this.updateSessionFromObservation(o,f.interactive,f.url,f.title,g),c!==null)throw c;return f}async render(t){return this.launcher.renderHtml(t.url,{timeoutMs:t.timeoutMs??3e4,waitUntil:t.waitFor??"load",signal:t.signal})}async screenshot(t){let{sessionId:n}=t,r=this.launcher.getPage(n);if(r===void 0)throw new Error(`browser_screenshot: no page open for session ${n}`);let o=this.ensureSessionState(n),i;if(t.target!==void 0){let d=await _S(r,t.target,o.knownElements);if(d.outcome==="not_found")throw new Error(`browser_screenshot: target not found: ${mI(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 PS(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 PS(n,o,r);return i}catch{return null}}}});var bi={};Nu(bi,{__resetBrowserRegistryForTests:()=>u8,browserProviderActive:()=>c8,closeBrowserProvider:()=>OS,getBrowserProvider:()=>l8,peekBrowserProvider:()=>d8});function hI(){Promise.resolve(OS()).then(()=>{process.exit(130)})}function yI(){Promise.resolve(OS()).then(()=>{process.exit(143)})}function bI(){Qn=null}function a8(){ym||(process.on("SIGINT",hI),process.on("SIGTERM",yI),process.on("exit",bI),ym=!0)}function wI(){ym&&(process.removeListener("SIGINT",hI),process.removeListener("SIGTERM",yI),process.removeListener("exit",bI),ym=!1)}async function l8(e){return Qn!==null?Qn:(yi!==null||(yi=(async()=>{let{PlaywrightProvider:t}=await Promise.resolve().then(()=>(gI(),fI)),n=Z_(e),r=new t(n);return a8(),Qn=r,yi=null,r})()),yi)}async function OS(){if(Qn===null)return;let e=Qn;Qn=null,yi=null,wI(),await e.shutdown()}function c8(){return Qn!==null}function d8(){return Qn}function u8(){Qn=null,yi=null,wI()}var Qn,yi,ym,wi=x(()=>{"use strict";RS();Qn=null,yi=null,ym=!1});async function SI(e,t){try{return await z_(e,t)}catch(n){return W("[web/scrape] extraction failed",{url:t,err:n}),{title:"",markdown:"",textLength:0,usedFallback:!0}}}async function y8(e,t){let{getBrowserProvider:n}=await Promise.resolve().then(()=>(wi(),bi));return(await n()).render({url:e,timeoutMs:t.timeoutMs,signal:t.signal})}async function vI(e,t){let n=t.fetchFn??globalThis.fetch,r=t.renderFn??y8,o=null,i=e,s=null,a=null;try{let c=await mm(n,e,{headers:h8,redirect:"follow",signal:t.signal});s=c.status,i=c.url||e;let d=c.headers.get("content-type")??"";if(c.ok){if(g8.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(f8.test(d)&&!m8.test(d))return{title:"",markdown:u.trim(),finalUrl:i,usedRender:!1};if(o=await SI(u,i),t.signal.aborted)throw t.signal.reason??new Error("aborted")}}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<200)&&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=await SI(c.html,c.finalUrl);if(t.signal.aborted)throw t.signal.reason??new Error("aborted");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 m8,f8,g8,h8,kI=x(()=>{"use strict";J_();ES();ye();m8=/(text\/html|application\/xhtml\+xml)/i,f8=/(application\/json|\/xml|\+xml|text\/|application\/(java|ecma)script|csv)/i,g8=/(image\/|audio\/|video\/|application\/pdf|application\/zip|application\/octet-stream|font\/)/i,h8={"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 S8(e){let t=e.fetchFn??globalThis.fetch;return{name:"exa",async search(n,{limit:r,signal:o}){let i=await t(b8,{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),w8),contents:{highlights:{numSentences:3,highlightsPerUrl:1}}}),signal:o});if(!i.ok){let l="";try{let d=await i.text(),u=_r(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 TI(e){return e.exaApiKey!==void 0&&e.exaApiKey.trim()!==""?S8({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 EI(e,t){if(t.length===0)return`# Search results for "${e}"
|
|
872
872
|
|
|
873
873
|
(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(`
|
|
874
874
|
`).trimEnd()}var b8,w8,xI=x(()=>{"use strict";po();b8="https://api.exa.ai/search",w8=10});function A8(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=v8;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,k8)}let a=T8;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,E8)}return{mode:r,url:o,query:i,timeoutMs:s,maxBytes:a}}function $S(e,t){return Buffer.byteLength(e,"utf8")<=t?{content:e,truncated:!1}:{content:Rr(e,t),truncated:!0}}function C8(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 R8.some(o=>r.includes(o))}function _8(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=A8(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 mm(t,i.url,{method:"GET",headers:{"User-Agent":"agent-afk/web_scrape",Accept:"*/*"},signal:s.signal})}catch(g){return s.signal.aborted?{content:`web_scrape aborted: ${c()}`,isError:!0}:{content:`web_scrape network error: ${g instanceof Error?g.message:String(g)}`,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(g){return{content:`web_scrape read error: ${g instanceof Error?g.message:String(g)}`,isError:!0}}let f=$S(m,i.maxBytes);return{content:f.content,...f.truncated?{truncated:!0}:{}}}if(i.mode==="markdown")try{let u=await vI(i.url,{fetchFn:t,renderFn:e.renderFn,timeoutMs:i.timeoutMs,signal:s.signal});if(u.markdown.trim().length===0)return{content:`web_scrape extracted no readable content from ${i.url}.`,isError:!0};let m=$S(u.markdown,i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}catch(u){if(s.signal.aborted)return{content:`web_scrape aborted: ${c()}`,isError:!0};let m=u instanceof Error?u.message:String(u),f=C8(u)?" (the render fallback needs the optional Playwright browser \u2014 run `pnpm exec playwright install chromium`)":"";return{content:`web_scrape markdown error: ${m}${f}`,isError:!0}}let d=TI({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:x8,timeoutMs:i.timeoutMs,signal:s.signal}),m=$S(EI(i.query,u),i.maxBytes);return{content:m.content,...m.truncated?{truncated:!0}:{}}}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 v8,k8,T8,E8,x8,R8,RI,AI=x(()=>{"use strict";kI();xI();ES();Gs();v8=3e4,k8=12e4,T8=1e5,E8=1e6,x8=10,R8=["Cannot find package","ERR_MODULE_NOT_FOUND","Executable doesn't exist"];RI=_8()});import{existsSync as _I,mkdirSync as I8,readFileSync as P8,renameSync as M8,unlinkSync as O8,writeFileSync as $8}from"node:fs";import{dirname as CI,join as D8}from"node:path";import{randomBytes as F8}from"node:crypto";function ln(e){let t=e??Ib();if(!_I(t))return[];try{let n=P8(t,"utf-8");return JSON.parse(n)}catch(n){let r=n instanceof Error?n.message:String(n);return console.error(`[schedule-store] failed to parse ${t}: ${r}`),[]}}function Si(e,t){let n=t??Ib();I8(CI(n),{recursive:!0});let r=D8(CI(n),`.schedules.json.${process.pid}.${F8(4).toString("hex")}.tmp`),o=JSON.stringify(e,null,2);try{$8(r,o,"utf-8"),M8(r,n)}catch(i){try{_I(r)&&O8(r)}catch{}throw i}}function bm(e,t){let n=ln(t),r=n.map(l=>l.id),o=L8(e.name),i=N8(o,r),s=new Date().toISOString(),a={...e,notifyOn:e.notifyOn??"failure",id:i,createdAt:s,updatedAt:s};return n.push(a),Si(n,t),a}function wm(e,t){let n=ln(t),r=n.length,o=n.filter(i=>i.id!==e);return o.length===r?!1:(Si(o,t),!0)}function $c(e,t){return ln(t).find(n=>n.id===e)}function L8(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}function N8(e,t){if(!t.includes(e))return e;let n=2;for(;t.includes(`${e}-${n}`);)n+=1;return`${e}-${n}`}function II(e){return{taskId:e.id,command:e.command,trigger:e.trigger??"cron",...e.cron!==void 0?{cronExpression:e.cron}:{},...e.notifyOn!==void 0?{notifyOn:e.notifyOn}:{},...e.notifyChat!==void 0?{notifyChat:e.notifyChat}:{}}}var Sm=x(()=>{"use strict";q()});import{existsSync as B8,readFileSync as U8}from"node:fs";import{join as j8}from"node:path";async function xn(e,t,n){let r;try{let o=j8(zu("default"),"port");if(!B8(o))return{synced:!1,detail:"daemon-not-detected (no port file)"};let i=U8(o,"utf-8").trim();if(r=parseInt(i,10),Number.isNaN(r))return{synced:!1,detail:"daemon-not-detected (invalid port file)"}}catch{return{synced:!1,detail:"daemon-not-detected (unreadable port file)"}}try{let o=await fetch(`http://localhost:${r}${t}`,{method:e,headers:{"Content-Type":"application/json"},body:n!==void 0?JSON.stringify(n):void 0,signal:AbortSignal.timeout(2e3)});return o.ok?{synced:!0,detail:"synced"}:e==="POST"&&o.status===409?{synced:!0,detail:"already-registered"}:e==="DELETE"&&o.status===404?{synced:!0,detail:"not-registered"}:{synced:!1,detail:`daemon-rejected (HTTP ${o.status})`}}catch{return{synced:!1,detail:"daemon-unreachable (stale port file or network error)"}}}var go,DS=x(()=>{"use strict";q();go="Change saved to schedules.json, but a running daemon (if any) did not pick it up \u2014 it will apply on the next daemon (re)start."});import{existsSync as H8}from"node:fs";import{readFile as W8}from"node:fs/promises";var PI,MI,OI,$I,DI=x(()=>{"use strict";Sm();q();DS();PI=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.name!="string"||!n.name)return{content:"Invalid input: name required",isError:!0};if(typeof n.command!="string"||!n.command)return{content:"Invalid input: command required",isError:!0};if(typeof n.cron!="string"||!n.cron)return{content:"Invalid input: cron required",isError:!0};let r=n.cron.trim().split(/\s+/);if(r.length!==5&&r.length!==6)return{content:"Invalid input: cron must be a 5 or 6-field expression",isError:!0};let o=n.notifyChat;if(o!==void 0&&typeof o!="number"&&typeof o!="string")return{content:"Invalid input: notifyChat must be a number (chat id) or string (chat id or alias name)",isError:!0};let i=bm({name:n.name,command:n.command,cron:n.cron,trigger:n.trigger??"cron",notifyOn:n.notifyOn,...o!==void 0?{notifyChat:o}:{},enabled:typeof n.enabled=="boolean"?n.enabled:!0}),s=i.enabled?await xn("POST","/tasks",{taskId:i.id,command:i.command,cron:i.cron,trigger:i.trigger,notifyOn:i.notifyOn,...i.notifyChat!==void 0?{notifyChat:i.notifyChat}:{}}):await xn("DELETE",`/tasks/${i.id}`);return{content:JSON.stringify({id:i.id,name:i.name,cron:i.cron,enabled:i.enabled,daemonSynced:s.synced,syncDetail:s.detail,...s.synced?{}:{syncNote:go}})}},MI=async(e,t)=>{let n=ln();return{content:JSON.stringify(n.map(r=>({id:r.id,name:r.name,cron:r.cron,trigger:r.trigger,enabled:r.enabled,notifyOn:r.notifyOn})))}},OI=async(e,t)=>{if(!e||typeof e!="object")return{content:"Invalid input: expected object",isError:!0};let n=e;if(typeof n.taskId!="string"||!n.taskId)return{content:"Invalid input: taskId required",isError:!0};let r=n.taskId,o=typeof n.limit=="number"?Math.min(Math.max(1,n.limit),50):10,i=Bn();if(!H8(i))return{content:JSON.stringify([])};let s;try{let c=await W8(i);s=(c.length>1048576?c.subarray(c.length-1048576):c).toString("utf-8")}catch{return{content:JSON.stringify([])}}let a=s.split(`
|
|
@@ -1061,21 +1061,21 @@ ${H.rationale}
|
|
|
1061
1061
|
---
|
|
1062
1062
|
Generated by audit-fit on ${new Date().toISOString().split(".")[0]}Z
|
|
1063
1063
|
`;await V0(L,P),R++}}let F=_t();await Y0(F,{recursive:!0});let _=O=>{let H=0;for(let C of Object.values(O))for(let L of Object.values(C))H+=L;return H},$=O=>{let H=A.user[O]??{},C=A.plugin[O]??{},L=P=>Object.values(P).reduce((M,I)=>M+I,0);return L(H)+L(C)},U={timestamp:new Date().toISOString(),surface:"afk",scope:c,total_artifacts:T.length,misfits_count:D.length,briefs_written:R,by_source:{user:_(A.user),plugin:_(A.plugin)},by_type:{skill:$("skill"),command:$("command"),agent:$("agent"),hook:$("hook")}},j=ck(F,"audit-fit-telemetry.jsonl");return await V0(j,JSON.stringify(U)+`
|
|
1064
|
-
`),{inventory:A,misfits:D,briefs_written:R,total_artifacts:T.length}}var Q0,X0,UOe,IX,PX,Z0,BX,eO=x(()=>{"use strict";tn();Ot();Ge();O0();Kv();D0();q();J0();Q0=Le.object({path:Le.string(),type:Le.enum(["skill","command","agent","hook"]),source:Le.enum(["user","plugin"]),plugin_key:Le.string().optional(),verdict:Le.enum(["correct","misfit","outlier"]),recommended_type:Le.string(),rationale:Le.string(),confidence:Le.enum(["high","med","low"])}),X0=Le.record(Le.string(),Le.record(Le.string(),Le.number())),UOe=Le.object({inventory:Le.object({user:X0,plugin:X0}),misfits:Le.array(Q0),briefs_written:Le.number(),total_artifacts:Le.number()}),IX=Le.object({writeBriefs:Le.boolean().optional(),scope:Le.enum(["user","plugin","all"]).optional()}),PX=["skill","command","agent"],Z0=["skill","command","agent","hook"];BX={name:"audit-fit",description:"Audit ~/.afk artifacts (skills, commands, agents, hooks) for correct type categorization. Walks user-scope dirs (~/.afk/{skills,commands,agents}/) and every plugin installed under ~/.afk/plugins/ (flat and marketplace-cache layouts), plus ~/.afk/settings.json for hooks. Dispatches per-type inspectors in parallel, applies decision heuristics (progressive-disclosure value, isolation need, deterministic vs. reasoning), flags misfits. Generates migration briefs only for user-scope misfits (plugin misfits are inventory-only \u2014 refactoring vendored plugin code is the maintainer's job). Optional `scope` input filters to `user`, `plugin`, or `all` (default). Use for inventory audits after bulk authoring, imports, or periodic hygiene.",handler:NX,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"],audience:"internal"};Mt(BX)});async function UX(){throw new Error("get-started is a load skill; its handler should never be called directly. Invoke via the `skill` tool or `/get-started` slash command.")}var jX,tO=x(()=>{"use strict";Ot();jX={name:"get-started",description:"Guided first-run onboarding for AFK. Runs a preflight check (git repo, model provider, AFK.md, Exa/Telegram/service config), asks the user their name and gives a brief intro, detects importable Claude Code / Codex assets and offers `afk migrate`, walks optional capability setup (Exa Search, Telegram via /telegram-setup, background service via /service-setup), then recommends /init to generate project context and /clear to start fresh \u2014 ending by routing the user to their first task. Runs interactively in the current session.",handler:UX,context:"load",audience:"public",whenToUse:"When someone is setting up AFK for the first time or asks how to get going \u2014 triggers on `/get-started`, 'how do I start', 'set me up', 'onboard me', or a fresh install with no AFK.md and unconfigured capabilities. Best run in the interactive REPL."};Mt(jX)});async function nO(e,t,n,r,o="sonnet",i){let
|
|
1064
|
+
`),{inventory:A,misfits:D,briefs_written:R,total_artifacts:T.length}}var Q0,X0,UOe,IX,PX,Z0,BX,eO=x(()=>{"use strict";tn();Ot();Ge();O0();Kv();D0();q();J0();Q0=Le.object({path:Le.string(),type:Le.enum(["skill","command","agent","hook"]),source:Le.enum(["user","plugin"]),plugin_key:Le.string().optional(),verdict:Le.enum(["correct","misfit","outlier"]),recommended_type:Le.string(),rationale:Le.string(),confidence:Le.enum(["high","med","low"])}),X0=Le.record(Le.string(),Le.record(Le.string(),Le.number())),UOe=Le.object({inventory:Le.object({user:X0,plugin:X0}),misfits:Le.array(Q0),briefs_written:Le.number(),total_artifacts:Le.number()}),IX=Le.object({writeBriefs:Le.boolean().optional(),scope:Le.enum(["user","plugin","all"]).optional()}),PX=["skill","command","agent"],Z0=["skill","command","agent","hook"];BX={name:"audit-fit",description:"Audit ~/.afk artifacts (skills, commands, agents, hooks) for correct type categorization. Walks user-scope dirs (~/.afk/{skills,commands,agents}/) and every plugin installed under ~/.afk/plugins/ (flat and marketplace-cache layouts), plus ~/.afk/settings.json for hooks. Dispatches per-type inspectors in parallel, applies decision heuristics (progressive-disclosure value, isolation need, deterministic vs. reasoning), flags misfits. Generates migration briefs only for user-scope misfits (plugin misfits are inventory-only \u2014 refactoring vendored plugin code is the maintainer's job). Optional `scope` input filters to `user`, `plugin`, or `all` (default). Use for inventory audits after bulk authoring, imports, or periodic hygiene.",handler:NX,argumentHint:"[--write-briefs]",whenToUse:"When the user wants ~/.afk artifacts (skills, commands, agents, hooks) audited for correct type categorization.",flags:["--write-briefs"],audience:"internal"};Mt(BX)});async function UX(){throw new Error("get-started is a load skill; its handler should never be called directly. Invoke via the `skill` tool or `/get-started` slash command.")}var jX,tO=x(()=>{"use strict";Ot();jX={name:"get-started",description:"Guided first-run onboarding for AFK. Runs a preflight check (git repo, model provider, AFK.md, Exa/Telegram/service config), asks the user their name and gives a brief intro, detects importable Claude Code / Codex assets and offers `afk migrate`, walks optional capability setup (Exa Search, Telegram via /telegram-setup, background service via /service-setup), then recommends /init to generate project context and /clear to start fresh \u2014 ending by routing the user to their first task. Runs interactively in the current session.",handler:UX,context:"load",audience:"public",whenToUse:"When someone is setting up AFK for the first time or asks how to get going \u2014 triggers on `/get-started`, 'how do I start', 'set me up', 'onboard me', or a fresh install with no AFK.md and unconfigured capabilities. Best run in the interactive REPL."};Mt(jX)});async function nO(e,t,n,r,o="sonnet",i,s){let l=Ue("mint")["spec.md"];if(!l)throw new Error("mint skill missing spec.md prompt");let u=await(await new le({...n!==void 0?{cwd:n}:{},...i!==void 0?{parentReadRoots:i}:{},...s!==void 0?{traceWriter:s}:{}}).forkSubagent({parent:{sessionId:t},config:{model:o,systemPrompt:l,apiKey:Pe(o)},idPrefix:"mint-spec",agentType:"mint-spec",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Create a detailed specification for: ${e}`);if(u.status!=="succeeded"||!u.message)throw new Error(`spec phase failed: ${St(u)}`);if(wt(u.stopReason))throw new Error(`spec phase returned an incomplete result (stopReason=${u.stopReason})`);return u.message.content}var rO=x(()=>{"use strict";Ge();pt();Et();tn()});async function oO(e,t,n,r,o="sonnet",i,s){let l=Ue("mint")["research.md"];if(!l)throw new Error("mint skill missing research.md prompt");let u=await(await new le({...n!==void 0?{cwd:n}:{},...i!==void 0?{parentReadRoots:i}:{},...s!==void 0?{traceWriter:s}:{}}).forkSubagent({parent:{sessionId:t},config:{model:o,systemPrompt:l,apiKey:Pe(o)},idPrefix:"mint-research",agentType:"mint-research",phaseRole:"read-only",...r?{parentId:r}:{}})).runToResult(`Gather context and research for this specification:
|
|
1065
1065
|
|
|
1066
|
-
${e}`);if(
|
|
1066
|
+
${e}`);if(u.status!=="succeeded"||!u.message)throw new Error(`research phase failed: ${St(u)}`);if(wt(u.stopReason))throw new Error(`research phase returned an incomplete result (stopReason=${u.stopReason})`);return u.message.content}var iO=x(()=>{"use strict";Ge();pt();Et();tn()});async function sO(e,t,n,r,o,i="sonnet",s,a){let c=Ue("mint")["plan.md"];if(!c)throw new Error("mint skill missing plan.md prompt");let u=await new le({...r!==void 0?{cwd:r}:{},...s!==void 0?{parentReadRoots:s}:{},...a!==void 0?{traceWriter:a}:{}}).forkSubagent({parent:{sessionId:n},config:{model:i,systemPrompt:c,apiKey:Pe(i)},idPrefix:"mint-plan",agentType:"mint-plan",phaseRole:"read-only",...o?{parentId:o}:{}}),m=`Specification:
|
|
1067
1067
|
${e}
|
|
1068
1068
|
|
|
1069
1069
|
Research findings:
|
|
1070
1070
|
${t}
|
|
1071
1071
|
|
|
1072
|
-
Create a detailed implementation plan based on the spec and research.`,
|
|
1072
|
+
Create a detailed implementation plan based on the spec and research.`,f=await u.runToResult(m);if(f.status!=="succeeded"||!f.message)throw new Error(`plan phase failed: ${St(f)}`);if(wt(f.stopReason))throw new Error(`plan phase returned an incomplete result (stopReason=${f.stopReason})`);return f.message.content}var aO=x(()=>{"use strict";Ge();pt();Et();tn()});function HX(e){let t=/[\w./@-]*\.(?:ts|tsx|js|jsx|mjs|cjs|py|md|json|yaml|yml|toml|sh)\b/gi,n=new Set;for(let r of e.matchAll(t))n.add(r[0].toLowerCase());return n.size}async function lO(e,t,n,r="sonnet",o,i){if(HX(e)<3)return{kind:"skipped",reason:"too-few-files"};let a=!1;try{let l=ze("parallelize");a=!0;let c={defaultModel:r,defaultSubagentModel:r,...n!==void 0?{callId:n}:{},...i!==void 0?{traceWriter:i}:{}};return{kind:"plan",plan:await l.handler({plan:e},t,c)}}catch(l){if(a)return{kind:"failed",error:`parallelize skill handler threw: ${l instanceof Error?l.message:String(l)}`}}try{let c=hd().get("parallelize");if(!c)return{kind:"skipped",reason:"skill-body-missing"};let d=new le({parentAbortSignal:t.abortSignal,...t.cwd!==void 0?{cwd:t.cwd}:{},...o!==void 0?{parentReadRoots:o}:{},...i!==void 0?{traceWriter:i}:{}});try{let m=await(await d.forkSubagent({parent:{sessionId:t.sessionId},config:{model:r,systemPrompt:c.body,env:{PLUGIN_ROOT:c.pluginPath},apiKey:Pe(r)},idPrefix:"mint-parallelize",agentType:"mint-parallelize",...n?{parentId:n}:{}})).runToResult(JSON.stringify({plan:e}));return wt(m.stopReason)?{kind:"failed",error:`parallelize subagent returned an incomplete result (stopReason=${m.stopReason})`}:m.status==="succeeded"&&m.message?{kind:"plan",plan:m.message.content}:m.status!=="succeeded"?{kind:"failed",error:`parallelize subagent status=${m.status}${m.error?.message?`: ${m.error.message}`:""}`}:{kind:"failed",error:"parallelize subagent returned no message"}}finally{await d.teardownAll()}}catch(l){return{kind:"failed",error:`parallelize dispatch threw: ${l instanceof Error?l.message:String(l)}`}}}var cO=x(()=>{"use strict";Ot();rr();Ge();pt();Et()});function Aa(e){let t=Tn();t&&t({type:"panel",spec:e},{subagentId:"__main__"})}var Yf=x(()=>{"use strict";xr()});import{z as Fr}from"zod";async function dO(e,t,n,r,o,i="sonnet",s,a){let c=Ue("mint")["build.md"];if(!c)throw new Error("mint skill missing build.md prompt");let u=await new le({...r!==void 0?{cwd:r}:{},...s!==void 0?{parentReadRoots:s}:{},...a!==void 0?{traceWriter:a}:{}}).forkSubagent({parent:{sessionId:n},config:{model:i,systemPrompt:c,apiKey:Pe(i)},idPrefix:"mint-build",agentType:"mint-build",outputSchema:WX,...o?{parentId:o}:{}}),m=`Implementation plan:
|
|
1073
1073
|
${e}
|
|
1074
1074
|
|
|
1075
1075
|
`+(t?`Wave orchestration plan:
|
|
1076
1076
|
${JSON.stringify(t,null,2)}
|
|
1077
1077
|
|
|
1078
|
-
`:"")+"Execute the implementation plan following TDD (test-first) principles.",
|
|
1078
|
+
`:"")+"Execute the implementation plan following TDD (test-first) principles.",f=await u.runToResult(m);if(f.status!=="succeeded"||!f.output)throw new Error(`build phase failed: ${St(f)}`);let g=f.output,h={filesChanged:g.files_changed,testsPassed:g.tests_passed,notes:g.notes};return Aa({kind:"checkpoint",title:"build",body:[`Files changed: ${h.filesChanged.length}`,`Tests: ${h.testsPassed?"passed":"failed"}`,"Next: verify"]}),h}var WX,uO=x(()=>{"use strict";Ge();pt();Et();tn();Yf();WX=Fr.object({status:Fr.enum(["PASS","FAIL"]),status_reason:Fr.string().optional(),files_changed:Fr.array(Fr.string()),tests_passed:Fr.boolean(),build_passed:Fr.boolean().optional(),verification_passed:Fr.boolean().optional(),notes:Fr.string()})});import{z as Ca}from"zod";async function dk(e,t,n,r,o,i,s,a="sonnet",l,c){let u=await new le({...i!==void 0?{cwd:i}:{},...l!==void 0?{parentReadRoots:l}:{},...c!==void 0?{traceWriter:c}:{}}).forkSubagent({parent:{sessionId:r},config:{model:a,systemPrompt:o,apiKey:Pe(a)},idPrefix:`mint-verify-${e}`,agentType:`mint-verify-${e}`,outputSchema:KX,...s?{parentId:s}:{}}),m=`Plan:
|
|
1079
1079
|
${t}
|
|
1080
1080
|
|
|
1081
1081
|
Build results:
|
|
@@ -1083,25 +1083,25 @@ ${JSON.stringify(n,null,2)}
|
|
|
1083
1083
|
|
|
1084
1084
|
Mode: ${e}
|
|
1085
1085
|
|
|
1086
|
-
Run ${e} verification on the implementation.`,
|
|
1086
|
+
Run ${e} verification on the implementation.`,f;try{f=await u.runToResult(m)}finally{await u.teardown().catch(()=>{})}if(f.status!=="succeeded"||!f.output)return{passed:!1,issues:[`${e} verification failed: ${St(f)}`]};let g=f.output,h=g.status==="PASS";return{passed:h,issues:h?void 0:g.issues}}async function Vf(e,t,n,r,o,i="sonnet",s,a){let c=Ue("mint")["verify.md"];if(!c)throw new Error("mint skill missing verify.md prompt");let[d,u,m]=await Promise.all([dk("test",e,t,n,c,r,o,i,s,a),dk("lint",e,t,n,c,r,o,i,s,a),dk("design-review",e,t,n,c,r,o,i,s,a)]),f=[];d.issues&&f.push(...d.issues),u.issues&&f.push(...u.issues),m.issues&&f.push(...m.issues);let g={testsPassed:d.passed,lintPassed:u.passed,designReviewPassed:m.passed,...f.length>0?{issues:f}:{}},h=g.testsPassed&&g.lintPassed&&g.designReviewPassed,y=b=>b?"passed":"failed";return Aa({kind:h?"checkpoint":"diagnosis",title:"verify",body:[`Tests: ${y(g.testsPassed)} \xB7 Lint: ${y(g.lintPassed)}`,`Design review: ${y(g.designReviewPassed)}`,...h?["Next: ship"]:[`Issues: ${f.length} (heal loop will retry)`]]}),g}var KX,uk=x(()=>{"use strict";Ge();pt();Et();tn();Yf();KX=Ca.object({status:Ca.enum(["PASS","FAIL"]),status_reason:Ca.string().optional(),issues:Ca.array(Ca.string()).default([]),summary:Ca.string().optional()})});async function pO(e,t,n,r,o,i,s="sonnet",a,l,c){if(n.testsPassed&&n.lintPassed&&n.designReviewPassed)return{healed:!0,newHealIterations:r,newVerifyResults:n};if(r>=2)return{healed:!1,newHealIterations:r,newVerifyResults:n};try{let d=`Verification failures:
|
|
1087
1087
|
Tests: ${n.testsPassed?"PASS":"FAIL"}
|
|
1088
1088
|
Lint: ${n.lintPassed?"PASS":"FAIL"}
|
|
1089
1089
|
Design: ${n.designReviewPassed?"PASS":"FAIL"}
|
|
1090
1090
|
Issues: ${n.issues?.join(`
|
|
1091
|
-
`)||"none"}`,
|
|
1091
|
+
`)||"none"}`,u=a?await a("diagnose",`${d}
|
|
1092
1092
|
|
|
1093
1093
|
Context (implementation plan):
|
|
1094
|
-
${e}`):"",
|
|
1095
|
-
`)??"none",
|
|
1094
|
+
${e}`):"",f=Ue("mint")["heal.md"];if(!f)throw new Error("mint skill missing heal.md prompt");let h=await new le({...o.cwd!==void 0?{cwd:o.cwd}:{},...l!==void 0?{parentReadRoots:l}:{},...c!==void 0?{traceWriter:c}:{}}).forkSubagent({parent:{sessionId:o.sessionId},config:{model:s,systemPrompt:f,apiKey:Pe(s)},idPrefix:"mint-heal",agentType:"mint-heal",...i?{parentId:i}:{}}),y=n.issues?.join(`
|
|
1095
|
+
`)??"none",b=`Plan:
|
|
1096
1096
|
${e}
|
|
1097
1097
|
|
|
1098
1098
|
Failure diagnosis (from /diagnose):
|
|
1099
|
-
${
|
|
1099
|
+
${u||"(diagnosis unavailable \u2014 diagnose the failures yourself from the verification issues below)"}
|
|
1100
1100
|
|
|
1101
1101
|
Verification issues:
|
|
1102
|
-
${
|
|
1102
|
+
${y}
|
|
1103
1103
|
|
|
1104
|
-
Apply the fix and update the implementation.`,
|
|
1104
|
+
Apply the fix and update the implementation.`,w=await h.runToResult(b);if(w.status!=="succeeded"||!w.message)throw new Error(`heal phase failed: ${St(w)}`);if(wt(w.stopReason))throw new Error(`heal phase returned an incomplete result (stopReason=${w.stopReason})`);let S=/^\s*FIX_APPLIED:\s*(true|false)/im.exec(w.message.content)?.[1]?.toLowerCase()==="true",k=r+1;if(!S)return{healed:!1,newHealIterations:k,newVerifyResults:n};if(!o.sessionId)throw new Error("Parent session ID required for verification");let T=await Vf(e,t,o.sessionId,o.cwd,i,s,l,c);return{healed:T.testsPassed&&T.lintPassed&&T.designReviewPassed,newHealIterations:k,newVerifyResults:T}}catch{return{healed:!1,newHealIterations:r+1,newVerifyResults:n}}}var mO=x(()=>{"use strict";Ge();pt();Et();tn();uk()});async function fO(e,t,n,r,o="sonnet",i,s){let l=Ue("mint")["ship.md"];if(!l)throw new Error("mint skill missing ship.md prompt");let d=await new le({...n!==void 0?{cwd:n}:{},...i!==void 0?{parentReadRoots:i}:{},...s!==void 0?{traceWriter:s}:{}}).forkSubagent({parent:{sessionId:t},config:{model:o,systemPrompt:l,apiKey:Pe(o)},idPrefix:"mint-ship",agentType:"mint-ship",...r?{parentId:r}:{}}),u=`Idea: ${e.idea}
|
|
1105
1105
|
|
|
1106
1106
|
Specification:
|
|
1107
1107
|
${e.spec}
|
|
@@ -1117,7 +1117,7 @@ ${JSON.stringify(e.verifyResults,null,2)}
|
|
|
1117
1117
|
|
|
1118
1118
|
Heal iterations used: ${e.healIterations}
|
|
1119
1119
|
|
|
1120
|
-
Create a ship-ready summary with next steps.`,
|
|
1120
|
+
Create a ship-ready summary with next steps.`,m=await d.runToResult(u);if(m.status!=="succeeded"||!m.message)throw new Error(`ship phase failed: ${St(m)}`);if(wt(m.stopReason))throw new Error(`ship phase returned an incomplete result (stopReason=${m.stopReason})`);let f=e.buildResults?.filesChanged.length??0,g=e.healIterations;return Aa({kind:"checkpoint",title:"ship \u2014 done",body:[`Files changed: ${f}`,`Heal iterations: ${g}`,`Idea: ${e.idea}`]}),m.message.content}var gO=x(()=>{"use strict";Ge();pt();Et();tn();Yf()});import{existsSync as hO,mkdirSync as GX,readFileSync as qX,unlinkSync as zX,writeFileSync as JX}from"fs";import{dirname as YX,join as VX}from"path";function pk(e){return VX(lt(),e,"mint-state.json")}function yO(e,t){let n=pk(e);GX(YX(n),{recursive:!0}),JX(n,JSON.stringify(t,null,2),"utf-8")}function XX(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.currentPhase=="string"&&typeof t.idea=="string"&&typeof t.spec=="string"&&typeof t.healIterations=="number"&&Array.isArray(t.history)}function bO(e){let t=pk(e);if(!hO(t))return null;try{let n=JSON.parse(qX(t,"utf-8"));return XX(n)?n:null}catch{return null}}function mk(e){let t=pk(e);if(hO(t))try{zX(t)}catch{}}var wO=x(()=>{"use strict";q()});function lr(e,t,n){e.history.push({phase:t,output:n,timestamp:Date.now()})}function EO(e){if("completed"in e&&"paused"in e)throw new Error("mint: invariant violation \u2014 MintResult carries both completed and paused keys simultaneously")}function e9(e){return e.length<=vO?e:e.slice(0,vO)+"\u2026"}function xO(e){if(typeof e=="string"){if(SO.test(e))return{userApproved:!0};if(e.length>1&&e.trimStart().startsWith("{"))try{let t=JSON.parse(e);if(typeof t=="object"&&t!==null)return xO(t)}catch{}return{idea:e}}if(typeof e=="object"&&e!==null){let t=e,n=typeof t.idea=="string"?t.idea:void 0;if(n!==void 0&&SO.test(n))return{userApproved:!0};if("idea"in t||"resumeFrom"in t||t.userApproved===!0)return t}throw new Error("mint handler requires input.idea (string), input as string, or {userApproved: true} to resume")}async function kO(e,t,n,r="sonnet",o,i,s){if(!t.sessionId)throw new Error("runPhasesAfterSpec requires parentSession.sessionId");let a=t.sessionId,l=t.cwd,c=lo(i,l);try{e.currentPhase="research",e.research=await oO(e.spec,a,l,n,r,c,s),lr(e,"research",e.research),e.currentPhase="plan",e.plan=await sO(e.spec,e.research,a,l,n,r,c,s),lr(e,"plan",e.plan),e.currentPhase="parallelize";let d=await lO(e.plan,t,n,r,c,s);if(d.kind==="plan")e.waveOrchestrationPlan=d.plan,lr(e,"parallelize",JSON.stringify(d.plan));else if(d.kind==="skipped")e.waveOrchestrationPlan=void 0,lr(e,"parallelize",`skipped: ${d.reason}`);else if(d.kind==="failed"){e.waveOrchestrationPlan=void 0;let f=e9(d.error);lr(e,"parallelize",`failed: ${f}`),$e({event:"fallback.inline",parent_session_id:a,reason:"parallelize-dispatch-failed",error_message:f}),console.warn(`[mint] parallelize dispatch failed (single-lane fallback): ${f}`)}else{let f=d}e.currentPhase="build",e.buildResults=await dO(e.plan,e.waveOrchestrationPlan,a,l,n,r,c,s),lr(e,"build",JSON.stringify(e.buildResults)),e.currentPhase="verify",e.verifyResults=await Vf(e.plan,e.buildResults,a,l,n,r,c,s),lr(e,"verify",JSON.stringify(e.verifyResults)),e.currentPhase="heal";let u=e.verifyResults.testsPassed&&e.verifyResults.lintPassed&&e.verifyResults.designReviewPassed;for(;!u&&e.healIterations<QX;){let f=await pO(e.plan,e.buildResults,e.verifyResults,e.healIterations,t,n,r,o,c,s);e.healIterations=f.newHealIterations,e.verifyResults=f.newVerifyResults,u=f.healed,lr(e,"heal",`Iterations: ${e.healIterations}, Success: ${u}`)}if(!u)return{paused:!0,phase:"heal-failed",reason:`Heal capped at ${e.healIterations} iterations; still have failures`,state:e,nextStep:"Heal loop exhausted. Inspect verifyResults, fix manually, then re-invoke /mint with a fresh idea \u2014 resume is not supported from heal-failed."};e.currentPhase="ship";let m=await fO(e,a,l,n,r,c,s);return lr(e,"ship",m),{completed:!0,artifact:m,state:e}}catch(d){throw new Error(`mint failed at ${e.currentPhase}: ${d}`)}}function TO(e,t){return EO(t),("completed"in t||t.phase==="heal-failed")&&mk(e),t}async function t9(e,t,n){let r=xO(e);if(!t?.sessionId)throw new Error("mint handler requires a parent session to fork subagents");let o=t.sessionId,i=n?.callId,s=n?.defaultSubagentModel??n?.defaultModel??"sonnet";if(r.userApproved){let c=r.resumeFrom??bO(o);if(!c)throw new Error("mint: no paused spec found for this session to continue. Run /mint <idea> first, then /mint --continue approved.");let d=await kO(c,t,i,s,n?.dispatchSkill,n?.getReadScopeInputs?.(),n?.traceWriter);return TO(o,d)}if(!r.idea)throw new Error("mint: no idea provided. Run /mint <idea> to start, or /mint --continue approved to resume a paused spec.");mk(o);let a={currentPhase:"spec",idea:r.idea,healIterations:0,history:[]};try{a.spec=await nO(r.idea,o,t.cwd,i,s,void 0,n?.traceWriter),lr(a,"spec",a.spec)}catch(c){throw new Error(`mint failed at spec: ${c}`)}if(!r.autoApprove){yO(o,a);let c={paused:!0,phase:"spec",spec:a.spec,state:a,nextStep:ZX};return EO(c),c}let l=await kO(a,t,i,s,n?.dispatchSkill,n?.getReadScopeInputs?.(),n?.traceWriter);return TO(o,l)}var QX,SO,ZX,vO,n9,RO=x(()=>{"use strict";Ot();di();rO();iO();aO();cO();Jn();uO();uk();mO();gO();wO();QX=2,SO=/^\s*(?:--continue(?:\s+(?:approved|yes|y))?|approved?|yes|y|lgtm|sure)\s*$/i,ZX='To approve and run the rest of the pipeline, say "approve", "yes", "sure", or "lgtm" \u2014 or invoke /mint --continue approved. The handler will reload the spec state from disk.';vO=240;n9={name:"mint",description:"Takes a feature idea or refactor scope and delivers a ship-ready, verified implementation end-to-end",handler:t9,argumentHint:"<idea> | --continue [approved]",whenToUse:'When the user wants a feature or refactor delivered end-to-end (spec \u2192 research \u2192 build \u2192 verify) in one ship-ready pass. After the spec phase pauses for approval, resume by invoking mint again with the literal string `"approved"` (or `"yes"`, `"lgtm"`, `"--continue approved"`) as the arguments. Equivalent JSON forms `{"userApproved": true}` and `{"idea": "approved"}` are also accepted. The handler reloads the spec state from disk and runs phases 2\u20138.',flags:["--continue"]};Mt(n9)});async function r9(){throw new Error("service-setup is a fork skill; its handler should never be called directly. Invoke via the `skill` tool or `/service-setup` slash command.")}var o9,AO=x(()=>{"use strict";Ot();o9={name:"service-setup",description:"Install an AFK background process (telegram bot or daemon) as an OS-supervised service \u2014 a launchd LaunchAgent on macOS or a systemd `--user` unit on Linux \u2014 so it auto-starts on login and relaunches on crash. Runs pre-flight checks (e.g., refuses to install the telegram service with an invalid token, which would otherwise crash-loop under KeepAlive/Restart=always), invokes `afk service install`, verifies with `afk service status`, and surfaces the management cheatsheet (including the `loginctl enable-linger` step on Linux). macOS + Linux \u2014 gracefully refuses on other platforms.",handler:r9,context:"fork",whenToUse:"When the user wants to make `afk telegram start` or `afk daemon` always-on \u2014 i.e., survive reboot, crash, OOM. Triggers on phrasings like 'install as a service', 'auto-start on login', 'keep the bot running', 'launchd', 'always-on telegram', or right after a successful `/telegram-setup` when the user asks how to make it persistent."};Mt(o9)});async function i9(){throw new Error("telegram-setup is a fork skill; its handler should never be called directly. Invoke via the `skill` tool or `/telegram-setup` slash command.")}var s9,CO=x(()=>{"use strict";Ot();s9={name:"telegram-setup",description:"Guide the user through first-time Telegram bot onboarding without leaking the bearer token. Walks the user to run `afk telegram setup` in a terminal for token entry, then uses the sanctioned `afk telegram check-token`/`discover-chat`/`set-allowed-chat` subcommands to validate and finish allowlist setup \u2014 the token never enters the model context. Works in REPL or Telegram. Use when the user wants to set up Telegram push notifications for the first time, or to debug a partially-configured install.",handler:i9,context:"fork",whenToUse:`When the user wants to set up Telegram bot notifications for the first time, or when they say something like "set up telegram", "connect telegram", "enable push", or you detect that TELEGRAM_BOT_TOKEN is unset and they're asking for notifications.`};Mt(s9)});function _O(e){return e.startsWith("--")?e:`--${e}`}function l9(e){let t=new Set;for(let n of e.matchAll(a9))n[1]&&t.add(`--${n[1]}`);return Array.from(t).sort()}function fk(e){if(!e.startsWith(`---
|
|
1121
1121
|
`))return{frontmatter:null,frontmatterFlags:null,body:e};let t=e.indexOf(`
|
|
1122
1122
|
---
|
|
1123
1123
|
`,4);if(t===-1)return{frontmatter:null,frontmatterFlags:null,body:e};let n=e.slice(4,t),r=e.slice(t+5),o={},i=null,s=n.split(`
|
|
@@ -1752,7 +1752,7 @@ ${S}
|
|
|
1752
1752
|
${k}`})}return{fileBlocks:a,warnings:l}}async function V1(e,t,n,r,o="summary",i,s){let a=_B(e.text,e.attachments);r.onUserMessage&&await Promise.resolve(r.onUserMessage(a)).catch(()=>{}),r.setInFlight(!0),tl(process.stdout,Fd(process.cwd(),!0));let l="",c=0,d=!1,u=!1,m=!1,f=!1,g,h=!1,y=!1,b={abort:null},w=0,S=3e3,k=[],T=new Map,A=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,D=()=>{let j=r.subagentControl;j?.hasPromotableForeground()&&j.promoteActiveForeground().then(O=>{for(let H of O)(i??{fn:console.log}).fn(p.dim(` \u2192 subagent backgrounded as ${H.jobId}: ${H.label}`))}).catch(()=>{})},R=r.getCompositor?r.getCompositor():null,F=()=>new wl({out:Sl(i),thinkingMode:o,...A?{activeSkillName:A}:{},onCancel:()=>{t.interrupt().catch(j=>{Ke()&&console.error(" "+p.error("session.interrupt() failed:"),j)})},...r.subagentControl?{onBackground:D}:{},...s?.history?{history:s.history}:{},...s?.autocompleteState?{autocompleteState:s.autocompleteState}:{},...s?.promptText!==void 0?{promptText:s.promptText}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{},...R?{compositor:R}:{},...r.onStageChange?{onStageChange:r.onStageChange}:{}}),_=F(),$=async()=>{if(!m){m=!0;try{await _.dispose()}catch{}}},U=async()=>{await _.arm();let j=_.getCompositor();if(i&&j){let O=j;i.fn=H=>O.commitAbove(H),i.suppressSubagentCompletion=!0}r.setActiveCompositor?.(j),r.setInterruptNotifier?.(O=>_.setInterrupting(O)),r.rearmStatus?.()};try{R?R.commitAbove(""):console.log(),r.setSoftStopHandler&&r.setSoftStopHandler(()=>{h=!0,_.setSoftStopping(!0),t.interrupt().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop session.interrupt() failed:"),M)});let P=r.subagentControl;P?.hasActiveForeground()&&P.cancelActiveForeground().catch(M=>{Ke()&&console.error(" "+p.error("soft-stop cancelActiveForeground() failed:"),M)})}),r.setPauseInterruptHandler&&r.setPauseInterruptHandler(()=>{y=!0,t.interrupt().catch(P=>{Ke()&&console.error(" "+p.error("pause-interrupt session.interrupt() failed:"),P)})}),await U(),r.setBackgroundHandler&&r.subagentControl&&r.setBackgroundHandler(D);let{fileBlocks:j,warnings:O}=Y1(e.text,{rootDir:process.cwd()});for(let P of O)(i??{fn:console.log}).fn(p.dim(` @-file: ${P}`));let H=j.length>0||e.attachments.length>0?z1(e.text,e.attachments,void 0,j):e.text,C=t.sendMessageStream(H);if(await Hs((P,M)=>{_.process(P,M)},async()=>{for await(let P of C){if(h||y)break;if(P.type==="chunk"&&P.chunk.type==="content"?(l+=P.chunk.content,d=!0):P.type==="message"&&!d&&(l=P.message.content),P.type==="stream_retry"&&(l=l.slice(0,c)),P.type==="chunk"&&P.chunk.type==="tool_use_detail"){let M=P.chunk,I={toolName:M.toolName,toolUseId:M.toolUseId,input:M.toolInput,...M.toolInputRaw!==void 0&&{inputRaw:M.toolInputRaw}};T.set(M.toolUseId,I),k.push(I)}else if(P.type==="chunk"&&P.chunk.type==="tool_result"){let M=P.chunk;c=l.length;let I=T.get(M.toolUseId);if(I&&(I.result=M.content,I.isError=M.isError,T.delete(M.toolUseId)),r.onContextProgress){let B=Date.now();if(B-w>=S){w=B;try{let K=r.onContextProgress();K instanceof Promise&&await K}catch(K){Ke()&&console.error(" "+p.error("onContextProgress (status refresh) failed:"),K)}}}}if(P.type==="paused"){if(r.setPausedState?.(!0),await $(),R&&P.autoResume===!0){let M=new AbortController;b.abort=M;let I=P.resetsAt?P.resetsAt.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"}):null,B=I?`Keep waiting \u2014 auto-resumes at ${I}`:"Keep waiting \u2014 auto-resume in progress",K="Switch model / provider (type /model after)",Q="Stop waiting",ee=[p.warning(" \u23F3 Usage limit reached.")+(I?p.dim(` Auto-resumes at ${I}.`):""),p.dim(" Tip: run `claude login` in another terminal to switch account \u2014 this turn resumes on it automatically."),""];dr(R,{header:ee,options:[B,K,Q],signal:M.signal,initialIndex:0}).then(se=>{if(b.abort=null,!se)return;let z=se[0];z===void 0||z===B||(y=!0,z===K&&(i??{fn:console.log}).fn(p.dim(" Hint: type /model <name> to switch, then send your message again.")),t.interrupt().catch(fe=>{Ke()&&console.error(" "+p.error("picker pause-interrupt session.interrupt() failed:"),fe)}))}).catch(se=>{Ke()&&console.error(" "+p.error("picker promise rejected:"),se)})}else(i??{fn:console.log}).fn(aA({reason:P.reason,...P.resetsAt!==void 0?{resetsAt:P.resetsAt}:{},...P.accountId!==void 0?{accountId:P.accountId}:{},...P.autoResume!==void 0?{autoResume:P.autoResume}:{}}));continue}if(P.type==="resumed"){r.setPausedState?.(!1),b.abort?.abort(),b.abort=null;let M=P.hotSwapped&&P.accountId?`\u25B6 Resumed on ${P.accountId}`:"\u25B6 Resumed";l="",c=0,d=!1,k.length=0,T.clear(),f=!1,g=void 0,u=!1,_=F(),m=!1,await U(),(i??{fn:console.log}).fn(p.success(M));continue}if(P.type==="error"){await $(),xs(ws(P.error)),u=!0;continue}_.process(P),P.type==="done"&&(f=!0,g=P.metadata)}}),await $(),h){let P=i?i.fn:console.log,M=R?R.getPendingCount():0,I=M>0?` \xB7 ${M} queued`:"";P(p.warning(`\u23F8 Stopped${I} \u2014 work so far kept.`)+p.dim(" Send a message to continue.")),P("")}if(y){let P=i?i.fn:console.log;P(p.dim("\u25B6 Ending wait \u2014 running your next command\u2026")),P("")}if(f&&!h&&!y){Di(n,a,l,g,k),r.onTurnComplete&&await r.onTurnComplete(a,l).catch(()=>{}),el(process.stdout),bL(process.stdout,"afk: turn complete");let P=I=>{i?i.fn(I):console.log(I)},M=Iy(l);if(M){P(q1(M)),P("");let I=WL(k);if(r.onTerminalState)try{r.onTerminalState(M,{doneHasCorroboratingEvidence:I})}catch{}if(n.permissionMode==="autonomous"){let B=M.kind==="done"&&yc().verifyDone===!0&&!I;GL(M,void 0,{unverified:B})}}if(Rce(g,n,P),r.onAfterTurn){let I=r.onAfterTurn();I instanceof Promise&&await I.catch(()=>{})}}}catch(j){await $(),u||xs(ws(j))}finally{await $(),tl(process.stdout,Fd(process.cwd(),!1)),i&&(i.fn=i.idleFn,i.suppressSubagentCompletion=!1),r.setActiveCompositor?.(null),r.setInterruptNotifier?.(null),r.setBackgroundHandler?.(null),r.setSoftStopHandler?.(null),r.setPausedState?.(!1),r.setPauseInterruptHandler?.(null),b.abort?.abort(),b.abort=null,r.setInFlight(!1),r.rearmStatus?.()}}function xce(e,t){let n=Math.round(e*100),r=ue(t);if(e>=1){let o=Math.round((e-1)*t);return{tier:"over",text:` context OVER ${Math.round(t/1e3)}k tok by ~${ue(o)} tok \u2014 model output may be silently truncated`}}return e>=.95?{tier:"near",text:` context ${n}% used of ${r} \u2014 near limit; output may soon truncate (consider /clear or a fresh session)`}:e>=.8?{tier:"caution",text:` context ${n}% used of ${r} \u2014 approaching limit`}:e>.5?{tier:"normal",text:` context ${n}% used of ${r}`}:{tier:"quiet",text:null}}function Rce(e,t,n=console.log){if(!e)return;let r=[];e.durationMs&&r.push(ve(e.durationMs)),e.totalCostUsd!==void 0&&r.push(st(e.totalCostUsd));let o=Number(e.usage?.input_tokens??0),i=Number(e.usage?.output_tokens??0);o+i>0&&r.push(ue(o+i)+" tok"),r.length>0&&n(p.dim(" \u25E6 "+r.join(" \xB7 ")));let s=fT(t),a=qt(t.model),l=xce(s,a);if(l.text!==null){let c=l.tier==="over"||l.tier==="near"?p.error:l.tier==="caution"?p.warning:p.dim;n(c(l.text))}n("")}var Ace=5e3,Cce=3,_ce="[auto-resume] The background task above has finished. Continue the work it was dispatched for.";async function Ice(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}async function X1(e,t,n,r,o,i,s,a){let{contextPane:l,loopStageBar:c,verdictLedger:d,shellPassthrough:u,bgResultNotifier:m}=s,f=null,g=[];e.session.current.waitForInitialization().then(async D=>{Ke()&&(f=ch(D)),await du(e.session.current),Ke()&&(g=RE())}).catch(()=>{});let h=e.initialInput!==void 0?{text:e.initialInput,attachments:[]}:void 0,y,b=!1,w=!1,S,k,T,A=0;for(m.onInjectable=()=>{A>=Cce||!o.isAwaitingInput()||!o.bufferIsEmpty()||(A++,el(process.stdout),h={text:_ce,attachments:[]},o.abortPendingRead())};;){if(f&&(e.replRenderer.writeLine(f),e.replRenderer.writeLine(""),f=null),g.length>0){for(let C of g)e.replRenderer.writeLine(C);e.replRenderer.writeLine(""),g=[]}let D=u.drainNotifications();for(let{job:C,result:L}of D){let P=L.errorReason===void 0?"\u2713":"\u2717",M=L.errorReason==="abort"?"killed":L.errorReason==="timeout"?"timed out":L.errorReason==="signal-killed"?"killed by signal":`exit ${L.exitCode??0}`,I=Math.max(0,Math.round(L.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${P} [${C.id}] ${M} \xB7 ${I}s \xB7 `)+C.command)}let R=m.drainNotifications();for(let{job:C}of R){let L=C.status==="completed"?"\u2713":C.status==="failed"?"\u2717":"\u2298",P=C.endedAt!==void 0?Math.max(0,Math.round((C.endedAt-C.startedAt)/100)/10):0,M=C.label.length>60?`${C.label.slice(0,60)}\u2026`:C.label;e.replRenderer.writeLine(p.dim(` ${L} [${C.jobId}] subagent ${C.status} \xB7 ${P}s \xB7 `)+M)}let F=l.renderIfChanged(e.stats.sessionId);if(F.length>0){for(let C of F)e.replRenderer.writeLine(C);e.replRenderer.writeLine("")}let _,$;if(h===void 0){let C=await e.session.current.takePendingPlanExitSeed();C!==void 0&&(e.stats.permissionMode=C.mode,h={text:C.message,attachments:[]})}if(h!==void 0){let C=h;h=void 0;let L=El(e.stats.permissionMode),P=Ki({buffer:C.text,promptText:L,isTTY:!!process.stdout.isTTY,attachmentSummary:cl([...C.attachments])});e.replRenderer.writeLine(P),_=C.text.trim(),$=C.attachments}else{let C=y;y=void 0;let L=await o.readLine({promptFn:()=>El(e.stats.permissionMode),...C!==void 0?{initialBuffer:C}:{},onSigint:r,onShiftTab:()=>{Ry(e.slashCtx).catch(()=>{}),e.statusLine.rearm()}});_=L.text.trim(),$=L.attachments}if(!_&&$.length===0)continue;if(_.startsWith("!")){let C=/^(0|false|off|no)$/i.test(v.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!C&&(b||(b=!0,e.replRenderer.writeLine(p.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await u.dispatch(_))){e.statusLine.rearm();continue}}let U=!1;if(_.startsWith("/")){let C=await IL(_,e.slashCtx,$);if(C.handled){if(C.result==="exit"){e.rl.close();return}if((_==="/clear"||_.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),d.reset(),S=void 0),C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="submit"){h={text:C.result.message,attachments:$??[]},e.statusLine.rearm();continue}if(C.result!==null&&typeof C.result=="object"&&"kind"in C.result&&C.result.kind==="prefill"){y=C.result.message,e.statusLine.rearm();continue}e.statusLine.rearm();continue}U=!0}a.push(_),await Ice(e,_);let j=_;if(U){let C=mT(_);if(C){let L=C.name.replace(/^\//,"").split(":").pop()??"";if(L&&kE(L)){let P={skillName:L,rawArgs:C.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},M=e.session.current.sessionId,I=Zi(M),B=Date.now();W(`[afk trace] preflight.start commandName=${L}`);let K=!1,Q=await Qi(P,{cwd:e.stats.cwd??process.cwd(),artifactDir:I},ee=>{Ke()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${L}) failed: `)+(ee instanceof Error?ee.message:String(ee)))});K=Q!==null,W(`[afk trace] preflight.end commandName=${L} durationMs=${Date.now()-B} success=${K}`),j=EE(Q?.manifestBlock,_)}}}let O=u.drainInjections();O.length>0&&(j=O+j);let H=m.drainInjections();if(H.length>0&&(j=H+j),S!==void 0&&(j=S+`
|
|
1753
1753
|
|
|
1754
1754
|
`+j,S=void 0),e.hookRegistry)try{let C={event:"UserPromptSubmit",prompt:j,sessionId:e.stats.sessionId},L=await e.hookRegistry.dispatch(C);L.injectContext&&(j=L.injectContext+j)}catch(C){if(C instanceof he){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+(C.reason?p.dim(`: ${_r(C.reason)}`):"")),e.statusLine.rearm();continue}if(C instanceof qn){e.replRenderer.writeLine(p.warning("\u2298 Turn blocked by hook")+p.dim(`: handler timed out after ${C.timeoutMs}ms`)),e.statusLine.rearm();continue}throw C}if(k=void 0,T=void 0,await V1({text:j,attachments:$},e.session.current,e.stats,{setInFlight(C){n.turnInFlight=C},...e.subagentControl?{subagentControl:e.subagentControl}:{},async onUserMessage(C){await t.appendUser(C)},async onTurnComplete(C,L){if(await t.appendTurn(C,L),e.stats.sessionId)try{Mo(e.stats)}catch(P){w||(w=!0,e.replRenderer.writeLine(p.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(P instanceof Error?P.message:String(P))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await e.gitStatusSampler.refresh(),e.statusLine.rearm(),c?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:(C,L)=>{d?.push(C),k=C.kind,T=L?.doneHasCorroboratingEvidence},setActiveCompositor:C=>{n.activeCompositor=C},setInterruptNotifier:C=>{n.notifyInterrupting=C},scrollRegion:e.statusLine,getCompositor:()=>o.getCompositor(),setBackgroundHandler:C=>o.setBackgroundHandler(C),setSoftStopHandler:i,setPausedState:C=>o.setPausedState(C),setPauseInterruptHandler:C=>o.setPauseInterruptHandler(C),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(On(e.stats,e.contextSampler,e.gitStatusSampler))},...c?{onStageChange:C=>c.repaint(C)}:{}},e.stats.thinkingUi??e.options.thinkingUi,e.completionWriter,o.toRunTurnRefs(El(e.stats.permissionMode))),e.hookRegistry)try{let C=await e.hookRegistry.dispatch({event:"Stop",sessionId:e.stats.sessionId,...k!==void 0?{terminalState:k}:{},...T!==void 0?{doneHasCorroboratingEvidence:T}:{}},void 0,Ace);C.injectContext&&C.injectContext.trim().length>0&&(S=C.injectContext)}catch(C){if(C instanceof ct)throw C;C instanceof qn?(W("[stop hook] handler timed out"),e.completionWriter.fn(p.dim(" [stop hook] timed out"))):C instanceof he?e.completionWriter.fn(p.dim(` [stop hook] blocked: ${_r(C.reason??"no reason given")}`)):W("[stop hook] unexpected error: "+String(C))}}}function Pce(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 Q1(e,t,n,r){let o=await I1(),i=new xy({rl:e.rl,history:o,statusLine:e.statusLine}),s=Pce(v.AFK_SUGGEST_GHOST,e.suggestGhostConfig),a;try{let{installSoftStop:l}=await D1(e,i,n,t,r,s,{getLoopStageBar:()=>a?.loopStageBar});a=G1(e,n),await X1(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)}}mc();Zs();import{execFile as Mce}from"node:child_process";import{dirname as Oce,isAbsolute as $ce,resolve as Dce}from"node:path";import{promisify as Fce}from"node:util";var Z1=Fce(Mce),Lce=3e3,Nce=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function Bce(){let t=(await Z1("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=$ce(t)?t:Dce(process.cwd(),t);return Oce(n)}async function eH(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await Bce()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),Lce)});try{let o=cn({execFile:Z1,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=>Nce.has(c.verdict)&&s.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}fp();mc();import{promises as Uce}from"node:fs";import{dirname as jce,join as rH}from"node:path";import{randomBytes as Hce}from"node:crypto";var Wce=["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(`
|
|
1755
|
-
`),tH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,JE=30,Kce=1024,Gce=8e3,qce="haiku";async function zce(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=Xce(n,Kce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Gce),s=t.signal?Qce([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ms({token:t.token,model:t.model??qce,system:Wce,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=Jce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=jce(t.worktreePath);return await Yce(l,c)}function Jce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(tH.test(t)&&t.length<=JE)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>JE)break;o=s}return tH.test(o)?o:null}async function Yce(e,t){if(!await Vce(rH(t,e)))return e;let n=Hce(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,JE-5)}-${n}`}async function Vce(e){try{return await Uce.access(e),!0}catch{return!1}}function Xce(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 Qce(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 oH(e){let t,n,r=rH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await zce(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=`${Rp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return nH(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 nH(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 nH(e,t){e&&e.setCwd(t),Zce(t)}function Zce(e){try{process.chdir(e)}catch{}}jt();q();import{spawn as sH}from"child_process";import{existsSync as aH,mkdirSync as ode,readFileSync as lH,unlinkSync as iH,writeFileSync as cH}from"fs";import{get as ide}from"https";import{join as dH}from"path";import{readFileSync as ede}from"fs";import{dirname as tde,join as nde}from"path";import{fileURLToPath as rde}from"url";function gr(){try{return"5.80.
|
|
1755
|
+
`),tH=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,JE=30,Kce=1024,Gce=8e3,qce="haiku";async function zce(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=Xce(n,Kce),o=new AbortController,i=setTimeout(()=>o.abort(),t.timeoutMs??Gce),s=t.signal?Qce([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,s):a=await Ms({token:t.token,model:t.model??qce,system:Wce,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=Jce(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=jce(t.worktreePath);return await Yce(l,c)}function Jce(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(tH.test(t)&&t.length<=JE)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>JE)break;o=s}return tH.test(o)?o:null}async function Yce(e,t){if(!await Vce(rH(t,e)))return e;let n=Hce(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,JE-5)}-${n}`}async function Vce(e){try{return await Uce.access(e),!0}catch{return!1}}function Xce(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 Qce(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 oH(e){let t,n,r=rH(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await zce(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=`${Rp(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return nH(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 nH(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 nH(e,t){e&&e.setCwd(t),Zce(t)}function Zce(e){try{process.chdir(e)}catch{}}jt();q();import{spawn as sH}from"child_process";import{existsSync as aH,mkdirSync as ode,readFileSync as lH,unlinkSync as iH,writeFileSync as cH}from"fs";import{get as ide}from"https";import{join as dH}from"path";import{readFileSync as ede}from"fs";import{dirname as tde,join as nde}from"path";import{fileURLToPath as rde}from"url";function gr(){try{return"5.80.2"}catch{}try{let e=tde(rde(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(ede(nde(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var sde=64*1024,ade=10800*1e3,lde=800,cde=3600*1e3,dde="update-check.json",ude="pending-update.json";function YE(){return dH(hs(),dde)}function hu(){return dH(hs(),ude)}function VE(){let e=hs();aH(e)||ode(e,{recursive:!0})}function uH(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 pH(){try{let e=lH(YE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function mH(){try{VE();let e=`
|
|
1756
1756
|
const https = require('https');
|
|
1757
1757
|
const fs = require('fs');
|
|
1758
1758
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|