agent-afk 3.77.0 → 3.78.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 +2 -1
package/dist/cli.mjs
CHANGED
|
@@ -2243,7 +2243,7 @@ ${R}`})}return{fileBlocks:a,warnings:l}}async function CE(e,t,n,r,o="summary",s,
|
|
|
2243
2243
|
`))!==-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(zK(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 JK(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 VK(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 Kc(e,t){let n=m.brand("afk")+m.dim(` (${e})`),r=t?m.warning(" \u25CF plan"):"";return n+r+m.dim(" \u203A ")}async function FE(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async v=>{We()&&(o=Tl(v)),await hc(e.session.current),We()&&(s=Ax())}).catch(()=>{});let i=await yE(),a=new jc({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,u,d,p,f,g,h=!1,b=!1,y=Fv({onError:v=>V("[afk suggest] Tier-2 completion failed:",v)}),w=JK(T.AFK_SUGGEST_GHOST,e.suggestGhostConfig);try{await a.armCompositor({promptFn:()=>Kc(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(wl({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+`
|
|
2244
2244
|
`)}},pendingCount:()=>Wt.pendingCount(),...v?{pickFromList:A=>vE(v,A),readTextOverlay:A=>TE(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=IE(),g=PE(),e.clearVerdictLedger=()=>g?.reset(),u=new Il,Zk(u),av(u),uv(u),lv(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 Wc(u,e.backgroundRegistry,{getAdjacentRows:()=>E}),d.setRowCountChangeHandler(A=>{S=A,C()}),p=new Ql({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 Hc({writeLine:A=>e.replRenderer.writeLine(A),getCwd:()=>e.stats.cwd}),sv(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",U=[];if(x.resultText){let K=x.resultText.trim().split(`
|
|
2245
2245
|
`)[0]?.slice(0,80)??"";K&&U.push(K)}x.error&&U.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&&U.push(J),e.replRenderer.writeLine(Mn({kind:x.status==="succeeded"?"checkpoint":"diagnosis",title:`${M} ${x.id} ${x.label}`,body:U})),e.replRenderer.writeLine("")}let A=f.drainNotifications();for(let{job:x,result:M}of A){let U=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(` ${U} [${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,j;if(l!==void 0){let x=l;l=void 0;let M=Kc(e.stats.model,e.stats.planMode),U=Er({buffer:x.text,promptText:M,isTTY:!!process.stdout.isTTY,attachmentSummary:Ho([...x.attachments])});e.replRenderer.writeLine(U),O=x.text.trim(),j=x.attachments}else{let x=await a.readLine({promptFn:()=>Kc(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(),j=x.attachments}if(!O&&j.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 mk(O,e.slashCtx,j);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:j??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}B=!0}i.push(O),await VK(e,O);let F=O;if(B){let x=_p(O);if(x){let M=x.name.replace(/^\//,"").split(":").pop()??"";if(M&&Im(M)){let U={skillName:M,rawArgs:x.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},J=e.session.current.sessionId,K=Dr(J),N=Date.now();V(`[afk trace] preflight.start commandName=${M}`);let Y=!1,be=await $r(U,{cwd:e.stats.cwd??process.cwd(),artifactDir:K},Ue=>{We()&&e.replRenderer.writeLine(m.warning(`\u26A0 preflight(${M}) failed: `)+(Ue instanceof Error?Ue.message:String(Ue)))});Y=be!==null,V(`[afk trace] preflight.end commandName=${M} durationMs=${Date.now()-N} success=${Y}`),F=Om(be?.manifestBlock,O)}}}let D=f.drainInjections();D.length>0&&(F=D+F),await CE({text:F,attachments:j},e.session.current,e.stats,{setInFlight(x){n.turnInFlight=x},async onTurnComplete(x,M){if(await t.appendTurn(x,M),e.stats.sessionId)try{qt(e.stats)}catch(U){b||(b=!0,e.replRenderer.writeLine(m.warning("\u26A0 ")+"session autosave failed \u2014 this conversation may not be resumable: "+(U instanceof Error?U.message:String(U))))}},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await Ak(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(xr(e.stats,e.contextSampler))},...p?{onStageChange:x=>p.repaint(x)}:{}},e.options.thinkingUi,e.completionWriter,u,a.toRunTurnRefs(Kc(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 YK}from"node:child_process";import{dirname as XK,isAbsolute as ZK,resolve as QK}from"node:path";import{promisify as eG}from"node:util";var NE=eG(YK),tG=3e3,nG=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function rG(){let t=(await NE("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=ZK(t)?t:QK(process.cwd(),t);return XK(n)}async function BE(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await rG()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),tG)});try{let o=Xt({execFile:NE,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=>nG.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}import{promises as oG}from"node:fs";import{dirname as sG,join as WE}from"node:path";import{randomBytes as iG}from"node:crypto";var aG=["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(`
|
|
2246
|
-
`),UE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,of=30,lG=1024,cG=8e3,uG="haiku";async function dG(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=gG(n,lG),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??cG),i=t.signal?hG([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await ro({token:t.token,model:t.model??uG,system:aG,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=pG(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=sG(t.worktreePath);return await mG(l,c)}function pG(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(UE.test(t)&&t.length<=of)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>of)break;o=i}return UE.test(o)?o:null}async function mG(e,t){if(!await fG(WE(t,e)))return e;let n=iG(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,of-5)}-${n}`}async function fG(e){try{return await oG.access(e),!0}catch{return!1}}function gG(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 hG(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 HE(e){let t,n,r=WE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await dG(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=`${qa(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return jE(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 jE(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 jE(e,t){e&&e.setCwd(t),yG(t)}function yG(e){try{process.chdir(e)}catch{}}H();import{spawn as KE}from"child_process";import{existsSync as vG,mkdirSync as TG,readFileSync as GE,unlinkSync as xG,writeFileSync as EG}from"fs";import{get as RG}from"https";import{join as zE}from"path";import{readFileSync as bG}from"fs";import{dirname as wG,join as SG}from"path";import{fileURLToPath as kG}from"url";function xn(){try{return"3.
|
|
2246
|
+
`),UE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,of=30,lG=1024,cG=8e3,uG="haiku";async function dG(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=gG(n,lG),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??cG),i=t.signal?hG([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await ro({token:t.token,model:t.model??uG,system:aG,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=pG(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=sG(t.worktreePath);return await mG(l,c)}function pG(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(UE.test(t)&&t.length<=of)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>of)break;o=i}return UE.test(o)?o:null}async function mG(e,t){if(!await fG(WE(t,e)))return e;let n=iG(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,of-5)}-${n}`}async function fG(e){try{return await oG.access(e),!0}catch{return!1}}function gG(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 hG(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 HE(e){let t,n,r=WE(e.deferred.repoRoot,".afk-worktrees","unnamed"),o=await dG(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=`${qa(e.branchPrefix)}${o}`;try{let c=await e.deferred.create(l);return jE(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 jE(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 jE(e,t){e&&e.setCwd(t),yG(t)}function yG(e){try{process.chdir(e)}catch{}}H();import{spawn as KE}from"child_process";import{existsSync as vG,mkdirSync as TG,readFileSync as GE,unlinkSync as xG,writeFileSync as EG}from"fs";import{get as RG}from"https";import{join as zE}from"path";import{readFileSync as bG}from"fs";import{dirname as wG,join as SG}from"path";import{fileURLToPath as kG}from"url";function xn(){try{return"3.78.0"}catch{}try{let e=wG(kG(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(bG(SG(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}G();var AG=64*1024,_G=1440*60*1e3,CG="update-check.json",IG="pending-update.json";function qE(){return zE(Vi(),CG)}function sf(){return zE(Vi(),IG)}function JE(){let e=Vi();vG(e)||TG(e,{recursive:!0})}function PG(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 MG(){try{let e=GE(qE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function OG(){try{JE();let e=`
|
|
2247
2247
|
const https = require('https');
|
|
2248
2248
|
const fs = require('fs');
|
|
2249
2249
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-afk",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.78.0",
|
|
4
4
|
"description": "CLI tool for interacting with AI agents via multiple interfaces",
|
|
5
5
|
"main": "dist/index.mjs",
|
|
6
6
|
"type": "module",
|
|
@@ -90,6 +90,7 @@
|
|
|
90
90
|
"audit:env:list": "tsx scripts/audit-env-access.ts --list",
|
|
91
91
|
"scan:env": "tsx scripts/render-env-registry.ts",
|
|
92
92
|
"scan:env:check": "tsx scripts/render-env-registry.ts --check",
|
|
93
|
+
"stats:tools": "tsx scripts/count-tool-calls.ts",
|
|
93
94
|
"clean": "rm -rf dist",
|
|
94
95
|
"build:dist": "node scripts/build-dist.mjs",
|
|
95
96
|
"release": "node scripts/release.mjs",
|