agent-afk 3.79.0 → 3.80.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 CHANGED
@@ -2247,7 +2247,7 @@ ${R}`})}return{fileBlocks:a,warnings:l}}async function FE(e,t,n,r,o="summary",s,
2247
2247
  `))!==-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(cG(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(m.dim(` [${o.id}] background: `)+t)}queueInjection(t){this.pendingInjections.push(t),this.pendingInjections.length>e.MAX_PENDING_INJECTIONS&&this.pendingInjections.shift()}};function dG(e,t){if(e!==void 0){let n=e.toLowerCase();return!(n==="0"||n==="false"||n==="off"||n==="no")}return typeof t=="boolean"?t:!0}async function pG(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(m.warning("\u26A0 ")+"first-turn hook failed: "+(r instanceof Error?r.message:String(r)))}}}function zc(e,t){let n=m.brand("afk")+m.dim(` (${e})`),r=t?m.warning(" \u25CF plan"):"";return n+r+m.dim(" \u203A ")}async function GE(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async v=>{He()&&(o=El(v)),await bc(e.session.current),He()&&(s=Dx())}).catch(()=>{});let i=await EE(),a=new Wc({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,u,d,p,f,g,h=!1,b=!1,y=Gv({onError:v=>V("[afk suggest] Tier-2 completion failed:",v)}),w=dG(T.AFK_SUGGEST_GHOST,e.suggestGhostConfig);try{await a.armCompositor({promptFn:()=>zc(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{let A=e.slashCtx;A.stats.planMode&&A.stats.pendingPlanExit?(A.stats.pendingPlanExit=!1,Pt(A,!1,{closureSummarySkipped:!0}).catch(()=>{})):Pt(A).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{},...w?{suggest:{engine:y,getContext:()=>({model:e.stats.model,apiKey:e.suggestApiKey,baseUrl:e.suggestBaseUrl,cwd:e.stats.cwd??process.cwd(),getHistory:()=>{let A=a.history;return A.getEntries?[...A.getEntries()]:[]},getDropdownTopCandidate:A=>{let O=a.autocompleteState.candidates[0];return O&&O.value.startsWith(A)&&O.value.length>A.length?O.value:null},getTranscriptTail:()=>"",getRecentCommands:()=>[],llmEnabled:()=>/^(1|true|yes|on)$/i.test(T.AFK_SUGGEST_ENABLED??"")})}}:{}});let v=a.getCompositor();Wt.install(kl({readLine:A=>a.readLine({promptFn:()=>A}).then(L=>L.text),writer:{line:(A="")=>{let L=a.getCompositor();L?L.commitAbove(A):process.stdout.write(A+`
2248
2248
  `)}},pendingCount:()=>Wt.pendingCount(),...v?{pickFromList:A=>IE(v,A),readTextOverlay:A=>PE(v,A)}:{}})),e.replRenderer.setCompositor(a.getCompositor()),e.slashCtx.getCompositor=()=>a.getCompositor();let R=a.getCompositor();if(R){let A=L=>R.commitAbove(L);e.completionWriter.fn=A,e.completionWriter.idleFn=A}e.slashCtx.setSoftStopHandler=A=>a.setSoftStopHandler(A),e.inputSurfaceRef&&(e.inputSurfaceRef.current=a),c=NE(),g=BE(),e.clearVerdictLedger=()=>g?.reset(),u=new Ml,iv(u),gv(u),bv(u),hv(e.backgroundRegistry);let S=0,E=0,_=1,C=()=>e.statusLine.setExtraRows(_+S+E);g.setRowCountChangeHandler(A=>{E=A,C(),d?.redraw(),p?.redraw()}),d=new Kc(u,e.backgroundRegistry,{getAdjacentRows:()=>E}),d.setRowCountChangeHandler(A=>{S=A,C()}),p=new tc({getExtraRows:()=>e.statusLine.getExtraRows()}),p.setRowCountChangeHandler(A=>{C()}),e.statusLine.setAfterScrollRestore(()=>{g?.repaint(),d?.redraw(),p?.redraw()}),d.start(),p.start(),g.start({stream:process.stdout});let I=50,P=[];for(u.on("complete",A=>{P.length>=I&&P.shift(),P.push(A)}),f=new Gc({writeLine:A=>e.replRenderer.writeLine(A),getCwd:()=>e.stats.cwd}),mv(f),n.tryAbortShellForeground=()=>f.abortActiveForeground();;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let x of s)e.replRenderer.writeLine(x);e.replRenderer.writeLine(""),s=[]}for(;P.length>0;){let x=P.shift(),M=x.status==="succeeded"?"\u2713":"\u2717",j=[];if(x.resultText){let K=x.resultText.trim().split(`
2249
2249
  `)[0]?.slice(0,80)??"";K&&j.push(K)}x.error&&j.push(x.error.message);let J=[x.stats.toolUses>0?`${x.stats.toolUses} tools`:"",x.stats.tokens>0?`${Math.round(x.stats.tokens/1e3)}k tok`:"",x.stats.durationMs>0?`${Math.round(x.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");J&&j.push(J),e.replRenderer.writeLine(Mn({kind:x.status==="succeeded"?"checkpoint":"diagnosis",title:`${M} ${x.id} ${x.label}`,body:j})),e.replRenderer.writeLine("")}let A=f.drainNotifications();for(let{job:x,result:M}of A){let j=M.errorReason===void 0?"\u2713":"\u2717",J=M.errorReason==="abort"?"killed":M.errorReason==="timeout"?"timed out":M.errorReason==="signal-killed"?"killed by signal":`exit ${M.exitCode??0}`,K=Math.max(0,Math.round(M.durationMs/100)/10);e.replRenderer.writeLine(m.dim(` ${j} [${x.id}] ${J} \xB7 ${K}s \xB7 `)+x.command)}let L=c.renderIfChanged(e.stats.sessionId);if(L.length>0){for(let x of L)e.replRenderer.writeLine(x);e.replRenderer.writeLine("")}let O,U;if(l!==void 0){let x=l;l=void 0;let M=zc(e.stats.model,e.stats.planMode),j=Rr({buffer:x.text,promptText:M,isTTY:!!process.stdout.isTTY,attachmentSummary:zo([...x.attachments])});e.replRenderer.writeLine(j),O=x.text.trim(),U=x.attachments}else{let x=await a.readLine({promptFn:()=>zc(e.stats.model,e.stats.planMode),onSigint:r,onShiftTab:()=>{let M=e.slashCtx;M.stats.planMode&&M.stats.pendingPlanExit?(M.stats.pendingPlanExit=!1,Pt(M,!1,{closureSummarySkipped:!0}).catch(()=>{})):Pt(M).catch(()=>{}),e.statusLine.rearm()}});O=x.text.trim(),U=x.attachments}if(!O&&U.length===0)continue;if(O.startsWith("!")){let x=/^(0|false|off|no)$/i.test(T.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!x&&(h||(h=!0,e.replRenderer.writeLine(m.dim(" \u2139 ! prefix shells out. Pass --no-shell-passthrough (or set AFK_SHELL_PASSTHROUGH=0) to send ! text to the model instead."))),await f.dispatch(O))){e.statusLine.rearm();continue}}let B=!1;if(O.startsWith("/")){let x=await kk(O,e.slashCtx,U);if(x.handled){if(x.result==="exit"){e.rl.close();return}if((O==="/clear"||O.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(m.dim(` transcript: ${t.path()}`)),g.reset()),x.result!==null&&typeof x.result=="object"&&"kind"in x.result&&x.result.kind==="submit"){l={text:x.result.message,attachments:U??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}i.push(O),await pG(e,O);let F=O;if(B){let x=Cp(O);if(x){let M=x.name.replace(/^\//,"").split(":").pop()??"";if(M&&Pm(M)){let j={skillName:M,rawArgs:x.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},J=e.session.current.sessionId,K=Lr(J),N=Date.now();V(`[afk trace] preflight.start commandName=${M}`);let Y=!1,be=await Dr(j,{cwd:e.stats.cwd??process.cwd(),artifactDir:K},je=>{He()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${M}) failed: `)+(je instanceof Error?je.message:String(je)))});Y=be!==null,V(`[afk trace] preflight.end commandName=${M} durationMs=${Date.now()-N} success=${Y}`),F=$m(be?.manifestBlock,O)}}}let D=f.drainInjections();D.length>0&&(F=D+F),await FE({text:F,attachments:U},e.session.current,e.stats,{setInFlight(x){n.turnInFlight=x},async onTurnComplete(x,M){if(await t.appendTurn(x,M),e.stats.sessionId)try{Jt(e.stats)}catch(j){b||(b=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(j instanceof Error?j.message:String(j))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await Dk(e.slashCtx),e.statusLine.rearm(),p?.repaint("observing")},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:x=>g?.push(x),setActiveCompositor:x=>{n.activeCompositor=x},setInterruptNotifier:x=>{n.notifyInterrupting=x},scrollRegion:e.statusLine,getCompositor:()=>a.getCompositor(),setBackgroundHandler:x=>a.setBackgroundHandler(x),setSoftStopHandler:x=>a.setSoftStopHandler(x),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(Er(e.stats,e.contextSampler))},...p?{onStageChange:x=>p.repaint(x)}:{}},e.options.thinkingUi,e.completionWriter,u,a.toRunTurnRefs(zc(e.stats.model,e.stats.planMode)))}}finally{if(u!==void 0)for(let R of u.running())u.cancel(R.id);n.tryAbortShellForeground=null,f?.drainOnExit(),p?.stop(),d?.stop(),g?.stop(),c?.dispose();let v=R=>console.log(R);e.completionWriter.fn=v,e.completionWriter.idleFn=v,await a.dispose(),e.inputSurfaceRef&&(e.inputSurfaceRef.current=null)}}import{execFile as mG}from"node:child_process";import{dirname as fG,isAbsolute as gG,resolve as hG}from"node:path";import{promisify as yG}from"node:util";var zE=yG(mG),bG=3e3,wG=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function SG(){let t=(await zE("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=gG(t)?t:hG(process.cwd(),t);return fG(n)}async function qE(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await SG()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),bG)});try{let o=Zt({execFile:zE,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=>wG.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}import{promises as kG}from"node:fs";import{dirname as vG,join as YE}from"node:path";import{randomBytes as TG}from"node:crypto";var xG=["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(`
2250
- `),JE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,sf=30,EG=1024,RG=8e3,AG="haiku";async function _G(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=MG(n,EG),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??RG),i=t.signal?OG([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await so({token:t.token,model:t.model??AG,system:xG,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=CG(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=vG(t.worktreePath);return await IG(l,c)}function CG(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(JE.test(t)&&t.length<=sf)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>sf)break;o=i}return JE.test(o)?o:null}async function IG(e,t){if(!await PG(YE(t,e)))return e;let n=TG(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,sf-5)}-${n}`}async function PG(e){try{return await kG.access(e),!0}catch{return!1}}function MG(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 OG(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 XE(e){let t,n,r=YE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await _G(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=`${Va(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),$G(t)}function $G(e){try{process.chdir(e)}catch{}}W();import{spawn as ZE}from"child_process";import{existsSync as BG,mkdirSync as jG,readFileSync as QE,unlinkSync as UG,writeFileSync as HG}from"fs";import{get as WG}from"https";import{join as eR}from"path";import{readFileSync as DG}from"fs";import{dirname as LG,join as FG}from"path";import{fileURLToPath as NG}from"url";function xn(){try{return"3.79.0"}catch{}try{let e=LG(NG(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(DG(FG(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var KG=64*1024,GG=1440*60*1e3,zG="update-check.json",qG="pending-update.json";function tR(){return eR(Xi(),zG)}function af(){return eR(Xi(),qG)}function nR(){let e=Xi();BG(e)||jG(e,{recursive:!0})}function JG(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 VG(){try{let e=QE(tR(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function YG(){try{nR();let e=`
2250
+ `),JE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,sf=30,EG=1024,RG=8e3,AG="haiku";async function _G(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=MG(n,EG),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??RG),i=t.signal?OG([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await so({token:t.token,model:t.model??AG,system:xG,user:r,maxTokens:32,signal:i})}catch(d){let p=d instanceof Error?d.message:String(d);return t.onSkip?.("slug-generator-error",p.slice(0,200)),null}finally{clearTimeout(s)}let l=CG(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=vG(t.worktreePath);return await IG(l,c)}function CG(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(JE.test(t)&&t.length<=sf)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>sf)break;o=i}return JE.test(o)?o:null}async function IG(e,t){if(!await PG(YE(t,e)))return e;let n=TG(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,sf-5)}-${n}`}async function PG(e){try{return await kG.access(e),!0}catch{return!1}}function MG(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 OG(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 XE(e){let t,n,r=YE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await _G(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=`${Va(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),$G(t)}function $G(e){try{process.chdir(e)}catch{}}W();import{spawn as ZE}from"child_process";import{existsSync as BG,mkdirSync as jG,readFileSync as QE,unlinkSync as UG,writeFileSync as HG}from"fs";import{get as WG}from"https";import{join as eR}from"path";import{readFileSync as DG}from"fs";import{dirname as LG,join as FG}from"path";import{fileURLToPath as NG}from"url";function xn(){try{return"3.80.0"}catch{}try{let e=LG(NG(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(DG(FG(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var KG=64*1024,GG=1440*60*1e3,zG="update-check.json",qG="pending-update.json";function tR(){return eR(Xi(),zG)}function af(){return eR(Xi(),qG)}function nR(){let e=Xi();BG(e)||jG(e,{recursive:!0})}function JG(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 VG(){try{let e=QE(tR(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function YG(){try{nR();let e=`
2251
2251
  const https = require('https');
2252
2252
  const fs = require('fs');
2253
2253
  const url = 'https://registry.npmjs.org/agent-afk/latest';