@reddb-io/red-skills 2.4.2 → 2.6.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.
@@ -517,7 +517,7 @@ ${l}`)}return r.write(`\u{1F680} fleet launched (supervisor pid=${u}, target=${n
517
517
  `);return{title:r,body:n,labels:[IC]}}function ssr(e){if(!Number.isInteger(e.issue)||e.issue<=0)throw new Error(`buildScoutEngineArgs: invalid issue ${e.issue}`);let t=["--once","--issues",String(e.issue),"--origin",cge,"--lane",IC,"--run-mode",nsr];return e.runner&&t.push("--runner",e.runner),t}async function Cst(e,t,r={}){let n=isr(t);await e.ensureLabel(IC);let o=await e.createIssue(n),i=await e.runEngine(ssr({issue:o,runner:r.runner}));return{issue:o,engineExit:i}}var asr=/^[a-z0-9-]+$/,csr=/^[A-Za-z0-9._-]+$/,usr=/^[0-9]+$/,lsr=/^afk(-attempts)?\/[A-Za-z0-9._-]+\/[0-9]+-[a-z0-9-]+$/;function Gv(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40).replace(/-+$/g,"")}function dsr(e){return lsr.test(e)}function zv(e,t,r,n){if(e!=="afk"&&e!=="afk-attempts"||!csr.test(t))return null;let o=typeof r=="number"?String(r):r;if(!usr.test(o)||!asr.test(n))return null;let i=`${e}/${t}/${o}-${n}`;return dsr(i)?i:null}function Ist(e,t,r,n){return zv(e,t,r,Gv(n))}function fsr(e,t){return["-C",e,"push","origin","--delete",t]}function psr(e,t,r){return["-C",e,"push","origin",`${t}:refs/heads/${r}`]}var xfn=["#!/usr/bin/env bash","# AFK continuous-push hook (issue #191)","# Fire-and-forget: push the worker branch to origin after every commit so a","# SIGKILL of the orchestrator at any point preserves the diff on the remote.","git push origin HEAD --force-with-lease || true",""].join(`
518
518
  `);async function t4(e,t,r){if(!r)return{ok:!0,ran:!1,warn:"delete_remote called with empty branch \u2014 skipping"};let{code:n}=await e(fsr(t,r));return n!==0?{ok:!0,ran:!0,warn:`failed to delete remote ${r} after close, branch survives on origin for cleanup later`}:{ok:!0,ran:!0}}async function sg(e,t,r,n){if(!r||!n)return{ok:!1,ran:!1,warn:"push_attempt called with empty branch or remote \u2014 skipping"};let{code:o}=await e(psr(t,r,n));return o!==0?{ok:!1,ran:!0,warn:`failed to push attempt branch to origin/${n}`}:{ok:!0,ran:!0}}import{existsSync as Rst,readdirSync as msr}from"node:fs";import{join as wst}from"node:path";var r4=["pre_session","pre_pick","post_pick","pre_worktree","pre_attempt","post_attempt","pre_feedback","on_baseline_probe","on_feedback_classify","post_feedback","pre_merge","post_merge","on_attempt_error","on_attempt_timeout","on_recovery_decision","on_blocked","on_reconcile","on_idle","on_heartbeat","post_session","on_session_error"],Bst={pre_worktree:["cargo","gradle"],post_attempt:["heartbeat","envelope"],post_merge:["validation"]},Cfn=Object.values(Bst).flat(),uge=class extends Error{constructor(r){super(`unknown hook name '${r}'`);this.hookName=r;this.name="UnknownHookError"}},hsr=new Set(r4);function gsr(e){return hsr.has(e)}var kst="afk.hooks.",Asr="afk.hooks.defaults.";function vst(e){let t=/^(\d+)/.exec(e);return t?parseInt(t[1],10):1/0}function ysr(e,t){let r=vst(e)-vst(t);return r!==0?r:e.localeCompare(t)}function lge(e,t,r,n,o){let i=l=>{let d=new Map;if(!l)return d;let f=wst(l,e);if(!o(f))return d;for(let p of n(f))p.startsWith(".")||d.set(p,wst(f,p));return d},s=i(t),a=i(r),c=new Map([...s,...a]);return[...c.keys()].sort(ysr).map(l=>c.get(l))}function sC(e,t){let{defaultCommand:r}=t,n=new Map;for(let[u,l]of Object.entries(e)){if(!u.startsWith(kst)||u.startsWith(Asr))continue;let d=u.slice(kst.length);if(!gsr(d))throw new uge(d);let f=l.split(`
519
519
  `).map(p=>p.trim()).filter(p=>p.length>0);n.set(d,f)}let{libraryHooksDir:o,projectHooksDir:i}=t,s=t.listFiles??(u=>msr(u)),a=t.dirExists??Rst,c={};for(let u of r4){let l=[],d=Bst[u];if(d)for(let p of d){let m=r(p);m!==void 0&&l.push(m)}(o!==void 0||i!==void 0)&&l.push(...lge(u,o,i,s,a));let f=n.get(u);f&&l.push(...f),c[u]=l}return c}function _st(e,t,r=Rst){let n={cargo:"red-cargo",gradle:"red-gradle",heartbeat:"red-heartbeat",envelope:"red-envelope",validation:"red-validation"};return o=>{let i=n[o];if(t){let a=`${t}/${i}`;if(r(a))return a}let s=`${e}/${i}`;return r(s)?s:void 0}}var xsr={pre_session:"abort",pre_pick:"abort",post_pick:"continue",pre_worktree:"abort",pre_attempt:"abort",post_attempt:"continue",pre_feedback:"abort",on_baseline_probe:"continue",on_feedback_classify:"continue",post_feedback:"continue",pre_merge:"abort",post_merge:"continue",on_attempt_error:"continue",on_attempt_timeout:"continue",on_recovery_decision:"continue",on_blocked:"continue",on_reconcile:"continue",on_idle:"continue",on_heartbeat:"continue",post_session:"continue",on_session_error:"continue"},Esr=new Set(r4),dge=class extends Error{constructor(r){super(`unknown lifecycle point '${r}'`);this.name=r;this.name="UnknownLifecyclePointError"}},bsr=65;function Ssr(e){if(e.length===0||e[0]!=="{")return!1;try{let t=JSON.parse(e);return typeof t=="object"&&t!==null&&!Array.isArray(t)}catch{return!1}}function Csr(e,t){let r={...e},n;try{n=JSON.parse(t)}catch{return r}if(typeof n!="object"||n===null||Array.isArray(n))return r;let o=n,i=(d,f)=>{typeof f=="string"?f.length>0&&(r[d]=f):typeof f=="number"&&Number.isFinite(f)&&(r[d]=String(f))},s=d=>typeof d=="object"&&d!==null&&!Array.isArray(d)?d:void 0;i("RED_AFK_ISSUE",s(o.issue)?.number),i("RED_AFK_WORKSPACE",o.workspace),i("RED_AFK_RUNNER",o.runner),i("RED_AFK_ATTEMPT_N",o.attempt_n),i("RED_AFK_MERGE_BASE",o.merge_base),i("RED_AFK_ITER_LOG",o.iter_log),i("RED_AFK_STATE_FILE",o.state_file);let a=s(o.result);a&&(i("RED_AFK_RESULT_STATUS",a.status),i("RED_AFK_RESULT_OUTCOME",a.outcome));let c=s(o.error);c&&(i("RED_AFK_ERROR_CLASS",c.class),i("RED_AFK_ERROR_MESSAGE",c.message));let u=s(o.merge_commit);u&&(i("RED_AFK_MERGE_COMMIT",u.sha),i("RED_AFK_MERGE_SHA",u.short)),i("RED_AFK_RECOVERY_DECISION",o.decision),i("RED_AFK_RECOVERY_REASON",o.reason),i("RED_AFK_BLOCKED_LABEL",o.blocked_label),i("RED_AFK_FEEDBACK_CLASS",o.class),i("RED_AFK_RECONCILE_OUTCOME",o.outcome);let l=s(o.vitals);if(l)for(let[d,f]of Object.entries(l))typeof f=="number"&&Number.isFinite(f)&&(r[`RED_AFK_VITAL_${d.toUpperCase()}`]=String(f));return r}async function XN(e,t,r,n,o={}){if(!Esr.has(e))throw new dge(e);let i=Csr(o.env??{},r),s=o.log??(()=>{}),a=xsr[e],c=[],u=r;for(let l of t){if(l.length===0)continue;s(`[afk:hooks] ${e}: enter: ${l}`);let{code:d,stdout:f}=await n(l,i,u);if(c.push({name:e,command:l,rc:d}),s(`[afk:hooks] ${e}: exit rc=${d}: ${l}`),d!==0){if(a==="abort")return s(`[afk:hooks] ${e}: command failed (rc=${d}): ${l}`),{context:u,aborted:!0,rc:d,executions:c};s(`[afk:hooks] ${e}: command failed (rc=${d}), continuing: ${l}`);continue}let p=f.trim();if(p.length!==0){if(Ssr(p)){u=p;continue}if(a==="abort")return s(`[afk:hooks] ${e}: non-JSON stdout (parse failure) from: ${l}`),{context:u,aborted:!0,rc:bsr,executions:c};s(`[afk:hooks] ${e}: non-JSON stdout, ignoring (parse failure): ${l}`)}}return{context:u,aborted:!1,rc:0,executions:c}}sn();var fge="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";function Dst(e,t=()=>!1){for(;;){let r="w";for(let n=0;n<4;n++){let o=Math.min(fge.length-1,Math.floor(e()*fge.length));r+=fge[o]}if(!t(r))return r}}function Vv(e,t){return e.labels.includes(t)}function Isr(e,t){return Vv(e,`prd:${t}`)?!0:new RegExp(`prd:\\s*#?${t}\\b`).test(e.body??"")}function Tst(e){return[...e].sort((t,r)=>{let n=Vv(t,rY)?0:1,o=Vv(r,rY)?0:1;return n!==o?n-o:t.number-r.number})}var pge=class extends Error{constructor(r,n){super(r);this.numbers=n;this.name="IssueSelectionError"}};function wsr(e,t){let r=e.filter(c=>!Vv(c,wM)),n=r.filter(c=>Vv(c,fR)).sort((c,u)=>c.number-u.number),o=r.filter(c=>!Vv(c,fR)),i;switch(t.kind){case"issues":{let c=new Map(o.map(d=>[d.number,d])),u=[],l=[];for(let d of t.numbers){let f=c.get(d);f?u.push(f):l.push(d)}if(l.length>0)throw new pge(`requested issue(s) missing from the ready-for-agent queue: ${l.map(d=>`#${d}`).join(", ")}`,l);i=u;break}case"prd":i=Tst(o.filter(c=>Isr(c,t.prd)));break;case"all":default:i=Tst(o);break}let s=new Set(n.map(c=>c.number)),a=i.filter(c=>!s.has(c.number));return[...n,...a]}function Qst(e,t){if(t!==void 0)return t;if(e.labels.includes(zAe))return"scout"}function ksr(e,t){return e!==t?t:t==="claude-minimax"?"claude":t==="claude"?"codex":"claude"}var vsr="<promise>NO MORE TASKS</promise>";function Rsr(e){switch(e){case"done":return"done";case"claim-lost":case"hook-aborted":return"failed";default:return"blocked"}}async function Ost(e,t){let r=[],n=e.hooks?sC(e.hooks.config,e.hooks.resolveOptions):void 0,o=async(c,u)=>!e.hooks||!n?!0:(r.push(c),!(await XN(c,n[c],u,e.hooks.exec,{env:e.hooks.env??{},log:e.emit})).aborted),i=(c,u,l)=>JSON.stringify({runner:t.runner,worker_id:t.workerId,stats:{done:c,blocked:u,total:l}}),s={runner:t.runner,workerId:t.workerId,done:0,blocked:0,failed:0,total:0,boot:{precheck:{ok:!0,warnings:[]}},processed:[],drained:!1,exhausted:!1,runnerTransient:!1,sessionHooksFired:r},a=await e.runBoot(e.bootDeps,e.bootOptions);if(s.boot=a,!a.precheck.ok)return s;if(t.bootOnly)return e.emit(t.sweepsSkipped?"boot complete (--boot-only): sweeps skipped (supervisor-owned), no issues processed":"boot complete (--boot-only): sweeps ran, no issues processed"),{...s,boot:a};try{if(!await o("pre_session",i(0,0,0)))return{...s,boot:a};await o("pre_pick",JSON.stringify({filter:t.filter}));let c=await e.gh.listCandidates(),u=wsr(c,t.filter),l=u.length;if(await o("post_pick",JSON.stringify({issues:u.map(b=>b.number)})),l===0)return await o("on_idle",i(0,0,0)),e.emit(vsr),await o("post_session",i(0,0,0)),{...s,boot:a,total:0,drained:!0};let d=t.iterCap&&t.iterCap>0?t.iterCap:l,f=[],p=0,m=0,g=0,A=!1,E=!1,y=t.runner;for(let b=0;b<u.length&&!(b>=d);b++){let I=u[b],w=t.alternate?y:t.runner;if(e.runnerCircuit&&await e.runnerCircuit.isOpen(w)){E=!0,e.emit(`runner ${w} circuit open \u2014 stopping before claiming more issues`);break}let v=e.buildProcessInput(I,t),k=t.alternate?{...v,runner:w}:v,R=await e.processIssue(e.processDeps,k),Q=Rsr(R.outcome);Q==="done"?p++:Q==="blocked"?m++:g++,f.push({issue:I.number,outcome:R.outcome});let L=b+1,T=Math.floor(L*100/l),ee=l-L;if(e.emit(`progress: ${L}/${l} (${T}%) \u2014 ${ee} remaining`),R.outcome==="exhausted"){A=!0;break}if(R.outcome==="runner-transient"){E=!0;break}if(t.once&&R.outcome!=="claim-lost")break;t.alternate&&(y=ksr(y,t.runner))}return await o("post_session",i(p,m,l)),{runner:t.runner,workerId:t.workerId,done:p,blocked:m,failed:g,total:l,boot:a,processed:f,drained:!1,exhausted:A,runnerTransient:E,sessionHooksFired:r}}catch(c){throw await o("on_session_error",JSON.stringify({runner:t.runner,worker_id:t.workerId,error:{message:c instanceof Error?c.message:String(c)}})),c}}Rv();sn();var Bsr=/^## Blocked by[ \t]*$/,_sr=/^## /,Tsr=/#[0-9]+/g;function Dsr(e){let t=!1,r=new Set;for(let n of e.split(`
520
- `)){if(t){if(_sr.test(n)){t=!1;continue}let o=n.match(Tsr);if(o)for(let i of o)r.add(i);continue}Bsr.test(n)&&(t=!0)}return[...r].sort()}function Qsr(e){let t=/^#?([0-9]+)$/.exec(e.trim());return t?Number(t[1]):null}var Osr=/^req:([0-9]+)$/;function eM(e){let t=new Set;for(let r of e){let n=Osr.exec(r.trim());n&&t.add(Number(n[1]))}return[...t].sort((r,n)=>r-n)}function mge(e){return e.length===0?!1:e.every(t=>t==="CLOSED")}function Nsr(e){return`\u{1F916} /afk promoted to ready-for-agent: all blockers closed (${e.join(", ")}).`}function Nst(e){return`\u{1F916} /afk unblocked: all dependencies closed (${e.map(t=>`#${t}`).join(", ")}).`}function n4(e,t){let r=[];for(let n of t){let o=n.reqs.map(s=>s.closed?"CLOSED":"open-or-unknown");if(!mge(o))continue;let i=n.reqs.map(s=>s.n).sort((s,a)=>s-a);r.push({number:n.number,refs:i.map(s=>`#${s}`),reqLabels:i.map(s=>`req:${s}`),comment:Nst(i)})}return r}async function Msr(e,t){let r=[];for(let n of e){let o=n.labels??[];if(!o.includes(tc))continue;let i=eM(o);if(i.length>0){let c=[];for(let u of i){let l=await t(u);c.push(l==="CLOSED"?"CLOSED":"open-or-unknown")}mge(c)&&r.push({number:n.number,refs:i.map(u=>`#${u}`),reqLabels:i.map(u=>`req:${u}`),comment:Nst(i)});continue}let s=Dsr(n.body);if(s.length===0)continue;let a=[];for(let c of s){let u=Qsr(c),l=u===null?void 0:await t(u);a.push(l==="CLOSED"?"CLOSED":"open-or-unknown")}mge(a)&&r.push({number:n.number,refs:s,reqLabels:[],comment:Nsr(s)})}return r}async function o4(e,t,r){let n=await Msr(e,t),o=new Map;for(let s of e)o.set(s.number,s.labels??[]);let i=[];for(let s of n){let c=(o.get(s.number)??[]).includes(tc)?tc:et;await r.editLabels(s.number,[c,...s.reqLabels],[mt]),await r.comment(s.number,s.comment),i.push(s.number)}return i}async function Mst(e){let t=r=>Number.isFinite(r)&&r>0?Math.floor(r):0;return{unlabeled:t(await e.unlabeled()),needsTriage:t(await e.needsTriage()),needsInfo:t(await e.needsInfo())}}function Fst(e){return e.unlabeled>0||e.needsTriage>0||e.needsInfo>0}var Fsr=/^afk\/[A-Za-z0-9._-]+\/([0-9]+)-[a-z0-9-]+$/;function Psr(e){let t=Fsr.exec(e);return t?Number(t[1]):null}function hge(e,t){for(let r of e)if(Psr(r)===t)return r;return null}var Lsr=new Set([Ix,wx,eu]);function Usr(e){return e.some(t=>Lsr.has(t))}function i4(e,t){let r=[];for(let n of e){if(!Usr(n.labels))continue;let o=hge(t,n.number);o&&r.push({number:n.number,title:n.title,body:n.body,labels:n.labels,branch:o})}return r}var Pst={refreshCadenceS:300,tolerance:3},Lst=300,Ust=2700,Age={...Pst,claimGraceS:Lst,recentCommitProtectionS:Ust};function $sr(e=Pst){return e.refreshCadenceS*(e.tolerance+1)}function Hsr(e){if(!e.createdAt)return null;let t=Date.parse(e.createdAt);return Number.isNaN(t)?null:Math.floor(t/1e3)}function Wsr(e,t,r=Age){let n=Hsr(e);if(n===null)return"fresh";let o=t-n;return"claimGraceS"in r&&o<=r.claimGraceS||o<=$sr(r)?"fresh":"stale"}function yge(e,t=Age){return r=>Wsr(r,e,t)==="stale"}function jsr(e,t){let r=new Map;for(let s of e){if(!Number.isFinite(s.commentId)||s.worker==="")continue;let a=r.get(s.worker);if(a===void 0){r.set(s.worker,{earliestClaimId:s.kind==="claim"?s.commentId:null,latestId:s.commentId,latestKind:s.kind,latestRecord:s});continue}s.kind==="claim"&&(a.earliestClaimId===null||s.commentId<a.earliestClaimId)&&(a.earliestClaimId=s.commentId),s.commentId>=a.latestId&&(a.latestId=s.commentId,a.latestKind=s.kind,a.latestRecord=s)}let n=null,o=1/0,i=[];for(let[s,a]of r)if(a.latestKind!=="concede"&&a.earliestClaimId!==null){if(t(a.latestRecord)){i.push(s);continue}a.earliestClaimId<o&&(o=a.earliestClaimId,n=s)}return i.sort(),{liveOwner:n,staleOwners:i}}function $st(e){let t=e.map(r=>`\`${r}\``).join(", ");return`\u{1F916} AFK cross-host stale-claim sweep: released this issue back to \`ready-for-agent\` \u2014 ${e.length===1?"the claim":"the claims"} held by ${t} stopped refreshing past the staleness window (owner presumed dead on another host).`}function Hst(e){let t=e.map(r=>`\`${r}\``).join(", ");return`\u{1F916} AFK same-host ghost-claim sweep: released this issue back to \`ready-for-agent\` \u2014 ${e.length===1?"the claim":"the claims"} held by ${t} had a dead \`worker.pid\`.`}function Wst(e,t,r=Age){let n=yge(t,r),o=[];for(let i of e){let s=new Set(i.deadOwners??[]),a=jsr(i.records,c=>s.has(c.worker)||n(c));if(a.liveOwner===null&&a.staleOwners.length>0){if(!a.staleOwners.some(u=>s.has(u))&&qsr(i.attemptBranchCommitS,t,r.recentCommitProtectionS))continue;o.push({issue:i.issue,staleOwners:a.staleOwners})}}return o}function qsr(e,t,r){return Number.isFinite(e)?t-e<=r:!1}var jst=/^[0-9]+$/;function aC(e,t){if(e!==void 0&&jst.test(e)){let r=Number(e);if(r>0)return r}return t}function gge(e,t){return e!==void 0&&jst.test(e)?Number(e):t}function qst(e=process.env){return{refreshCadenceS:aC(e.RED_AFK_CLAIM_REFRESH_S,300),tolerance:gge(e.RED_AFK_CLAIM_STALE_TOLERANCE,3)}}function Gst(e=process.env,t=()=>""){return{refreshCadenceS:aC(e.RED_AFK_CLAIM_REFRESH_S,0)||aC(t("afk.claim_reaper.refresh_s"),300),tolerance:gge(e.RED_AFK_CLAIM_STALE_TOLERANCE,gge(t("afk.claim_reaper.stale_tolerance"),3)),claimGraceS:aC(e.RED_AFK_CLAIM_REAPER_GRACE_S,0)||aC(t("afk.claim_reaper.grace_s"),Lst),recentCommitProtectionS:aC(e.RED_AFK_CLAIM_REAPER_RECENT_COMMIT_S,0)||aC(t("afk.claim_reaper.recent_commit_s"),Ust)}}sn();function Gsr(e){if(!e.ghInstalled)return{ok:!1,failed:"gh-missing"};if(!e.ghAuthenticated)return{ok:!1,failed:"gh-unauthenticated"};if(!e.isGitRepo)return{ok:!1,failed:"not-a-git-repo"};if(!e.allowHttpsRemote){for(let n of e.remoteUrls)if(n.startsWith("https://"))return{ok:!1,failed:"https-remote-forbidden",detail:n}}if(!e.hasMainBranch)return{ok:!1,failed:"no-main-branch"};let t=e.lockedBranch??"main";if(e.currentBranch!==t)return{ok:!1,failed:"not-on-main",detail:e.currentBranch};let r=[];return e.pnpmInstalled||r.push("pnpm not on PATH; feedback loops will be skipped"),{ok:!0,warnings:r}}async function s4(e,t){let r=Gsr(t.precheck);if(!r.ok)return{precheck:r};let n=t.bootstrap;if(await e.fs.ensureDir(n.tmpDir),await e.fs.ensureDir(n.stateDir),await e.fs.ensureGitignoreLine(n.gitignorePath,".red/tmp/"),await e.fs.ensureGitignoreLine(n.gitignorePath,".red/state/"),await e.fs.ensureDir(n.workerDir),await e.fs.writeWorkerPid(n.workerPidFile,n.workerPid),t.skipSweeps)return{precheck:r,bootstrap:{ok:!0}};let o=await Vsr(e,t),i=await Ysr(e,t.attemptCap),s=await Jsr(e,t.branches),a=await Ksr(e,t.unblockCandidates),c=await zsr(e),u=await Zsr(e,t),l=await Xsr(e);return{precheck:r,bootstrap:{ok:!0},orphanCleanup:o,attemptCap:i,branchCleanup:s,unblockSweep:a,staleClaimSweep:c,reconcileSweep:u,straggler:l}}async function zsr(e){if(!e.lookups.claimedIssues)return{released:[]};let t;try{t=await e.lookups.claimedIssues()}catch{return{released:[]}}let r=Gst(e.env??process.env,i=>e.config?.[i]??""),n=Wst(t,e.nowS,r),o=[];for(let i of n)try{let s=await e.gh.viewLabels(i.issue);if(!s.includes(Ze)){o.push(i.issue);continue}let a=s.includes(et)?[]:[mt];await e.gh.editLabels(i.issue,[Ze],a);let c=t.find(d=>d.issue===i.issue),u=new Set(c?.deadOwners??[]),l=i.staleOwners.some(d=>u.has(d))?Hst(i.staleOwners):$st(i.staleOwners);await e.gh.comment(i.issue,l),o.push(i.issue)}catch{}return{released:o}}async function Vsr(e,t){let r=t.orphans,n=[],o=[],i=[],s=[],a=[];for(let c of t.legacyWorkDirs??[])await e.fs.removeDir(c),s.push(c);for(let c of r){let u=c.issue!==null,l="OPEN",d=null,f=!1,p=!0;if(u&&c.issue!==null){let g=await e.lookups.orphanState(c.issue);p=g.ghOk,l=g.state,d=g.label,f=g.envelopePosted}let m=Uit({issueState:l,label:d,envelopePosted:f,hasStateFile:u,ageS:c.ageS,ghOk:p});m.kind==="remove"?(await e.fs.removeDir(c.path),n.push(c.path)):m.kind==="restore-and-remove"?await e.lookups.claimHolderAlive?.(c.issue).catch(()=>!1)??!1?(await e.fs.removeDir(c.path),n.push(c.path)):(await e.gh.editLabels(c.issue,[Ze],[mt]),await e.gh.comment(c.issue,"\u{1F916} /afk orchestrator died mid-issue; restoring ready-for-agent."),o.push(c.issue),await e.fs.removeDir(c.path),n.push(c.path)):c.ageS>m.ttlS?(await e.fs.removeDir(c.path),n.push(c.path)):i.push(c.path)}for(let c of t.staleClaimDirs??[])await e.fs.removeDir(c.path),a.push(c.path);return{removed:n,restored:o,kept:i,legacyWiped:s,claimsReleased:a}}async function Ysr(e,t){let r=jit(e.env),n=qit(e.env),o=[];for(let[,i]of t.byIssue){let s=$it(i,{ttlS:r,keep:n,nowS:e.nowS});for(let a of s)await e.fs.removeDir(a.path),o.push(a.path)}return{reclaimed:o}}async function Jsr(e,t){let r=TN(e.env),n=DN(t.snapshotRefs,e.lookups.branchIssue,e.nowS,r),o=[];for(let u of Jh(n))await e.git.deleteRemoteBranch(u.branch),o.push(u.branch);let i=vv(t.remoteLiveRefs,e.lookups.branchIssue,e.nowS),s=[];for(let u of Jh(i))await e.git.deleteRemoteBranch(u.branch),s.push(u.branch);let a=QN(t.localLiveRefs,e.lookups.branchIssue,e.nowS),c=[];for(let u of Jh(a))await e.git.deleteLocalBranch(u.branch),c.push(u.branch);return{snapshotReaped:o,remoteLiveReaped:s,localLiveReaped:c}}async function Ksr(e,t){return{promoted:await o4(t,e.lookups.blockerState,e.gh)}}async function Zsr(e,t){let r={landed:[],parked:[],skipped:[]};if(!e.reconcileRunner)return r;let n=t.reconcileSweepCandidates??[];if(n.length===0)return r;let o=t.branches.remoteLiveRefs.map(s=>s.branch),i=i4(n,o);for(let s of i)try{let{outcome:a}=await e.reconcileRunner(s);a==="landed"?r.landed.push(s.number):a==="parked"?r.parked.push(s.number):r.skipped.push(s.number)}catch{r.skipped.push(s.number)}return r}async function Xsr(e){let t=await Mst(e.lookups.straggler);return{counts:t,warn:Fst(t)}}var tM=class extends Error{constructor(t){super(t),this.name="QuarantineConfigError"}};function zst(e){for(let t=0;t<e.length;t++){let r=e[t];if(!r.issue.trim())throw new tM(`quarantine entry ${t} (pattern: "${r.pattern}") has no issue reference \u2014 every quarantine entry must link to a tracker issue`)}}function Vst(e,t){let r=[],n=t==="."?"":`${t}/`;for(let o of e)if(t==="."||o.pattern.startsWith(n)){let i=t==="."?o.pattern:o.pattern.slice(n.length);r.push("--exclude",i)}return r}function Yst(e,t){let r=t==="."?"":`${t}/`;return e.filter(n=>t==="."||n.pattern.startsWith(r))}var ear=["APPDATA","CI","COLORTERM","ComSpec","COREPACK_HOME","FORCE_COLOR","HOME","LANG","LOCALAPPDATA","LOGNAME","NO_COLOR","NPM_CONFIG_USERCONFIG","PATH","PATHEXT","PNPM_HOME","SHELL","SystemRoot","TEMP","TERM","TMP","TMPDIR","USER","USERPROFILE","TZ","npm_config_userconfig"],tar=["COREPACK_","LC_","NPM_CONFIG_","PNPM_","XDG_","YARN_","npm_config_"],rar=["ANTHROPIC_API_KEY","GITHUB_TOKEN","GH_TOKEN","MINIMAX_API_KEY","NODE_AUTH_TOKEN","NPM_TOKEN","OPENAI_API_KEY","OPENROUTER_API_KEY","RED_AFK_WORKERS_NAMESPACE"],nar=["ANTHROPIC_","CLAUDE_","CODEX_","MINIMAX_","OPENAI_","OPENROUTER_","RED_AFK_","RED_SKILLS_"];function Jst(e,t,r){return t.includes(e)||r.some(n=>e.startsWith(n))}function Ege(e=process.env){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&(Jst(r,rar,nar)||Jst(r,ear,tar)&&(t[r]=n));return t}var oar=["test","typecheck","lint","build"],iar="red.afk.validation.v1";function sar(e,t){let r=new Set(t),n=new Set,o=[],i=[];for(let s of e)n.has(s)||(n.add(s),r.has(s)?i.push(s):o.push(s));return{shouldBlock:o.length>0,blockingFailures:o,preExistingFailures:i}}function aar(e){return e.startsWith("./")?e.slice(2):e}function car(e,t){if(t==="")return;let r=aar(t),n=r.includes("/")?r.slice(0,r.lastIndexOf("/")):".";for(;n!==""&&n!=="."&&n!=="/";){if(e.hasPackage(n))return n;n=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"."}return e.hasPackage(".")?".":void 0}function u4(e,t){let r=new Set;for(let n of t){if(n==="")continue;let o=car(e,n);o!==void 0&&r.add(o)}return r.size===0&&e.hasPackage(".")&&r.add("."),[...r].sort()}function uar(e){return e==="."?"root":e}function xge(e,t){return t==="."?e:`${e}/${t}`}function ag(e){let t={schema:iar,name:e.name,status:e.status};return e.command!==void 0&&e.command!==""&&(t.command=e.command),e.exitCode!==void 0&&Number.isFinite(e.exitCode)&&(t.exitCode=Math.trunc(e.exitCode)),e.durationMs!==void 0&&(t.durationMs=e.durationMs),e.summary!==void 0&&e.summary!==""&&(t.summary=e.summary),t}function a4(e){return JSON.stringify(e)}function l4(e){if(e.ok)return!1;for(let t of e.checks){if(t.status!=="failed")continue;let r=t.record.exitCode;if(r===0)continue;if(r===137)return!0;let n=t.record.summary??"";if(n.includes("feedback worktree setup failed")||n.includes("feedback worktree submodule init failed")||n.includes("feedback worktree install failed")||n.includes("SIGKILL")||/\b137\b/.test(n)||n.includes("maxBuffer length exceeded"))return!0}return!1}function c4(e,t){if(e==="passed")return"command exited 0";let r=t.replace(/\n+$/,"");return r===""?"command exited non-zero":r.split(`
520
+ `)){if(t){if(_sr.test(n)){t=!1;continue}let o=n.match(Tsr);if(o)for(let i of o)r.add(i);continue}Bsr.test(n)&&(t=!0)}return[...r].sort()}function Qsr(e){let t=/^#?([0-9]+)$/.exec(e.trim());return t?Number(t[1]):null}var Osr=/^req:([0-9]+)$/;function eM(e){let t=new Set;for(let r of e){let n=Osr.exec(r.trim());n&&t.add(Number(n[1]))}return[...t].sort((r,n)=>r-n)}function mge(e){return e.length===0?!1:e.every(t=>t==="CLOSED")}function Nsr(e){return`\u{1F916} /afk promoted to ready-for-agent: all blockers closed (${e.join(", ")}).`}function Nst(e){return`\u{1F916} /afk unblocked: all dependencies closed (${e.map(t=>`#${t}`).join(", ")}).`}function n4(e,t){let r=[];for(let n of t){let o=n.reqs.map(s=>s.closed?"CLOSED":"open-or-unknown");if(!mge(o))continue;let i=n.reqs.map(s=>s.n).sort((s,a)=>s-a);r.push({number:n.number,refs:i.map(s=>`#${s}`),reqLabels:i.map(s=>`req:${s}`),comment:Nst(i)})}return r}async function Msr(e,t){let r=[];for(let n of e){let o=n.labels??[];if(!o.includes(tc))continue;let i=eM(o);if(i.length>0){let c=[];for(let u of i){let l=await t(u);c.push(l==="CLOSED"?"CLOSED":"open-or-unknown")}mge(c)&&r.push({number:n.number,refs:i.map(u=>`#${u}`),reqLabels:i.map(u=>`req:${u}`),comment:Nst(i)});continue}let s=Dsr(n.body);if(s.length===0)continue;let a=[];for(let c of s){let u=Qsr(c),l=u===null?void 0:await t(u);a.push(l==="CLOSED"?"CLOSED":"open-or-unknown")}mge(a)&&r.push({number:n.number,refs:s,reqLabels:[],comment:Nsr(s)})}return r}async function o4(e,t,r){let n=await Msr(e,t),o=new Map;for(let s of e)o.set(s.number,s.labels??[]);let i=[];for(let s of n){let c=(o.get(s.number)??[]).includes(tc)?tc:et;await r.editLabels(s.number,[c,...s.reqLabels],[mt]),await r.comment(s.number,s.comment),i.push(s.number)}return i}async function Mst(e){let t=r=>Number.isFinite(r)&&r>0?Math.floor(r):0;return{unlabeled:t(await e.unlabeled()),needsTriage:t(await e.needsTriage()),needsInfo:t(await e.needsInfo())}}function Fst(e){return e.unlabeled>0||e.needsTriage>0||e.needsInfo>0}var Fsr=/^afk\/[A-Za-z0-9._-]+\/([0-9]+)-[a-z0-9-]+$/;function Psr(e){let t=Fsr.exec(e);return t?Number(t[1]):null}function hge(e,t){for(let r of e)if(Psr(r)===t)return r;return null}var Lsr=new Set([Ix,wx,eu]);function Usr(e){return e.some(t=>Lsr.has(t))}function i4(e,t){let r=[];for(let n of e){if(!Usr(n.labels))continue;let o=hge(t,n.number);o&&r.push({number:n.number,title:n.title,body:n.body,labels:n.labels,branch:o})}return r}var Pst={refreshCadenceS:270,tolerance:3},Lst=270,Ust=2700,Age={...Pst,claimGraceS:Lst,recentCommitProtectionS:Ust};function $sr(e=Pst){return e.refreshCadenceS*(e.tolerance+1)}function Hsr(e){if(!e.createdAt)return null;let t=Date.parse(e.createdAt);return Number.isNaN(t)?null:Math.floor(t/1e3)}function Wsr(e,t,r=Age){let n=Hsr(e);if(n===null)return"fresh";let o=t-n;return"claimGraceS"in r&&o<=r.claimGraceS||o<=$sr(r)?"fresh":"stale"}function yge(e,t=Age){return r=>Wsr(r,e,t)==="stale"}function jsr(e,t){let r=new Map;for(let s of e){if(!Number.isFinite(s.commentId)||s.worker==="")continue;let a=r.get(s.worker);if(a===void 0){r.set(s.worker,{earliestClaimId:s.kind==="claim"?s.commentId:null,latestId:s.commentId,latestKind:s.kind,latestRecord:s});continue}s.kind==="claim"&&(a.earliestClaimId===null||s.commentId<a.earliestClaimId)&&(a.earliestClaimId=s.commentId),s.commentId>=a.latestId&&(a.latestId=s.commentId,a.latestKind=s.kind,a.latestRecord=s)}let n=null,o=1/0,i=[];for(let[s,a]of r)if(a.latestKind!=="concede"&&a.earliestClaimId!==null){if(t(a.latestRecord)){i.push(s);continue}a.earliestClaimId<o&&(o=a.earliestClaimId,n=s)}return i.sort(),{liveOwner:n,staleOwners:i}}function $st(e){let t=e.map(r=>`\`${r}\``).join(", ");return`\u{1F916} AFK cross-host stale-claim sweep: released this issue back to \`ready-for-agent\` \u2014 ${e.length===1?"the claim":"the claims"} held by ${t} stopped refreshing past the staleness window (owner presumed dead on another host).`}function Hst(e){let t=e.map(r=>`\`${r}\``).join(", ");return`\u{1F916} AFK same-host ghost-claim sweep: released this issue back to \`ready-for-agent\` \u2014 ${e.length===1?"the claim":"the claims"} held by ${t} had a dead \`worker.pid\`.`}function Wst(e,t,r=Age){let n=yge(t,r),o=[];for(let i of e){let s=new Set(i.deadOwners??[]),a=jsr(i.records,c=>s.has(c.worker)||n(c));if(a.liveOwner===null&&a.staleOwners.length>0){if(!a.staleOwners.some(u=>s.has(u))&&qsr(i.attemptBranchCommitS,t,r.recentCommitProtectionS))continue;o.push({issue:i.issue,staleOwners:a.staleOwners})}}return o}function qsr(e,t,r){return Number.isFinite(e)?t-e<=r:!1}var jst=/^[0-9]+$/;function aC(e,t){if(e!==void 0&&jst.test(e)){let r=Number(e);if(r>0)return r}return t}function gge(e,t){return e!==void 0&&jst.test(e)?Number(e):t}function qst(e=process.env){return{refreshCadenceS:aC(e.RED_AFK_CLAIM_REFRESH_S,270),tolerance:gge(e.RED_AFK_CLAIM_STALE_TOLERANCE,3)}}function Gst(e=process.env,t=()=>""){return{refreshCadenceS:aC(e.RED_AFK_CLAIM_REFRESH_S,0)||aC(t("afk.claim_reaper.refresh_s"),270),tolerance:gge(e.RED_AFK_CLAIM_STALE_TOLERANCE,gge(t("afk.claim_reaper.stale_tolerance"),3)),claimGraceS:aC(e.RED_AFK_CLAIM_REAPER_GRACE_S,0)||aC(t("afk.claim_reaper.grace_s"),Lst),recentCommitProtectionS:aC(e.RED_AFK_CLAIM_REAPER_RECENT_COMMIT_S,0)||aC(t("afk.claim_reaper.recent_commit_s"),Ust)}}sn();function Gsr(e){if(!e.ghInstalled)return{ok:!1,failed:"gh-missing"};if(!e.ghAuthenticated)return{ok:!1,failed:"gh-unauthenticated"};if(!e.isGitRepo)return{ok:!1,failed:"not-a-git-repo"};if(!e.allowHttpsRemote){for(let n of e.remoteUrls)if(n.startsWith("https://"))return{ok:!1,failed:"https-remote-forbidden",detail:n}}if(!e.hasMainBranch)return{ok:!1,failed:"no-main-branch"};let t=e.lockedBranch??"main";if(e.currentBranch!==t)return{ok:!1,failed:"not-on-main",detail:e.currentBranch};let r=[];return e.pnpmInstalled||r.push("pnpm not on PATH; feedback loops will be skipped"),{ok:!0,warnings:r}}async function s4(e,t){let r=Gsr(t.precheck);if(!r.ok)return{precheck:r};let n=t.bootstrap;if(await e.fs.ensureDir(n.tmpDir),await e.fs.ensureDir(n.stateDir),await e.fs.ensureGitignoreLine(n.gitignorePath,".red/tmp/"),await e.fs.ensureGitignoreLine(n.gitignorePath,".red/state/"),await e.fs.ensureDir(n.workerDir),await e.fs.writeWorkerPid(n.workerPidFile,n.workerPid),t.skipSweeps)return{precheck:r,bootstrap:{ok:!0}};let o=await Vsr(e,t),i=await Ysr(e,t.attemptCap),s=await Jsr(e,t.branches),a=await Ksr(e,t.unblockCandidates),c=await zsr(e),u=await Zsr(e,t),l=await Xsr(e);return{precheck:r,bootstrap:{ok:!0},orphanCleanup:o,attemptCap:i,branchCleanup:s,unblockSweep:a,staleClaimSweep:c,reconcileSweep:u,straggler:l}}async function zsr(e){if(!e.lookups.claimedIssues)return{released:[]};let t;try{t=await e.lookups.claimedIssues()}catch{return{released:[]}}let r=Gst(e.env??process.env,i=>e.config?.[i]??""),n=Wst(t,e.nowS,r),o=[];for(let i of n)try{let s=await e.gh.viewLabels(i.issue);if(!s.includes(Ze)){o.push(i.issue);continue}let a=s.includes(et)?[]:[mt];await e.gh.editLabels(i.issue,[Ze],a);let c=t.find(d=>d.issue===i.issue),u=new Set(c?.deadOwners??[]),l=i.staleOwners.some(d=>u.has(d))?Hst(i.staleOwners):$st(i.staleOwners);await e.gh.comment(i.issue,l),o.push(i.issue)}catch{}return{released:o}}async function Vsr(e,t){let r=t.orphans,n=[],o=[],i=[],s=[],a=[];for(let c of t.legacyWorkDirs??[])await e.fs.removeDir(c),s.push(c);for(let c of r){let u=c.issue!==null,l="OPEN",d=null,f=!1,p=!0;if(u&&c.issue!==null){let g=await e.lookups.orphanState(c.issue);p=g.ghOk,l=g.state,d=g.label,f=g.envelopePosted}let m=Uit({issueState:l,label:d,envelopePosted:f,hasStateFile:u,ageS:c.ageS,ghOk:p});m.kind==="remove"?(await e.fs.removeDir(c.path),n.push(c.path)):m.kind==="restore-and-remove"?await e.lookups.claimHolderAlive?.(c.issue).catch(()=>!1)??!1?(await e.fs.removeDir(c.path),n.push(c.path)):(await e.gh.editLabels(c.issue,[Ze],[mt]),await e.gh.comment(c.issue,"\u{1F916} /afk orchestrator died mid-issue; restoring ready-for-agent."),o.push(c.issue),await e.fs.removeDir(c.path),n.push(c.path)):c.ageS>m.ttlS?(await e.fs.removeDir(c.path),n.push(c.path)):i.push(c.path)}for(let c of t.staleClaimDirs??[])await e.fs.removeDir(c.path),a.push(c.path);return{removed:n,restored:o,kept:i,legacyWiped:s,claimsReleased:a}}async function Ysr(e,t){let r=jit(e.env),n=qit(e.env),o=[];for(let[,i]of t.byIssue){let s=$it(i,{ttlS:r,keep:n,nowS:e.nowS});for(let a of s)await e.fs.removeDir(a.path),o.push(a.path)}return{reclaimed:o}}async function Jsr(e,t){let r=TN(e.env),n=DN(t.snapshotRefs,e.lookups.branchIssue,e.nowS,r),o=[];for(let u of Jh(n))await e.git.deleteRemoteBranch(u.branch),o.push(u.branch);let i=vv(t.remoteLiveRefs,e.lookups.branchIssue,e.nowS),s=[];for(let u of Jh(i))await e.git.deleteRemoteBranch(u.branch),s.push(u.branch);let a=QN(t.localLiveRefs,e.lookups.branchIssue,e.nowS),c=[];for(let u of Jh(a))await e.git.deleteLocalBranch(u.branch),c.push(u.branch);return{snapshotReaped:o,remoteLiveReaped:s,localLiveReaped:c}}async function Ksr(e,t){return{promoted:await o4(t,e.lookups.blockerState,e.gh)}}async function Zsr(e,t){let r={landed:[],parked:[],skipped:[]};if(!e.reconcileRunner)return r;let n=t.reconcileSweepCandidates??[];if(n.length===0)return r;let o=t.branches.remoteLiveRefs.map(s=>s.branch),i=i4(n,o);for(let s of i)try{let{outcome:a}=await e.reconcileRunner(s);a==="landed"?r.landed.push(s.number):a==="parked"?r.parked.push(s.number):r.skipped.push(s.number)}catch{r.skipped.push(s.number)}return r}async function Xsr(e){let t=await Mst(e.lookups.straggler);return{counts:t,warn:Fst(t)}}var tM=class extends Error{constructor(t){super(t),this.name="QuarantineConfigError"}};function zst(e){for(let t=0;t<e.length;t++){let r=e[t];if(!r.issue.trim())throw new tM(`quarantine entry ${t} (pattern: "${r.pattern}") has no issue reference \u2014 every quarantine entry must link to a tracker issue`)}}function Vst(e,t){let r=[],n=t==="."?"":`${t}/`;for(let o of e)if(t==="."||o.pattern.startsWith(n)){let i=t==="."?o.pattern:o.pattern.slice(n.length);r.push("--exclude",i)}return r}function Yst(e,t){let r=t==="."?"":`${t}/`;return e.filter(n=>t==="."||n.pattern.startsWith(r))}var ear=["APPDATA","CI","COLORTERM","ComSpec","COREPACK_HOME","FORCE_COLOR","HOME","LANG","LOCALAPPDATA","LOGNAME","NO_COLOR","NPM_CONFIG_USERCONFIG","PATH","PATHEXT","PNPM_HOME","SHELL","SystemRoot","TEMP","TERM","TMP","TMPDIR","USER","USERPROFILE","TZ","npm_config_userconfig"],tar=["COREPACK_","LC_","NPM_CONFIG_","PNPM_","XDG_","YARN_","npm_config_"],rar=["ANTHROPIC_API_KEY","GITHUB_TOKEN","GH_TOKEN","MINIMAX_API_KEY","NODE_AUTH_TOKEN","NPM_TOKEN","OPENAI_API_KEY","OPENROUTER_API_KEY","RED_AFK_WORKERS_NAMESPACE"],nar=["ANTHROPIC_","CLAUDE_","CODEX_","MINIMAX_","OPENAI_","OPENROUTER_","RED_AFK_","RED_SKILLS_"];function Jst(e,t,r){return t.includes(e)||r.some(n=>e.startsWith(n))}function Ege(e=process.env){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&(Jst(r,rar,nar)||Jst(r,ear,tar)&&(t[r]=n));return t}var oar=["test","typecheck","lint","build"],iar="red.afk.validation.v1";function sar(e,t){let r=new Set(t),n=new Set,o=[],i=[];for(let s of e)n.has(s)||(n.add(s),r.has(s)?i.push(s):o.push(s));return{shouldBlock:o.length>0,blockingFailures:o,preExistingFailures:i}}function aar(e){return e.startsWith("./")?e.slice(2):e}function car(e,t){if(t==="")return;let r=aar(t),n=r.includes("/")?r.slice(0,r.lastIndexOf("/")):".";for(;n!==""&&n!=="."&&n!=="/";){if(e.hasPackage(n))return n;n=n.includes("/")?n.slice(0,n.lastIndexOf("/")):"."}return e.hasPackage(".")?".":void 0}function u4(e,t){let r=new Set;for(let n of t){if(n==="")continue;let o=car(e,n);o!==void 0&&r.add(o)}return r.size===0&&e.hasPackage(".")&&r.add("."),[...r].sort()}function uar(e){return e==="."?"root":e}function xge(e,t){return t==="."?e:`${e}/${t}`}function ag(e){let t={schema:iar,name:e.name,status:e.status};return e.command!==void 0&&e.command!==""&&(t.command=e.command),e.exitCode!==void 0&&Number.isFinite(e.exitCode)&&(t.exitCode=Math.trunc(e.exitCode)),e.durationMs!==void 0&&(t.durationMs=e.durationMs),e.summary!==void 0&&e.summary!==""&&(t.summary=e.summary),t}function a4(e){return JSON.stringify(e)}function l4(e){if(e.ok)return!1;for(let t of e.checks){if(t.status!=="failed")continue;let r=t.record.exitCode;if(r===0)continue;if(r===137)return!0;let n=t.record.summary??"";if(n.includes("feedback worktree setup failed")||n.includes("feedback worktree submodule init failed")||n.includes("feedback worktree install failed")||n.includes("SIGKILL")||/\b137\b/.test(n)||n.includes("maxBuffer length exceeded"))return!0}return!1}function c4(e,t){if(e==="passed")return"command exited 0";let r=t.replace(/\n+$/,"");return r===""?"command exited non-zero":r.split(`
521
521
  `).slice(-20).join(" ").slice(0,1e3)}async function lar(e,t,r,n,o,i){let s=new Map;for(let{name:a,script:c,scope:u}of r){if(!n.hasScript(u,c))continue;let l=xge(t,u),d=await e(["pnpm","-C",l,c],{env:i});s.set(a,d.code===0?"passed":"failed")}return s}async function d4(e,t){let{worktree:r,scopes:n,layout:o,now:i,baselineWorktree:s,validationScope:a}=t,c=Ege(),u=t.quarantine??[],l=[],d=[],f=!1,p=m=>{l.push(m),d.push(a4(m.record))};try{zst(u)}catch(m){if(m instanceof tM){let A={name:"quarantine:config-error",script:"test",label:"quarantine",scope:"",status:"failed",record:ag({name:"quarantine:config-error",status:"failed",summary:m.message})};return p(A),{ok:!1,checks:l,sidecar:d,baselineDowngraded:[],quarantined:[]}}throw m}for(let m of oar){if(n.length===0){let g=`${m}:no-package`,A=ag({name:g,status:"skipped",summary:"no package.json"});p({name:g,script:m,label:"no-package",scope:"",status:"skipped",record:A});continue}for(let g of n){let A=uar(g),E=`${m}:${A}`;if(!o.hasScript(g,m)){let P=ag({name:E,status:"skipped",summary:"script missing"});p({name:E,script:m,label:A,scope:g,status:"skipped",record:P});continue}let y=m==="test"?Vst(u,g):[];if(m==="test"&&y.length>0)for(let P of Yst(u,g)){let B=`quarantined:${P.pattern}`,M=ag({name:B,status:"skipped",summary:`quarantined \u2014 ${P.issue} (since ${P.since})`});p({name:B,script:"test",label:A,scope:g,status:"skipped",record:M})}let b=xge(r,g),I=["pnpm","-C",b,m],w=y.length>0?[...I,"--",...y]:I,v=y.length>0?`pnpm -C ${b} ${m} -- ${y.join(" ")}`:`pnpm -C ${b} ${m}`,k=i(),R=await e(w,{env:c}),Q=i()-k,L=R.code===0?"passed":"failed";L==="failed"&&(f=!0);let T=c4(L,`${R.stdout}${R.stderr}`),ee=ag({name:E,status:L,command:v,exitCode:R.code,durationMs:Q,summary:T});p({name:E,script:m,label:A,scope:g,status:L,record:ee})}}if(n.length>0&&!n.includes(".")&&o.hasScript(".","typecheck")){let m="typecheck:workspace",g="workspace",A=".",E=xge(r,"."),y=`pnpm -C ${E} typecheck`,b=i(),I=await e(["pnpm","-C",E,"typecheck"],{env:c}),w=i()-b,v=I.code===0?"passed":"failed";v==="failed"&&(f=!0);let k=c4(v,`${I.stdout}${I.stderr}`),R=ag({name:m,status:v,command:y,exitCode:I.code,durationMs:w,summary:k});p({name:m,script:"typecheck",label:g,scope:A,status:v,record:R})}if(f&&s){let m=l.filter(I=>I.status==="failed").map(I=>({name:I.name,script:I.script,scope:I.scope})),A=[...(await lar(e,s,m,o,i,c)).entries()].filter(([,I])=>I==="failed").map(([I])=>I),E=sar(m.map(I=>I.name),A),y=new Set(E.preExistingFailures),b=[];for(let I=0;I<l.length;I+=1){let w=l[I];if(w.status==="failed"&&y.has(w.name)){let v=ag({name:w.name,status:"skipped",command:w.record.command,summary:"pre-existing failure on baseline"});l[I]={...w,status:"skipped",record:v},d[I]=a4(v),b.push(w.name)}}return f=E.shouldBlock,{ok:!f,checks:l,sidecar:d,baselineDowngraded:b,baselineProbeRan:!0,baselineFailures:E.preExistingFailures,quarantined:u,validationScope:a}}return{ok:!f,checks:l,sidecar:d,baselineDowngraded:[],quarantined:u,validationScope:a}}async function Zst(e,t){let{repo:r,remote:n,branch:o,stillBehind:i,inSync:s}=t,a=`${n}/${o}`;return s?{ok:!0,action:"in-sync"}:i?{ok:(await e(["git","-C",r,"merge","--ff-only",a])).code===0,action:"fast-forward"}:(await e(["git","-C",r,"rebase",a])).code!==0?(await e(["git","-C",r,"rebase","--abort"]),{ok:!1,action:"rebase"}):{ok:!0,action:"rebase"}}async function Xst(e,t){let{repo:r,remote:n,base:o,branch:i}=t,s=t.maxPushRetries??2,a=`${n}/${o}`,c=async()=>(await e(["git","-C",r,"fetch",n,o,"--quiet"])).code!==0?{ok:!1,reason:"fetch-failed"}:(await e(["git","-C",r,"merge-base","--is-ancestor",a,"HEAD"])).code===0?{ok:!0,alreadyIntegrated:!0}:(await e(["git","-C",r,"rebase",a])).code!==0?t.resolveMechanical&&await t.resolveMechanical(r)?{ok:!0}:(await e(["git","-C",r,"rebase","--abort"]),{ok:!1,reason:"conflict"}):{ok:!0},u=await c();if(!u.ok)return u;if(u.alreadyIntegrated)return{ok:!0};for(let l=0;l<=s;l++){if((await e(["git","-C",r,"push",n,`HEAD:refs/heads/${i}`,"--force-with-lease"])).code===0)return{ok:!0};if(l<s){let f=await c();if(!f.ok)return f}}return{ok:!1,reason:"push-rejected"}}async function eat(e,t){let{repo:r,remote:n,branch:o,target:i,n:s,title:a,preMergeSha:c}=t,u=t.mergeTitle??`merge: #${s} ${a}`;return(await e(["git","-C",r,"merge","--no-ff","--no-verify",o,"-m",u])).code!==0?{ok:!1,rolledBack:!1}:(await e(["git","-C",r,"push",n,`HEAD:refs/heads/${i}`])).code!==0?(await e(["git","-C",r,"reset","--hard",c]),{ok:!1,rolledBack:!0}):{ok:!0,rolledBack:!1}}function dar(e){let t=e.trim();if(t==="")return[];try{let r=JSON.parse(t);return Array.isArray(r)?r.flatMap(n=>{if(typeof n!="object"||n===null)return[];let o=n.name,i=n.state;return typeof o!="string"?[]:[{name:o,state:typeof i=="string"?i:""}]}):[]}catch{return[]}}function far(e){let t=e.trim().toUpperCase();return t!==""&&t!=="PENDING"}async function par(e,t,r,n){let o=n.maxPolls??30,i=n.intervalMs??1e4,s=n.check.trim().toLowerCase(),a=!1;for(let c=0;c<o;c++){let u=await e(["gh","-R",t,"pr","checks",String(r),"--json","name,state"]),l=dar(u.stdout).find(d=>d.name.toLowerCase().includes(s));if(l!==void 0&&(a=!0,far(l.state)))return"concluded";c+1<o&&await n.sleep(i)}return a?"timeout":"absent"}var Yv=e=>typeof e=="string"?e.trim().toUpperCase():"";function mar(e){let t=Yv(e.conclusion),r=Yv(e.state);return["FAILURE","TIMED_OUT","CANCELLED","ACTION_REQUIRED","STARTUP_FAILURE","STALE"].includes(t)?!0:["FAILURE","ERROR"].includes(r)}function har(e){let t=Yv(e.status),r=Yv(e.state),n=Yv(e.conclusion);return!!(t!==""&&t!=="COMPLETED"||["PENDING","EXPECTED"].includes(r)||t==="COMPLETED"&&n==="")}function gar(e){let t=e.trim();if(t==="")return{mergeStateStatus:"",anyFailed:!1,anyPending:!1};try{let r=JSON.parse(t);if(typeof r!="object"||r===null)return{mergeStateStatus:"",anyFailed:!1,anyPending:!1};let n=r.mergeStateStatus,o=r.statusCheckRollup,i=Array.isArray(o)?o.filter(s=>typeof s=="object"&&s!==null):[];return{mergeStateStatus:typeof n=="string"?n:"",anyFailed:i.some(mar),anyPending:i.some(har)}}catch{return{mergeStateStatus:"",anyFailed:!1,anyPending:!1}}}function Aar(e){let t=Yv(e.mergeStateStatus);return t==="DIRTY"||t==="BEHIND"?"conflict":e.anyFailed?"ci-failed":t==="CLEAN"?"merge":e.anyPending?"pending":t==="BLOCKED"||t==="UNSTABLE"||t==="HAS_HOOKS"?"merge":"pending"}async function yar(e,t,r,n){let o=n.maxPolls??60,i=n.intervalMs??1e4;for(let s=0;s<o;s++){let a=await e(["gh","-R",t,"pr","view",String(r),"--json","mergeStateStatus,statusCheckRollup"]),c=Aar(gar(a.stdout));if(c!=="pending")return c;s+1<o&&await n.sleep(i)}return"pending"}var xar="Automated AFK landing for #";async function tat(e,t){let{repo:r,gitRepo:n,remote:o,branch:i,target:s,n:a,title:c,mergeTitle:u,worktree:l,waitForReview:d,ciAwait:f,locked:p}=t;if(l&&(await e(["git","-C",l,"push",o,`HEAD:refs/heads/${i}`,"--force-with-lease"])).code!==0)return{ok:!1,reason:"push-failed"};let m=await bge(e,{repo:r,branch:i,target:s,n:a,title:c,mergeTitle:u});if(m===void 0)return{ok:!1,reason:"no-pr"};if(d&&await par(e,r,m,d),f){let E=await yar(e,r,m,f);if(E==="conflict")return{ok:!1,prNumber:m,reason:"conflict"};if(E==="ci-failed")return{ok:!1,prNumber:m,reason:"ci-failed"};if(E==="pending")return{ok:!1,prNumber:m,reason:"ci-pending"}}let g=["gh","-R",r,"pr","merge",String(m),"--merge"];return u&&g.push("--subject",u),(await e(g)).code!==0?{ok:!1,prNumber:m,reason:"merge-failed"}:(p||(await e(["git","-C",n,"fetch",o,s,"--quiet"]),await e(["git","-C",n,"merge","--ff-only",`${o}/${s}`])),{ok:!0,prNumber:m})}async function bge(e,t){let{repo:r,branch:n,target:o,n:i,title:s}=t,a=t.mergeTitle??`merge: #${i} ${s}`,c=await Kst(e,r,n,o);if(c===void 0){if((await e(["gh","-R",r,"pr","create","--base",o,"--head",n,"--title",a,"--body",`${xar}${i}. Per-attempt history lives in the issue Envelopes, the JSONL logs, and the \`afk-attempts/*\` snapshot branches.
522
522
 
523
523
  Closes #${i}`])).code!==0)return;c=await Kst(e,r,n,o)}return c}async function rat(e,t){let{repo:r,branch:n,target:o,n:i,title:s,reviewLabel:a}=t,c=await bge(e,{repo:r,branch:n,target:o,n:i,title:s});return c===void 0?{ok:!1}:(await e(["gh","-R",r,"pr","edit",String(c),"--add-label",a])).code!==0?{ok:!1,prNumber:c}:{ok:!0,prNumber:c}}async function nat(e,t){let r=await bge(e,t);return r===void 0?{ok:!1}:{ok:!0,prNumber:r}}function Ear(e,t,r){let{branch:n,n:o,title:i,target:s}=e,a=r.split(`
@@ -802,7 +802,7 @@ requeued to ready-for-agent${e.activeBlocker?` (cleared active blocker: ${e.acti
802
802
  `);let n;try{let i=await Kt("git",["branch","--show-current"],{cwd:t});n=i.code===0&&i.stdout.trim()||void 0}catch{}let o=Nmr(e)??(n?P4(n):void 0);return!o||!n?(process.stderr.write(`[afk] /ship alias: could not infer issue or branch.
803
803
  Run manually: red-skills-dev requeue #ISSUE --adopt-branch BRANCH --guidance 'reason'
804
804
  `),1):(process.stderr.write(`[afk] /ship alias: routing to requeue #${o} --adopt-branch ${n}
805
- `),F4([String(o),"--adopt-branch",n,"--guidance","Adopted via deprecated /ship alias (ADR 0081). Update guidance if needed."],t,r))}import{existsSync as fhr,statSync as phr}from"node:fs";import{join as Zlt,basename as mhr}from"node:path";function W4(e){let t={app:e,version:Mmr(aR("__RED_BUILD_VERSION__",()=>"2.4.2")??"0.0.0-dev"),gitSha:aR("__RED_BUILD_GIT_SHA__",()=>"9e5142051cfdca3d56adb889da63738b714719b6")??"unknown",buildTime:aR("__RED_BUILD_TIME__",()=>"2026-07-07T02:25:19-03:00")??"unknown",bundleAsset:aR("__RED_BUNDLE_ASSET__",()=>"dev.bundle.min.mjs")??"unknown"},r=aR("__REDDB_SDK_VERSION__",()=>""),n=aR("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function Mmr(e){return e.startsWith("v")?e.slice(1):e}function Ult(e){return`${e.app} ${e.version} ${e.gitSha}`}function aR(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}function j4(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.floor(e/1e3)}k`:String(e)}function $lt(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 Hlt(e){let t=e.toLowerCase();for(let r of["opus","sonnet","haiku","fable"])if(t.includes(r))return r;return e}function Fmr(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 q4(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 Pmr(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 Lmr(e){return!e||!e.model?null:e.effort?`${e.model}\xB7${e.effort}`:e.model}function Umr(e){if(!e)return null;let t=e.contextTokens;if(t===void 0||t===0)return null;let r=j4(t);return e.contextPercent===void 0?r:`${r} ${Math.round(e.contextPercent)}%`}function $mr(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?` (${q4(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=",j4(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${Fmr(c)}`),t.push({label:"#",value:String(i),suffix:u})}),t}function Hmr(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 Wmr(e){if(!e)return null;let t=[],r=e.cacheAgeS!==void 0?` (${q4(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(`prs=${e.openPrs}${r}`),e.openIssues&&e.openIssues>0){let o=r&&(!e.openPrs||e.openPrs===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 jmr(e){let t=$mr(e);return t.length===0?null:t.map(r=>`${r.label}${r.value}${r.suffix}`).join(" ")}function Wlt(e){let t=[Pmr(e.project)],r=Lmr(e.claude);r!==null&&t.push(r);let n=Umr(e.claude);n!==null&&t.push(n);let o=Hmr(e.claude);o!==null&&t.push(o);let i=Wmr(e.repo);i!==null&&t.push(i);let s=jmr(e.afk);return s!==null&&t.push(s),t.join(" \xB7 ")}var qmr="\x1B[48;2;114;47;55m",Gmr="\x1B[48;2;88;36;42m",jlt="\x1B[49m",yC="\x1B[38;2;255;255;255m",qlt="\x1B[38;2;255;214;214m",Glt="\x1B[39m",z4="\x1B[38;2;224;138;148m",G4="\x1B[38;2;201;150;158m",zmr="\x1B[38;2;240;200;120m",zlt="\x1B[1m",Vlt="\x1B[22m",Ylt="\x1B[0m",Vmr=28,Ymr=" ",yAe=["workerId","run","org","iss","stage","elapsed","loc","tks","tls","rsn","txt"],Jmr=e=>e.replace(/\x1b\[[0-9;]*m/g,"");function Jlt(e){return Jmr(e).length}function Kmr(e,t){return e+" ".repeat(Math.max(0,t-Jlt(e)))}var cR=(e,t)=>`${qlt}${e}=${Glt}${t}${z4}`;function Zmr(e,t){let r=[];return e&&e>0&&r.push(`+${e}`),t&&t>0&&r.push(`-${t}`),r.length?r.join(" "):null}function Xmr(e){let t="";if(e.branch){let n=e.branch.length>Vmr?`${e.branch.slice(0,27)}\u2026`:e.branch;t=` ${G4}(${n})${yC}`}else e.detachedSha&&(t=` ${G4}(detached ${e.detachedSha})${yC}`);let r=e.version?` ${G4}v${e.version}${yC}`:"";return`${zmr}\xBB${yC} ${zlt}${e.basename}${Vlt}${t}${r}`}function ehr(e){return!e||!e.model?null:e.effort?`${e.model}${G4}\xB7${yC}${e.effort}`:e.model}function thr(e){if(!e||!e.contextTokens)return null;let t=j4(e.contextTokens),r=e.contextPercent===void 0?t:`${t} ${Math.round(e.contextPercent)}%`;return cR("ctx",r)}function rhr(e){if(!e)return[];let t=[];return e.usage5h!==void 0&&t.push(cR("5h",`${Math.round(e.usage5h)}%`)),e.usage7d!==void 0&&t.push(cR("7d",`${Math.round(e.usage7d)}%`)),t}function nhr(e){if(!e)return[];let t=[],r=e.cacheAgeS!==void 0?` (${q4(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(cR("prs",String(e.openPrs))+r),e.openIssues&&e.openIssues>0){let n=r&&(!e.openPrs||e.openPrs===0)?r:"";t.push(cR("iss",String(e.openIssues))+n)}return t}function ohr(e){if(!e)return[];let t=Zmr(e.localAdded,e.localRemoved);return t?[cR("loc",t)]:[]}function ihr(e,t,r){let n=`${Gmr}${yC} ${Xmr(e)} `,o=ehr(t);o!==null&&(n+=`${qmr}${yC} ${o} `),n+=`${jlt}${z4}`;let i=[thr(t),...rhr(t),...nhr(r),...ohr(r)].filter(s=>s!==null);return i.length&&(n+=` ${i.join(" ")}`),`${n}${Ylt}`}function shr(e,t){let r=Xut(e,t),n=[r.runner,r.model?Hlt(r.model):void 0,r.effort].filter(o=>!!o).join(" ");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:`loc=${Q4(r.added,r.removed)}`,tks:`tks=${$lt(r.tokens)}`,tls:`tls=${String(r.tools)}`,rsn:`rsn=${String(r.reasoning)}`,txt:`txt=${String(r.text)}`}}function ahr(e){let t=Object.fromEntries(yAe.map(r=>[r,0]));for(let r of e)for(let n of yAe)t[n]=Math.max(t[n],Jlt(r[n]));return t}function chr(e,t){if(e==="workerId")return`${zlt}${t}${Vlt}`;let r=t.indexOf("=");return r>0?`${qlt}${t.slice(0,r+1)}${Glt}${t.slice(r+1)}${z4}`:t}function uhr(e,t){let r=yAe.map(n=>chr(n,Kmr(e[n],t[n])));return`${jlt}${z4}${r.join(Ymr)}${Ylt}`}function lhr(e,t){let r=e.map(o=>shr(o,t)),n=ahr(r);return r.map(o=>uhr(o,n))}function dhr(e,t={}){let r=[ihr(e.project,e.claude,e.repo)],n=t.now??0;return r.push(...lhr(t.workers??[],n)),r.join(`
805
+ `),F4([String(o),"--adopt-branch",n,"--guidance","Adopted via deprecated /ship alias (ADR 0081). Update guidance if needed."],t,r))}import{existsSync as fhr,statSync as phr}from"node:fs";import{join as Zlt,basename as mhr}from"node:path";function W4(e){let t={app:e,version:Mmr(aR("__RED_BUILD_VERSION__",()=>"2.6.0")??"0.0.0-dev"),gitSha:aR("__RED_BUILD_GIT_SHA__",()=>"df6f09dd14ebb91dd1836ebbcac706b11e5f2509")??"unknown",buildTime:aR("__RED_BUILD_TIME__",()=>"2026-07-07T08:05:30-03:00")??"unknown",bundleAsset:aR("__RED_BUNDLE_ASSET__",()=>"dev.bundle.min.mjs")??"unknown"},r=aR("__REDDB_SDK_VERSION__",()=>""),n=aR("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function Mmr(e){return e.startsWith("v")?e.slice(1):e}function Ult(e){return`${e.app} ${e.version} ${e.gitSha}`}function aR(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}function j4(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.floor(e/1e3)}k`:String(e)}function $lt(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 Hlt(e){let t=e.toLowerCase();for(let r of["opus","sonnet","haiku","fable"])if(t.includes(r))return r;return e}function Fmr(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 q4(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 Pmr(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 Lmr(e){return!e||!e.model?null:e.effort?`${e.model}\xB7${e.effort}`:e.model}function Umr(e){if(!e)return null;let t=e.contextTokens;if(t===void 0||t===0)return null;let r=j4(t);return e.contextPercent===void 0?r:`${r} ${Math.round(e.contextPercent)}%`}function $mr(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?` (${q4(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=",j4(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${Fmr(c)}`),t.push({label:"#",value:String(i),suffix:u})}),t}function Hmr(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 Wmr(e){if(!e)return null;let t=[],r=e.cacheAgeS!==void 0?` (${q4(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(`prs=${e.openPrs}${r}`),e.openIssues&&e.openIssues>0){let o=r&&(!e.openPrs||e.openPrs===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 jmr(e){let t=$mr(e);return t.length===0?null:t.map(r=>`${r.label}${r.value}${r.suffix}`).join(" ")}function Wlt(e){let t=[Pmr(e.project)],r=Lmr(e.claude);r!==null&&t.push(r);let n=Umr(e.claude);n!==null&&t.push(n);let o=Hmr(e.claude);o!==null&&t.push(o);let i=Wmr(e.repo);i!==null&&t.push(i);let s=jmr(e.afk);return s!==null&&t.push(s),t.join(" \xB7 ")}var qmr="\x1B[48;2;114;47;55m",Gmr="\x1B[48;2;88;36;42m",jlt="\x1B[49m",yC="\x1B[38;2;255;255;255m",qlt="\x1B[38;2;255;214;214m",Glt="\x1B[39m",z4="\x1B[38;2;224;138;148m",G4="\x1B[38;2;201;150;158m",zmr="\x1B[38;2;240;200;120m",zlt="\x1B[1m",Vlt="\x1B[22m",Ylt="\x1B[0m",Vmr=28,Ymr=" ",yAe=["workerId","run","org","iss","stage","elapsed","loc","tks","tls","rsn","txt"],Jmr=e=>e.replace(/\x1b\[[0-9;]*m/g,"");function Jlt(e){return Jmr(e).length}function Kmr(e,t){return e+" ".repeat(Math.max(0,t-Jlt(e)))}var cR=(e,t)=>`${qlt}${e}=${Glt}${t}${z4}`;function Zmr(e,t){let r=[];return e&&e>0&&r.push(`+${e}`),t&&t>0&&r.push(`-${t}`),r.length?r.join(" "):null}function Xmr(e){let t="";if(e.branch){let n=e.branch.length>Vmr?`${e.branch.slice(0,27)}\u2026`:e.branch;t=` ${G4}(${n})${yC}`}else e.detachedSha&&(t=` ${G4}(detached ${e.detachedSha})${yC}`);let r=e.version?` ${G4}v${e.version}${yC}`:"";return`${zmr}\xBB${yC} ${zlt}${e.basename}${Vlt}${t}${r}`}function ehr(e){return!e||!e.model?null:e.effort?`${e.model}${G4}\xB7${yC}${e.effort}`:e.model}function thr(e){if(!e||!e.contextTokens)return null;let t=j4(e.contextTokens),r=e.contextPercent===void 0?t:`${t} ${Math.round(e.contextPercent)}%`;return cR("ctx",r)}function rhr(e){if(!e)return[];let t=[];return e.usage5h!==void 0&&t.push(cR("5h",`${Math.round(e.usage5h)}%`)),e.usage7d!==void 0&&t.push(cR("7d",`${Math.round(e.usage7d)}%`)),t}function nhr(e){if(!e)return[];let t=[],r=e.cacheAgeS!==void 0?` (${q4(e.cacheAgeS)})`:"";if(e.openPrs&&e.openPrs>0&&t.push(cR("prs",String(e.openPrs))+r),e.openIssues&&e.openIssues>0){let n=r&&(!e.openPrs||e.openPrs===0)?r:"";t.push(cR("iss",String(e.openIssues))+n)}return t}function ohr(e){if(!e)return[];let t=Zmr(e.localAdded,e.localRemoved);return t?[cR("loc",t)]:[]}function ihr(e,t,r){let n=`${Gmr}${yC} ${Xmr(e)} `,o=ehr(t);o!==null&&(n+=`${qmr}${yC} ${o} `),n+=`${jlt}${z4}`;let i=[thr(t),...rhr(t),...nhr(r),...ohr(r)].filter(s=>s!==null);return i.length&&(n+=` ${i.join(" ")}`),`${n}${Ylt}`}function shr(e,t){let r=Xut(e,t),n=[r.runner,r.model?Hlt(r.model):void 0,r.effort].filter(o=>!!o).join(" ");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:`loc=${Q4(r.added,r.removed)}`,tks:`tks=${$lt(r.tokens)}`,tls:`tls=${String(r.tools)}`,rsn:`rsn=${String(r.reasoning)}`,txt:`txt=${String(r.text)}`}}function ahr(e){let t=Object.fromEntries(yAe.map(r=>[r,0]));for(let r of e)for(let n of yAe)t[n]=Math.max(t[n],Jlt(r[n]));return t}function chr(e,t){if(e==="workerId")return`${zlt}${t}${Vlt}`;let r=t.indexOf("=");return r>0?`${qlt}${t.slice(0,r+1)}${Glt}${t.slice(r+1)}${z4}`:t}function uhr(e,t){let r=yAe.map(n=>chr(n,Kmr(e[n],t[n])));return`${jlt}${z4}${r.join(Ymr)}${Ylt}`}function lhr(e,t){let r=e.map(o=>shr(o,t)),n=ahr(r);return r.map(o=>uhr(o,n))}function dhr(e,t={}){let r=[ihr(e.project,e.claude,e.repo)],n=t.now??0;return r.push(...lhr(t.workers??[],n)),r.join(`
806
806
  `)}function Klt(e,t,r={}){return t?dhr(e,r):Wlt(e)}Qo();function hhr(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 ghr(e){if(!e.trim())return{};try{let t=JSON.parse(e);return typeof t=="object"&&t!==null?t:{}}catch{return{}}}function Ahr(e){try{return phr(e).isDirectory()}catch{return!1}}function yhr(e,t,r){if(e&&Ahr(e))return e;let n=t.workspace?.project_dir||t.workspace?.current_dir||t.cwd;return n||r}function xhr(e){let t=Zlt(e,".red","config.yaml");if(!fhr(t))return!0;let r=br(t,{warn:()=>{}});return!(tt(r,"statusline")==="false"||tt(r,"afk.statusline")==="false")}async function Ehr(e){let t={cwd:e},r=W4("dev").version,n={basename:mhr(e),version:r},o=await LN(t);if(o)return{...n,branch:o};let i=await Xh(t);return i?{...n,detachedSha:i}:n}function bhr(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 Xlt(e,t=process.cwd(),r=process.stdout,n=process.stdin){if(e.includes("--legend"))return r.write(`${O4()}
807
807
  `),0;let o=e[0],i=await hhr(n),s=ghr(i),a=yhr(o,s,t);if(!xhr(a))return 0;let c=await Ehr(a),u=bhr(s),l={root:a,repo:Wv(a),remote:"origin"},d=br(Zlt(a,".red","config.yaml"),{warn:()=>{}}),f=jV(process.env,I=>tt(d,I)),[p,m,g]=await Promise.all([lst(l,f),cst(l,f).then(I=>I??void 0),ust(l)]),A=!process.env.NO_COLOR,E=Number.parseInt(process.env.COLUMNS??"",10),y=Math.floor(Date.now()/1e3),b=Klt({project:c,claude:u,repo:p,afk:m},A,{columns:Number.isFinite(E)&&E>0?E:void 0,workers:g,now:y});return r.write(`${b}
808
808
  `),0}async function edt(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 ast(r,n||Wv(r),o||void 0),0}vC();import{spawn as hdt}from"node:child_process";import{existsSync as EAe,openSync as Adt,closeSync as _hr,writeFileSync as ydt,writeSync as Thr,rmSync as bAe,renameSync as Dhr}from"node:fs";import{join as xC}from"node:path";import{existsSync as Shr,readdirSync as EM,readFileSync as V4,statSync as odt}from"node:fs";import{join as os}from"node:path";Tp();function Chr(e,t){return os(e,`afk-supervisor-slot-${t}.log`)}function Ihr(e){let t;try{t=V4(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.4.2")??"0.0.0-dev"),gitSha:iL("__RED_BUILD_GIT_SHA__",()=>"9e5142051cfdca3d56adb889da63738b714719b6")??"unknown",buildTime:iL("__RED_BUILD_TIME__",()=>"2026-07-07T02:25:19-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
6518
+ ${Pct(s.usageCommand)}`),2}}function Ict(r){let s={app:r,version:Pgr(iL("__RED_BUILD_VERSION__",()=>"2.6.0")??"0.0.0-dev"),gitSha:iL("__RED_BUILD_GIT_SHA__",()=>"df6f09dd14ebb91dd1836ebbcac706b11e5f2509")??"unknown",buildTime:iL("__RED_BUILD_TIME__",()=>"2026-07-07T08:05:30-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.4.2",
3
+ "version": "2.6.0",
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",