agent-afk 3.58.0 → 3.59.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/dist/index.mjs +130 -128
- package/dist/telegram.mjs +146 -144
- package/package.json +1 -1
package/dist/cli.mjs
CHANGED
|
@@ -2215,7 +2215,7 @@ _ended: ${new Date().toISOString()}_
|
|
|
2215
2215
|
`))!==-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(GB(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()}};function bc(e,t){let n=p.brand("afk")+p.dim(` (${e})`),r=t?p.warning(" \u25CF plan"):"";return n+r+p.dim(" \u203A ")}async function mE(e,t,n,r){let o=null,s=[];e.session.current.waitForInitialization().then(async g=>{Ue()&&(o=Qa(g)),await Kl(e.session.current),Ue()&&(s=iT())}).catch(()=>{});let i=await VT(),a=new gc({rl:e.rl,history:i,statusLine:e.statusLine}),l,c,u,d,m,f=!1;try{await a.armCompositor({promptFn:()=>bc(e.stats.model,e.stats.planMode),onCancel:r,onShiftTab:()=>{let S=e.slashCtx;S.stats.planMode&&S.stats.pendingPlanExit?(S.stats.pendingPlanExit=!1,Rt(S,!1,{closureSummarySkipped:!0}).catch(()=>{})):Rt(S).catch(()=>{}),e.statusLine.rearm()},scrollRegion:e.statusLine,...e.preArmAnchorRow!==void 0?{anchorRow:e.preArmAnchorRow}:{}});let g=a.getCompositor();Ft.install(Ja({readLine:S=>a.readLine({promptFn:()=>S}).then(x=>x.text),writer:{line:(S="")=>{let x=a.getCompositor();x?x.commitAbove(S):process.stdout.write(S+`
|
|
2216
2216
|
`)}},pendingCount:()=>Ft.pendingCount(),...g?{pickFromList:S=>eE(g,S),readTextOverlay:S=>tE(g,S)}:{}})),e.replRenderer.setCompositor(a.getCompositor()),e.slashCtx.getCompositor=()=>a.getCompositor();let h=a.getCompositor();if(h){let S=x=>h.commitAbove(x);e.completionWriter.fn=S,e.completionWriter.idleFn=S}e.slashCtx.setSoftStopHandler=S=>a.setSoftStopHandler(S),e.inputSurfaceRef&&(e.inputSurfaceRef.current=a),c=iE();let b=aE();e.clearVerdictLedger=()=>b.reset(),u=new sl,ZS(u),ak(u),uk(u),lk(e.backgroundRegistry),d=new hc(u,e.backgroundRegistry),d.setRowCountChangeHandler(S=>{e.statusLine.setExtraRows(S)}),d.start();let y=50,w=[];for(u.on("complete",S=>{w.length>=y&&w.shift(),w.push(S)}),m=new yc({writeLine:S=>e.replRenderer.writeLine(S),getCwd:()=>e.stats.cwd}),sk(m),n.tryAbortShellForeground=()=>m.abortActiveForeground();;){if(o&&(e.replRenderer.writeLine(o),e.replRenderer.writeLine(""),o=null),s.length>0){for(let T of s)e.replRenderer.writeLine(T);e.replRenderer.writeLine(""),s=[]}for(;w.length>0;){let T=w.shift(),R=T.status==="succeeded"?"\u2713":"\u2717",A=[];if(T.resultText){let U=T.resultText.trim().split(`
|
|
2217
2217
|
`)[0]?.slice(0,80)??"";U&&A.push(U)}T.error&&A.push(T.error.message);let F=[T.stats.toolUses>0?`${T.stats.toolUses} tools`:"",T.stats.tokens>0?`${Math.round(T.stats.tokens/1e3)}k tok`:"",T.stats.durationMs>0?`${Math.round(T.stats.durationMs/1e3)}s`:""].filter(Boolean).join(" \xB7 ");F&&A.push(F),e.replRenderer.writeLine(vn({kind:T.status==="succeeded"?"checkpoint":"diagnosis",title:`${R} ${T.id} ${T.label}`,body:A})),e.replRenderer.writeLine("")}let S=m.drainNotifications();for(let{job:T,result:R}of S){let A=R.errorReason===void 0?"\u2713":"\u2717",F=R.errorReason==="abort"?"killed":R.errorReason==="timeout"?"timed out":R.errorReason==="signal-killed"?"killed by signal":`exit ${R.exitCode??0}`,U=Math.max(0,Math.round(R.durationMs/100)/10);e.replRenderer.writeLine(p.dim(` ${A} [${T.id}] ${F} \xB7 ${U}s \xB7 `)+T.command)}let x=c.renderIfChanged(e.stats.sessionId);if(x.length>0){for(let T of x)e.replRenderer.writeLine(T);e.replRenderer.writeLine("")}let v=b.render();v&&e.replRenderer.writeLine(v);let _,I;if(l!==void 0){let T=l;l=void 0;let R=bc(e.stats.model,e.stats.planMode),A=pr({buffer:T.text,promptText:R,isTTY:!!process.stdout.isTTY,attachmentSummary:Ro([...T.attachments])});e.replRenderer.writeLine(A),_=T.text.trim(),I=T.attachments}else{let T=await a.readLine({promptFn:()=>bc(e.stats.model,e.stats.planMode),onSigint:r,onShiftTab:()=>{let R=e.slashCtx;R.stats.planMode&&R.stats.pendingPlanExit?(R.stats.pendingPlanExit=!1,Rt(R,!1,{closureSummarySkipped:!0}).catch(()=>{})):Rt(R).catch(()=>{}),e.statusLine.rearm()}});_=T.text.trim(),I=T.attachments}if(!_&&I.length===0)continue;if(_.startsWith("!")){let T=/^(0|false|off|no)$/i.test(E.AFK_SHELL_PASSTHROUGH??"");if(e.options.shellPassthrough!==!1&&!T&&(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(_))){e.statusLine.rearm();continue}}let D=!1;if(_.startsWith("/")){let T=await bS(_,e.slashCtx,I);if(T.handled){if(T.result==="exit"){e.rl.close();return}if((_==="/clear"||_.startsWith("/clear "))&&(await t.rotateOnClear(),e.replRenderer.writeLine(p.dim(` transcript: ${t.path()}`)),b.reset()),T.result!==null&&typeof T.result=="object"&&"kind"in T.result&&T.result.kind==="submit"){l={text:T.result.message,attachments:I??[]},e.statusLine.rearm();continue}e.statusLine.rearm();continue}D=!0}i.push(_);let P=_;if(D){let T=Zd(_);if(T){let R=T.name.replace(/^\//,"").split(":").pop()??"";if(R&&Yp(R)){let A={skillName:R,rawArgs:T.args,source:"plugin",capabilities:{compose:!0,subagents:!0}},F=e.session.current.sessionId,U=kr(F),G=Date.now();J(`[afk trace] preflight.start commandName=${R}`);let M=!1,N=await Sr(A,{cwd:e.stats.cwd??process.cwd(),artifactDir:U},B=>{Ue()&&e.replRenderer.writeLine(p.warning(`\u26A0 preflight(${R}) failed: `)+(B instanceof Error?B.message:String(B)))});M=N!==null,J(`[afk trace] preflight.end commandName=${R} durationMs=${Date.now()-G} success=${M}`),P=Qp(N?.manifestBlock,_)}}}let O=m.drainInjections();O.length>0&&(P=O+P);let C;if(e.firstTurnHook&&e.stats.totalTurns===0){let T=e.firstTurnHook;e.firstTurnHook=void 0,C=Promise.resolve().then(()=>T(_)).catch(R=>{e.completionWriter.fn(p.warning("\u26A0 ")+"first-turn hook failed: "+(R instanceof Error?R.message:String(R)))})}await sE({text:P,attachments:I},e.session.current,e.stats,{setInFlight(T){n.turnInFlight=T},async onTurnComplete(T,R){await t.appendTurn(T,R)},async onAfterTurn(){await e.contextSampler.onTurn(e.stats.totalTurns),await MS(e.slashCtx),e.statusLine.rearm()},rearmStatus:()=>e.statusLine.rearm(),onTerminalState:T=>b.push(T),setActiveCompositor:T=>{n.activeCompositor=T},setInterruptNotifier:T=>{n.notifyInterrupting=T},scrollRegion:e.statusLine,getCompositor:()=>a.getCompositor(),setBackgroundHandler:T=>a.setBackgroundHandler(T),setSoftStopHandler:T=>a.setSoftStopHandler(T),async onContextProgress(){await e.contextSampler.refresh(),e.statusLine.repaint(dr(e.stats,e.contextSampler))}},e.options.thinkingUi,e.completionWriter,u,a.toRunTurnRefs(bc(e.stats.model,e.stats.planMode))),C!==void 0&&await C}}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 zB}from"node:child_process";import{dirname as JB,isAbsolute as VB,resolve as YB}from"node:path";import{promisify as XB}from"node:util";var fE=XB(zB),ZB=3e3,QB=new Set(["empty","orphaned-dir","orphaned-registration","dead-owner"]);async function eW(){let t=(await fE("git",["rev-parse","--git-common-dir"])).stdout.trim();if(!t)throw new Error("Not in a git repository.");let n=VB(t)?t:YB(process.cwd(),t);return JB(n)}async function gE(e){if(e?.disabled)return{ran:!1,removedCount:0,skippedReason:"disabled"};let t;try{t=await eW()}catch{return{ran:!1,removedCount:0,skippedReason:"not-in-repo"}}let n,r=new Promise(o=>{n=setTimeout(()=>o("timeout"),ZB)});try{let o=Gt({execFile:fE,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=>QB.has(c.verdict)&&i.removed.includes(c.path)).length}}catch{return{ran:!1,removedCount:0,skippedReason:"error"}}finally{n&&clearTimeout(n)}}import{promises as tW}from"node:fs";import{dirname as nW,join as rW}from"node:path";import{randomBytes as oW}from"node:crypto";var sW=["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(`
|
|
2218
|
-
`),hE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Tm=30,iW=1024,aW=8e3,lW="haiku";async function cW(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=mW(n,iW),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??aW),i=t.signal?fW([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await sc({token:t.token,model:t.model??lW,system:sW,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=uW(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=nW(t.worktreePath);return await dW(l,c)}function uW(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(hE.test(t)&&t.length<=Tm)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>Tm)break;o=i}return hE.test(o)?o:null}async function dW(e,t){if(!await pW(rW(t,e)))return e;let n=oW(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Tm-5)}-${n}`}async function pW(e){try{return await tW.access(e),!0}catch{return!1}}function mW(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 fW(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 bE(e){let t,n,r=await cW(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}:{},onSkip:(i,a)=>{t=i,n=a}});if(r===null)return{status:"skipped",reason:t??"unknown",...n!==void 0?{detail:n}:{}};let s=await(e.renameFn??xb)(e.handle,r,e.branchPrefix!==void 0?{branchPrefix:e.branchPrefix}:void 0);return s.ok?(e.session&&e.session.setCwd(s.newPath),yE(s.newPath),{status:"renamed",oldPath:s.oldPath,newPath:s.newPath,oldBranch:s.oldBranch,newBranch:s.newBranch}):(s.partial==="branch"&&(e.session&&e.session.setCwd(e.handle.path),yE(e.handle.path)),{status:"failed",reason:s.reason,...s.partial!==void 0?{partial:s.partial}:{}})}function yE(e){try{process.chdir(e)}catch{}}W();import{spawn as wE}from"child_process";import{existsSync as wW,mkdirSync as SW,readFileSync as SE,unlinkSync as kW,writeFileSync as vW}from"fs";import{get as TW}from"https";import{join as kE}from"path";import{readFileSync as gW}from"fs";import{dirname as hW,join as yW}from"path";import{fileURLToPath as bW}from"url";function fn(){try{return"3.
|
|
2218
|
+
`),hE=/^[a-z0-9]+(-[a-z0-9]+){1,3}$/,Tm=30,iW=1024,aW=8e3,lW="haiku";async function cW(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=mW(n,iW),o=new AbortController,s=setTimeout(()=>o.abort(),t.timeoutMs??aW),i=t.signal?fW([t.signal,o.signal]):o.signal,a;try{t.slugGenerator?a=await t.slugGenerator(r,i):a=await sc({token:t.token,model:t.model??lW,system:sW,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=uW(a);if(l===null)return t.onSkip?.("invalid-slug-output",a.slice(0,60)),null;let c=nW(t.worktreePath);return await dW(l,c)}function uW(e){let t=e.trim().toLowerCase();if(t.length===0)return null;if(hE.test(t)&&t.length<=Tm)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>Tm)break;o=i}return hE.test(o)?o:null}async function dW(e,t){if(!await pW(rW(t,e)))return e;let n=oW(2).toString("hex");return`${e.split("-").slice(0,3).join("-").slice(0,Tm-5)}-${n}`}async function pW(e){try{return await tW.access(e),!0}catch{return!1}}function mW(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 fW(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 bE(e){let t,n,r=await cW(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}:{},onSkip:(i,a)=>{t=i,n=a}});if(r===null)return{status:"skipped",reason:t??"unknown",...n!==void 0?{detail:n}:{}};let s=await(e.renameFn??xb)(e.handle,r,e.branchPrefix!==void 0?{branchPrefix:e.branchPrefix}:void 0);return s.ok?(e.session&&e.session.setCwd(s.newPath),yE(s.newPath),{status:"renamed",oldPath:s.oldPath,newPath:s.newPath,oldBranch:s.oldBranch,newBranch:s.newBranch}):(s.partial==="branch"&&(e.session&&e.session.setCwd(e.handle.path),yE(e.handle.path)),{status:"failed",reason:s.reason,...s.partial!==void 0?{partial:s.partial}:{}})}function yE(e){try{process.chdir(e)}catch{}}W();import{spawn as wE}from"child_process";import{existsSync as wW,mkdirSync as SW,readFileSync as SE,unlinkSync as kW,writeFileSync as vW}from"fs";import{get as TW}from"https";import{join as kE}from"path";import{readFileSync as gW}from"fs";import{dirname as hW,join as yW}from"path";import{fileURLToPath as bW}from"url";function fn(){try{return"3.59.0"}catch{}try{let e=hW(bW(import.meta.url));for(let t of["../../package.json","../package.json"])try{let n=JSON.parse(gW(yW(e,t),"utf-8"));if(typeof n.version=="string")return n.version}catch{}}catch{}return"0.0.0-unknown"}K();var EW=64*1024,xW=1440*60*1e3,RW="update-check.json",AW="pending-update.json";function vE(){return kE(xi(),RW)}function Em(){return kE(xi(),AW)}function TE(){let e=xi();wW(e)||SW(e,{recursive:!0})}function _W(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 CW(){try{let e=SE(vE(),"utf-8"),t=JSON.parse(e);if(typeof t.latestVersion=="string"&&typeof t.checkedAt=="number")return t}catch{}return null}function IW(){try{TE();let e=`
|
|
2219
2219
|
const https = require('https');
|
|
2220
2220
|
const fs = require('fs');
|
|
2221
2221
|
const url = 'https://registry.npmjs.org/agent-afk/latest';
|