agent-afk 3.61.0 → 3.62.0
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 +1 -1
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -2213,7 +2213,7 @@ _ended: ${new Date().toISOString()}_
|
|
|
2213
2213
|
`))!==-1;){let u=n.slice(0,c);n=n.slice(c+1),this.opts.writeLine(u)}},s={command:t,mode:"foreground",onChunk:c=>{r||(n+=c.toString("utf8"),o())}},i=this.opts.getCwd();i!==void 0&&(s.cwd=i);let{job:a,handle:l}=this.registry.start(s);this.activeFgJobId=a.id;try{let c=await l.promise;r=!0,n.length>0&&(this.opts.writeLine(n),n=""),this.opts.writeLine(rW(a,c)),this.queueInjection({command:t,mode:"foreground",result:c})}finally{this.activeFgJobId=null}}startBackground(t){let n={command:t,mode:"background"},r=this.opts.getCwd();r!==void 0&&(n.cwd=r);let{job:o}=this.registry.start(n);this.opts.writeLine(p.dim(` [${o.id}] background: `)+t)}queueInjection(t){this.pendingInjections.push(t),this.pendingInjections.length>e.MAX_PENDING_INJECTIONS&&this.pendingInjections.shift()}};async function sW(e,t){if(e.firstTurnHook&&e.stats.totalTurns===0){let n=e.firstTurnHook;e.firstTurnHook=void 0;try{await n(t)}catch(r){e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}function kc(e,t){let n=p.brand("afk")+p.dim(` (${e})`),r=t?p.warning(" \u25CF plan"):"";return n+r+p.dim(" \u203A ")}async function bE(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async g=>{Ne()&&(o=nl(g)),await zl(e.session.current),Ne()&&(s=dT())}).catch(()=>{});let i=await eE(),a=new bc({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,u,d,m,f=!1;try{await a.armCompositor({promptFn:()=>kc(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{let v=e.slashCtx;v.stats.planMode&&v.stats.pendingPlanExit?(v.stats.pendingPlanExit=!1,At(v,!1,{closureSummarySkipped:!0}).catch(()=>{})):At(v).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{}});let g=a.getCompositor();Ft.install(Za({readLine:v=>a.readLine({promptFn:()=>v}).then(x=>x.text),writer:{line:(v="")=>{let x=a.getCompositor();x?x.commitAbove(v):process.stdout.write(v+`
|
|
2214
2214
|
`)}},pendingCount:()=>Ft.pendingCount(),...g?{pickFromList:v=>sE(g,v),readTextOverlay:v=>iE(g,v)}:{}})),e.replRenderer.setCompositor(a.getCompositor()),e.slashCtx.getCompositor=()=>a.getCompositor();let h=a.getCompositor();if(h){let v=x=>h.commitAbove(x);e.completionWriter.fn=v,e.completionWriter.idleFn=v}e.slashCtx.setSoftStopHandler=v=>a.setSoftStopHandler(v),e.inputSurfaceRef&&(e.inputSurfaceRef.current=a),c=dE();let b=pE();e.clearVerdictLedger=()=>b.reset(),u=new ll,rk(u),pk(u),gk(u),mk(e.backgroundRegistry),d=new wc(u,e.backgroundRegistry),d.setRowCountChangeHandler(v=>{e.statusLine.setExtraRows(v)}),d.start();let y=50,w=[];for(u.on("complete",v=>{w.length>=y&&w.shift(),w.push(v)}),m=new Sc({writeLine:v=>e.replRenderer.writeLine(v),getCwd:()=>e.stats.cwd}),uk(m),n.tryAbortShellForeground=()=>m.abortActiveForeground();;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let E of s)e.replRenderer.writeLine(E);e.replRenderer.writeLine(""),s=[]}for(;w.length>0;){let E=w.shift(),_=E.status==="succeeded"?"\u2713":"\u2717",L=[];if(E.resultText){let O=E.resultText.trim().split(`
|
|
2215
2215
|
`)[0]?.slice(0,80)??"";O&&L.push(O)}E.error&&L.push(E.error.message);let R=[E.stats.toolUses>0?`${E.stats.toolUses} tools`:"",E.stats.tokens>0?`${Math.round(E.stats.tokens/1e3)}k tok`:"",E.stats.durationMs>0?`${Math.round(E.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");R&&L.push(R),e.replRenderer.writeLine(Tn({kind:E.status==="succeeded"?"checkpoint":"diagnosis",title:`${_} ${E.id} ${E.label}`,body:L})),e.replRenderer.writeLine("")}let v=m.drainNotifications();for(let{job:E,result:_}of v){let L=_.errorReason===void 0?"\u2713":"\u2717",R=_.errorReason==="abort"?"killed":_.errorReason==="timeout"?"timed out":_.errorReason==="signal-killed"?"killed by signal":`exit ${_.exitCode??0}`,O=Math.max(0,Math.round(_.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${L} [${E.id}] ${R} \xB7 ${O}s \xB7 `)+E.command)}let x=c.renderIfChanged(e.stats.sessionId);if(x.length>0){for(let E of x)e.replRenderer.writeLine(E);e.replRenderer.writeLine("")}let k=b.render();k&&e.replRenderer.writeLine(k);let A,C;if(l!==void 0){let E=l;l=void 0;let _=kc(e.stats.model,e.stats.planMode),L=mr({buffer:E.text,promptText:_,isTTY:!!process.stdout.isTTY,attachmentSummary:Co([...E.attachments])});e.replRenderer.writeLine(L),A=E.text.trim(),C=E.attachments}else{let E=await a.readLine({promptFn:()=>kc(e.stats.model,e.stats.planMode),onSigint:r,onShiftTab:()=>{let _=e.slashCtx;_.stats.planMode&&_.stats.pendingPlanExit?(_.stats.pendingPlanExit=!1,At(_,!1,{closureSummarySkipped:!0}).catch(()=>{})):At(_).catch(()=>{}),e.statusLine.rearm()}});A=E.text.trim(),C=E.attachments}if(!A&&C.length===0)continue;if(A.startsWith("!")){let E=/^(0|false|off|no)$/i.test(T.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!E&&(f||(f=!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 m.dispatch(A))){e.statusLine.rearm();continue}}let D=!1;if(A.startsWith("/")){let E=await TS(A,e.slashCtx,C);if(E.handled){if(E.result==="exit"){e.rl.close();return}if((A==="/clear"||A.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),b.reset()),E.result!==null&&typeof E.result=="object"&&"kind"in E.result&&E.result.kind==="submit"){l={text:E.result.message,attachments:C??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}D=!0}i.push(A),await sW(e,A);let P=A;if(D){let E=rp(A);if(E){let _=E.name.replace(/^\//,"").split(":").pop()??"";if(_&&tm(_)){let L={skillName:_,rawArgs:E.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},R=e.session.current.sessionId,O=vr(R),B=Date.now();J(`[afk trace] preflight.start commandName=${_}`);let K=!1,I=await kr(L,{cwd:e.stats.cwd??process.cwd(),artifactDir:O},N=>{Ne()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${_}) failed: `)+(N instanceof Error?N.message:String(N)))});K=I!==null,J(`[afk trace] preflight.end commandName=${_} durationMs=${Date.now()-B} success=${K}`),P=om(I?.manifestBlock,A)}}}let M=m.drainInjections();M.length>0&&(P=M+P),await uE({text:P,attachments:C},e.session.current,e.stats,{setInFlight(E){n.turnInFlight=E},async onTurnComplete(E,_){await t.appendTurn(E,_)},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await FS(e.slashCtx),e.statusLine.rearm()},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:E=>b.push(E),setActiveCompositor:E=>{n.activeCompositor=E},setInterruptNotifier:E=>{n.notifyInterrupting=E},scrollRegion:e.statusLine,getCompositor:()=>a.getCompositor(),setBackgroundHandler:E=>a.setBackgroundHandler(E),setSoftStopHandler:E=>a.setSoftStopHandler(E),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(pr(e.stats,e.contextSampler))}},e.options.thinkingUi,e.completionWriter,u,a.toRunTurnRefs(kc(e.stats.model,e.stats.planMode)))}}finally{if(u!==void 0)for(let h of u.running())u.cancel(h.id);n.tryAbortShellForeground=null,m?.drainOnExit(),d?.stop(),c?.dispose();let g=h=>console.log(h);e.completionWriter.fn=g,e.completionWriter.idleFn=g,await a.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}import{execFile as iW}from"node:child_process";import{dirname as aW,isAbsolute as lW,resolve as cW}from"node:path";import{promisify as uW}from"node:util";var wE=uW(iW),dW=3e3,pW=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function mW(){let t=(await wE("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=lW(t)?t:cW(process.cwd(),t);return aW(n)}async function SE(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await mW()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),dW)});try{let o=Gt({execFile:wE,repoRoot:t,dryRun:!1,scope:"interactive",bypassSoftLaunch:!0}),s=await Promise.race([o,r]);if(s==="timeout")return{ran:!1,removedCount:0,skippedReason:"timeout"};let i=s;return i.warnings.some(c=>c.toLowerCase().includes("contested"))?{ran:!1,removedCount:0,skippedReason:"lock-contested"}:{ran:!0,removedCount:i.candidates.filter(c=>pW.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}import{promises as fW}from"node:fs";import{dirname as gW,join as TE}from"node:path";import{randomBytes as hW}from"node:crypto";var yW=["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(`
|
|
2216
|
-
`),kE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,_m=30,bW=1024,wW=8e3,SW="haiku";async function kW(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=xW(n,bW),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??wW),i=t.signal?RW([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await lc({token:t.token,model:t.model??SW,system:yW,user:r,maxTokens:32,signal:i})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(s)}let l=vW(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=gW(t.worktreePath);return await TW(l,c)}function vW(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(kE.test(t)&&t.length<=_m)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>_m)break;o=i}return kE.test(o)?o:null}async function TW(e,t){if(!await EW(TE(t,e)))return e;let n=hW(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,_m-5)}-${n}`}async function EW(e){try{return await fW.access(e),!0}catch{return!1}}function xW(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 RW(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 EE(e){let t,n,r=TE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await kW(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${Aa(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return vE(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return vE(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function vE(e,t){e&&e.setCwd(t),AW(t)}function AW(e){try{process.chdir(e)}catch{}}j();import{spawn as xE}from"child_process";import{existsSync as MW,mkdirSync as OW,readFileSync as RE,unlinkSync as $W,writeFileSync as DW}from"fs";import{get as LW}from"https";import{join as AE}from"path";import{readFileSync as _W}from"fs";import{dirname as CW,join as IW}from"path";import{fileURLToPath as PW}from"url";function gn(){try{return"3.
|
|
2216
|
+
`),kE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,_m=30,bW=1024,wW=8e3,SW="haiku";async function kW(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=xW(n,bW),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??wW),i=t.signal?RW([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await lc({token:t.token,model:t.model??SW,system:yW,user:r,maxTokens:32,signal:i})}catch(d){let m=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",m.slice(0,200)),null}finally{clearTimeout(s)}let l=vW(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=gW(t.worktreePath);return await TW(l,c)}function vW(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(kE.test(t)&&t.length<=_m)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>_m)break;o=i}return kE.test(o)?o:null}async function TW(e,t){if(!await EW(TE(t,e)))return e;let n=hW(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,_m-5)}-${n}`}async function EW(e){try{return await fW.access(e),!0}catch{return!1}}function xW(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 RW(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 EE(e){let t,n,r=TE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await kW(e.message,{token:e.token,...e.model!==void 0?{model:e.model}:{},...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{},worktreePath:r,...e.signal!==void 0?{signal:e.signal}:{},...e.slugGenerator!==void 0?{slugGenerator:e.slugGenerator}:{},onSkip:(a,l)=>{t=a,n=l}}),s=t??"unknown",i=n;if(o!==null){let l=`${Aa(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return vE(e.session,c.path),{status:"created",path:c.path,branch:c.branch,slug:o}}catch(c){s="create-failed",i=(c instanceof Error?c.message:String(c)).slice(0,200)}}try{let a=await e.deferred.create(!0);return vE(e.session,a.path),{status:"created-fallback",path:a.path,branch:a.branch,reason:s,...i!==void 0?{detail:i}:{}}}catch(a){return{status:"failed",reason:a instanceof Error?a.message:String(a)}}}function vE(e,t){e&&e.setCwd(t),AW(t)}function AW(e){try{process.chdir(e)}catch{}}j();import{spawn as xE}from"child_process";import{existsSync as MW,mkdirSync as OW,readFileSync as RE,unlinkSync as $W,writeFileSync as DW}from"fs";import{get as LW}from"https";import{join as AE}from"path";import{readFileSync as _W}from"fs";import{dirname as CW,join as IW}from"path";import{fileURLToPath as PW}from"url";function gn(){try{return"3.62.0"}catch{}try{let e=CW(PW(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(_W(IW(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var FW=64*1024,NW=1440*60*1e3,BW="update-check.json",UW="pending-update.json";function _E(){return AE(Ci(),BW)}function Cm(){return AE(Ci(),UW)}function CE(){let e=Ci();MW(e)||OW(e,{recursive:!0})}function jW(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 WW(){try{let e=RE(_E(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function HW(){try{CE();let e=`
|
|
2217
2217
|
const https = require('https');
|
|
2218
2218
|
const fs = require('fs');
|
|
2219
2219
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|