@reddb-io/red-skills 2.23.0 → 2.23.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/dev.bundle.min.mjs
CHANGED
|
@@ -638,7 +638,7 @@ ${b.stderr.trim()}
|
|
|
638
638
|
`),"refused"):"clear"}function fpr(e){return e.split(",").map(t=>Number(t.trim())).filter(t=>Number.isFinite(t))}function ppr(e){let t=fpr(e);if(t.length===0)throw new V4(`--issues requires at least one valid issue number (got: ${JSON.stringify(e)})`);return{kind:"issues",numbers:t}}var mpr={spec:{kind:"value",coerce:e=>({kind:"spec",spec:Number(e)})},issues:{kind:"value",coerce:ppr},n:{kind:"value",coerce:e=>Number(e)},once:{kind:"boolean"},runner:{kind:"value",coerce:e=>e},model:{kind:"value",coerce:e=>e},effort:{kind:"value",coerce:e=>e},request:{kind:"value",aliases:["r"],coerce:e=>e},alternate:{kind:"boolean"},"fallback-runner":{kind:"boolean"},"boot-only":{kind:"boolean"},"reconcile-issue":{kind:"value",coerce:e=>Number(e)},origin:{kind:"value",coerce:e=>e},lane:{kind:"value",coerce:e=>e},"pre-pr":{kind:"boolean"},"local-merge":{kind:"boolean"},yolo:{kind:"boolean"},verify:{kind:"value",coerce:e=>e},"go-verify-retries":{kind:"value",coerce:e=>Number(e)},"run-mode":{kind:"value",coerce:e=>e},force:{kind:"boolean"}};function hpr(e){let{values:t}=vl(e,mpr),r={kind:"all"},n=-1;for(let c=0;c<e.length;c+=1){let u=e[c];(u==="--spec"||u.startsWith("--spec="))&&t.spec!==void 0&&c>n?(r=t.spec,n=c):(u==="--issues"||u.startsWith("--issues="))&&t.issues!==void 0&&c>n&&(r=t.issues,n=c)}let o=t.runner,i=t.alternate===!0;if(i&&o!==void 0)throw new V4("--alternate is mutually exclusive with --runner");let s=t["reconcile-issue"],a=typeof s=="number"&&Number.isFinite(s)&&s>0?s:void 0;return{filter:r,iterCap:t.n,once:t.once===!0,runnerFlag:o,model:t.model,effort:t.effort,request:t.request,alternate:i,fallbackRunner:t["fallback-runner"]===!0,bootOnly:t["boot-only"]===!0,reconcileIssue:a,origin:t.origin,lane:t.lane,prePr:t["pre-pr"]===!0,localMerge:t["local-merge"]===!0,yolo:t.yolo===!0,verifyCommand:t.verify,goVerifyRetries:typeof t["go-verify-retries"]=="number"&&Number.isFinite(t["go-verify-retries"])?t["go-verify-retries"]:void 0,runMode:t["run-mode"],force:t.force===!0}}function gpr(e){let t=$p(e);return async r=>{let n=await t(["-C",r,"diff","--name-only","--diff-filter=U"]);if(n.code!==0)return!1;let o=n.stdout.split(`
|
|
639
639
|
`).map(a=>a.trim()).filter(Boolean);if(o.length===0)return!1;let i=[];for(let a of o){let c;try{c=await EAe(Pt(r,a),"utf8")}catch{return!1}let u=mct(c);i.push({path:a,kind:u,description:`${u} conflict in ${a}`})}if(hct(i).nonMechanical.length>0)return!1;for(let a of o)if((await t(["-C",r,"checkout","--theirs","--",a])).code!==0||(await t(["-C",r,"add","--",a])).code!==0)return!1;return(await t(["-C",r,"-c","core.editor=true","rebase","--continue"])).code===0}}function Gut(e,t,r,n,o){let i={cwd:e.root,repo:e.repo},s={cwd:e.root},a=Vv(e.root),c=Cr(t.configPath,{warn:()=>{}}),u=Ze(c,"dev.lock.branch")||void 0,l=Ze(c,"dev.trunk")||void 0;return async d=>{let f=`${t.tmpDir}/claims/${d.number}`;if(!await e4(f,process.pid))return{outcome:"skipped"};let p={gh:{editLabels:async(m,g,y)=>(await pa(i,m,g,y),!0),ensureLabel:m=>El(i,m),comment:(m,g)=>ri(i,m,g),close:m=>Ax(i,m),listByLabel:m=>YN(i,m),issueClosed:m=>JN(i,m),issueReference:m=>og(i,m)},git:{headShortSha:()=>sg(s),deleteLocalBranch:m=>ag(s,m)},fs:{completionSweep:m=>n4(t.workersRoot,m)},lookups:{changedFiles:(m,g)=>XN(s,m,g),branchPresent:async m=>await cg(s,m)?!0:(await ZN(s,m),cg(s,m)),isLocked:()=>Yv(a)},mergeExec:eP(s),remoteGit:$p(s),pnpm:o.pnpm,layout:o.layout,makeLandingWorktree:async m=>{let g=bC(process.env.RED_AFK_SLOT)??0,y=m.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"base",E=Pt(t.tmpDir,"landing",`${y}-boot-${g}`);return await No(s,E),await qd(s,E,m)?E:null},removeLandingWorktree:m=>No(s,m),makeRebaseWorktree:async m=>{let g=bC(process.env.RED_AFK_SLOT)??0,y=m.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"branch",E=Pt(t.tmpDir,"rebase",`${y}-boot-${g}`);return await No(s,E),await qd(s,E,m)?E:null},removeRebaseWorktree:m=>No(s,m),resolveMechanicalConflict:d.labels.includes(ou)?gpr(s):void 0,envelope:{git:$p(s),poster:async(m,g)=>(await ri(i,m,g),!0),writeMarkers:async()=>{},writePosted:async()=>{},issueReference:m=>og(i,m)},nowEpoch:()=>Math.floor(Date.now()/1e3),appendIterLog:()=>{},recoveryEnv:process.env};try{let m=await uR({issueBody:d.body},{readLockedBranch:()=>fC(a),configLockedBranch:u,configTrunk:l,fetchIssueBody:A=>Fhe(i,A)}),g={issue:d.number,title:d.title,body:d.body,labels:d.labels,branch:d.branch,base:m,trunk:l||"main",repo:e.repo,repoDir:e.root,remote:e.remote,workerId:r,attempt:0,attemptDir:Pt(t.tmpDir,"boot-reconcile",String(d.number)),runner:n,trustPriorValidation:d.labels.includes(ou)},y=await cR(p,g);return{outcome:y.outcome==="landed"?"landed":y.outcome==="parked"?"parked":"skipped"}}finally{await as(f)}}}async function Apr(e,t,r,n,o){let i={cwd:r.root,repo:r.repo},s={cwd:r.root},a=await UV(i,e);if(!a)return process.stderr.write(`[afk reconcile-worker] #${e} not found or fetch failed \u2014 nothing to reconcile
|
|
640
640
|
`),0;let c=await Hp(s,"afk/"),u=Pge(c.map(p=>p.branch),e);if(!u)return process.stderr.write(`[afk reconcile-worker] no afk branch for #${e} \u2014 nothing to reconcile
|
|
641
|
-
`),0;let l={number:a.number,title:a.title,body:a.body,labels:a.labels,branch:u},d=yge(r.root,process.env,t),f=BP(r.root,Pt(n.tmpDir,"feedback"),void 0,{rebaseOnto:d.feedbackRebaseBase});try{await Gut(r,n,o,t,f)(l)}finally{await f.cleanup()}return 0}var ypr=[{stage:"impl",pattern:/^(edit|write|multiedit|notebookedit)$/},{stage:"explore",pattern:/^(read|grep|glob)$/}],xpr=[{stage:"commit",pattern:/\bgit\s+commit(?:\s|$)/},{stage:"push",pattern:/\bgit\s+push(?:\s|$)/},{stage:"review",pattern:/\bgit\s+(?:diff|log|show)(?:\s|$)/},{stage:"build",pattern:/\btsc\s+--build\b/},{stage:"build",pattern:/\b(?:npm|pnpm|yarn|bun)(?:(?![;&|]).)*\bbuild\b/},{stage:"build",pattern:/\bvite\s+build\b/},{stage:"build",pattern:/\bcargo\s+build\b/},{stage:"build",pattern:/\bgo\s+build\b/},{stage:"build",pattern:/\bmake\b/},{stage:"build",pattern:/\bgradle(?:(?![;&|]).)*\bbuild\b/},{stage:"build",pattern:/\bmvn(?:(?![;&|]).)*\bpackage\b/},{stage:"build",pattern:/\bdotnet\s+build\b/},{stage:"build",pattern:/\bcmake\b/},{stage:"build",pattern:/\bbazel\s+build\b/},{stage:"build",pattern:/\bzig\s+build\b/},{stage:"build",pattern:/\bdart\s+compile\b/},{stage:"typecheck",pattern:/\b(?:npm|pnpm|yarn|bun)(?:(?![;&|]).)*\btypecheck\b/},{stage:"typecheck",pattern:/\btsc\b(?!\s+--build\b)/},{stage:"typecheck",pattern:/\b(?:mypy|pyright)\b/},{stage:"typecheck",pattern:/\bcargo\s+check\b/},{stage:"typecheck",pattern:/\bdart\s+analyze\b/},{stage:"lint",pattern:/\b(?:eslint|biome)\b/},{stage:"lint",pattern:/\bprettier\b(?:(?![;&|]).)*\b--check\b/},{stage:"lint",pattern:/\bcargo\s+clippy\b/},{stage:"lint",pattern:/\b(?:ruff|flake8|pylint)\b/},{stage:"lint",pattern:/\bblack\b(?:(?![;&|]).)*\b--check\b/},{stage:"lint",pattern:/\brubocop\b/},{stage:"lint",pattern:/\bgolangci-lint\b/},{stage:"lint",pattern:/\bgo\s+vet\b/},{stage:"lint",pattern:/\bgofmt\b/},{stage:"lint",pattern:/\b(?:ktlint|checkstyle)\b/},{stage:"lint",pattern:/\bclang-tidy\b/},{stage:"lint",pattern:/\bdotnet\s+format\b/},{stage:"lint",pattern:/\bdart\s+analyze\b/},{stage:"tests",pattern:/\b(?:vitest|jest|mocha)\b/},{stage:"tests",pattern:/\b(?:npm|pnpm|yarn|bun)(?:(?![;&|]).)*\btest\b/},{stage:"tests",pattern:/\bcargo\s+test\b/},{stage:"tests",pattern:/\bgo\s+test\b/},{stage:"tests",pattern:/\bpytest\b/},{stage:"tests",pattern:/\bpython(?:\d+(?:\.\d+)?)?\s+-m\s+(?:pytest|unittest)\b/},{stage:"tests",pattern:/\bunittest\b/},{stage:"tests",pattern:/\bphpunit\b/},{stage:"tests",pattern:/\bgradle(?:(?![;&|]).)*\btest\b/},{stage:"tests",pattern:/\bmvn(?:(?![;&|]).)*\btest\b/},{stage:"tests",pattern:/\bdotnet\s+test\b/},{stage:"tests",pattern:/\bctest\b/},{stage:"tests",pattern:/\bdart\s+test\b/},{stage:"tests",pattern:/\bzig\s+test\b/},{stage:"explore",pattern:/\bgit\s+ls-files(?:\s|$)/},{stage:"explore",pattern:/\bfind\b/}];function Epr(e){if(e.type==="reasoning")return"plan";if(e.type!=="toolCall")return;let t=e.name.toLowerCase(),r=e.formattedArgs.toLowerCase();for(let n of ypr)if(n.pattern.test(t))return n.stage;for(let n of xpr)if(n.pattern.test(r))return n.stage}function bC(e){if(e===void 0)return;let t=parseInt(e,10);return Number.isFinite(t)&&t>=0?t:void 0}function bpr(e,t,r,n,o,i,s,a,c,u,l,d,f,p){let m={cwd:e.root,repo:e.repo,exec:a},g={cwd:e.root,exec:a},y=Zr(e.root),E=Vv(e.root),A=c??DV,b=0,I="",w=dAe(),v="",k={added:0,removed:0},R=0,T=0,U="",D=Cr(y.configPath,{warn:()=>{}}),ee=kl(D),L=RP(e.root);hC(D,L);let B=Ze(D,"afk.merge.wait_for_review")==="true"?{check:Ze(D,"afk.merge.review_check")||"CodeRabbit",sleep:_=>new Promise(J=>setTimeout(J,_))}:void 0,P=Ze(D,"afk.merge.ci_aware")==="true"?{sleep:_=>new Promise(J=>setTimeout(J,_)),intervalMs:1e4,maxPolls:Math.max(1,Math.ceil(lxe(process.env)/10))}:void 0,F=Hct(D),N=Ze(D,"afk.worktree_launches_pull_request")!=="false",$=Ze(D,"afk.merge.native_queue")==="true",ne=$||Ze(D,"afk.merge.land_lock")==="false"?void 0:dut(y.tmpDir,`pid-${process.pid}`),ce=Pct(D),fe=dM(D),Ne=f&&f.trim()!==""?[...fe,f.trim()]:fe;return{gh:{viewLabels:_=>aC(m,_),editLabels:(_,J,le)=>pa(m,_,J,le),ensureLabel:async _=>{try{await El(m,_)}catch{}},comment:(_,J)=>ri(m,_,J),editBody:(_,J)=>VN(m,_,J),close:_=>Ax(m,_),listByLabel:_=>YN(m,_),issueClosed:_=>JN(m,_),issueReference:_=>og(m,_),issueTrust:_=>jit(m,_),repoVisibility:()=>qit(m),actorTrustSignals:_=>ig(m,_),renderDecisionCard:async _=>{let{hitlCardCommand:J}=await Promise.resolve().then(()=>(xAe(),$ut));await J(["render",`--issue=${_}`,`--root=${e.root}`])},findMainRedRepairIssue:()=>_it(m),createMainRedRepairIssue:_=>Tit(m,_),updateMainRedRepairIssue:(_,J)=>Dit(m,_,J),closeMainRedRepairIssue:(_,J)=>Qit(m,_,J)},claimGh:{postClaim:(_,J)=>zN(m,_,J),listClaims:_=>Uv(m,_),concede:async(_,J)=>{try{await zN(m,_,J)}catch{}},audit:async(_,J)=>{try{await ri(m,_,J)}catch{}}},claimStale:Lge(Math.floor(Date.now()/1e3),Oat(process.env)),recoveredWorkerDeathCause:_=>Aut(y.tmpDir,_,RR()),claimLock:{acquire:_=>e4(`${y.tmpDir}/claims/${_}`,process.pid),release:async _=>{await as(`${y.tmpDir}/claims/${_}`)}},fs:{ensureAttemptDir:_=>Wp(_),writeHandoff:(_,J)=>Xhe(_,J),writeValidationSidecar:(_,J)=>ege(_,J),completionSweep:_=>n4(y.workersRoot,_)},git:{headShortSha:()=>sg(g),deleteLocalBranch:_=>ag(g,_),resolveFreshBase:_=>Xit(g,_),fetchBase:async _=>{await $p(g)(["fetch",e.remote,_])},prepareFreshWorkerBranch:_=>est(g,{..._,remote:e.remote})},mergeExec:eP(g),remoteGit:$p(g),salvageUncommitted:_=>zV(g,_,e.remote),exitBarrier:_=>kct({salvage:J=>zV(g,J,e.remote),push:J=>zhe(g,J,e.remote),headSha:async J=>await Up(g,J)??"",nowIso:()=>new Date().toISOString()},_),terminalExitBarrier:_=>vct({salvage:J=>zV(g,J,e.remote),push:J=>zhe(g,J,e.remote),headSha:async J=>await Up(g,J)??"",nowIso:()=>new Date().toISOString()},_),pnpm:n.pnpm,layout:n.layout,backpressure:n.backpressure,backpressureCommands:Ne,postBackpressureReview:(_,J)=>j4(m).postReview(_,{summary:J,comments:[]}),goVerifyRetries:p,postAttemptFormat:n.postAttemptFormat,postAttemptFormatCommands:uxe(D),runAgent:Vst(r,process.env,c,u,l,d,()=>w.peek()),sandboxMode:r,sandboxAvailable:async _=>(await(a??Wt)("sh",["-c",`command -v ${_}`],{cwd:e.root})).code===0,model:t,classifyIssue:Spr(D,s,e.root,a),resolveTier:(_,J="think")=>ba(D,_,J,process.env),fallbackRunner:i,waitForReview:B,ciAwait:P,worktreeLaunchesPr:N,landLock:ne,nativeMergeQueue:$,reviewGate:F,reviewGateLabel:TC,conflictResolver:async(_,J)=>{let le=ba(D,s,"think",process.env),jt=s==="codex"?Uot({prompt:_,worktree:J,lastMessagePath:Pt(y.tmpDir,"merge-resolve.last"),model:le.model,effort:le.effort}):Lot({prompt:_,worktree:J}),{execTool:Zn}=await Promise.resolve().then(()=>(En(),ng));await Zn(jt.command,jt.args,{cwd:J})},makeLandingWorktree:async _=>{let J=bC(process.env.RED_AFK_SLOT)??0,le=_.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"base",jt=Pt(y.tmpDir,"landing",`${le}-${J}`);return await No(g,jt),await qd(g,jt,_)?jt:null},removeLandingWorktree:_=>No(g,_),makeRebaseWorktree:async _=>{let J=bC(process.env.RED_AFK_SLOT)??0,le=_.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"branch",jt=Pt(y.tmpDir,"rebase",`${le}-${J}`);return await No(g,jt),await qd(g,jt,_)?jt:null},removeRebaseWorktree:_=>No(g,_),hooks:{config:D,resolveOptions:L,exec:vP(e.root),env:uAe(e.repo,e.root,bC(process.env.RED_AFK_SLOT),s)},lookups:{base:{readLockedBranch:()=>fC(E),configLockedBranch:Ze(D,"dev.lock.branch")||void 0,configTrunk:Ze(D,"dev.trunk")||void 0,fetchIssueBody:_=>Fhe(m,_)},isLocked:()=>Yv(E),comments:_=>$V(m,_,J=>wl(ee,J,le=>ig(m,le))),issueUrl:_=>Nit(m,_),priorAttemptContext:async _=>{try{let J=await uut(y.tmpDir,_);return J?lut(J):void 0}catch{return}},changedFiles:(_,J)=>XN(g,_,J),diffstat:(_,J)=>rst(g,_,J),branchPresent:async _=>await cg(g,_)?!0:(await ZN(g,_),cg(g,_)),branchMerged:(_,J)=>tst(g,_,J)},envelope:{git:$p(g),poster:async(_,J)=>(await ri(m,_,J),!0),writeMarkers:_=>rge(o.attemptDir,_),writePosted:_=>nge(o.attemptDir,_),issueReference:_=>og(m,_)},nowEpoch:()=>Math.floor(Date.now()/1e3),nowIso:()=>new Date().toISOString(),appendIterLog:_=>{uP(Pt(o.attemptDir,"afk.log"),_)},recordAgentEvent:_=>{let J=new Date().toISOString();if(_.type==="raw"){xx(Pt(o.attemptDir,"log.jsonl"),"raw",_.line,{ts:J,fields:{extra:{kind:"raw",iteration:String(_.iteration)}}}).catch(()=>{});return}if(_.type==="sessionId"){xx(Pt(o.attemptDir,"log.jsonl"),"session",`session ${_.sessionId}`,{ts:J,fields:{extra:{kind:"sessionId",iteration:String(_.iteration),session_id:_.sessionId}}}).catch(()=>{});return}let le=o.attemptDir;if(le!==I&&(I=le,b=0),le!==v&&(v=le,w=dAe()),le!==U&&(U=le,R=0,T=0),(_.type==="text"||_.type==="toolCall"||_.type==="reasoning"||_.type==="usage")&&w.record(_),_.iteration!==b){let qe=(ir,Xn,ga)=>{uP(Pt(le,"afk.log"),ir),xx(Pt(le,"log.jsonl"),"iteration",ir,{ts:J,fields:{extra:{iteration:String(ga),phase:Xn}}}).catch(()=>{})};b>0&&qe(tAe(b,"ended",A),"ended",b),b=_.iteration,qe(tAe(b,"started",A),"started",b),bl(Pt(le,"afk.state.json"),{"current.iteration":String(b)}).catch(()=>{})}let jt=_.type==="text"?_.message:_.type==="reasoning"?`\u{1F9E0} reasoning${_.tokens?` (${_.tokens} tok)`:_.message?`: ${_.message.slice(0,80)}`:""}`:_.type==="usage"?`\u{1F4B0} usage (in:${_.inputTokens} out:${_.outputTokens}${_.reasoningTokens?` reason:${_.reasoningTokens}`:""})`:_.type==="result"?`result: ${_.result}`:`\u2192 ${_.name} ${_.formattedArgs}`;Tct(Pt(o.attemptDir,"agent.log.jsonl"),jt,{ts:J,fields:{extra:{iteration:String(_.iteration),kind:_.type}}}).catch(()=>{}),xx(Pt(o.attemptDir,"log.jsonl"),"agent",jt,{ts:J,fields:{extra:{iteration:String(_.iteration),kind:_.type}}}).catch(()=>{});let Zn=Epr(_),Fi=_.type==="toolCall"||_.type==="reasoning"||_.type==="usage"||_.type==="result",Zd=_.type==="usage"?{"current.input_tokens":w.peek().inputTokens,"current.output_tokens":w.peek().outputTokens,"current.cost_usd":w.peek().costUsd}:{};(Zn||Fi)&&bl(Pt(o.attemptDir,"afk.state.json"),{...Zn?{"current.stage":Zn,"current.last_stream_line":jt.slice(0,200)}:{},"current.phase":"coding","current.last_event_at":J,...Zd}).catch(()=>{})},emitHeartbeat:_=>{let J=new Date().toISOString(),le=Math.max(0,Math.floor((_.nowMs-_.lastProgressMs)/1e3)),jt=new Date(_.lastProgressMs).toISOString(),Zn=_.head??"";(async()=>{let Fi=await ist(g,o.attemptDir).catch(()=>{})??Pt(o.attemptDir,"worktree"),Zd=_.base?`origin/${_.base}`:`origin/${Ze(D,"dev.trunk")||"main"}`,qe=xut(o.attemptDir,"/"),{added:ir,removed:Xn}=await yut({headSha:Zn,compute:()=>nst({cwd:Fi},Zd).catch(()=>({added:0,removed:0})),computeUncommitted:()=>ost({cwd:Fi}).catch(()=>({added:0,removed:0})),readMemo:()=>{try{let us=JSON.parse(QP(qe,"utf8"));return{sha:String(us.sha??""),added:Number(us.added??0),removed:Number(us.removed??0)}}catch{return null}},writeMemo:us=>{try{Wut(qe,JSON.stringify(us),"utf8")}catch{}}});k={added:ir,removed:Xn},ir>R&&(R=ir),Xn>T&&(T=Xn);let ga=w.snapshotWindow(),Wn=Qct({secsSinceProgress:le,lastProgressAt:jt,head:Zn,added:ir,removed:Xn,activity:ga});await xx(Pt(o.attemptDir,"log.jsonl"),"heartbeat",Wn.msg,{ts:J,fields:{extra:Wn.extra}}).catch(()=>{}),await uP(Pt(o.attemptDir,"afk.log"),`[heartbeat] ${Wn.msg}`),await bl(Pt(o.attemptDir,"afk.state.json"),{...Wn.statePatch,"current.loc_peak_added":R,"current.loc_peak_removed":T,"current.worktree":Fi,..._.base?{"current.base":_.base}:{}}).catch(()=>{})})()},heartbeatVitals:()=>{let _=w.peek();return{tools_called_count:_.toolsCalled,text_chunk_count:_.textChunks,reasoning_events:_.reasoningCount,reasoning_tokens:_.reasoningTokens,waiting_count:_.waiting,input_tokens:_.inputTokens,output_tokens:_.outputTokens,cost_usd:_.costUsd,loc_added:k.added,loc_removed:k.removed}},notesLoop:ce,writeNotes:(_,J)=>{try{Wut(_,J,"utf8")}catch{}},markPhase:_=>{bl(Pt(o.attemptDir,"afk.state.json"),{"current.phase":_}).catch(()=>{})},markState:_=>{bl(Pt(o.attemptDir,"afk.state.json"),_).catch(()=>{})},historyPath:y.historyPath,historyClock:{ts:new Date().toISOString(),epoch:Math.floor(Date.now()/1e3)},recoveryEnv:process.env,recordAttempt:Ipr(e.root,o,a),recordOutcomeEvent:wpr(e.root,o,a),cascadeRebase:{async listAFKBranches(){return(await Hp(g,"afk/")).map(J=>J.branch)},isWorkerLive(_){try{let J=aP(y.tmpDir,_),le=QP(J,"utf8").trim();return/^[1-9][0-9]*$/.test(le)?(process.kill(Number(le),0),!0):!1}catch(J){return J.code==="EPERM"}},async rebaseAndPush(_,J,le){let jt=J.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),Zn=bC(process.env.RED_AFK_SLOT)??0,Fi=Pt(y.tmpDir,"cascade-rebase",`${jt}-${Zn}`);try{if(await No(g,Fi),!await qd(g,Fi,J))return{ok:!1,warn:`failed to create worktree for ${J}`};let qe=a??(await Promise.resolve().then(()=>(En(),ng))).execTool,ir=await qe("git",["rebase",`origin/${le}`],{cwd:Fi});if(ir.code!==0)return await qe("git",["rebase","--abort"],{cwd:Fi}).catch(()=>{}),{ok:!1,warn:`rebase of ${J} onto ${le} conflicted: ${ir.stderr.slice(0,200)}`};let Xn=await qe("git",["push","origin",`HEAD:refs/heads/${J}`,"--force-with-lease"],{cwd:Fi});return Xn.code!==0?{ok:!1,warn:`--force-with-lease push rejected for ${J}: ${Xn.stderr.slice(0,200)}`}:{ok:!0}}finally{await No(g,Fi).catch(()=>{})}}}}}function Spr(e,t,r,n){return async o=>{let i=ba(e,t,"validate",process.env);return Uct(o,async({prompt:s})=>{let a=n??(await Promise.resolve().then(()=>(En(),ng))).execTool,c={cwd:r,timeoutMs:45e3,maxBuffer:1024*1024},u=t==="codex"?await a("codex",["exec","--model",i.model,"-c",`model_reasoning_effort=${i.effort}`,"-C",r,"--sandbox","read-only","--skip-git-repo-check",s],c):await a("claude",["--model",i.model,"--effort",i.effort,"--permission-mode","bypassPermissions","--print",s],c);return u.code===0?u.stdout.trim():void 0})}}function Cpr(e){try{let t=JSON.parse(QP(e,"utf8")).version;return typeof t=="string"&&t.length>0?t:void 0}catch{return}}function Ipr(e,t,r){return async n=>{try{let o={...process.env,MEMORY_REPO_ROOT:process.env.MEMORY_REPO_ROOT??e},i=uct(e,o,{exists:DP,readJsonVersion:Cpr,readText:f=>{try{return QP(f,"utf8")}catch{return}}});if(!i)return;let s=t.attemptDir||e,a=Pt(s,`memory-attempt-${n.issueNumber}-a${n.attemptNumber}.json`);await Wp(s);let c=cct(n);await Y4(a,c,"utf8");let u=r??(await Promise.resolve().then(()=>(En(),ng))).execTool,[l,...d]=i;await u(l,[...d,"attempt","record","--root",e],{cwd:e,env:o,input:c})}catch(o){process.stderr.write(`[afk] memory attempt-record skipped (best-effort): ${String(o)}
|
|
641
|
+
`),0;let l={number:a.number,title:a.title,body:a.body,labels:a.labels,branch:u},d=yge(r.root,process.env,t),f=BP(r.root,Pt(n.tmpDir,"feedback"),void 0,{rebaseOnto:d.feedbackRebaseBase});try{await Gut(r,n,o,t,f)(l)}finally{await f.cleanup()}return 0}var ypr=[{stage:"impl",pattern:/^(edit|write|multiedit|notebookedit)$/},{stage:"explore",pattern:/^(read|grep|glob)$/}],xpr=[{stage:"commit",pattern:/\bgit\s+commit(?:\s|$)/},{stage:"push",pattern:/\bgit\s+push(?:\s|$)/},{stage:"review",pattern:/\bgit\s+(?:diff|log|show)(?:\s|$)/},{stage:"build",pattern:/\btsc\s+--build\b/},{stage:"build",pattern:/\b(?:npm|pnpm|yarn|bun)(?:(?![;&|]).)*\bbuild\b/},{stage:"build",pattern:/\bvite\s+build\b/},{stage:"build",pattern:/\bcargo\s+build\b/},{stage:"build",pattern:/\bgo\s+build\b/},{stage:"build",pattern:/\bmake\b/},{stage:"build",pattern:/\bgradle(?:(?![;&|]).)*\bbuild\b/},{stage:"build",pattern:/\bmvn(?:(?![;&|]).)*\bpackage\b/},{stage:"build",pattern:/\bdotnet\s+build\b/},{stage:"build",pattern:/\bcmake\b/},{stage:"build",pattern:/\bbazel\s+build\b/},{stage:"build",pattern:/\bzig\s+build\b/},{stage:"build",pattern:/\bdart\s+compile\b/},{stage:"typecheck",pattern:/\b(?:npm|pnpm|yarn|bun)(?:(?![;&|]).)*\btypecheck\b/},{stage:"typecheck",pattern:/\btsc\b(?!\s+--build\b)/},{stage:"typecheck",pattern:/\b(?:mypy|pyright)\b/},{stage:"typecheck",pattern:/\bcargo\s+check\b/},{stage:"typecheck",pattern:/\bdart\s+analyze\b/},{stage:"lint",pattern:/\b(?:eslint|biome)\b/},{stage:"lint",pattern:/\bprettier\b(?:(?![;&|]).)*\b--check\b/},{stage:"lint",pattern:/\bcargo\s+clippy\b/},{stage:"lint",pattern:/\b(?:ruff|flake8|pylint)\b/},{stage:"lint",pattern:/\bblack\b(?:(?![;&|]).)*\b--check\b/},{stage:"lint",pattern:/\brubocop\b/},{stage:"lint",pattern:/\bgolangci-lint\b/},{stage:"lint",pattern:/\bgo\s+vet\b/},{stage:"lint",pattern:/\bgofmt\b/},{stage:"lint",pattern:/\b(?:ktlint|checkstyle)\b/},{stage:"lint",pattern:/\bclang-tidy\b/},{stage:"lint",pattern:/\bdotnet\s+format\b/},{stage:"lint",pattern:/\bdart\s+analyze\b/},{stage:"tests",pattern:/\b(?:vitest|jest|mocha)\b/},{stage:"tests",pattern:/\b(?:npm|pnpm|yarn|bun)(?:(?![;&|]).)*\btest\b/},{stage:"tests",pattern:/\bcargo\s+test\b/},{stage:"tests",pattern:/\bgo\s+test\b/},{stage:"tests",pattern:/\bpytest\b/},{stage:"tests",pattern:/\bpython(?:\d+(?:\.\d+)?)?\s+-m\s+(?:pytest|unittest)\b/},{stage:"tests",pattern:/\bunittest\b/},{stage:"tests",pattern:/\bphpunit\b/},{stage:"tests",pattern:/\bgradle(?:(?![;&|]).)*\btest\b/},{stage:"tests",pattern:/\bmvn(?:(?![;&|]).)*\btest\b/},{stage:"tests",pattern:/\bdotnet\s+test\b/},{stage:"tests",pattern:/\bctest\b/},{stage:"tests",pattern:/\bdart\s+test\b/},{stage:"tests",pattern:/\bzig\s+test\b/},{stage:"explore",pattern:/\bgit\s+ls-files(?:\s|$)/},{stage:"explore",pattern:/\bfind\b/}];function Epr(e){if(e.type!=="toolCall")return;let t=e.name.toLowerCase(),r=e.formattedArgs.toLowerCase();for(let n of ypr)if(n.pattern.test(t))return n.stage;for(let n of xpr)if(n.pattern.test(r))return n.stage}function bC(e){if(e===void 0)return;let t=parseInt(e,10);return Number.isFinite(t)&&t>=0?t:void 0}function bpr(e,t,r,n,o,i,s,a,c,u,l,d,f,p){let m={cwd:e.root,repo:e.repo,exec:a},g={cwd:e.root,exec:a},y=Zr(e.root),E=Vv(e.root),A=c??DV,b=0,I="",w=dAe(),v="",k={added:0,removed:0},R=0,T=0,U="",D=Cr(y.configPath,{warn:()=>{}}),ee=kl(D),L=RP(e.root);hC(D,L);let B=Ze(D,"afk.merge.wait_for_review")==="true"?{check:Ze(D,"afk.merge.review_check")||"CodeRabbit",sleep:_=>new Promise(J=>setTimeout(J,_))}:void 0,P=Ze(D,"afk.merge.ci_aware")==="true"?{sleep:_=>new Promise(J=>setTimeout(J,_)),intervalMs:1e4,maxPolls:Math.max(1,Math.ceil(lxe(process.env)/10))}:void 0,F=Hct(D),N=Ze(D,"afk.worktree_launches_pull_request")!=="false",$=Ze(D,"afk.merge.native_queue")==="true",ne=$||Ze(D,"afk.merge.land_lock")==="false"?void 0:dut(y.tmpDir,`pid-${process.pid}`),ce=Pct(D),fe=dM(D),Ne=f&&f.trim()!==""?[...fe,f.trim()]:fe;return{gh:{viewLabels:_=>aC(m,_),editLabels:(_,J,le)=>pa(m,_,J,le),ensureLabel:async _=>{try{await El(m,_)}catch{}},comment:(_,J)=>ri(m,_,J),editBody:(_,J)=>VN(m,_,J),close:_=>Ax(m,_),listByLabel:_=>YN(m,_),issueClosed:_=>JN(m,_),issueReference:_=>og(m,_),issueTrust:_=>jit(m,_),repoVisibility:()=>qit(m),actorTrustSignals:_=>ig(m,_),renderDecisionCard:async _=>{let{hitlCardCommand:J}=await Promise.resolve().then(()=>(xAe(),$ut));await J(["render",`--issue=${_}`,`--root=${e.root}`])},findMainRedRepairIssue:()=>_it(m),createMainRedRepairIssue:_=>Tit(m,_),updateMainRedRepairIssue:(_,J)=>Dit(m,_,J),closeMainRedRepairIssue:(_,J)=>Qit(m,_,J)},claimGh:{postClaim:(_,J)=>zN(m,_,J),listClaims:_=>Uv(m,_),concede:async(_,J)=>{try{await zN(m,_,J)}catch{}},audit:async(_,J)=>{try{await ri(m,_,J)}catch{}}},claimStale:Lge(Math.floor(Date.now()/1e3),Oat(process.env)),recoveredWorkerDeathCause:_=>Aut(y.tmpDir,_,RR()),claimLock:{acquire:_=>e4(`${y.tmpDir}/claims/${_}`,process.pid),release:async _=>{await as(`${y.tmpDir}/claims/${_}`)}},fs:{ensureAttemptDir:_=>Wp(_),writeHandoff:(_,J)=>Xhe(_,J),writeValidationSidecar:(_,J)=>ege(_,J),completionSweep:_=>n4(y.workersRoot,_)},git:{headShortSha:()=>sg(g),deleteLocalBranch:_=>ag(g,_),resolveFreshBase:_=>Xit(g,_),fetchBase:async _=>{await $p(g)(["fetch",e.remote,_])},prepareFreshWorkerBranch:_=>est(g,{..._,remote:e.remote})},mergeExec:eP(g),remoteGit:$p(g),salvageUncommitted:_=>zV(g,_,e.remote),exitBarrier:_=>kct({salvage:J=>zV(g,J,e.remote),push:J=>zhe(g,J,e.remote),headSha:async J=>await Up(g,J)??"",nowIso:()=>new Date().toISOString()},_),terminalExitBarrier:_=>vct({salvage:J=>zV(g,J,e.remote),push:J=>zhe(g,J,e.remote),headSha:async J=>await Up(g,J)??"",nowIso:()=>new Date().toISOString()},_),pnpm:n.pnpm,layout:n.layout,backpressure:n.backpressure,backpressureCommands:Ne,postBackpressureReview:(_,J)=>j4(m).postReview(_,{summary:J,comments:[]}),goVerifyRetries:p,postAttemptFormat:n.postAttemptFormat,postAttemptFormatCommands:uxe(D),runAgent:Vst(r,process.env,c,u,l,d,()=>w.peek()),sandboxMode:r,sandboxAvailable:async _=>(await(a??Wt)("sh",["-c",`command -v ${_}`],{cwd:e.root})).code===0,model:t,classifyIssue:Spr(D,s,e.root,a),resolveTier:(_,J="think")=>ba(D,_,J,process.env),fallbackRunner:i,waitForReview:B,ciAwait:P,worktreeLaunchesPr:N,landLock:ne,nativeMergeQueue:$,reviewGate:F,reviewGateLabel:TC,conflictResolver:async(_,J)=>{let le=ba(D,s,"think",process.env),jt=s==="codex"?Uot({prompt:_,worktree:J,lastMessagePath:Pt(y.tmpDir,"merge-resolve.last"),model:le.model,effort:le.effort}):Lot({prompt:_,worktree:J}),{execTool:Zn}=await Promise.resolve().then(()=>(En(),ng));await Zn(jt.command,jt.args,{cwd:J})},makeLandingWorktree:async _=>{let J=bC(process.env.RED_AFK_SLOT)??0,le=_.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"base",jt=Pt(y.tmpDir,"landing",`${le}-${J}`);return await No(g,jt),await qd(g,jt,_)?jt:null},removeLandingWorktree:_=>No(g,_),makeRebaseWorktree:async _=>{let J=bC(process.env.RED_AFK_SLOT)??0,le=_.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"branch",jt=Pt(y.tmpDir,"rebase",`${le}-${J}`);return await No(g,jt),await qd(g,jt,_)?jt:null},removeRebaseWorktree:_=>No(g,_),hooks:{config:D,resolveOptions:L,exec:vP(e.root),env:uAe(e.repo,e.root,bC(process.env.RED_AFK_SLOT),s)},lookups:{base:{readLockedBranch:()=>fC(E),configLockedBranch:Ze(D,"dev.lock.branch")||void 0,configTrunk:Ze(D,"dev.trunk")||void 0,fetchIssueBody:_=>Fhe(m,_)},isLocked:()=>Yv(E),comments:_=>$V(m,_,J=>wl(ee,J,le=>ig(m,le))),issueUrl:_=>Nit(m,_),priorAttemptContext:async _=>{try{let J=await uut(y.tmpDir,_);return J?lut(J):void 0}catch{return}},changedFiles:(_,J)=>XN(g,_,J),diffstat:(_,J)=>rst(g,_,J),branchPresent:async _=>await cg(g,_)?!0:(await ZN(g,_),cg(g,_)),branchMerged:(_,J)=>tst(g,_,J)},envelope:{git:$p(g),poster:async(_,J)=>(await ri(m,_,J),!0),writeMarkers:_=>rge(o.attemptDir,_),writePosted:_=>nge(o.attemptDir,_),issueReference:_=>og(m,_)},nowEpoch:()=>Math.floor(Date.now()/1e3),nowIso:()=>new Date().toISOString(),appendIterLog:_=>{uP(Pt(o.attemptDir,"afk.log"),_)},recordAgentEvent:_=>{let J=new Date().toISOString();if(_.type==="raw"){xx(Pt(o.attemptDir,"log.jsonl"),"raw",_.line,{ts:J,fields:{extra:{kind:"raw",iteration:String(_.iteration)}}}).catch(()=>{});return}if(_.type==="sessionId"){xx(Pt(o.attemptDir,"log.jsonl"),"session",`session ${_.sessionId}`,{ts:J,fields:{extra:{kind:"sessionId",iteration:String(_.iteration),session_id:_.sessionId}}}).catch(()=>{});return}let le=o.attemptDir;if(le!==I&&(I=le,b=0),le!==v&&(v=le,w=dAe()),le!==U&&(U=le,R=0,T=0),(_.type==="text"||_.type==="toolCall"||_.type==="reasoning"||_.type==="usage")&&w.record(_),_.iteration!==b){let qe=(ir,Xn,ga)=>{uP(Pt(le,"afk.log"),ir),xx(Pt(le,"log.jsonl"),"iteration",ir,{ts:J,fields:{extra:{iteration:String(ga),phase:Xn}}}).catch(()=>{})};b>0&&qe(tAe(b,"ended",A),"ended",b),b=_.iteration,qe(tAe(b,"started",A),"started",b),bl(Pt(le,"afk.state.json"),{"current.iteration":String(b)}).catch(()=>{})}let jt=_.type==="text"?_.message:_.type==="reasoning"?`\u{1F9E0} reasoning${_.tokens?` (${_.tokens} tok)`:_.message?`: ${_.message.slice(0,80)}`:""}`:_.type==="usage"?`\u{1F4B0} usage (in:${_.inputTokens} out:${_.outputTokens}${_.reasoningTokens?` reason:${_.reasoningTokens}`:""})`:_.type==="result"?`result: ${_.result}`:`\u2192 ${_.name} ${_.formattedArgs}`;Tct(Pt(o.attemptDir,"agent.log.jsonl"),jt,{ts:J,fields:{extra:{iteration:String(_.iteration),kind:_.type}}}).catch(()=>{}),xx(Pt(o.attemptDir,"log.jsonl"),"agent",jt,{ts:J,fields:{extra:{iteration:String(_.iteration),kind:_.type}}}).catch(()=>{});let Zn=Epr(_),Fi=_.type==="toolCall"||_.type==="reasoning"||_.type==="usage"||_.type==="result",Zd=_.type==="usage"?{"current.input_tokens":w.peek().inputTokens,"current.output_tokens":w.peek().outputTokens,"current.cost_usd":w.peek().costUsd}:{};(Zn||Fi)&&bl(Pt(o.attemptDir,"afk.state.json"),{...Zn?{"current.stage":Zn,"current.last_stream_line":jt.slice(0,200)}:{},"current.phase":"coding","current.last_event_at":J,...Zd}).catch(()=>{})},emitHeartbeat:_=>{let J=new Date().toISOString(),le=Math.max(0,Math.floor((_.nowMs-_.lastProgressMs)/1e3)),jt=new Date(_.lastProgressMs).toISOString(),Zn=_.head??"";(async()=>{let Fi=await ist(g,o.attemptDir).catch(()=>{})??Pt(o.attemptDir,"worktree"),Zd=_.base?`origin/${_.base}`:`origin/${Ze(D,"dev.trunk")||"main"}`,qe=xut(o.attemptDir,"/"),{added:ir,removed:Xn}=await yut({headSha:Zn,compute:()=>nst({cwd:Fi},Zd).catch(()=>({added:0,removed:0})),computeUncommitted:()=>ost({cwd:Fi}).catch(()=>({added:0,removed:0})),readMemo:()=>{try{let us=JSON.parse(QP(qe,"utf8"));return{sha:String(us.sha??""),added:Number(us.added??0),removed:Number(us.removed??0)}}catch{return null}},writeMemo:us=>{try{Wut(qe,JSON.stringify(us),"utf8")}catch{}}});k={added:ir,removed:Xn},ir>R&&(R=ir),Xn>T&&(T=Xn);let ga=w.snapshotWindow(),Wn=Qct({secsSinceProgress:le,lastProgressAt:jt,head:Zn,added:ir,removed:Xn,activity:ga});await xx(Pt(o.attemptDir,"log.jsonl"),"heartbeat",Wn.msg,{ts:J,fields:{extra:Wn.extra}}).catch(()=>{}),await uP(Pt(o.attemptDir,"afk.log"),`[heartbeat] ${Wn.msg}`),await bl(Pt(o.attemptDir,"afk.state.json"),{...Wn.statePatch,"current.loc_peak_added":R,"current.loc_peak_removed":T,"current.worktree":Fi,..._.base?{"current.base":_.base}:{}}).catch(()=>{})})()},heartbeatVitals:()=>{let _=w.peek();return{tools_called_count:_.toolsCalled,text_chunk_count:_.textChunks,reasoning_events:_.reasoningCount,reasoning_tokens:_.reasoningTokens,waiting_count:_.waiting,input_tokens:_.inputTokens,output_tokens:_.outputTokens,cost_usd:_.costUsd,loc_added:k.added,loc_removed:k.removed}},notesLoop:ce,writeNotes:(_,J)=>{try{Wut(_,J,"utf8")}catch{}},markPhase:_=>{bl(Pt(o.attemptDir,"afk.state.json"),{"current.phase":_}).catch(()=>{})},markState:_=>{bl(Pt(o.attemptDir,"afk.state.json"),_).catch(()=>{})},historyPath:y.historyPath,historyClock:{ts:new Date().toISOString(),epoch:Math.floor(Date.now()/1e3)},recoveryEnv:process.env,recordAttempt:Ipr(e.root,o,a),recordOutcomeEvent:wpr(e.root,o,a),cascadeRebase:{async listAFKBranches(){return(await Hp(g,"afk/")).map(J=>J.branch)},isWorkerLive(_){try{let J=aP(y.tmpDir,_),le=QP(J,"utf8").trim();return/^[1-9][0-9]*$/.test(le)?(process.kill(Number(le),0),!0):!1}catch(J){return J.code==="EPERM"}},async rebaseAndPush(_,J,le){let jt=J.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),Zn=bC(process.env.RED_AFK_SLOT)??0,Fi=Pt(y.tmpDir,"cascade-rebase",`${jt}-${Zn}`);try{if(await No(g,Fi),!await qd(g,Fi,J))return{ok:!1,warn:`failed to create worktree for ${J}`};let qe=a??(await Promise.resolve().then(()=>(En(),ng))).execTool,ir=await qe("git",["rebase",`origin/${le}`],{cwd:Fi});if(ir.code!==0)return await qe("git",["rebase","--abort"],{cwd:Fi}).catch(()=>{}),{ok:!1,warn:`rebase of ${J} onto ${le} conflicted: ${ir.stderr.slice(0,200)}`};let Xn=await qe("git",["push","origin",`HEAD:refs/heads/${J}`,"--force-with-lease"],{cwd:Fi});return Xn.code!==0?{ok:!1,warn:`--force-with-lease push rejected for ${J}: ${Xn.stderr.slice(0,200)}`}:{ok:!0}}finally{await No(g,Fi).catch(()=>{})}}}}}function Spr(e,t,r,n){return async o=>{let i=ba(e,t,"validate",process.env);return Uct(o,async({prompt:s})=>{let a=n??(await Promise.resolve().then(()=>(En(),ng))).execTool,c={cwd:r,timeoutMs:45e3,maxBuffer:1024*1024},u=t==="codex"?await a("codex",["exec","--model",i.model,"-c",`model_reasoning_effort=${i.effort}`,"-C",r,"--sandbox","read-only","--skip-git-repo-check",s],c):await a("claude",["--model",i.model,"--effort",i.effort,"--permission-mode","bypassPermissions","--print",s],c);return u.code===0?u.stdout.trim():void 0})}}function Cpr(e){try{let t=JSON.parse(QP(e,"utf8")).version;return typeof t=="string"&&t.length>0?t:void 0}catch{return}}function Ipr(e,t,r){return async n=>{try{let o={...process.env,MEMORY_REPO_ROOT:process.env.MEMORY_REPO_ROOT??e},i=uct(e,o,{exists:DP,readJsonVersion:Cpr,readText:f=>{try{return QP(f,"utf8")}catch{return}}});if(!i)return;let s=t.attemptDir||e,a=Pt(s,`memory-attempt-${n.issueNumber}-a${n.attemptNumber}.json`);await Wp(s);let c=cct(n);await Y4(a,c,"utf8");let u=r??(await Promise.resolve().then(()=>(En(),ng))).execTool,[l,...d]=i;await u(l,[...d,"attempt","record","--root",e],{cwd:e,env:o,input:c})}catch(o){process.stderr.write(`[afk] memory attempt-record skipped (best-effort): ${String(o)}
|
|
642
642
|
`)}}}function wpr(e,t,r){return async n=>{try{let o=Pt(e,".red","config.yaml"),i=QP(o,"utf8");if(!sut(i,"brain"))return;let s={...process.env,BRAIN_REPO_ROOT:process.env.BRAIN_REPO_ROOT??e},a=kpr(e,s);if(!a)return;let c=t.attemptDir||e;await Wp(c);let u=JSON.stringify(n);await Y4(Pt(c,`brain-outcome-event-${n.context?.issueNumber??"unknown"}-a${n.context?.attemptNumber??"unknown"}.json`),u,"utf8");let l=r??(await Promise.resolve().then(()=>(En(),ng))).execTool,[d,...f]=a;await l(d,[...f,"outcome-event","record","--root",e],{cwd:e,env:s,input:u})}catch(o){process.stderr.write(`[afk] brain outcome-event skipped (best-effort): ${String(o)}
|
|
643
643
|
`)}}}function kpr(e,t){let r=t.RED_BRAIN_CLI;if(r)return DP(r)?["node",r]:void 0;if(vpr("brain",t.PATH))return["brain"];let o=t.CLAUDE_PLUGIN_ROOT??t.CODEX_PLUGIN_ROOT;if(o){let s=Pt(o,"..","brain","dist","cli.js");if(DP(s))return["node",s]}let i=Pt(e,"plugins","brain","dist","cli.js");if(DP(i))return["node",i]}function vpr(e,t){for(let r of(t??"").split(":").filter(Boolean)){let n=Pt(r,e);if(DP(n))return n}}var Rpr=300;async function jut(e,t,r){let n=r instanceof Error?r.message:String(r),o=r instanceof Error?r.stack:void 0,i={type:t,at:new Date().toISOString(),message:n,stack:o};await Wp(e),await Y4(Pt(e,`${t}.log`),`${JSON.stringify(i)}
|
|
644
644
|
`,"utf8"),process.stderr.write(`[afk] ${t}: ${n}
|
|
@@ -818,7 +818,7 @@ requeued to ready-for-agent${e.activeBlocker?` (cleared active blocker: ${e.acti
|
|
|
818
818
|
`),2;let i=n.body??"",s=n.author?.trim()||void 0,a=n["is-pr"]===!0,c=n.root?.trim()||t,u=Cr(Kd(c),{warn:()=>{}}),l=n.runner,d=Ze(u,"afk.default_runner")||"claude",f=l??d,p=iAr(f)?f:"claude",m=await sAr(c,n.repo),g={cwd:c,repo:m},y=kl(u),E=ba(u,p,"complex",process.env),A=await iC(),b=zdt({run:A.run,agentFor:A.agentFor,sandboxFor:k=>A.sandboxFor(k),output:({tag:k,maxRetries:R})=>Op.object({tag:k,schema:qdt,maxRetries:R}),cwd:c},{model:E.model,effort:E.effort}),I={async reply(k,R){let T=a?"pr":"issue",U=m?["--repo",m]:[];await Wt("gh",[T,"comment",String(k),...U,"--body",Hr(R)],{cwd:c})}},w={body:i,author:s,number:o,isPr:a,runner:p},v;try{v=await Gdt({gh:I,resolveTrust:k=>wl(y,k,R=>ig(g,R)),explain:b,review:async()=>{let k=["--pr",String(o),"--runner",p];m&&k.push("--repo",m),c&&k.push("--root",c),await cY(k,c,r)},log:k=>process.stderr.write(`${k}
|
|
819
819
|
`)},w)}catch(k){return process.stderr.write(`[afk] respond failed: ${k instanceof Error?k.message:String(k)}
|
|
820
820
|
`),1}return r.write(`Respond #${o}: ${v.action}${v.verb?` (/dev ${v.verb})`:""}.
|
|
821
|
-
`),0}EC();import{existsSync as FAr,statSync as LAr}from"node:fs";import{join as aft,basename as UAr}from"node:path";function lY(e){let t={app:e,version:aAr(yR("__RED_BUILD_VERSION__",()=>"2.23.
|
|
821
|
+
`),0}EC();import{existsSync as FAr,statSync as LAr}from"node:fs";import{join as aft,basename as UAr}from"node:path";function lY(e){let t={app:e,version:aAr(yR("__RED_BUILD_VERSION__",()=>"2.23.1")??"0.0.0-dev"),gitSha:yR("__RED_BUILD_GIT_SHA__",()=>"562c41322a3940813a2e4ac200a93254fe26f88a")??"unknown",buildTime:yR("__RED_BUILD_TIME__",()=>"2026-07-09T17:04:46-03:00")??"unknown",bundleAsset:yR("__RED_BUNDLE_ASSET__",()=>"dev.bundle.min.mjs")??"unknown"},r=yR("__REDDB_SDK_VERSION__",()=>""),n=yR("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function aAr(e){return e.startsWith("v")?e.slice(1):e}function Ydt(e){return`${e.app} ${e.version} ${e.gitSha}`}function yR(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}function dY(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.floor(e/1e3)}k`:String(e)}function Jdt(e){let t=(r,n)=>{let o=(Math.round(r*10)/10).toFixed(1);return`${o.endsWith(".0")?o.slice(0,-2):o}${n}`};return e>=1e9?t(e/1e9,"B"):e>=1e6?t(e/1e6,"M"):e>=1e3?t(e/1e3,"k"):String(e>0?e:0)}function Kdt(e){let t=e.toLowerCase();for(let r of["opus","sonnet","haiku","fable"])if(t.includes(r))return r;return e}function cAr(e){let t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60);if(r<60)return`${r}m${t%60}s`;let n=Math.floor(r/60);return n<24?`${n}h${r%60}m`:`${Math.floor(n/24)}d${n%24}h`}function fY(e){if(e<60)return`${e}s`;let t=Math.floor(e/60);if(t<60)return`${t}m`;let r=Math.floor(t/60),n=t%60;return n>0?`${r}h${n}m`:`${r}h`}function uAr(e){let t=e.basename;if(e.branch){let r=e.branch;return r.length>28&&(r=`${r.slice(0,27)}\u2026`),`${t} (${r})`}return e.detachedSha?`${t} (detached ${e.detachedSha})`:t}function lAr(e){return!e||!e.model?null:e.effort?`${e.model}\xB7${e.effort}`:e.model}function dAr(e){if(!e)return null;let t=e.contextTokens;if(t===void 0||t===0)return null;let r=dY(t);return e.contextPercent===void 0?r:`${r} ${Math.round(e.contextPercent)}%`}function fAr(e){if(!e||e.workers<=0)return[];let t=[],r=(i,s)=>{t.push({label:i,value:s,suffix:""})};if(e.workers>0&&r("wrk=",String(e.workers)),e.sourceCounts&&e.sourceCounts.length>0)for(let{origin:i,count:s}of e.sourceCounts)r(`${i}=`,String(s));let n=e.cacheAgeS!==void 0?` (${fY(e.cacheAgeS)})`:"";if(e.queue>0&&t.push({label:"rdy=",value:String(e.queue),suffix:n}),e.human>0){let i=n&&e.queue===0?n:"";t.push({label:"hmn=",value:String(e.human),suffix:i})}e.blocked>0&&r("blk=",String(e.blocked));let o=[];return e.added>0&&o.push(`+${e.added}`),e.removed>0&&o.push(`-${e.removed}`),o.length&&r("loc=",e.locIsPeak?`~${o.join(" ")}`:o.join(" ")),e.waiting!==void 0&&e.waiting>0&&r("wai=",String(e.waiting)),e.tokens!==void 0&&e.tokens>0&&r("tok=",dY(e.tokens)),e.costUsd!==void 0&&e.costUsd>0&&r("usd=",e.costUsd.toFixed(2)),e.issues.forEach((i,s)=>{let a=e.stages?.[s],c=e.aliveMs?.[s],u=a?`\xB7${a}`:"";c!==void 0&&c>0&&(u+=`\xB7${cAr(c)}`),t.push({label:"#",value:String(i),suffix:u})}),t}function pAr(e){if(!e)return null;let t=[];return e.usage5h!==void 0&&t.push(`5h=${Math.round(e.usage5h)}%`),e.usage7d!==void 0&&t.push(`7d=${Math.round(e.usage7d)}%`),t.length?t.join(" "):null}function mAr(e){if(!e)return null;let t=[],r=e.cacheAgeS!==void 0?` (${fY(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(`prs=${e.openPrs}${r}`),e.todayPrs&&e.todayPrs>0){let o=r&&(!e.openPrs||e.openPrs===0)?r:"";t.push(`cpr=${e.todayPrs}${o}`)}if(e.openIssues&&e.openIssues>0){let o=r&&(!e.openPrs||e.openPrs===0)&&(!e.todayPrs||e.todayPrs===0)?r:"";t.push(`iss=${e.openIssues}${o}`)}let n=[];return e.localAdded&&e.localAdded>0&&n.push(`+${e.localAdded}`),e.localRemoved&&e.localRemoved>0&&n.push(`-${e.localRemoved}`),n.length&&t.push(`loc=${n.join(" ")}`),t.length?t.join(" "):null}function hAr(e){let t=fAr(e);return t.length===0?null:t.map(r=>`${r.label}${r.value}${r.suffix}`).join(" ")}function Zdt(e){let t=[uAr(e.project)],r=lAr(e.claude);r!==null&&t.push(r);let n=dAr(e.claude);n!==null&&t.push(n);let o=pAr(e.claude);o!==null&&t.push(o);let i=mAr(e.repo);i!==null&&t.push(i);let s=hAr(e.afk);return s!==null&&t.push(s),t.join(" \xB7 ")}var gAr="\x1B[48;2;114;47;55m",AAr="\x1B[48;2;88;36;42m",Xdt="\x1B[49m",wC="\x1B[38;2;255;255;255m",eft="\x1B[38;2;255;214;214m",tft="\x1B[39m",mY="\x1B[38;2;224;138;148m",pY="\x1B[38;2;201;150;158m",yAr="\x1B[38;2;240;200;120m",rft="\x1B[1m",nft="\x1B[22m",oft="\x1B[0m",xAr=28,EAr=" ",HAe=["workerId","run","org","iss","stage","elapsed","loc","tks","tls","rsn","txt"],bAr=new Set(["requeue"]),SAr=e=>e.replace(/\x1b\[[0-9;]*m/g,"");function ift(e){return SAr(e).length}function CAr(e,t){return e+" ".repeat(Math.max(0,t-ift(e)))}var kC=(e,t)=>`${eft}${e}=${tft}${t}${mY}`;function IAr(e,t){let r=[];return e&&e>0&&r.push(`+${e}`),t&&t>0&&r.push(`-${t}`),r.length?r.join(" "):null}function wAr(e){let t="";if(e.branch){let n=e.branch.length>xAr?`${e.branch.slice(0,27)}\u2026`:e.branch;t=` ${pY}(${n})${wC}`}else e.detachedSha&&(t=` ${pY}(detached ${e.detachedSha})${wC}`);let r=e.version?` ${pY}v${e.version}${wC}`:"";return`${yAr}\xBB${wC} ${rft}${e.basename}${nft}${t}${r}`}function kAr(e){return!e||!e.model?null:e.effort?`${e.model}${pY}\xB7${wC}${e.effort}`:e.model}function vAr(e){if(!e||!e.contextTokens)return null;let t=dY(e.contextTokens),r=e.contextPercent===void 0?t:`${t} ${Math.round(e.contextPercent)}%`;return kC("ctx",r)}function RAr(e){if(!e)return[];let t=[];return e.usage5h!==void 0&&t.push(kC("5h",`${Math.round(e.usage5h)}%`)),e.usage7d!==void 0&&t.push(kC("7d",`${Math.round(e.usage7d)}%`)),t}function BAr(e){if(!e)return[];let t=[],r=e.cacheAgeS!==void 0?` (${fY(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(kC("prs",String(e.openPrs))+r),e.todayPrs&&e.todayPrs>0){let n=r&&(!e.openPrs||e.openPrs===0)?r:"";t.push(kC("cpr",String(e.todayPrs))+n)}if(e.openIssues&&e.openIssues>0){let n=r&&(!e.openPrs||e.openPrs===0)&&(!e.todayPrs||e.todayPrs===0)?r:"";t.push(kC("iss",String(e.openIssues))+n)}return t}function _Ar(e){if(!e)return[];let t=IAr(e.localAdded,e.localRemoved);return t?[kC("loc",t)]:[]}function TAr(e,t,r){let n=`${AAr}${wC} ${wAr(e)} `,o=kAr(t);o!==null&&(n+=`${gAr}${wC} ${o} `),n+=`${Xdt}${mY}`;let i=[vAr(t),...RAr(t),...BAr(r),..._Ar(r)].filter(s=>s!==null);return i.length&&(n+=` ${i.join(" ")}`),`${n}${oft}`}function DAr(e,t){let r=Klt(e,t),n=[r.runner,r.model?Kdt(r.model):void 0,r.effort].filter(i=>!!i).join(" "),o=r.origin!==void 0&&bAr.has(r.origin);return{workerId:r.workerId,run:`run=${n}`,org:`org=${r.origin||"afk"}`,iss:r.issue===null?"":`iss=${String(r.issue)}`,stage:r.issue===null?"":r.stage,elapsed:r.elapsed,loc:o?"":`loc=${rY(r.added,r.removed)}`,tks:o?"":`tks=${Jdt(r.tokens)}`,tls:o?"":`tls=${String(r.tools)}`,rsn:o?"":`rsn=${String(r.reasoning)}`,txt:o?"":`txt=${String(r.text)}`}}function QAr(e){let t=Object.fromEntries(HAe.map(r=>[r,0]));for(let r of e)for(let n of HAe)t[n]=Math.max(t[n],ift(r[n]));return t}function OAr(e,t){if(e==="workerId")return`${rft}${t}${nft}`;let r=t.indexOf("=");return r>0?`${eft}${t.slice(0,r+1)}${tft}${t.slice(r+1)}${mY}`:t}function NAr(e,t){let r=HAe.map(n=>OAr(n,CAr(e[n],t[n])));return`${Xdt}${mY}${r.join(EAr)}${oft}`}function PAr(e,t){let r=e.map(o=>DAr(o,t)),n=QAr(r);return r.map(o=>NAr(o,n))}function MAr(e,t={}){let r=[TAr(e.project,e.claude,e.repo)],n=t.now??0;return r.push(...PAr(t.workers??[],n)),r.join(`
|
|
822
822
|
`)}function sft(e,t,r={}){return t?MAr(e,r):Zdt(e)}Mo();function $Ar(e){return new Promise(t=>{if(e.isTTY){t("");return}let r="",n=!1,o=()=>{n||(n=!0,t(r))};e.setEncoding("utf8"),e.on("data",i=>{r+=i}),e.on("end",o),e.on("error",o),e.on("close",o)})}function HAr(e){if(!e.trim())return{};try{let t=JSON.parse(e);return typeof t=="object"&&t!==null?t:{}}catch{return{}}}function WAr(e){try{return LAr(e).isDirectory()}catch{return!1}}function jAr(e,t,r){if(e&&WAr(e))return e;let n=t.workspace?.project_dir||t.workspace?.current_dir||t.cwd;return n||r}function GAr(e){let t=aft(e,".red","config.yaml");if(!FAr(t))return!0;let r=Cr(t,{warn:()=>{}});return!(Ze(r,"statusline")==="false"||Ze(r,"afk.statusline")==="false")}async function qAr(e){let t={cwd:e},r=lY("dev").version,n={basename:UAr(e),version:r},o=await KN(t);if(o)return{...n,branch:o};let i=await sg(t);return i?{...n,detachedSha:i}:n}function zAr(e){let t=e.model?.display_name,r=e.effort?.level,n=e.context_window?.total_input_tokens,o=e.context_window?.used_percentage,i=e.rate_limits?.five_hour?.used_percentage,s=e.rate_limits?.seven_day?.used_percentage;if(!(t===void 0&&n===void 0&&i===void 0&&s===void 0))return{model:t||void 0,effort:r||void 0,contextTokens:n,contextPercent:o,usage5h:i,usage7d:s}}async function cft(e,t=process.cwd(),r=process.stdout,n=process.stdin){if(e.includes("--legend"))return r.write(`${nY()}
|
|
823
823
|
`),0;let o=e[0],i=await $Ar(n),s=HAr(i),a=jAr(o,s,t);if(!GAr(a))return 0;let c=await qAr(a),u=zAr(s),l={root:a,repo:Zv(a),remote:"origin"},d=Cr(aft(a,".red","config.yaml"),{warn:()=>{}}),f=u4(process.env,I=>Ze(d,I)),[p,m,g]=await Promise.all([Zst(l,f),Jst(l,f).then(I=>I??void 0),Kst(l)]),y=!process.env.NO_COLOR,E=Number.parseInt(process.env.COLUMNS??"",10),A=Math.floor(Date.now()/1e3),b=sft({project:c,claude:u,repo:p,afk:m},y,{columns:Number.isFinite(E)&&E>0?E:void 0,workers:g,now:A});return r.write(`${b}
|
|
824
824
|
`),0}async function uft(e,t=process.cwd()){let r=e[0]??t,n="",o="";for(let i=1;i<e.length;i+=1){let s=e[i];s==="--repo"?n=e[++i]??"":s==="--lock"&&(o=e[++i]??"")}return await Yst(r,n||Zv(r),o||void 0),0}NC();import{spawn as Ift}from"node:child_process";import{existsSync as jAe,openSync as kft,closeSync as ryr,writeFileSync as vft,writeSync as nyr,rmSync as GAe,renameSync as oyr}from"node:fs";import{join as vC}from"node:path";import{existsSync as VAr,readdirSync as FP,readFileSync as hY,statSync as pft}from"node:fs";import{join as cs}from"node:path";eu();Gd();function YAr(e,t){return cs(e,`afk-supervisor-slot-${t}.log`)}function JAr(e){let t;try{t=hY(e,"utf8")}catch{return[]}let r=[],n=new Set;for(let o of t.split(`
|
|
@@ -6515,7 +6515,7 @@ Usage:
|
|
|
6515
6515
|
${r} archive --candidate <json> [--root <dir>] [--archive-dir <rel>]
|
|
6516
6516
|
${r} restore <name> [--root <dir>] [--archive-dir <rel>]`}function nL(r){return ygr(typeof r.root=="string"?r.root:process.cwd())}function Dct(r){return typeof r["archive-dir"]=="string"?r["archive-dir"]:void 0}async function YW(r){let s=await Mu(r);return s?s.mode!=="graph"?{ok:!1,message:`curate: skill telemetry needs graph mode (this project is "${s.mode}") \u2014 run \`${_De}\``}:uh(s)?{ok:!0}:{ok:!1,message:`curate: skill telemetry is not enabled here \u2014 run \`${_De}\``}:{ok:!1,message:`curate: memory is not initialized here \u2014 run \`${_De}\``}}function bgr(){let r=hgr(vgr(import.meta.url));return r.includes("dist/curate-skill")||r.endsWith("dist/curate-skill")?Ect(r,"..","cli.js"):Ect(r,"..","cli.ts")}async function Sgr(r,s){let l=["curate","skills","--json"];s!==void 0&&l.push("--stale-days",String(s));let f=bgr(),v=f.endsWith(".ts")?Cct(process.execPath,["--import","tsx",f,...l,"--root",r],{encoding:"utf8"}):Cct(process.execPath,[f,...l,"--root",r],{encoding:"utf8"}),T=v.status??1;if(T!==0)throw new Error(`memory curate skills exited ${T}`);return kct(v.stdout??"")}function xgr(r){return typeof r.flags["stale-days"]=="string"?Number(r.flags["stale-days"]):void 0}async function Act(r,s){return(s.loadCuratorReport??Sgr)(nL(r.flags),xgr(r))}async function kgr(r){let s=nL(r.flags),l=await YW(s);return l.ok?(console.log("curate: skill telemetry is enabled \u2014 ready to curate"),0):(console.error(l.message),2)}async function wgr(r,s){let l=nL(r.flags),f=await YW(l);if(!f.ok)return console.error(f.message),2;let _;try{_=await Act(r,s)}catch(B){return console.error(`curate: ${B.message}`),1}let{candidates:v,byCategory:T,filtered:N}=fDe(_);return console.log(JSON.stringify({candidates:v,byCategory:T,filtered:N,totals:{totalSkills:_.totalSkills,curatableSkills:_.curatableSkills,readOnlySkills:_.readOnlySkills}},null,2)),0}async function Tgr(r,s){let l=nL(r.flags),f=await YW(l);if(!f.ok)return console.error(f.message),2;let _;try{_=await Act(r,s)}catch(B){return console.error(`curate: ${B.message}`),1}let{byCategory:v}=fDe(_);if(pDe(v)===0)return console.error("curate: no candidates \u2014 no issue filed"),0;let T=typeof r.flags.label=="string"?r.flags.label:void 0,N=await Tct({byCategory:v,totals:{totalSkills:_.totalSkills,curatableSkills:_.curatableSkills,readOnlySkills:_.readOnlySkills},generatedAt:_.generatedAt},{cwd:l,label:T});return console.log(`curate: filed background issue \u2014 ${N.output||N.title}`),0}async function Cgr(r){let s=nL(r.flags),l=await YW(s);if(!l.ok)return console.error(l.message),2;let f=r.flags.candidate;if(typeof f!="string")return console.error("curate archive: --candidate <json> is required"),2;let _;try{_=JSON.parse(f)}catch(T){return console.error(`curate archive: invalid --candidate JSON: ${T.message}`),2}let v=await Sct(_,{rootDir:s,archiveDir:Dct(r.flags)});return v.ok?(console.log(`curate: archived "${v.receipt.name}" \u2192 ${v.receipt.archiveRoot} (${v.receipt.files.length} file(s), manifest at ${v.receipt.manifestPath})`),0):(console.error(`curate archive: refused \u2014 ${v.rejection.reason}: ${v.rejection.detail}`),3)}async function Egr(r){let s=nL(r.flags),l=await YW(s);if(!l.ok)return console.error(l.message),2;let f=r.positional[0];if(!f)return console.error("curate restore: skill name is required"),2;let _=await xct(f,{rootDir:s,archiveDir:Dct(r.flags)});return console.log(`curate: restored "${_.name}" \u2192 ${_.restoredRoot} (${_.files.length} file(s) hash-verified)`),0}async function Nct(r,s={}){switch(r.command){case"check":return kgr(r);case"list":return wgr(r,s);case"background":return Tgr(r,s);case"archive":return Cgr(r);case"restore":return Egr(r);case void 0:case"--help":case"-h":return console.log(Pct(s.usageCommand)),0;default:return console.error(`unknown curate subcommand: ${r.command}
|
|
6517
6517
|
|
|
6518
|
-
${Pct(s.usageCommand)}`),2}}function Ict(r){let s={app:r,version:Pgr(iL("__RED_BUILD_VERSION__",()=>"2.23.
|
|
6518
|
+
${Pct(s.usageCommand)}`),2}}function Ict(r){let s={app:r,version:Pgr(iL("__RED_BUILD_VERSION__",()=>"2.23.1")??"0.0.0-dev"),gitSha:iL("__RED_BUILD_GIT_SHA__",()=>"562c41322a3940813a2e4ac200a93254fe26f88a")??"unknown",buildTime:iL("__RED_BUILD_TIME__",()=>"2026-07-09T17:04:46-03:00")??"unknown",bundleAsset:iL("__RED_BUNDLE_ASSET__",()=>"memory.bundle.min.mjs")??"unknown"},l=iL("__REDDB_SDK_VERSION__",()=>"1.7.0"),f=iL("__REDDB_BINARY_TAG__",()=>"v1.7.0");return l&&(s.reddbSdkVersion=l),f&&(s.reddbBinaryTag=f),s}function Pgr(r){return r.startsWith("v")?r.slice(1):r}function Rct(r){return`${r.app} ${r.version} ${r.gitSha}`}function iL(r,s){try{let l=s();return typeof l=="string"&&l.length>0?l:void 0}catch{return process.env[r.replace(/^__|__$/g,"")]}}var Oct=`memory \u2014 governed operational memory for code agents
|
|
6519
6519
|
|
|
6520
6520
|
Common workflows:
|
|
6521
6521
|
remember one fact memory store "Decision: ..."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reddb-io/red-skills",
|
|
3
|
-
"version": "2.23.
|
|
3
|
+
"version": "2.23.1",
|
|
4
4
|
"description": "RedSkills plugin runtime bundles (dev, memory, brain) distributed over npm — the v2 client transport (ADR 0091). Carries the platform-independent JS bundles inside the tarball plus thin bin shims; no postinstall download.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|