agent-afk 3.10.0 → 3.10.1
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 +4 -4
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -1937,7 +1937,7 @@ ${a}`)}o.push({type:"text",text:s});let i=new dn({out:Tr(),activeSkillName:"init
|
|
|
1937
1937
|
${e.replace(/<\/system-reminder>/gi,"")}
|
|
1938
1938
|
</system-reminder>
|
|
1939
1939
|
|
|
1940
|
-
${t}`}var wb=!1;function Sb(){wb||(wb=!0,Zc("review-pr",hb),gb())}function EM(e){let t=e??"builtin";switch(t){case"builtin":return"builtin";case"user":return"user";case"project":return"project";default:{let n=t;throw new Error(`[afk builtin-skills] Unhandled origin: ${String(n)}`)}}}function RM(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,acceptsAttachments:!0,...n!==void 0?{usage:n}:{},...e.whenToUse?{hint:e.whenToUse}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o,s){let i=process.env.AFK_SKILL_STREAM_VERBOSE==="1",a=new dn({out:r.out,verbose:i,activeSkillName:e.name,onCancel:()=>{r.session.current.interrupt().catch(()=>{})}});try{await a.arm();let l={skillName:e.name,rawArgs:o,source:EM(e.origin),capabilities:{compose:!0,subagents:!0}},c=r.session.current.sessionId,d=_o(c),u=await Io(l,{cwd:process.cwd(),artifactDir:d},f=>{process.env.AFK_SKILL_STREAM_VERBOSE==="1"&&r.out.warn(`preflight(${e.name}) failed: ${f instanceof Error?f.message:String(f)}`)}),p=mb(e,o,u?.manifestBlock,s);await Xn(a.sink,async()=>{for await(let f of r.session.current.sendMessageStream(p))a.sink(f)})}catch(l){r.out.line(),r.out.error(`${e.name} failed: ${l instanceof Error?l.message:String(l)}`)}finally{await a.dispose()}return"continue"}}}function vb(){Sb(),Ql(),Ys(Td(),"project");for(let e of at())an(RM(Ee(e)))}L();import{existsSync as Mo,mkdirSync as s0,renameSync as i0,rmSync as a0,symlinkSync as l0,lstatSync as c0,unlinkSync as u0}from"fs";import{basename as d0,join as lu}from"path";L();import{existsSync as gn,mkdirSync as BM,readFileSync as WM,realpathSync as Ab,renameSync as HM,rmSync as KM,symlinkSync as GM,lstatSync as zM,unlinkSync as JM}from"fs";import{basename as Cb,dirname as qM,join as Dn,resolve as ou,relative as VM}from"path";import{existsSync as Tb}from"fs";import{isAbsolute as AM,resolve as Rb}from"path";import{homedir as xb}from"os";var CM=/^(?:https?:\/\/|git:\/\/|ssh:\/\/|git\+ssh:\/\/|git@[^:]+:)/,PM=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\/([a-zA-Z0-9][a-zA-Z0-9._-]*?)(?:\.git)?$/,IM=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*):([a-zA-Z0-9][a-zA-Z0-9_.-]*)$/;function _M(e){return e==="~"?xb():e.startsWith("~/")?Rb(xb(),e.slice(2)):e}function Rr(e){let t=e.trim();if(!t)throw new Error('plugin source is required (examples: "owner/repo", "https://github.com/owner/repo.git", "./my-plugin")');if(MM(t)){let o=Eb(t);if(!Tb(o))throw new Error(`could not resolve plugin source: "${t}" looks like a local path but does not exist on disk`);return{type:"local",path:o}}if(CM.test(t))return{type:"git",url:t};let n=IM.exec(t);if(n&&n[1]&&n[2])return{type:"marketplace-ref",marketplace:n[1],plugin:n[2]};let r=PM.exec(t);if(r&&r[1]&&r[2]){let o=r[1],s=r[2];return{type:"github",owner:o,repo:s,url:`https://github.com/${o}/${s}.git`}}if(Tb(t))return{type:"local",path:Eb(t)};throw new Error(`could not resolve plugin source: "${t}". Use a git URL (https://\u2026/repo.git), GitHub shorthand (owner/repo), or a local path to a directory that exists on disk.`)}function MM(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("~")||e.startsWith("/")}function Eb(e){let t=_M(e);return AM(t)?t:Rb(process.cwd(),t)}import{execFile as $M}from"child_process";import{promisify as OM}from"util";var DM=OM($M),Ar=async(e,t)=>{try{let{stdout:n,stderr:r}=await DM("git",Array.from(e),{cwd:t,maxBuffer:20971520});return{stdout:n,stderr:r}}catch(n){throw LM(n)&&n.code==="ENOENT"?new Error("git not found on PATH \u2014 install git first"):n}};function LM(e){return typeof e=="object"&&e!==null&&"code"in e}async function Zi(e,t,n={}){await(n.runner??Ar)(["clone","--",e,t])}async function ea(e,t={}){await(t.runner??Ar)(["fetch","--tags","--prune"],e)}async function pn(e,t={}){let n=t.runner??Ar,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e);return r.split(`
|
|
1940
|
+
${t}`}var wb=!1;function Sb(){wb||(wb=!0,Zc("review-pr",hb),gb())}function EM(e){let t=e??"builtin";switch(t){case"builtin":return"builtin";case"user":return"user";case"project":return"project";default:{let n=t;throw new Error(`[afk builtin-skills] Unhandled origin: ${String(n)}`)}}}function RM(e){let t=`/${e.name}`,n=e.argumentHint?`${t} ${e.argumentHint}`:void 0;return{name:t,summary:e.description,acceptsAttachments:!0,...n!==void 0?{usage:n}:{},...e.whenToUse?{hint:e.whenToUse}:{},...e.flags&&e.flags.length>0?{flags:e.flags}:{},async handler(r,o,s){let i=process.env.AFK_SKILL_STREAM_VERBOSE==="1",a=new dn({out:r.out,verbose:i,activeSkillName:e.name,onCancel:()=>{r.session.current.interrupt().catch(()=>{})}});try{await a.arm();let l={skillName:e.name,rawArgs:o,source:EM(e.origin),capabilities:{compose:!0,subagents:!0}},c=r.session.current.sessionId,d=_o(c),u=await Io(l,{cwd:r.stats.cwd??process.cwd(),artifactDir:d},f=>{process.env.AFK_SKILL_STREAM_VERBOSE==="1"&&r.out.warn(`preflight(${e.name}) failed: ${f instanceof Error?f.message:String(f)}`)}),p=mb(e,o,u?.manifestBlock,s);await Xn(a.sink,async()=>{for await(let f of r.session.current.sendMessageStream(p))a.sink(f)})}catch(l){r.out.line(),r.out.error(`${e.name} failed: ${l instanceof Error?l.message:String(l)}`)}finally{await a.dispose()}return"continue"}}}function vb(){Sb(),Ql(),Ys(Td(),"project");for(let e of at())an(RM(Ee(e)))}L();import{existsSync as Mo,mkdirSync as s0,renameSync as i0,rmSync as a0,symlinkSync as l0,lstatSync as c0,unlinkSync as u0}from"fs";import{basename as d0,join as lu}from"path";L();import{existsSync as gn,mkdirSync as BM,readFileSync as WM,realpathSync as Ab,renameSync as HM,rmSync as KM,symlinkSync as GM,lstatSync as zM,unlinkSync as JM}from"fs";import{basename as Cb,dirname as qM,join as Dn,resolve as ou,relative as VM}from"path";import{existsSync as Tb}from"fs";import{isAbsolute as AM,resolve as Rb}from"path";import{homedir as xb}from"os";var CM=/^(?:https?:\/\/|git:\/\/|ssh:\/\/|git\+ssh:\/\/|git@[^:]+:)/,PM=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\/([a-zA-Z0-9][a-zA-Z0-9._-]*?)(?:\.git)?$/,IM=/^([a-zA-Z0-9][a-zA-Z0-9_.-]*):([a-zA-Z0-9][a-zA-Z0-9_.-]*)$/;function _M(e){return e==="~"?xb():e.startsWith("~/")?Rb(xb(),e.slice(2)):e}function Rr(e){let t=e.trim();if(!t)throw new Error('plugin source is required (examples: "owner/repo", "https://github.com/owner/repo.git", "./my-plugin")');if(MM(t)){let o=Eb(t);if(!Tb(o))throw new Error(`could not resolve plugin source: "${t}" looks like a local path but does not exist on disk`);return{type:"local",path:o}}if(CM.test(t))return{type:"git",url:t};let n=IM.exec(t);if(n&&n[1]&&n[2])return{type:"marketplace-ref",marketplace:n[1],plugin:n[2]};let r=PM.exec(t);if(r&&r[1]&&r[2]){let o=r[1],s=r[2];return{type:"github",owner:o,repo:s,url:`https://github.com/${o}/${s}.git`}}if(Tb(t))return{type:"local",path:Eb(t)};throw new Error(`could not resolve plugin source: "${t}". Use a git URL (https://\u2026/repo.git), GitHub shorthand (owner/repo), or a local path to a directory that exists on disk.`)}function MM(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("~")||e.startsWith("/")}function Eb(e){let t=_M(e);return AM(t)?t:Rb(process.cwd(),t)}import{execFile as $M}from"child_process";import{promisify as OM}from"util";var DM=OM($M),Ar=async(e,t)=>{try{let{stdout:n,stderr:r}=await DM("git",Array.from(e),{cwd:t,maxBuffer:20971520});return{stdout:n,stderr:r}}catch(n){throw LM(n)&&n.code==="ENOENT"?new Error("git not found on PATH \u2014 install git first"):n}};function LM(e){return typeof e=="object"&&e!==null&&"code"in e}async function Zi(e,t,n={}){await(n.runner??Ar)(["clone","--",e,t])}async function ea(e,t={}){await(t.runner??Ar)(["fetch","--tags","--prune"],e)}async function pn(e,t={}){let n=t.runner??Ar,{stdout:r}=await n(["tag","--list","--sort=-v:refname"],e);return r.split(`
|
|
1941
1941
|
`).map(o=>o.trim()).filter(Boolean)}async function mn(e,t,n={}){await(n.runner??Ar)(["checkout","--detach",t],e)}async function St(e,t={}){let n=t.runner??Ar,{stdout:r}=await n(["rev-parse","HEAD"],e);return r.trim()}async function vt(e,t={}){let n=t.runner??Ar;try{let{stdout:r}=await n(["symbolic-ref","refs/remotes/origin/HEAD","--short"],e);return r.trim().replace(/^origin\//,"")||"main"}catch{return"main"}}var NM=/^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;function FM(e){let t=NM.exec(e);if(!t)return null;let[,n,r,o,s]=t;return{raw:e,major:Number(n),minor:Number(r),patch:Number(o),prerelease:s??null}}function jM(e,t){if(e===null&&t===null)return 0;if(e===null)return 1;if(t===null)return-1;let n=e.split("."),r=t.split("."),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s],a=r[s];if(i===void 0)return-1;if(a===void 0)return 1;let l=/^\d+$/.test(i),c=/^\d+$/.test(a);if(l&&c){let d=Number(i)-Number(a);if(d!==0)return d}else{if(l)return-1;if(c)return 1;if(i<a)return-1;if(i>a)return 1}}return 0}function UM(e,t){return e.major!==t.major?e.major-t.major:e.minor!==t.minor?e.minor-t.minor:e.patch!==t.patch?e.patch-t.patch:jM(e.prerelease,t.prerelease)}function fn(e){let t=e.map(n=>FM(n.trim())).filter(n=>n!==null);return t.length===0?null:(t.sort((n,r)=>UM(r,n)),t[0]?.raw??null)}async function ra(e,t={},n={}){let r=n.pluginsDir??xe(),o=n.indexPath??te(),s=n.now??(()=>new Date),i=n.gitRunner?{runner:n.gitRunner}:{},a=Rr(e);if(BM(r,{recursive:!0}),a.type==="local")return YM(a,t,r,o,s);if(a.type==="marketplace-ref")throw new Error(`marketplace-ref source "${a.marketplace}:${a.plugin}" must be installed via the marketplace resolver, not installPlugin directly`);return XM(a,t,r,o,s,i)}function YM(e,t,n,r,o){Pb(e.path);let s=Ib(e.path),i=t.name??s??Cb(e.path);Ln(i);let a=Dn(n,i);Nn(a,n),su(a,t.force??!1),(gn(a)||iu(a))&&na(a),GM(e.path,a,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,enabled:!0,installedAt:l,updatedAt:l,...s&&s!==i?{manifestName:s}:{}};return Jt(i,c,r),{name:i,dir:a,entry:c}}async function XM(e,t,n,r,o,s){let i=t.name??ZM(e);Ln(i);let a=Dn(n,i);Nn(a,n),su(a,t.force??!1),gn(a)&&na(a);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await Zi(e.url,a,s);try{let c;if(t.ref)c=t.ref;else{let b=await pn(a,s);c=fn(b)??await vt(a,s)}(t.ref||await QM(a,c,s))&&await mn(a,c,s);let d=await St(a,s);Pb(a);let u=Ib(a),p=i,f=a;if(!t.name&&u&&u!==i){Ln(u);let b=Dn(n,u);Nn(b,n),su(b,t.force??!1),gn(b)&&na(b),HM(a,b),p=u,f=b}let g=o().toISOString(),h={source:l,sourceType:e.type,ref:c,commit:d,enabled:!0,installedAt:g,updatedAt:g,...u&&u!==p?{manifestName:u}:{}};return Jt(p,h,r),{name:p,dir:f,entry:h}}catch(c){try{gn(a)&&na(a)}catch{}throw c}}async function QM(e,t,n){let r=await vt(e,n);return t!==r}function ZM(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):t}function Pb(e){let t=Dn(e,".claude-plugin","plugin.json");if(gn(t))return;let n=Dn(e,".claude-plugin","marketplace.json");if(gn(n))throw new Error(`${e} contains .claude-plugin/marketplace.json instead of plugin.json. Use \`afk marketplace install <source>\` to install a marketplace, then \`afk plugin install <marketplace>:<plugin>\` to install a plugin from it.`)}function Ib(e){let t=Dn(e,".claude-plugin","plugin.json");if(!gn(t))return null;try{let n=JSON.parse(WM(t,"utf8"));return typeof n.name=="string"&&n.name.trim()?n.name.trim():null}catch{return null}}var e0=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;function Ln(e){if(!e||e.length>100||!e0.test(e))throw new Error(`Invalid plugin name "${e}": must be 1\u2013100 chars, starting with alphanumeric, containing only letters, digits, hyphens, or underscores.`)}function Nn(e,t){let n;try{n=Ab(ou(t))}catch{n=ou(t)}let r=ou(e),o;try{o=Dn(Ab(qM(r)),Cb(r))}catch{o=r}let s=VM(n,o);if(s.startsWith("..")||s==="")throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`);if(s.startsWith("/"))throw new Error(`Path traversal detected: resolved path "${e}" escapes plugin dir "${t}"`)}function su(e,t){if(!(!gn(e)&&!iu(e))&&!t)throw new Error(`plugin directory already exists: ${e} (re-run with --force to replace)`)}function iu(e){try{return zM(e).isSymbolicLink()}catch{return!1}}function na(e){if(iu(e)){JM(e);return}KM(e,{recursive:!0,force:!0})}import{existsSync as Mb,readFileSync as t0}from"fs";import{join as n0}from"path";var r0=".claude-plugin/marketplace.json";function $b(e){return n0(e,r0)}function au(e){return Mb($b(e))}function $t(e){let t=$b(e);if(!Mb(t))throw new Error(`marketplace manifest not found: ${t}`);let n;try{n=t0(t,"utf8")}catch(o){throw new Error(`could not read marketplace manifest at ${t}: ${_b(o)}`)}let r;try{r=JSON.parse(n)}catch(o){throw new Error(`marketplace manifest at ${t} is not valid JSON: ${_b(o)}`)}return o0(r,t)}function Ob(e){try{return $t(e)}catch{return null}}function o0(e,t){if(!e||typeof e!="object")throw new Error(`marketplace manifest at ${t} must be a JSON object`);let n=e,r=n.name;if(typeof r!="string"||!r.trim())throw new Error(`marketplace manifest at ${t} is missing required "name" field`);let o=n.plugins;if(!Array.isArray(o))throw new Error(`marketplace manifest at ${t} is missing required "plugins" array`);let s=new Set,i=o.map((d,u)=>{if(!d||typeof d!="object")throw new Error(`marketplace manifest at ${t}: plugins[${u}] must be an object`);let p=d,f=p.name,g=p.source;if(typeof f!="string"||!f.trim())throw new Error(`marketplace manifest at ${t}: plugins[${u}] missing required "name"`);if(typeof g!="string"||!g.trim())throw new Error(`marketplace manifest at ${t}: plugins[${u}] missing required "source"`);let h=f.trim();if(s.has(h))throw new Error(`marketplace manifest at ${t}: duplicate plugin name "${h}"`);s.add(h);let b={name:h,source:g.trim()},y=p.description;return typeof y=="string"&&(b.description=y),b}),a={name:r.trim(),plugins:i},l=n.metadata;if(l&&typeof l=="object"){let d=l,u={};typeof d.description=="string"&&(u.description=d.description),Object.keys(u).length>0&&(a.metadata=u)}let c=n.owner;if(c&&typeof c=="object"){let d=c,u={};typeof d.name=="string"&&(u.name=d.name),typeof d.email=="string"&&(u.email=d.email),Object.keys(u).length>0&&(a.owner=u)}return a}function _b(e){return e instanceof Error?e.message:String(e)}async function sa(e,t={},n={}){let r=n.cacheDir??Tt(),o=n.indexPath??te(),s=n.now??(()=>new Date),i=n.gitRunner?{runner:n.gitRunner}:{},a=Rr(e);if(a.type==="marketplace-ref")throw new Error(`marketplace source cannot itself be a marketplace reference ("${e}")`);return s0(r,{recursive:!0}),a.type==="local"?p0(a,t,r,o,s):m0(a,t,r,o,s,i)}function p0(e,t,n,r,o){let s=$t(e.path),i=t.name??s.name;Ln(i);let a=lu(n,i);Nn(a,n),cu(a,t.force??!1),(Mo(a)||uu(a))&&oa(a),l0(e.path,a,"dir");let l=o().toISOString(),c={source:e.path,sourceType:"local",ref:null,commit:null,installedAt:l,updatedAt:l};return Xr(i,c,r),{name:i,dir:a,entry:c,plugins:s.plugins.map(Db)}}async function m0(e,t,n,r,o,s){let i=t.name??g0(e);Ln(i);let a=lu(n,i);Nn(a,n),cu(a,t.force??!1),Mo(a)&&oa(a);let l=e.type==="github"?`${e.owner}/${e.repo}`:e.url;await Zi(e.url,a,s);try{let c;if(t.ref)c=t.ref;else{let b=await pn(a,s);c=fn(b)??await vt(a,s)}(t.ref||await f0(a,c,s))&&await mn(a,c,s);let d=await St(a,s),u=$t(a),p=i,f=a;if(!t.name&&u.name!==i){Ln(u.name);let b=lu(n,u.name);Nn(b,n),cu(b,t.force??!1),Mo(b)&&oa(b),i0(a,b),p=u.name,f=b}let g=o().toISOString(),h={source:l,sourceType:e.type,ref:c,commit:d,installedAt:g,updatedAt:g};return Xr(p,h,r),{name:p,dir:f,entry:h,plugins:u.plugins.map(Db)}}catch(c){try{Mo(a)&&oa(a)}catch{}throw c}}async function f0(e,t,n){let r=await vt(e,n);return t!==r}function g0(e){if(e.type==="github")return e.repo;let t=e.url.replace(/\.git$/,""),n=t.lastIndexOf("/"),r=t.lastIndexOf(":"),o=Math.max(n,r);return o>=0?t.slice(o+1):d0(t)}function cu(e,t){if(!(!Mo(e)&&!uu(e))&&!t)throw new Error(`marketplace directory already exists: ${e} (re-run with --force to replace)`)}function uu(e){try{return c0(e).isSymbolicLink()}catch{return!1}}function oa(e){if(uu(e)){u0(e);return}a0(e,{recursive:!0,force:!0})}function Db(e){return e.description?{name:e.name,description:e.description}:{name:e.name}}L();import{existsSync as h0,lstatSync as y0,rmSync as b0,unlinkSync as k0}from"fs";import{join as w0}from"path";function ia(e,t={}){let n=t.cacheDir??Tt(),r=t.indexPath??te(),o=w0(n,e),s=!1;S0(o)?(k0(o),s=!0):h0(o)&&(b0(o,{recursive:!0,force:!0}),s=!0);let i=le(r),a=Object.prototype.hasOwnProperty.call(i.marketplaces,e),l=Object.entries(i.plugins).filter(([,c])=>c.marketplace===e).map(([c])=>c);return(a||l.length>0)&&Ap(e,r),{name:e,removedDir:s,removedIndexEntry:a,removedPluginEntries:l}}function S0(e){try{return y0(e).isSymbolicLink()}catch{return!1}}L();import{existsSync as v0}from"fs";import{join as T0}from"path";async function $o(e,t={},n={}){let r=n.indexPath??te(),o=n.now??(()=>new Date),s=n.gitRunner?{runner:n.gitRunner}:{},a=le(r).marketplaces[e];if(!a)throw new Error(`marketplace "${e}" is not installed`);let l=n.cacheDir?T0(n.cacheDir,e):Hr(e);if(!v0(l))return{name:e,status:"missing-dir",dir:l};if(a.sourceType==="local")return{name:e,status:"skipped-local"};let c=new Set((Ob(l)?.plugins??[]).map(y=>y.name));await ea(l,s);let d;if(t.ref)d=t.ref;else{let y=await pn(l,s);d=fn(y)??a.ref??await vt(l,s)}if(d===a.ref){let y=await St(l,s);return{name:e,status:"up-to-date",ref:d,commit:y}}await mn(l,d,s);let u=await St(l,s),p=o().toISOString(),f={...a,ref:d,commit:u,updatedAt:p};Xr(e,f,r);let g=new Set($t(l).plugins.map(y=>y.name)),h=[...g].filter(y=>!c.has(y)),b=[...c].filter(y=>!g.has(y));return{name:e,status:"updated",fromRef:a.ref,toRef:d,commit:u,addedPlugins:h,removedPlugins:b}}async function Lb(e={}){let t=e.indexPath??te(),n=le(t),r=[];for(let o of Object.keys(n.marketplaces))try{r.push(await $o(o,{},e))}catch(s){let i=s instanceof Error?s.message:String(s);r.push({name:o,status:"missing-dir",dir:i})}return r}L();import{existsSync as aa,statSync as x0}from"fs";import{isAbsolute as E0,join as R0,resolve as Nb}from"path";async function Cr(e,t,n={},r={}){let o=r.marketplaceDirFor??Hr,s=r.indexPath??te(),i=r.now??(()=>new Date),a=o(e);if(!aa(a)||!au(a))throw new Error(`marketplace "${e}" is not installed (looked for manifest under ${a})`);let l=$t(a),c=l.plugins.find(d=>d.name===t);if(!c){let d=l.plugins.map(u=>u.name).join(", ")||"(none)";throw new Error(`marketplace "${e}" does not list a plugin named "${t}". Available: ${d}`)}return A0(c.source)?C0(e,c,a,s,i,n):P0(e,c,n,r)}function la(e,t={}){let n=t.marketplaceDirFor??Hr,r=t.indexPath??te(),o=n(e);if(!aa(o)||!au(o))throw new Error(`marketplace "${e}" is not installed`);let s=$t(o),i=le(r);return s.plugins.map(a=>{let l=`${e}:${a.name}`,c=l in i.plugins||a.name in i.plugins&&i.plugins[a.name]?.marketplace===e,d={name:a.name,installed:c,key:l};return a.description&&(d.description=a.description),d})}function A0(e){return e.startsWith("./")||e.startsWith("../")||e.startsWith("/")||e.startsWith("~")}function C0(e,t,n,r,o,s){let i=t.source,a=E0(i)||i.startsWith("~")?I0(i):Nb(n,i);if(!aa(a))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path does not exist on disk`);if(!x0(a).isDirectory())throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but that path is not a directory`);let c=R0(a,".claude-plugin","plugin.json");if(!aa(c))throw new Error(`marketplace "${e}" lists plugin "${t.name}" at ${a}, but no .claude-plugin/plugin.json was found`);let d=`${e}:${t.name}`,u=le(r);if(!s.force&&d in u.plugins&&u.plugins[d]?.enabled)throw new Error(`plugin "${d}" is already installed (re-run with --force to overwrite)`);let p=o().toISOString(),f={source:`${e}:${t.name}`,sourceType:"marketplace",ref:null,commit:null,enabled:!0,installedAt:p,updatedAt:p,marketplace:e};return Jt(d,f,r),{key:d,name:t.name,dir:a,entry:f}}async function P0(e,t,n,r){let o={name:t.name,...n.ref?{ref:n.ref}:{},...n.force?{force:!0}:{}},s=await ra(t.source,o,r),i=r.indexPath??te(),a={...s.entry,marketplace:e};return Jt(s.name,a,i),{key:s.name,name:s.name,dir:s.dir,entry:a}}function I0(e){if(e.startsWith("~")){let t=process.env.HOME??"";if(e==="~")return t;if(e.startsWith("~/"))return Nb(t,e.slice(2))}return e}var Fb=["add","plugins","install","remove","update"],_0={name:"/marketplaces",summary:"List installed plugin marketplaces",async handler(e){return $0(e),"continue"}},M0={name:"/marketplace",summary:"Manage plugin marketplaces (add | plugins | install | remove | update)",usage:"/marketplace <add|plugins|install|remove|update> [args]",async handler(e,t){let n=t.trim();if(!n)return O0(e),"continue";let[r,...o]=n.split(/\s+/);if(!r||!Fb.includes(r))return e.out.error(`Unknown subcommand "${r??""}". Try one of: ${Fb.join(", ")}.`),"continue";switch(r){case"add":return D0(e,o);case"plugins":return L0(e,o);case"install":return N0(e,o);case"remove":return F0(e,o);case"update":return j0(e,o);default:return"continue"}}};function jb(){ce(_0),ce(M0)}function $0(e){let t=le(),n=Object.entries(t.marketplaces).sort(([r],[o])=>r.localeCompare(o));if(e.out.line(),n.length===0){e.out.line(m.dim(" No marketplaces installed.")),e.out.line(m.dim(" Try: /marketplace add anthropics/claude-plugins-official")),e.out.line();return}e.out.line(m.bold("Installed marketplaces:"));for(let[r,o]of n){let s=o.ref?m.brand(o.ref):m.dim("(local)");e.out.line(` ${m.bold(r.padEnd(28))} ${s.padEnd(12)} ${m.dim(o.source)}`)}e.out.line()}function O0(e){e.out.line(),e.out.line(m.bold("/marketplace usage:")),e.out.line(` ${m.brand("/marketplace add")} <git-url|owner/repo|local-path>`),e.out.line(` ${m.brand("/marketplace plugins")} <marketplace>`),e.out.line(` ${m.brand("/marketplace install")} <marketplace> <plugin>`),e.out.line(` ${m.brand("/marketplace remove")} <marketplace>`),e.out.line(` ${m.brand("/marketplace update")} [<marketplace>]`),e.out.line()}async function D0(e,t){if(t.length===0)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let[n,r,...o]=t;if(!n)return e.out.error("Usage: /marketplace add <source> [name]"),"continue";let s=U0(o);e.out.info(`Installing marketplace ${n}\u2026`);try{let i=await sa(n,{...r&&!r.startsWith("-")?{name:r}:{},...s.ref?{ref:s.ref}:{},...s.force?{force:!0}:{}});e.out.success(`Installed marketplace ${i.name} (${i.plugins.length} plugin(s) available).`),e.out.line(m.dim(` Next: /marketplace plugins ${i.name}`))}catch(i){e.out.error(`Install failed: ${ca(i)}`)}return"continue"}function L0(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace plugins <marketplace>"),"continue";try{let r=la(n);if(e.out.line(),r.length===0)return e.out.line(m.dim(` Marketplace "${n}" lists no plugins.`)),e.out.line(),"continue";e.out.line(m.bold(`Plugins in ${n}:`)),r.forEach((o,s)=>{let i=o.installed?m.brand("[\u2713]"):m.dim("[ ]"),a=o.description?m.dim(` \u2014 ${o.description}`):"";e.out.line(` ${i} ${m.bold(String(s+1).padStart(2))}. ${m.bold(o.name)}${a}`)}),e.out.line(),e.out.line(m.dim(` Install one: /marketplace install ${n} <plugin>`)),e.out.line()}catch(r){e.out.error(`List failed: ${ca(r)}`)}return"continue"}async function N0(e,t){let n,r;if(t.length===1&&t[0]?.includes(":")){let o=t[0].split(":");o.length===2&&([n,r]=o)}else[n,r]=t;if(!n||!r)return e.out.error("Usage: /marketplace install <marketplace> <plugin>"),"continue";e.out.info(`Installing ${n}:${r}\u2026`);try{let o=await Cr(n,r);e.out.success(`Installed ${o.key}.`),e.out.line(m.dim(" Run /reload-plugins to refresh this session's slash commands."))}catch(o){e.out.error(`Install failed: ${ca(o)}`)}return"continue"}function F0(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace remove <marketplace>"),"continue";let r=ia(n);if(!r.removedDir&&!r.removedIndexEntry&&r.removedPluginEntries.length===0)return e.out.line(m.dim(` No marketplace named "${n}" to remove.`)),"continue";let o=r.removedPluginEntries.length>0?` + ${r.removedPluginEntries.length} plugin(s)`:"";return e.out.success(`Removed marketplace ${n}${o}.`),"continue"}async function j0(e,t){let n=t[0];if(!n)return e.out.error("Usage: /marketplace update <marketplace>"),"continue";e.out.info(`Updating ${n}\u2026`);try{let r=await $o(n);switch(r.status){case"updated":{let o=r.addedPlugins.length>0?` +${r.addedPlugins.join(", ")}`:"",s=r.removedPlugins.length>0?` -${r.removedPlugins.join(", ")}`:"";e.out.success(`Updated ${n}: ${r.fromRef??"(none)"} \u2192 ${r.toRef}${o}${s}`);break}case"up-to-date":e.out.info(`${n} is up-to-date (${r.ref}).`);break;case"skipped-local":e.out.info(`${n} skipped (local source).`);break;case"missing-dir":e.out.warn(`${n}: marketplace dir missing (${r.dir}).`);break}}catch(r){e.out.error(`Update failed: ${ca(r)}`)}return"continue"}function U0(e){let t={};for(let n=0;n<e.length;n+=1){let r=e[n];r==="-f"||r==="--force"?t.force=!0:(r==="-r"||r==="--ref")&&e[n+1]&&(t.ref=e[n+1],n+=1)}return t}function ca(e){return e instanceof Error?e.message:String(e)}Vy("shadow-verify",{glyph:"\u25C8",color:"#7B5EA7",inFlightVerb:"verifying\u2026"});function Ub(){ch();for(let e of gh)ce(e);for(let e of xh)ce(e);ce(Rh),ce(Lh),ce(Nh),ce(Fh),ce(Kh),ce(zh);for(let e of Yh)ce(e);ce(Zh),ce(ty),ce(Jy),ce(Qy),ce(eb),vb(),lh(nb),pb(),rb(),jb()}function Bb(e,t={}){if(!e.isTTY)return{writeLine:o=>{e.write(o+`
|
|
1942
1942
|
`)},setCompositor:()=>{}};let n=null,r=t.statusLine;return{writeLine(o){if(n?.isArmed()){n.commitAbove(o);return}r?r.withFullScrollRegion(()=>{e.write(o+`
|
|
1943
1943
|
`)}):e.write(o+`
|
|
@@ -1949,7 +1949,7 @@ ${Y0(i)}
|
|
|
1949
1949
|
`),this.client=a,this.connected=!0,this.pendingAuthTransport=void 0;let l=await ha(this.client.listTools(),s,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${s}ms`),()=>a.close().catch(()=>{})),c=this.client.getServerVersion();return{tools:l.tools,serverInfo:c?{name:c.name,version:c.version}:void 0}}async listTools(){if(!this.client)throw new Error(`McpClient(${this.serverName}): not connected`);let t=this.config.timeout??pu;return(await ha(this.client.listTools(),t,()=>new Error(`MCP server "${this.serverName}" listTools timed out after ${t}ms`))).tools}async refreshTools(){return this.listTools()}async callTool(t,n,r){if(!this.client)return{content:`MCP server "${this.serverName}" is not connected`,isError:!0};if(r.aborted)return{content:"Tool call aborted",isError:!0};let o=this.config.timeout??pu,s;try{s=await this.client.callTool({name:t,arguments:n??{}},r$,{signal:r,timeout:o})}catch(i){let a=i instanceof Error?i.message:String(i);return{content:`MCP tool "${this.serverName}.${t}" failed: ${a}`,isError:!0}}return o$(s)}async finishAuth(t){if(!this.pendingAuthTransport)throw new Error(`McpClient(${this.serverName}): no pending OAuth transport \u2014 server is not in oauth_pending state`);await this.pendingAuthTransport.finishAuth(t)}async disconnect(){if(this.pendingAuthTransport=void 0,!this.client)return;let t=this.client;this.client=void 0,this.connected=!1;try{await t.close()}catch{}}};function o$(e){let t=[];for(let r of e.content??[])if(r.type==="text")t.push(r.text);else if(r.type==="image")t.push(`[image block: mimeType=${r.mimeType}, ${r.data.length} bytes base64]`);else if(r.type==="resource"){let o="resource"in r&&typeof r.resource=="object"?r.resource.uri??"(unknown)":"(unknown)";t.push(`[resource block: ${o}]`)}else t.push(`[unknown block: ${JSON.stringify(r)}]`);let n=t.join(`
|
|
1950
1950
|
`);return{content:n.length===0?"(empty tool result)":n,...e.isError?{isError:!0}:{}}}function s$(e,t,n){let r=t.type??(t.command?"stdio":"streamable-http");return{primary:ga(e,t,n),fallback:r==="streamable-http"?()=>ga(e,{...t,type:"sse"},n):null}}function i$(e){return e instanceof Jb&&(e.code===404||e.code===405)}function a$(e){return e instanceof Jb?e.code:void 0}function ha(e,t,n,r){let o=null,s=new Promise((i,a)=>{o=setTimeout(()=>{if(r!==void 0)try{let l=r();l&&typeof l.then=="function"&&l.catch(()=>{})}catch{}a(n())},t)});return Promise.race([e,s]).finally(()=>{o!==null&&clearTimeout(o)})}import{createHash as l$}from"node:crypto";var qb="mcp__",Vb="__",fu=64,c$=6;function Oo(e){if(e.length===0)return"_";let n=e.replace(/[^a-zA-Z0-9_-]/g,"_").replace(/_{2,}/g,"_");return n.length===0?"_":n}function u$(e){return l$("sha256").update(e).digest("hex").slice(0,c$)}function Yb(e,t){let n=Oo(e),r=Oo(t),o=`${qb}${n}${Vb}${r}`;if(o.length<=fu)return o;let i=`${`${qb}${u$(e)}${Vb}`}${r}`;return i.length<=fu?i:i.slice(0,fu)}function Do(e){let t=new Map,n=new Map;for(let{serverName:o,toolNames:s}of e)for(let i of s){let a=Yb(o,i),l={serverName:o,originalToolName:i},c=t.get(a);if(c===void 0){t.set(a,l);continue}if(c.serverName===o&&c.originalToolName===i)continue;let d=n.get(a)??[c];d.push(l),n.set(a,d)}let r=[];for(let[o,s]of n)r.push({wireName:o,pairs:s});return{tools:t,conflicts:r}}var Lo=class e{records;nameRegistry;onToolsRefreshed;constructor(t){this.records=t;let n=[];for(let[o,s]of t)s.state.status==="connected"&&n.push({serverName:o,toolNames:s.tools.map(i=>i.name)});let r=Do(n);if(r.conflicts.length>0){let o=r.conflicts.map(s=>{let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");return` ${s.wireName} \u2190 ${i}`});throw new Error(`MCP tool name conflicts (rename one of the servers in mcp.json):
|
|
1951
1951
|
${o.join(`
|
|
1952
|
-
`)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],s={manager:void 0};for(let[c,d]of Object.entries(t)){let u=Oo(c);if(u!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${u}" for wire encoding`),d.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:d,status:"disabled",toolCount:0}});continue}let f={client:void 0,tools:[],state:{serverName:c,config:d,status:"connecting",toolCount:0}};r.set(c,f);let g=new Pr(c,d);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=ya(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{s.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{try{let{tools:b,serverInfo:y}=await g.connect();f.tools=b,f.state.status="connected",f.state.toolCount=b.length,f.state.lastListedAt=Date.now();let w=y?`${y.name}@${y.version}`:"unknown";console.log(`[mcp:${c}] connected (${w}) \u2014 ${b.length} tool(s)`)}catch(b){if(b instanceof mu){f.state.status="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let y=b instanceof Error?b.message:String(b);if(f.state.status="error",f.state.error=ya(y,200),d.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${y}`);console.warn(`[mcp:${c}] connect failed: ${y}`)}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return s.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);if(!s||s.state.status!=="connected")continue;let i=s.tools.find(a=>a.name===o);i&&t.push(d$(n,i))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);!s||s.state.status!=="connected"||t.set(n,async(i,a)=>s.client?s.client.callTool(o,i,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[s,i]of this.nameRegistry)i.serverName===t&&this.nameRegistry.delete(s);let o=Do([{serverName:t,toolNames:r.map(s=>s.name)}]);if(o.conflicts.length>0)for(let s of o.conflicts){let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${s.wireName} \u2190 ${i}`)}for(let[s,i]of o.tools)this.nameRegistry.set(s,i);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new Pr(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=ya(i.message,200),console.warn(`[mcp:${t}] transport error: ${i.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:i,serverInfo:a}=await o.connect();r.tools=i,r.state.status="connected",r.state.toolCount=i.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${i.length} tool(s)`)}catch(i){let a=i instanceof Error?i.message:String(i);throw r.state.status="error",r.state.error=ya(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[i,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(i);let s=Do([{serverName:t,toolNames:r.tools.map(i=>i.name)}]);for(let[i,a]of s.tools)this.nameRegistry.set(i,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let s=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${s}`)}));await Promise.all(t)}};function d$(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function ya(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}L();import{existsSync as jo,lstatSync as p$,readFileSync as m$,readdirSync as f$}from"node:fs";import{join as Fo}from"node:path";function ba(){return Fo(yn(),"mcp.json")}function Xb(e=process.cwd()){return Fo(e,".mcp.json")}var g$=5;function gu(e=xe()){if(!jo(e))return[];let t=[];return Qb(e,e,0,t,new Set),t}function Qb(e,t,n,r,o){if(n>g$||o.has(t))return;o.add(t);let s=Fo(t,".claude-plugin","plugin.json");if(jo(s)){let a=Fo(t,".claude-plugin","mcp.json");jo(a)&&r.push(a);return}let i;try{i=f$(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=Fo(t,a),c;try{c=p$(l)}catch{continue}c.isDirectory()&&Qb(e,l,n+1,r,o)}}function h$(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(s=>typeof s=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let s={};for(let[i,a]of Object.entries(n.env))typeof a=="string"&&(s[i]=a);o.env=s}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let s={};for(let[i,a]of Object.entries(n.headers))typeof a=="string"&&(s[i]=a);o.headers=s}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),{ok:!0,config:o}}function No(e){if(!jo(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(m$(e,"utf-8"))}catch(i){let a=i instanceof Error?i.message:String(i);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let s={};for(let[i,a]of Object.entries(o)){let l=h$(i,a);l.ok?s[i]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:s,sources:[e],warnings:t}}function hu(e={}){let t=[],n=[];if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?gu(a):gu();for(let c of l)t.push({path:c,loaded:No(c)})}if(!e.skipUserGlobal){let a=ba();t.push({path:a,loaded:No(a)})}if(!e.skipProjectLocal&&process.env.AFK_ALLOW_PROJECT_MCP!=="0"){let a=Xb(e.cwd);jo(a)&&(t.push({path:a,loaded:No(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:No(e.cliOverride)});let r=new Map,o=[...n],s=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)s.includes(l)||s.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let d=r.get(l);d&&o.push(`mcp: server "${l}" defined in ${d.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let i={};for(let[a,l]of r)i[a]=l.config;return{mcpServers:i,sources:s,warnings:o}}Ei();function Zb(e){if(e.resume&&e.continue)throw new Error("Use either --resume <id> or --continue, not both.");if(e.resume){let t=hi(e.resume);return t?{id:t.id,resumeId:t.data.sessionId??t.id,stored:t.data}:{id:e.resume,resumeId:e.resume}}if(e.continue){let t=wo()[0];if(!t)throw new Error("No saved sessions found for --continue. Run a session first or use /save.");let n=ko(t.path);if(!n)throw new Error(`Could not load latest saved session: ${t.id}`);return{id:t.id,resumeId:n.sessionId??t.id,stored:n}}}function ka(e){return e?{resume:e.resumeId,sessionId:e.resumeId,...e.stored?{resumeHistory:e.stored.turns.map(t=>({user:t.user,assistant:t.assistant}))}:{}}:{}}function yu(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function Uo(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${yu(r)}`))}async function ek(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(i){let a=i instanceof Error?i.message:String(i);return{ok:!1,reason:`buildSession failed: ${yu(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=yu(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{Uo(t.completionWriter,"new session close after init failure",a)});let i=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(m.warning(`\u26A0 ${i}`)),{ok:!1,reason:i}}await t.backgroundRegistry.cancelAll().catch(i=>{Uo(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{Uo(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(wi(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.planMode=!1,delete t.stats.pendingPlanExit;try{t.onSwapped(e)}catch(i){Uo(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await Yi(n).catch(i=>{Uo(t.completionWriter,"autoRegisterPluginPassthroughs failed",i)});let s=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&s.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&s.push(_e(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(Y(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),t.statusLine.repaint(So(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function tk(e){return new We(An({model:e.model,apiKey:ne(),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},provider:e.provider}))}async function rk(e,t){let n=Zb(e),r=ka(n),o=n?.stored?.model??e.model,s,i,a;s=Zt(e.thinking)??or(),i=en(e.effort)??sr(),a=ar(e.maxOutputTokens)??fo();let l=rr()??nr(),c=Ne(),d=c.systemPromptSource,u=c.autoRouting?.interactive??!0,p=si(l,u),f={current:null},g=ne(),h=new H({apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{}}),b=n?.stored?.sessionId,y=mi(b?{sessionLabel:b}:{}),w=new li(y?{traceWriter:y.writer}:{});Jh(w);let A=c.bgSummaries===!0&&g?new ma({registry:w,apiKey:g,maxCallsPerSession:c.maxSummaryCallsPerSession??200}):void 0;A?.start(),qh(A);let S=ci(),_={get sessionId(){return f.current?.sessionId},getInputStreamRef(){return f.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return f.current?.abortSignal??new AbortController().signal}},v=ui(o,g,S,c.baseUrl,y?.writer),E=new sn({subagentManager:h,parentSession:_,defaultConfig:{apiKey:g,systemPrompt:l,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{}},defaultSubagentModel:Qt(),childProviderFactory:S,childSkillExecutorFactory:v,backgroundRegistry:w}),R=new on({parentSession:_,defaultModel:o,defaultSubagentModel:Qt(),apiKey:g,childProviderFactory:S,childSkillExecutorFactory:v,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...y?.writer!==void 0?{traceWriter:y.writer}:{}}),x=new pr({parentSession:_,defaultModel:o,defaultSubagentModel:Qt(),apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},systemPrompt:l??""}),O=new Ce,P;{let $e=t?.cwd??process.cwd(),je=hu({cwd:$e,...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),yd=Object.values(je.mcpServers).filter(Br=>!Br.disabled).length;if(yd>0){let Br=je.sources.length===1?je.sources[0]:`${je.sources.length} source(s)`;console.log(m.dim(` mcp: ${yd} server(s) from ${Br??ba()}`)),P=await Lo.fromConfig(je.mcpServers,{warnings:je.warnings})}else if(je.warnings.length>0)for(let Br of je.warnings)console.warn(`[mcp] ${Br}`)}let $=Js(e.provider,{subagentExecutor:E,skillExecutor:R,composeExecutor:x,memoryStore:O,model:String(o),...c.openaiBaseUrl!==void 0?{openaiBaseUrl:c.openaiBaseUrl}:{},...P!==void 0?{mcpManager:P}:{}})??new Ie({permissions:{allowedTools:[...Vt,...xn,"agent","skill","compose",...P?.getMcpToolWireNames()??[]]},subagentExecutor:E,skillExecutor:R,composeExecutor:x,memoryStore:O,surface:"cli",...P!==void 0?{mcpManager:P}:{}}),I=ph(o);n?.stored&&wi(I,n.stored,n.resumeId),I.cwd=t?.cwd??process.cwd(),y&&console.log(m.dim(` trace: ${y.tracePath}`));let N={fn:$e=>console.log($e)},V=new bi,U=Bb(process.stdout,{statusLine:V}),C=mr($e=>{N.fn(ii($e))},"cli",O,()=>I.planMode?"plan":"default").registry,D={model:o,resumeConfig:r,systemPrompt:p,systemPromptSource:d,thinking:s,effort:i,maxOutputTokens:a,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},provider:$,hookRegistry:C,traceWriter:y?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:c.autoResumeOnUsageLimit},B=tk(D);f.current=B;let j=new ua,Z=Tr(),M=new da(B),we={session:f,stats:I,out:Z,ui:{clearScreen:()=>{V.stop(),M.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),V.start(),V.repaint(So(I,M))},repaintStatusLine:()=>V.repaint(So(I,M))},ledger:j,...P!==void 0?{mcpManager:P}:{}},qe=$e=>(j.clear(),ek($e,{sessionRef:f,stats:I,contextSampler:M,statusLine:V,backgroundRegistry:w,completionWriter:N,isInFlight:()=>Ve.getInFlight?.()??!1,onSwapped:je=>{Ve.resumeTarget=je,Ve.clearVerdictLedger?.()},buildSession:je=>tk({...D,model:je.stored?.model??D.model,resumeConfig:ka(je)})})),Ve={session:f,memoryStore:O,stats:I,statusLine:V,contextSampler:M,completionWriter:N,replRenderer:U,slashCtx:we,rl:null,options:e,...n!==void 0?{resumeTarget:n}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:w,...A!==void 0?{bgSummarizer:A}:{},requestResume:qe,getInFlight:()=>!1,...P!==void 0?{mcpManager:P}:{}},Lt=$e=>{N.fn(Xy($e,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},Ur=$e=>{N.fn(Yy($e,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),j.record($e)};Dg(Lt),$g(Ur),Ve.teardownTrustedSkillEvents=()=>{Lg(Lt),Og(Ur)},Ub(),$ instanceof Ie&&Zy($);let Qo=nk.createInterface({input:process.stdin,output:process.stdout,terminal:!1});return Ve.rl=Qo,we.requestResume=qe,Ve}import{promises as Bo}from"node:fs";import*as sk from"node:os";import*as wa from"node:path";async function ok(e,t,n=!1){await Bo.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=wa.join(e,`${r}.md`),s=n?" (continued)":"";return await Bo.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
|
|
1952
|
+
`)}`)}this.nameRegistry=r.tools}static async fromConfig(t,n={}){if(n.warnings&&n.warnings.length>0)for(let c of n.warnings)console.warn(`[mcp] ${c}`);let r=new Map,o=[],s={manager:void 0};for(let[c,d]of Object.entries(t)){let u=Oo(c);if(u!==c&&console.warn(`[mcp] server name "${c}" sanitized to "${u}" for wire encoding`),d.disabled){r.set(c,{client:void 0,tools:[],state:{serverName:c,config:d,status:"disabled",toolCount:0}});continue}let f={client:void 0,tools:[],state:{serverName:c,config:d,status:"connecting",toolCount:0}};r.set(c,f);let g=new Pr(c,d);f.client=g,g.onTransportError=b=>{f.state.status="error",f.state.error=ya(b.message,200),console.warn(`[mcp:${c}] transport error: ${b.message}`)},g.onToolListChanged=()=>{s.manager?.refreshServer(c).catch(b=>{let y=b instanceof Error?b.message:String(b);console.warn(`[mcp:${c}] refreshServer failed: ${y}`)})};let h=(async()=>{try{let{tools:b,serverInfo:y}=await g.connect();f.tools=b,f.state.status="connected",f.state.toolCount=b.length,f.state.lastListedAt=Date.now();let w=y?`${y.name}@${y.version}`:"unknown";console.log(`[mcp:${c}] connected (${w}) \u2014 ${b.length} tool(s)`)}catch(b){if(b instanceof mu){f.state.status="oauth_pending",console.log(`[mcp:${c}] OAuth authorization required \u2014 check Telegram or stderr for the auth URL`);return}let y=b instanceof Error?b.message:String(b);if(f.state.status="error",f.state.error=ya(y,200),d.alwaysLoad===!0)throw new Error(`MCP server "${c}" is marked alwaysLoad but failed to connect: ${y}`);console.warn(`[mcp:${c}] connect failed: ${y}`)}})();o.push(h)}let a=(await Promise.allSettled(o)).find(c=>c.status==="rejected");if(a){for(let c of r.values())c.client&&await c.client.disconnect().catch(()=>{});throw a.reason}let l=new e(r);return s.manager=l,l}getMcpTools(){let t=[];for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);if(!s||s.state.status!=="connected")continue;let i=s.tools.find(a=>a.name===o);i&&t.push(d$(n,i))}return t}getMcpHandlers(){let t=new Map;for(let[n,{serverName:r,originalToolName:o}]of this.nameRegistry){let s=this.records.get(r);!s||s.state.status!=="connected"||t.set(n,async(i,a)=>s.client?s.client.callTool(o,i,a):{content:`MCP server "${r}" is not connected`,isError:!0})}return t}async refreshServer(t){let n=this.records.get(t);if(!n||!n.client||n.state.status!=="connected")throw new Error(`McpManager.refreshServer("${t}"): server is not connected`);let r=await n.client.refreshTools();for(let[s,i]of this.nameRegistry)i.serverName===t&&this.nameRegistry.delete(s);let o=Do([{serverName:t,toolNames:r.map(s=>s.name)}]);if(o.conflicts.length>0)for(let s of o.conflicts){let i=s.pairs.map(a=>`${a.serverName}.${a.originalToolName}`).join(", ");console.warn(`[mcp:${t}] wire-name conflict after refresh \u2014 skipping: ${s.wireName} \u2190 ${i}`)}for(let[s,i]of o.tools)this.nameRegistry.set(s,i);n.tools=r,n.state.toolCount=r.length,n.state.lastListedAt=Date.now(),console.log(`[mcp:${t}] tool list refreshed \u2014 ${r.length} tool(s)`),this.onToolsRefreshed?.(t)}getServerStates(){return[...this.records.values()].map(t=>({...t.state}))}getMcpToolWireNames(){return[...this.nameRegistry.keys()]}async completeAuth(t,n){let r=this.records.get(t);if(!r)throw new Error(`McpManager.completeAuth("${t}"): server not found`);if(r.state.status!=="oauth_pending")throw new Error(`McpManager.completeAuth("${t}"): server is not in oauth_pending state (current status: ${r.state.status})`);if(!r.client)throw new Error(`McpManager.completeAuth("${t}"): no client record \u2014 server was never connected`);await r.client.finishAuth(n),await r.client.disconnect().catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] completeAuth disconnect warning: ${a}`)});let o=new Pr(t,r.state.config);o.onTransportError=i=>{r.state.status="error",r.state.error=ya(i.message,200),console.warn(`[mcp:${t}] transport error: ${i.message}`)},o.onToolListChanged=()=>{this.refreshServer(t).catch(i=>{let a=i instanceof Error?i.message:String(i);console.warn(`[mcp:${t}] refreshServer failed: ${a}`)})},r.state.status="connecting",r.state.error=void 0,r.client=o;try{let{tools:i,serverInfo:a}=await o.connect();r.tools=i,r.state.status="connected",r.state.toolCount=i.length,r.state.lastListedAt=Date.now();let l=a?`${a.name}@${a.version}`:"unknown";console.log(`[mcp:${t}] OAuth complete \u2014 connected (${l}) \u2014 ${i.length} tool(s)`)}catch(i){let a=i instanceof Error?i.message:String(i);throw r.state.status="error",r.state.error=ya(a,200),new Error(`McpManager.completeAuth("${t}"): reconnect failed: ${a}`)}for(let[i,a]of this.nameRegistry)a.serverName===t&&this.nameRegistry.delete(i);let s=Do([{serverName:t,toolNames:r.tools.map(i=>i.name)}]);for(let[i,a]of s.tools)this.nameRegistry.set(i,a);this.onToolsRefreshed?.(t)}hasAnyConnected(){for(let t of this.records.values())if(t.state.status==="connected")return!0;return!1}size(){return this.records.size}async disconnectAll(){let t=[];for(let[n,r]of this.records)r.client&&t.push(r.client.disconnect().catch(o=>{let s=o instanceof Error?o.message:String(o);console.warn(`[mcp:${n}] disconnect error: ${s}`)}));await Promise.all(t)}};function d$(e,t){let n=t.description??`MCP tool ${t.name}`;return{name:e,description:n,input_schema:t.inputSchema}}function ya(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}L();import{existsSync as jo,lstatSync as p$,readFileSync as m$,readdirSync as f$}from"node:fs";import{join as Fo}from"node:path";function ba(){return Fo(yn(),"mcp.json")}function Xb(e=process.cwd()){return Fo(e,".mcp.json")}var g$=5;function gu(e=xe()){if(!jo(e))return[];let t=[];return Qb(e,e,0,t,new Set),t}function Qb(e,t,n,r,o){if(n>g$||o.has(t))return;o.add(t);let s=Fo(t,".claude-plugin","plugin.json");if(jo(s)){let a=Fo(t,".claude-plugin","mcp.json");jo(a)&&r.push(a);return}let i;try{i=f$(t)}catch{return}for(let a of i){if(a.startsWith("."))continue;let l=Fo(t,a),c;try{c=p$(l)}catch{continue}c.isDirectory()&&Qb(e,l,n+1,r,o)}}function h$(e,t){if(t===null||typeof t!="object"||Array.isArray(t))return{ok:!1,error:`server "${e}" must be an object`};let n=t,r=n.type;if(r===void 0)if(typeof n.command=="string")r="stdio";else if(typeof n.url=="string")r="streamable-http";else return{ok:!1,error:`server "${e}" has no \`command\` or \`url\`; cannot infer transport`};if(r==="stdio"){if(typeof n.command!="string"||n.command.length===0)return{ok:!1,error:`stdio server "${e}" requires non-empty \`command\``}}else if(r==="streamable-http"||r==="sse"){if(typeof n.url!="string"||n.url.length===0)return{ok:!1,error:`${r} server "${e}" requires non-empty \`url\``}}else return{ok:!1,error:`server "${e}" has unsupported \`type\`: ${String(r)}`};let o={type:r};if(typeof n.command=="string"&&(o.command=n.command),Array.isArray(n.args)&&(o.args=n.args.filter(s=>typeof s=="string")),n.env!==void 0&&typeof n.env=="object"&&n.env!==null){let s={};for(let[i,a]of Object.entries(n.env))typeof a=="string"&&(s[i]=a);o.env=s}if(typeof n.url=="string"&&(o.url=n.url),n.headers!==void 0&&typeof n.headers=="object"&&n.headers!==null){let s={};for(let[i,a]of Object.entries(n.headers))typeof a=="string"&&(s[i]=a);o.headers=s}return typeof n.oauth=="boolean"&&(o.oauth=n.oauth),typeof n.disabled=="boolean"&&(o.disabled=n.disabled),typeof n.alwaysLoad=="boolean"&&(o.alwaysLoad=n.alwaysLoad),typeof n.timeout=="number"&&n.timeout>0&&(o.timeout=n.timeout),{ok:!0,config:o}}function No(e){if(!jo(e))return{mcpServers:{},sources:[],warnings:[]};let t=[],n;try{n=JSON.parse(m$(e,"utf-8"))}catch(i){let a=i instanceof Error?i.message:String(i);return t.push(`mcp.json at ${e}: parse error \u2014 ${a}`),{mcpServers:{},sources:[e],warnings:t}}if(n===null||typeof n!="object"||Array.isArray(n))return t.push(`mcp.json at ${e}: top-level must be an object`),{mcpServers:{},sources:[e],warnings:t};let o=n.mcpServers;if(o==null||typeof o!="object")return{mcpServers:{},sources:[e],warnings:t};let s={};for(let[i,a]of Object.entries(o)){let l=h$(i,a);l.ok?s[i]=l.config:t.push(`mcp.json at ${e}: skipping ${l.error}`)}return{mcpServers:s,sources:[e],warnings:t}}function hu(e={}){let t=[],n=[];if(e.pluginsRoot!==null){let a=e.pluginsRoot,l=a?gu(a):gu();for(let c of l)t.push({path:c,loaded:No(c)})}if(!e.skipUserGlobal){let a=ba();t.push({path:a,loaded:No(a)})}if(!e.skipProjectLocal&&process.env.AFK_ALLOW_PROJECT_MCP!=="0"){let a=Xb(e.cwd);jo(a)&&(t.push({path:a,loaded:No(a)}),n.push(`mcp: loaded project-local config from ${a} \u2014 set AFK_ALLOW_PROJECT_MCP=0 to disable auto-load`))}e.cliOverride!==void 0&&t.push({path:e.cliOverride,loaded:No(e.cliOverride)});let r=new Map,o=[...n],s=[];for(let a of t){for(let l of a.loaded.warnings)o.push(l);if(a.loaded.sources.length>0)for(let l of a.loaded.sources)s.includes(l)||s.push(l);for(let[l,c]of Object.entries(a.loaded.mcpServers)){let d=r.get(l);d&&o.push(`mcp: server "${l}" defined in ${d.source} is overridden by ${a.path}`),r.set(l,{config:c,source:a.path})}}let i={};for(let[a,l]of r)i[a]=l.config;return{mcpServers:i,sources:s,warnings:o}}Ei();function Zb(e){if(e.resume&&e.continue)throw new Error("Use either --resume <id> or --continue, not both.");if(e.resume){let t=hi(e.resume);return t?{id:t.id,resumeId:t.data.sessionId??t.id,stored:t.data}:{id:e.resume,resumeId:e.resume}}if(e.continue){let t=wo()[0];if(!t)throw new Error("No saved sessions found for --continue. Run a session first or use /save.");let n=ko(t.path);if(!n)throw new Error(`Could not load latest saved session: ${t.id}`);return{id:t.id,resumeId:n.sessionId??t.id,stored:n}}}function ka(e){return e?{resume:e.resumeId,sessionId:e.resumeId,...e.stored?{resumeHistory:e.stored.turns.map(t=>({user:t.user,assistant:t.assistant}))}:{}}:{}}function yu(e){return e.replace(/\bsk-ant-[A-Za-z0-9_-]{10,}/g,"sk-ant-[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{10,}/g,"sk-[REDACTED]").replace(/Bearer\s+[A-Za-z0-9._-]{10,}/gi,"Bearer [REDACTED]").replace(/Authorization:\s*\S+/gi,"Authorization: [REDACTED]")}function Uo(e,t,n){let r=n instanceof Error?n.message:String(n);e.fn(m.warning(`\u26A0 [resume-swap] ${t}: ${yu(r)}`))}async function ek(e,t){if(t.isInFlight()===!0)return{ok:!1,reason:"A turn is in flight \u2014 wait for it to finish before resuming."};let n;try{n=t.buildSession(e)}catch(i){let a=i instanceof Error?i.message:String(i);return{ok:!1,reason:`buildSession failed: ${yu(a)}`}}let r;if(!await n.waitForInitialization().then(()=>!0,i=>(r=yu(i instanceof Error?i.message:String(i)),!1))){await n.close().catch(a=>{Uo(t.completionWriter,"new session close after init failure",a)});let i=`Session initialization failed: ${r??"unknown error"}`;return t.completionWriter.fn(m.warning(`\u26A0 ${i}`)),{ok:!1,reason:i}}await t.backgroundRegistry.cancelAll().catch(i=>{Uo(t.completionWriter,"cancelAll failed",i)}),await t.sessionRef.current.close().catch(i=>{Uo(t.completionWriter,"session close failed",i)}),t.sessionRef.current=n,e.stored?(wi(t.stats,e.stored,e.resumeId),t.stats.turnCosts=[],t.stats.turnTokens=[]):(t.stats.totalTurns=0,t.stats.totalCostUsd=0,t.stats.totalTokens=0,t.stats.totalDurationMs=0,t.stats.turns=[],t.stats.sessionId=e.resumeId,t.stats.sessionStartTime=Date.now(),t.stats.turnCosts=[],t.stats.turnTokens=[]),t.stats.planMode=!1,delete t.stats.pendingPlanExit;try{t.onSwapped(e)}catch(i){Uo(t.completionWriter,"onSwapped callback threw",i)}t.contextSampler.attach(n),await Yi(n).catch(i=>{Uo(t.completionWriter,"autoRegisterPluginPassthroughs failed",i)});let s=[`\u21AA Resumed ${e.id}`];return t.stats.totalTurns>0&&s.push(`${t.stats.totalTurns} prior turn${t.stats.totalTurns===1?"":"s"}`),t.stats.totalCostUsd>0&&s.push(_e(t.stats.totalCostUsd)),t.stats.totalTokens>0&&s.push(Y(t.stats.totalTokens)+" tokens"),t.completionWriter.fn(m.brand(s.join(" \xB7 "))),t.statusLine.repaint(So(t.stats,t.contextSampler)),{ok:!0,sessionId:n.sessionId??t.stats.sessionId??e.resumeId}}function tk(e){return new We(An({model:e.model,apiKey:ne(),maxTurns:e.maxTurns,hookRegistry:e.hookRegistry,...e.systemPrompt!==void 0?{systemPrompt:e.systemPrompt}:{},...e.systemPromptSource!==void 0?{systemPromptSource:e.systemPromptSource}:{},...e.thinking!==void 0?{thinking:e.thinking}:{},...e.effort!==void 0?{effort:e.effort}:{},...e.maxOutputTokens!==void 0?{maxOutputTokens:e.maxOutputTokens}:{},...e.resumeConfig,...e.cwd!==void 0?{cwd:e.cwd}:{},...e.traceWriter!==void 0?{traceWriter:e.traceWriter}:{},...e.autoResumeOnUsageLimit!==void 0?{autoResumeOnUsageLimit:e.autoResumeOnUsageLimit}:{},...e.baseUrl!==void 0?{baseUrl:e.baseUrl}:{},provider:e.provider}))}async function rk(e,t){let n=Zb(e),r=ka(n),o=n?.stored?.model??e.model,s,i,a;s=Zt(e.thinking)??or(),i=en(e.effort)??sr(),a=ar(e.maxOutputTokens)??fo();let l=rr()??nr(),c=Ne(),d=c.systemPromptSource,u=c.autoRouting?.interactive??!0,p=si(l,u),f={current:null},g=ne(),h=new H({apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...t?.cwd!==void 0?{cwd:t.cwd}:{}}),b=n?.stored?.sessionId,y=mi(b?{sessionLabel:b}:{}),w=new li(y?{traceWriter:y.writer}:{});Jh(w);let A=c.bgSummaries===!0&&g?new ma({registry:w,apiKey:g,maxCallsPerSession:c.maxSummaryCallsPerSession??200}):void 0;A?.start(),qh(A);let S=ci(),_={get sessionId(){return f.current?.sessionId},getInputStreamRef(){return f.current?.getInputStreamRef?.()??{pushUserMessage:()=>{}}},get abortSignal(){return f.current?.abortSignal??new AbortController().signal}},v=ui(o,g,S,c.baseUrl,y?.writer),E=new sn({subagentManager:h,parentSession:_,defaultConfig:{apiKey:g,systemPrompt:l,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{}},defaultSubagentModel:Qt(),childProviderFactory:S,childSkillExecutorFactory:v,backgroundRegistry:w}),R=new on({parentSession:_,defaultModel:o,defaultSubagentModel:Qt(),apiKey:g,childProviderFactory:S,childSkillExecutorFactory:v,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},...y?.writer!==void 0?{traceWriter:y.writer}:{}}),x=new pr({parentSession:_,defaultModel:o,defaultSubagentModel:Qt(),apiKey:g,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},systemPrompt:l??""}),O=new Ce,P;{let $e=t?.cwd??process.cwd(),je=hu({cwd:$e,...e.mcpConfig!==void 0?{cliOverride:e.mcpConfig}:{}}),yd=Object.values(je.mcpServers).filter(Br=>!Br.disabled).length;if(yd>0){let Br=je.sources.length===1?je.sources[0]:`${je.sources.length} source(s)`;console.log(m.dim(` mcp: ${yd} server(s) from ${Br??ba()}`)),P=await Lo.fromConfig(je.mcpServers,{warnings:je.warnings})}else if(je.warnings.length>0)for(let Br of je.warnings)console.warn(`[mcp] ${Br}`)}let $=Js(e.provider,{subagentExecutor:E,skillExecutor:R,composeExecutor:x,memoryStore:O,model:String(o),...c.openaiBaseUrl!==void 0?{openaiBaseUrl:c.openaiBaseUrl}:{},...P!==void 0?{mcpManager:P}:{}})??new Ie({permissions:{allowedTools:[...Vt,...xn,"agent","skill","compose",...P?.getMcpToolWireNames()??[]]},subagentExecutor:E,skillExecutor:R,composeExecutor:x,memoryStore:O,surface:"cli",...P!==void 0?{mcpManager:P}:{}}),I=ph(o);n?.stored&&wi(I,n.stored,n.resumeId),I.cwd=t?.cwd??process.cwd(),y&&console.log(m.dim(` trace: ${y.tracePath}`));let N={fn:$e=>console.log($e)},V=new bi,U=Bb(process.stdout,{statusLine:V}),C=mr($e=>{N.fn(ii($e))},"cli",O,()=>I.planMode?"plan":"default").registry,D={model:o,resumeConfig:r,systemPrompt:p,systemPromptSource:d,thinking:s,effort:i,maxOutputTokens:a,...c.baseUrl!==void 0?{baseUrl:c.baseUrl}:{},provider:$,hookRegistry:C,traceWriter:y?.writer,cwd:t?.cwd,maxTurns:parseInt(e.maxTurns,10),autoResumeOnUsageLimit:c.autoResumeOnUsageLimit},B=tk(D);f.current=B;let j=new ua,Z=Tr(),M=new da(B),we={session:f,stats:I,out:Z,ui:{clearScreen:()=>{V.stop(),M.reset(),process.stdout.write("\x1B[3J\x1B[2J\x1B[H"),V.start(),V.repaint(So(I,M))},repaintStatusLine:()=>V.repaint(So(I,M))},ledger:j,...P!==void 0?{mcpManager:P}:{}},qe=$e=>(j.clear(),ek($e,{sessionRef:f,stats:I,contextSampler:M,statusLine:V,backgroundRegistry:w,completionWriter:N,isInFlight:()=>Ve.getInFlight?.()??!1,onSwapped:je=>{Ve.resumeTarget=je,Ve.clearVerdictLedger?.()},buildSession:je=>tk({...D,model:je.stored?.model??D.model,resumeConfig:ka(je)})})),Ve={session:f,memoryStore:O,stats:I,statusLine:V,contextSampler:M,completionWriter:N,replRenderer:U,slashCtx:we,rl:null,options:e,...n!==void 0?{resumeTarget:n}:{},teardownTrustedSkillEvents:void 0,backgroundRegistry:w,...A!==void 0?{bgSummarizer:A}:{},requestResume:qe,getInFlight:()=>!1,...P!==void 0?{mcpManager:P}:{}},Lt=$e=>{N.fn(Xy($e,{isTTY:process.stdout.isTTY,columns:process.stdout.columns}))},Ur=$e=>{N.fn(Yy($e,{isTTY:process.stdout.isTTY,columns:process.stdout.columns})),j.record($e)};Dg(Lt),$g(Ur),Ve.teardownTrustedSkillEvents=()=>{Lg(Lt),Og(Ur)},Ub(),$ instanceof Ie&&Zy($);let Qo=nk.createInterface({input:process.stdin,output:process.stdout,terminal:!1});return Ve.rl=Qo,we.requestResume=qe,Ve}import{promises as Bo}from"node:fs";import*as sk from"node:os";import*as wa from"node:path";async function ok(e,t,n=!1){await Bo.mkdir(e,{recursive:!0});let r=new Date().toISOString().replace(/[:.]/g,"-"),o=wa.join(e,`${r}.md`),s=n?" (continued)":"";return await Bo.writeFile(o,`# Session \u2014 ${new Date().toISOString()}${s}
|
|
1953
1953
|
|
|
1954
1954
|
- model: ${t}
|
|
1955
1955
|
|
|
@@ -2013,8 +2013,8 @@ _ended: ${new Date().toISOString()}_
|
|
|
2013
2013
|
`),b=h[0]??"";u.push(i+" "+g+" "+Re(b,d)+" "+i);for(let y of h.slice(1))u.push(i+" "+" ".repeat(c)+" "+Re(y,d)+" "+i)}u.push(a);let p=m.dim(ue(t.affordance,n));return u.push(i+" "+Re(p,n)+" "+i),u.push(s),u.join(`
|
|
2014
2014
|
`)}function W$(e){let t=[],n=(r,o)=>{o&&o.trim().length>0&&t.push({label:r,value:o.trim()})};switch(e.kind){case"done":n("done",e.whatWasDone),n("evidence",e.evidence),n("deferred",e.deferred);break;case"blocked":n("blocks",e.whatBlocks),n("unblock",e.unblockCondition),n("progress",e.alreadyDone);break;case"asking":n("question",e.question),n("resolves",e.assumption),n("after",e.followup);break;case"interrupted":n("was doing",e.whatWasInProgress),n("saved at",e.stateLocation),n("resume",e.resumeRequires);break}return t}function Tk(e,t,n){let r=[];n&&n.trim().length>0&&r.push({type:"text",text:n}),e&&r.push({type:"text",text:e});for(let o of t)r.push({type:"image",source:{type:"base64",media_type:o.mediaType,data:o.bytes.toString("base64")}});return r}async function xk(e,t,n,r,o="summary",s,i,a){let l=ck(e.text,e.attachments);r.setInFlight(!0);let c="",d=!1,u,p=!1,f=!1,g=!1,h,b=!1,y=[],w=new Map,T=e.text.startsWith("/")?e.text.split(/[\s:]/)[0]?.slice(1):void 0,A=new dn({out:Tr(),thinkingMode:o,...T?{activeSkillName:T}:{},onCancel:()=>{t.interrupt().catch(_=>{Oe()&&console.error(" "+m.error("session.interrupt() failed:"),_)})},...i?{onBackground:()=>{b=!0}}:{},...a?.history?{history:a.history}:{},...a?.autocompleteState?{autocompleteState:a.autocompleteState}:{},...r.scrollRegion?{scrollRegion:r.scrollRegion}:{}}),S=async()=>{if(!f){f=!0;try{await A.dispose()}catch{}}};try{console.log(),await A.arm();let _=A.getCompositor();if(s&&_){let R=_;s.fn=x=>R.commitAbove(x)}r.setActiveCompositor?.(_),r.rearmStatus?.();let v=e.attachments.length===0?e.text:Tk(e.text,e.attachments),E=t.sendMessageStream(v);if(await Xn(A.sink,async()=>{for await(let R of E){if(b&&i){let x=T??e.text.slice(0,40),O=i.register(x),P=Pi(O,i);Ii(E,c,l,O,i,P,n,r.onTurnComplete,t.abortSignal),await S(),console.log(m.dim(` \u2192 backgrounded as ${O.id}: ${O.label}`)),r.setInFlight(!1),r.rearmStatus?.();return}if(R.type==="chunk"&&R.chunk.type==="content"?(c+=R.chunk.content,d=!0):R.type==="message"&&!d&&(c=R.message.content),R.type==="chunk"&&R.chunk.type==="tool_use_detail"){let x=R.chunk,O={toolName:x.toolName,toolUseId:x.toolUseId,input:x.toolInput};w.set(x.toolUseId,O),y.push(O)}else if(R.type==="chunk"&&R.chunk.type==="tool_result"){let x=R.chunk,O=w.get(x.toolUseId);O&&(O.result=x.content,O.isError=x.isError,w.delete(x.toolUseId))}if(R.type==="paused"){await S(),console.log(Xd({reason:R.reason,...R.resetsAt!==void 0?{resetsAt:R.resetsAt}:{},...R.accountId!==void 0?{accountId:R.accountId}:{}}));continue}if(R.type==="resumed"){let x=R.hotSwapped&&R.accountId?`\u25B6 Resumed on ${R.accountId}`:"\u25B6 Resumed";console.log(m.success(x));continue}if(R.type==="error"){await S(),qn(Jn(R.error)),p=!0;continue}A.process(R),R.type==="done"&&(g=!0,h=R.metadata)}}),!f){let R=A.getCompositor();if(R)try{let{text:x,queued:O}=R.getBuffer();O&&x.length>0&&(u=x)}catch{}}if(await S(),g){ki(n,l,c,h,y),r.onTurnComplete&&await r.onTurnComplete(l,c).catch(()=>{}),d&&console.log(`
|
|
2015
2015
|
`);let R=Sk(c);if(R&&(console.log(vk(R)),console.log(),r.onTerminalState))try{r.onTerminalState(R)}catch{}if(H$(h,n),r.onAfterTurn){let x=r.onAfterTurn();x instanceof Promise&&await x.catch(()=>{})}}}catch(_){await S(),p||qn(Jn(_))}finally{await S(),s&&(s.fn=_=>console.log(_)),r.setActiveCompositor?.(null),r.setInFlight(!1),r.rearmStatus?.()}return u}function H$(e,t){if(!e)return;let n=[];e.durationMs&&n.push(re(e.durationMs)),e.totalCostUsd!==void 0&&n.push(_e(e.totalCostUsd));let r=Number(e.usage?.input_tokens??0),o=Number(e.usage?.output_tokens??0);r+o>0&&n.push(Y(r+o)+" tok"),n.length>0&&console.log(m.dim(" \u25E6 "+n.join(" \xB7 ")));let s=vc(t);if(s>.5){let i=s>.8?m.error:m.warning;console.log(i(` context ${Math.round(s*100)}% used of ${Y(Ke(t.model))}`))}console.log()}function Ek(e={}){let t=e.load??Ri,n=e.onResize??(i=>Qe.subscribe(i)),r="",o,s=n(()=>{r=""});return{renderIfChanged(i){let a=i??"unbound",l=t(a),c=Oh(l);return a===o&&c===r?[]:(o=a,r=c,c===""?[]:Ai(l))},invalidate(){r=""},dispose(){try{s()}catch{}}}}var Ru={done:{glyph:"\u2713",color:m.success,label:"done"},blocked:{glyph:"\u2298",color:m.error,label:"blocked"},asking:{glyph:"?",color:m.warning,label:"asking"},interrupted:{glyph:"\u23F8",color:m.meta,label:"interrupted"}};function Rk(e={}){let t=Math.max(2,e.capacity??8),n=[];return{push(r){n.push(r.kind),n.length>t&&(n=n.slice(n.length-t))},reset(){n=[]},entries(){return n},render(){if(n.length===0)return null;let r=m.dim(" ledger "),o=m.dim(" \xB7 "),s=n.map(d=>{let u=Ru[d];return u.color(`${u.glyph} ${u.label}`)}),i=m.dim(` (${n.length} turn${n.length===1?"":"s"})`),a=r+s.join(o)+i,l=Math.max(20,ee()-2);if(W(a)<=l)return a;let c=r+n.map(d=>Ru[d].color(Ru[d].glyph)).join(m.dim(" "))+i;return ue(c,l)}}}var Au=["\u25D0","\u25D1","\u25D2","\u25D3"],Ra=class{stream;manager;registry;throttleMs;started=!1;lastRepaint=0;spinnerIndex=0;spinnerInterval=null;resizeUnsub=null;updateHandler=null;registryStartedHandler=null;registrySettledHandler=null;rowCount=0;onRowCountChange;constructor(t,n,r={}){this.manager=t,this.registry=n,this.stream=r.stream??process.stdout,this.throttleMs=r.throttleMs??200}setRowCountChangeHandler(t){this.onRowCountChange=t}start(){this.started||(this.started=!0,this.updateHandler=()=>this.scheduleRepaint(),this.manager.on("update",this.updateHandler),this.manager.on("complete",this.updateHandler),this.registry&&(this.registryStartedHandler=t=>{this.scheduleRepaint()},this.registrySettledHandler=t=>{this.scheduleRepaint()},this.registry.on("started",this.registryStartedHandler),this.registry.on("settled",this.registrySettledHandler)),this.resizeUnsub=Qe.subscribe(()=>this.repaint()),this.spinnerInterval=setInterval(()=>{this.spinnerIndex=(this.spinnerIndex+1)%Au.length,this.rowCount>0&&this.repaint()},Math.max(this.throttleMs,50)))}stop(){this.started&&(this.started=!1,this.updateHandler&&(this.manager.removeListener("update",this.updateHandler),this.manager.removeListener("complete",this.updateHandler),this.updateHandler=null),this.registry&&(this.registryStartedHandler&&(this.registry.off("started",this.registryStartedHandler),this.registryStartedHandler=null),this.registrySettledHandler&&(this.registry.off("settled",this.registrySettledHandler),this.registrySettledHandler=null)),this.resizeUnsub&&(this.resizeUnsub(),this.resizeUnsub=null),this.spinnerInterval&&(clearInterval(this.spinnerInterval),this.spinnerInterval=null),this.rowCount>0&&(this.clearRows(),this.rowCount=0,this.onRowCountChange?.(0)))}scheduleRepaint(){Date.now()-this.lastRepaint<this.throttleMs||this.repaint()}repaint(){if(!this.started||!this.stream.isTTY)return;this.lastRepaint=Date.now();let t=[...this.manager.running().map(s=>({kind:"turn",task:s})),...(this.registry?.list()??[]).filter(s=>s.status==="running").map(s=>({kind:"subagent",job:s}))],n=this.stream.rows??24,r=Math.max(0,Math.min(t.length,n-1));if(r!==this.rowCount&&(this.rowCount>0&&this.clearRows(),this.rowCount=r,this.onRowCountChange?.(r)),r===0)return;let o=Math.max(1,n-r);this.stream.write("\x1B[s");for(let s=0;s<r;s++){let i=t[s],a=o+s;this.stream.write(`\x1B[${a};1H`),this.stream.write("\x1B[2K"),this.stream.write(this.formatItemLine(i))}this.stream.write("\x1B[u")}clearRows(){if(!this.stream.isTTY)return;let t=this.stream.rows??24,n=Math.min(this.rowCount,t-1),r=Math.max(1,t-n);this.stream.write("\x1B[s");for(let o=0;o<n;o++)this.stream.write(`\x1B[${r+o};1H`),this.stream.write("\x1B[2K");this.stream.write("\x1B[u")}formatItemLine(t){return t.kind==="turn"?this.formatTaskLine(t.task):this.formatJobLine(t.job)}formatTaskLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(Au[this.spinnerIndex]),o=m.dim(t.id),s=m.bold(t.label),i=[r,o,s];t.progressDescription&&i.push(m.dim(t.progressDescription));let a=[];t.stats.toolUses>0&&a.push(`${t.stats.toolUses} tool${t.stats.toolUses===1?"":"s"}`),t.stats.tokens>0&&a.push(`${Y(t.stats.tokens)} tok`);let l=Date.now()-t.startedAt;return a.push(re(l)),a.length>0&&i.push(m.dim(a.join(" \xB7 "))),ue(" "+i.join(" "),n)}formatJobLine(t){let n=Math.max(4,(this.stream.columns??80)-2),r=m.brand(Au[this.spinnerIndex]),o=m.dim(t.jobId),s=m.bold(t.label||t.jobId),i=[r,o,s],a=Date.now()-t.startedAt;return i.push(m.dim(re(a))),ue(" "+i.join(" "),n)}};function Ak(e,t){let n=m.brand("afk")+m.dim(` (${e})`),r=t?m.warning(" \u25CF plan"):"";return n+r+m.dim(" \u203A ")}async function Ck(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async h=>{Oe()&&(o=vi(h)),await Yi(e.session.current),Oe()&&(s=db())}).catch(()=>{});let i=await wk(),a=Ta(),l,c=Ek(),d=Rk();e.clearVerdictLedger=()=>d.reset();let u=new Ci;Gh(u),Xh(u),ey(u),Qh(e.backgroundRegistry);let p=new Ra(u,e.backgroundRegistry);p.setRowCountChangeHandler(h=>{e.statusLine.setExtraRows(h)}),p.start();let f=50,g=[];u.on("complete",h=>{g.length>=f&&g.shift(),g.push(h)});try{for(;;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let v of s)e.replRenderer.writeLine(v);e.replRenderer.writeLine(""),s=[]}for(;g.length>0;){let v=g.shift(),E=v.status==="succeeded"?"\u2713":"\u2717",R=[];if(v.resultText){let O=v.resultText.trim().split(`
|
|
2016
|
-
`)[0]?.slice(0,80)??"";O&&R.push(O)}v.error&&R.push(v.error.message);let x=[v.stats.toolUses>0?`${v.stats.toolUses} tools`:"",v.stats.tokens>0?`${Math.round(v.stats.tokens/1e3)}k tok`:"",v.stats.durationMs>0?`${Math.round(v.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");x&&R.push(x),e.replRenderer.writeLine(Ht({kind:v.status==="succeeded"?"checkpoint":"diagnosis",title:`${E} ${v.id} ${v.label}`,body:R})),e.replRenderer.writeLine("")}let h=c.renderIfChanged(e.stats.sessionId);if(h.length>0){for(let v of h)e.replRenderer.writeLine(v);e.replRenderer.writeLine("")}let b=d.render();b&&e.replRenderer.writeLine(b);let y,w;if(l!==void 0){let v=l;l=void 0;let E=Ak(e.stats.model,e.stats.planMode),R=Eo({buffer:v.text,promptText:E,isTTY:!!process.stdout.isTTY,attachmentSummary:Sa([...v.attachments])});e.replRenderer.writeLine(R),y=v.text.trim(),w=v.attachments}else{let v=await hk({rl:e.rl,promptFn:()=>Ak(e.stats.model,e.stats.planMode),onSigint:r,statusLine:e.statusLine,compositor:n.activeCompositor??void 0,history:i,autocompleteState:a,onShiftTab:()=>{let E=e.slashCtx;E.stats.planMode&&E.stats.pendingPlanExit?(E.stats.pendingPlanExit=!1,_t(E,!1,{closureSummarySkipped:!0}).catch(()=>{})):_t(E).catch(()=>{}),e.statusLine.rearm()}});y=v.text.trim(),w=v.attachments}if(!y&&w.length===0)continue;let T=!1;if(y.startsWith("/")){let v=await dh(y,e.slashCtx,w);if(v.handled){if(v.result==="exit"){e.rl.close();return}if((y==="/clear"||y.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),d.reset()),v.result!==null&&typeof v.result=="object"&&"kind"in v.result&&v.result.kind==="submit"){l={text:v.result.message,attachments:w??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}T=!0}i.push(y);let A=y;if(T){let v=Sc(y);if(v){let E=v.name.replace(/^\//,"").split(":").pop()??"";if(E&&eu(E)){let R={skillName:E,rawArgs:v.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},x=e.session.current.sessionId,O=_o(x),P=Date.now();z(`[afk trace] preflight.start commandName=${E}`);let $=!1,I=await Io(R,{cwd:process.cwd(),artifactDir:O},N=>{Oe()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${E}) failed: `)+(N instanceof Error?N.message:String(N)))});$=I!==null,z(`[afk trace] preflight.end commandName=${E} durationMs=${Date.now()-P} success=${$}`),A=ru(I?.manifestBlock,y)}}}let S;if(e.firstTurnHook&&e.stats.totalTurns===0){let v=e.firstTurnHook;e.firstTurnHook=void 0,S=Promise.resolve().then(()=>v(y)).catch(E=>{e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(E instanceof Error?E.message:String(E)))})}let _=await xk({text:A,attachments:w},e.session.current,e.stats,{setInFlight(v){n.turnInFlight=v},async onTurnComplete(v,E){await t.appendTurn(v,E)},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await Eh(e.slashCtx),e.statusLine.rearm()},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:v=>d.push(v),setActiveCompositor:v=>{n.activeCompositor=v,e.replRenderer.setCompositor(v)},scrollRegion:e.statusLine},e.options.thinkingUi,e.completionWriter,u,{history:i,autocompleteState:a});l=_!==void 0?{text:_,attachments:[]}:void 0,S!==void 0&&await S}}finally{for(let h of u.running())u.cancel(h.id);p.stop(),c.dispose()}}import{promises as K$}from"node:fs";import{dirname as G$,join as z$}from"node:path";import{randomBytes as J$}from"node:crypto";var q$=["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(`
|
|
2017
|
-
`),Pk=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Cu=30,V$=1024,Y$=8e3,X$="haiku";async function Q$(e,t){let n=e.trim();if(n.length===0||n.startsWith("/"))return null;let r=nO(n,V$),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??Y$),i=t.signal?rO([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await pa({token:t.token,model:t.model??X$,system:q$,user:r,maxTokens:32,signal:i})}catch{return null}finally{clearTimeout(s)}let l=Z$(a);if(l===null)return null;let c=G$(t.worktreePath);return await eO(l,c)}function Z$(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Pk.test(t)&&t.length<=Cu)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>Cu)break;o=i}return Pk.test(o)?o:null}async function eO(e,t){if(!await tO(z$(t,e)))return e;let n=J$(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Cu-5)}-${n}`}async function tO(e){try{return await K$.access(e),!0}catch{return!1}}function nO(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 rO(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 Ik(e){let t=await Q$(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:e.handle.path,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{}});if(t===null)return{status:"skipped",reason:"slug generation returned null"};let r=await(e.renameFn??cf)(e.handle,t,e.branchPrefix!==void 0?{branchPrefix:e.branchPrefix}:void 0);return r.ok?(e.session&&e.session.setCwd(r.newPath),{status:"renamed",oldPath:r.oldPath,newPath:r.newPath,oldBranch:r.oldBranch,newBranch:r.newBranch}):(r.partial==="branch"&&e.session&&e.session.setCwd(e.handle.path),{status:"failed",reason:r.reason,...r.partial!==void 0?{partial:r.partial}:{}})}L();import{spawn as _k}from"child_process";import{existsSync as lO,mkdirSync as cO,readFileSync as Mk,unlinkSync as uO,writeFileSync as dO}from"fs";import{get as pO}from"https";import{join as $k}from"path";import{readFileSync as oO}from"fs";import{dirname as sO,join as iO}from"path";import{fileURLToPath as aO}from"url";function Ot(){try{return"3.10.
|
|
2016
|
+
`)[0]?.slice(0,80)??"";O&&R.push(O)}v.error&&R.push(v.error.message);let x=[v.stats.toolUses>0?`${v.stats.toolUses} tools`:"",v.stats.tokens>0?`${Math.round(v.stats.tokens/1e3)}k tok`:"",v.stats.durationMs>0?`${Math.round(v.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");x&&R.push(x),e.replRenderer.writeLine(Ht({kind:v.status==="succeeded"?"checkpoint":"diagnosis",title:`${E} ${v.id} ${v.label}`,body:R})),e.replRenderer.writeLine("")}let h=c.renderIfChanged(e.stats.sessionId);if(h.length>0){for(let v of h)e.replRenderer.writeLine(v);e.replRenderer.writeLine("")}let b=d.render();b&&e.replRenderer.writeLine(b);let y,w;if(l!==void 0){let v=l;l=void 0;let E=Ak(e.stats.model,e.stats.planMode),R=Eo({buffer:v.text,promptText:E,isTTY:!!process.stdout.isTTY,attachmentSummary:Sa([...v.attachments])});e.replRenderer.writeLine(R),y=v.text.trim(),w=v.attachments}else{let v=await hk({rl:e.rl,promptFn:()=>Ak(e.stats.model,e.stats.planMode),onSigint:r,statusLine:e.statusLine,compositor:n.activeCompositor??void 0,history:i,autocompleteState:a,onShiftTab:()=>{let E=e.slashCtx;E.stats.planMode&&E.stats.pendingPlanExit?(E.stats.pendingPlanExit=!1,_t(E,!1,{closureSummarySkipped:!0}).catch(()=>{})):_t(E).catch(()=>{}),e.statusLine.rearm()}});y=v.text.trim(),w=v.attachments}if(!y&&w.length===0)continue;let T=!1;if(y.startsWith("/")){let v=await dh(y,e.slashCtx,w);if(v.handled){if(v.result==="exit"){e.rl.close();return}if((y==="/clear"||y.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),d.reset()),v.result!==null&&typeof v.result=="object"&&"kind"in v.result&&v.result.kind==="submit"){l={text:v.result.message,attachments:w??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}T=!0}i.push(y);let A=y;if(T){let v=Sc(y);if(v){let E=v.name.replace(/^\//,"").split(":").pop()??"";if(E&&eu(E)){let R={skillName:E,rawArgs:v.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},x=e.session.current.sessionId,O=_o(x),P=Date.now();z(`[afk trace] preflight.start commandName=${E}`);let $=!1,I=await Io(R,{cwd:e.stats.cwd??process.cwd(),artifactDir:O},N=>{Oe()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${E}) failed: `)+(N instanceof Error?N.message:String(N)))});$=I!==null,z(`[afk trace] preflight.end commandName=${E} durationMs=${Date.now()-P} success=${$}`),A=ru(I?.manifestBlock,y)}}}let S;if(e.firstTurnHook&&e.stats.totalTurns===0){let v=e.firstTurnHook;e.firstTurnHook=void 0,S=Promise.resolve().then(()=>v(y)).catch(E=>{e.completionWriter.fn(m.warning("\u26A0 ")+"first-turn hook failed: "+(E instanceof Error?E.message:String(E)))})}let _=await xk({text:A,attachments:w},e.session.current,e.stats,{setInFlight(v){n.turnInFlight=v},async onTurnComplete(v,E){await t.appendTurn(v,E)},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await Eh(e.slashCtx),e.statusLine.rearm()},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:v=>d.push(v),setActiveCompositor:v=>{n.activeCompositor=v,e.replRenderer.setCompositor(v)},scrollRegion:e.statusLine},e.options.thinkingUi,e.completionWriter,u,{history:i,autocompleteState:a});l=_!==void 0?{text:_,attachments:[]}:void 0,S!==void 0&&await S}}finally{for(let h of u.running())u.cancel(h.id);p.stop(),c.dispose()}}import{promises as K$}from"node:fs";import{dirname as G$,join as z$}from"node:path";import{randomBytes as J$}from"node:crypto";var q$=["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(`
|
|
2017
|
+
`),Pk=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Cu=30,V$=1024,Y$=8e3,X$="haiku";async function Q$(e,t){let n=e.trim();if(n.length===0||n.startsWith("/"))return null;let r=nO(n,V$),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??Y$),i=t.signal?rO([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await pa({token:t.token,model:t.model??X$,system:q$,user:r,maxTokens:32,signal:i})}catch{return null}finally{clearTimeout(s)}let l=Z$(a);if(l===null)return null;let c=G$(t.worktreePath);return await eO(l,c)}function Z$(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(Pk.test(t)&&t.length<=Cu)return t;let n=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");if(n.length===0)return null;let r=n.split("-").filter(s=>s.length>0).slice(0,4);if(r.length<2)return null;let o=r[0];for(let s=1;s<r.length;s++){let i=`${o}-${r[s]}`;if(i.length>Cu)break;o=i}return Pk.test(o)?o:null}async function eO(e,t){if(!await tO(z$(t,e)))return e;let n=J$(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Cu-5)}-${n}`}async function tO(e){try{return await K$.access(e),!0}catch{return!1}}function nO(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 rO(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 Ik(e){let t=await Q$(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:e.handle.path,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{}});if(t===null)return{status:"skipped",reason:"slug generation returned null"};let r=await(e.renameFn??cf)(e.handle,t,e.branchPrefix!==void 0?{branchPrefix:e.branchPrefix}:void 0);return r.ok?(e.session&&e.session.setCwd(r.newPath),{status:"renamed",oldPath:r.oldPath,newPath:r.newPath,oldBranch:r.oldBranch,newBranch:r.newBranch}):(r.partial==="branch"&&e.session&&e.session.setCwd(e.handle.path),{status:"failed",reason:r.reason,...r.partial!==void 0?{partial:r.partial}:{}})}L();import{spawn as _k}from"child_process";import{existsSync as lO,mkdirSync as cO,readFileSync as Mk,unlinkSync as uO,writeFileSync as dO}from"fs";import{get as pO}from"https";import{join as $k}from"path";import{readFileSync as oO}from"fs";import{dirname as sO,join as iO}from"path";import{fileURLToPath as aO}from"url";function Ot(){try{return"3.10.1"}catch{}try{let e=sO(aO(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(oO(iO(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}var mO=64*1024,fO=1440*60*1e3,gO="update-check.json",hO="pending-update.json";function Ok(){return $k(ts(),gO)}function Pu(){return $k(ts(),hO)}function Dk(){let e=ts();lO(e)||cO(e,{recursive:!0})}function yO(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number),o=Math.max(n.length,r.length);for(let s=0;s<o;s++){let i=n[s]??0,a=r[s]??0;if(a>i)return!0;if(a<i)return!1}return!1}function bO(){try{let e=Mk(Ok(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function kO(){try{Dk();let e=`
|
|
2018
2018
|
const https = require('https');
|
|
2019
2019
|
const fs = require('fs');
|
|
2020
2020
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|