@reddb-io/red-skills 3.3.10 → 3.3.11

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.
@@ -658,7 +658,7 @@ ${n}`,"</details>"].join(`
658
658
  `)){let f=d.trim();if(!f||c.has(f))continue;let p=XD(f);p!=="glossary"&&p!=="adr"||c.set(f,{path:f,state:"ahead",group:p,ignored:!1,trackedPrecedent:i.get(p)??!1})}let u=eP({base:t,files:[...c.values()]});return u.files.length>0?{count:u.files.length}:void 0}var KZ=[".red/CONTEXT.md",".red/CONTEXT-MAP.md",".red/contexts",".red/adr"];function D_t(e){return e==="adr"?".red/adr":".red"}function P_t(e,t){let r=new Map;for(let n of e.split(`
659
659
  `)){let o=n.replace(/\s+$/,"");if(!o)continue;let i=o.slice(0,2),s=o.slice(3),a=s.indexOf(" -> ");a!==-1&&(s=s.slice(a+4)),s=Tvt(s);let c=XD(s);c!=="glossary"&&c!=="adr"||r.set(s,{path:s,state:i==="??"||i==="!!"?"untracked":"modified",group:c,ignored:i==="!!",trackedPrecedent:t.get(c)??!1})}return[...r.values()]}async function T_t(e,t,r){if(r!=="glossary"&&r!=="adr")return!1;let n=await Le("git",["ls-tree","-r","--name-only",t,"--",D_t(r)],{cwd:e.cwd});return n.code===0&&n.stdout.trim()!==""}async function B_t(e,t,r,n){if(r!=="glossary"&&r!=="adr")return!1;let o=await n("git",["ls-tree","-r","--name-only",t,"--",D_t(r)],{cwd:e.cwd});return o.code===0&&o.stdout.trim()!==""}async function UU(e,t){let r={cwd:e.root},o=(await Le("git",["fetch",e.remote,t],{cwd:e.root})).code===0,i=`${e.remote}/${t}`,s=new Map([["glossary",await T_t(r,i,"glossary")],["adr",await T_t(r,i,"adr")]]),a=await Le("git",["status","--porcelain","--untracked-files=all","--ignored=matching","--",...KZ],{cwd:e.root}),c=a.code===0?P_t(a.stdout,s):[],l=new Map(c.map(u=>[u.path,u]));if(o){let u=await Le("git",["diff","--name-only",`${i}...HEAD`,"--",...KZ],{cwd:e.root});if(u.code===0)for(let d of u.stdout.split(`
660
660
  `)){let f=d.trim();if(!f||l.has(f))continue;let p=XD(f);p!=="glossary"&&p!=="adr"||l.set(f,{path:f,state:"ahead",group:p,ignored:!1,trackedPrecedent:s.get(p)??!1})}}return{base:t,files:[...l.values()],originReachable:o}}async function uTe(e,t){let r=ir(e.root),n=`${Date.now().toString(36)}-${process.pid}`,o=cTe(r.tmpDir,"docs-sweep",n),i=`docs/afk-docs-sweep-${n}`,s="docs: land AFK boot docs sweep",a="Automated Docs Sweep landing for stranded .red documentation.";if(await kf(__t(o)),(await Le("git",["worktree","add","-b",i,o,`${e.remote}/${t.base}`],{cwd:e.root})).code!==0)return{ok:!1,reason:"worktree-add-failed"};try{for(let y of t.files){let x=cTe(e.root,y.path),k=cTe(o,y.path);h2r(x)?(g2r(__t(k),{recursive:!0}),m2r(x,k)):A2r(k,{force:!0})}if((await Le("git",["add","--force","--",...t.files.map(y=>y.path)],{cwd:o})).code!==0)return{ok:!1,reason:"add-failed"};if((await Le("git",["commit","-m",s],{cwd:o})).code!==0)return{ok:!1,reason:"commit-failed"};if((await Le("git",["push",e.remote,`HEAD:refs/heads/${i}`],{cwd:o})).code!==0)return{ok:!1,reason:"push-failed"};let f=await Le("gh",["-R",e.repo,"pr","create","--base",t.base,"--head",i,"--title",s,"--body",a],{cwd:e.root});if(f.code!==0)return{ok:!1,reason:"pr-create-failed"};let p=/\/pull\/([0-9]+)/.exec(f.stdout)?.[1]??f.stdout.trim().match(/^[0-9]+$/)?.[0],h=p?{code:0,stdout:p,stderr:""}:await Le("gh",["-R",e.repo,"pr","view",i,"--json","number","-q",".number"],{cwd:e.root}),m=h.stdout.trim();return h.code!==0||!m?{ok:!1,reason:"pr-resolve-failed"}:(await Le("gh",["-R",e.repo,"pr","merge",m,"--merge","--delete-branch"],{cwd:e.root})).code!==0?{ok:!1,reason:"merge-failed"}:(await Le("git",["fetch",e.remote,t.base],{cwd:e.root}),{ok:!0})}finally{await Le("git",["worktree","remove","--force",o],{cwd:e.root})}}ZD();Wr();var y2r=/^[ \t]*(?:[-*][ \t]+)?branch:[ \t]+(\S+)[ \t]*(?:#.*)?$/,b2r=/Spec[ \t]*#[ \t]*(\d+)/,Em="main";function dTe(e,t,r){let n=e;return n.startsWith(t)&&(n=n.slice(t.length)),n.endsWith(r)&&(n=n.slice(0,n.length-r.length)),n}function O_t(e){for(let t of e.split(`
661
- `)){let r=y2r.exec(t);if(!r)continue;let n=r[1];if(n=dTe(n,"`","`"),n=dTe(n,'"','"'),n=dTe(n,"'","'"),n.length!==0)return n}}function x2r(e){let t=b2r.exec(e);return t?Number(t[1]):void 0}async function N_t(e,t){let r=O_t(e.issueBody);if(r)return{branch:r,source:"pin"};let n=x2r(e.issueBody);if(n!==void 0){let i=await t.fetchIssueBody(n);if(i!==void 0){let s=O_t(i);if(s)return{branch:s,source:"pin"}}}let o=t.defaultBranch?.trim();return{branch:o!==void 0&&o.length>0?o:Em,source:"trunk"}}Po();async function fTe(e){let t={cwd:e.root},r={cwd:e.root,repo:e.repo},n=await Cf(t,"afk/"),o=await kZ(t,"afk/*"),i=await wZ(t),s=o.filter(f=>!i.has(f)).map(f=>({branch:f})),a=Te(await or(e.root),"dev.trunk")||Em,c=await SZ(t,"afk/*",`${e.remote}/${a}`),l=new Set;for(let f of[...n,...s]){let p=Uk(f.branch);p!==null&&l.add(p)}let u=await Wl(r),d=new Map;for(let f of l){let p=u.get(f);p?d.set(f,{state:p.state,closedAt:p.closedAt}):d.set(f,await PU(r,f))}return{remoteLiveRefs:n,localLiveRefs:s,landedLocalBranches:c,trunk:a,lookup:f=>d.get(f),deleteRemote:f=>yZ(t,f),deleteLocal:async f=>{await hm(t,f)}}}import{existsSync as wTe,readFileSync as uTt}from"node:fs";import{join as i5}from"node:path";function Tf(e){let t={app:e,version:E2r(RP("__RED_BUILD_VERSION__",()=>"3.3.10")??"0.0.0-dev"),gitSha:RP("__RED_BUILD_GIT_SHA__",()=>"efacf48c6512520601e438c4e755e96b51509e23")??"unknown",buildTime:RP("__RED_BUILD_TIME__",()=>"2026-08-02T23:09:28-03:00")??"unknown",bundleAsset:RP("__RED_BUNDLE_ASSET__",()=>"dev.bundle.min.mjs")??"unknown"},r=RP("__REDDB_SDK_VERSION__",()=>""),n=RP("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function E2r(e){return e.startsWith("v")?e.slice(1):e}function M_t(e){return`${e.app} ${e.version} ${e.gitSha}`}function RP(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}ln();ab();Wr();fm();function ZZ(e){return e!==void 0&&e.trim().length>0}async function pTe(e,t){let r=await t.readLockedBranch();if(ZZ(r))return{branch:r.trim(),source:"lock"};if(ZZ(t.configLockedBranch))return{branch:t.configLockedBranch.trim(),source:"pin"};let n=await N_t(e,{fetchIssueBody:t.fetchIssueBody,defaultBranch:t.configTrunk});return ZZ(n.branch)?n:{branch:ZZ(t.configTrunk)?t.configTrunk.trim():Em,source:"trunk"}}async function kb(e,t){return(await pTe(e,t)).branch}Ht();Yc();um();ac();W8();zve();zv();cb();bt();var k2r=[".red/config.yaml",".red/.gitignore"],S2r=[".red/hooks/"],F_t="commit the /red-setup-generated files (git add .red/config.yaml .red/.gitignore .red/hooks && git commit) or ignore them",w2r=6,L_t="\u2192 /red-setup closing report (#3106)";function C2r(e){return k2r.includes(e)?!0:S2r.some(t=>e.startsWith(t))}function I2r(e){return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1).replace(/\\([\\"])/g,"$1").replace(/\\n/g,`
661
+ `)){let r=y2r.exec(t);if(!r)continue;let n=r[1];if(n=dTe(n,"`","`"),n=dTe(n,'"','"'),n=dTe(n,"'","'"),n.length!==0)return n}}function x2r(e){let t=b2r.exec(e);return t?Number(t[1]):void 0}async function N_t(e,t){let r=O_t(e.issueBody);if(r)return{branch:r,source:"pin"};let n=x2r(e.issueBody);if(n!==void 0){let i=await t.fetchIssueBody(n);if(i!==void 0){let s=O_t(i);if(s)return{branch:s,source:"pin"}}}let o=t.defaultBranch?.trim();return{branch:o!==void 0&&o.length>0?o:Em,source:"trunk"}}Po();async function fTe(e){let t={cwd:e.root},r={cwd:e.root,repo:e.repo},n=await Cf(t,"afk/"),o=await kZ(t,"afk/*"),i=await wZ(t),s=o.filter(f=>!i.has(f)).map(f=>({branch:f})),a=Te(await or(e.root),"dev.trunk")||Em,c=await SZ(t,"afk/*",`${e.remote}/${a}`),l=new Set;for(let f of[...n,...s]){let p=Uk(f.branch);p!==null&&l.add(p)}let u=await Wl(r),d=new Map;for(let f of l){let p=u.get(f);p?d.set(f,{state:p.state,closedAt:p.closedAt}):d.set(f,await PU(r,f))}return{remoteLiveRefs:n,localLiveRefs:s,landedLocalBranches:c,trunk:a,lookup:f=>d.get(f),deleteRemote:f=>yZ(t,f),deleteLocal:async f=>{await hm(t,f)}}}import{existsSync as wTe,readFileSync as uTt}from"node:fs";import{join as i5}from"node:path";function Tf(e){let t={app:e,version:E2r(RP("__RED_BUILD_VERSION__",()=>"3.3.11")??"0.0.0-dev"),gitSha:RP("__RED_BUILD_GIT_SHA__",()=>"0ac7e9947aa678cf8956b86c0428874cb3a09c31")??"unknown",buildTime:RP("__RED_BUILD_TIME__",()=>"2026-08-02T23:50:43-03:00")??"unknown",bundleAsset:RP("__RED_BUNDLE_ASSET__",()=>"dev.bundle.min.mjs")??"unknown"},r=RP("__REDDB_SDK_VERSION__",()=>""),n=RP("__REDDB_BINARY_TAG__",()=>"");return r&&(t.reddbSdkVersion=r),n&&(t.reddbBinaryTag=n),t}function E2r(e){return e.startsWith("v")?e.slice(1):e}function M_t(e){return`${e.app} ${e.version} ${e.gitSha}`}function RP(e,t){try{let r=t();return typeof r=="string"&&r.length>0?r:void 0}catch{return process.env[e.replace(/^__|__$/g,"")]}}ln();ab();Wr();fm();function ZZ(e){return e!==void 0&&e.trim().length>0}async function pTe(e,t){let r=await t.readLockedBranch();if(ZZ(r))return{branch:r.trim(),source:"lock"};if(ZZ(t.configLockedBranch))return{branch:t.configLockedBranch.trim(),source:"pin"};let n=await N_t(e,{fetchIssueBody:t.fetchIssueBody,defaultBranch:t.configTrunk});return ZZ(n.branch)?n:{branch:ZZ(t.configTrunk)?t.configTrunk.trim():Em,source:"trunk"}}async function kb(e,t){return(await pTe(e,t)).branch}Ht();Yc();um();ac();W8();zve();zv();cb();bt();var k2r=[".red/config.yaml",".red/.gitignore"],S2r=[".red/hooks/"],F_t="commit the /red-setup-generated files (git add .red/config.yaml .red/.gitignore .red/hooks && git commit) or ignore them",w2r=6,L_t="\u2192 /red-setup closing report (#3106)";function C2r(e){return k2r.includes(e)?!0:S2r.some(t=>e.startsWith(t))}function I2r(e){return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1).replace(/\\([\\"])/g,"$1").replace(/\\n/g,`
662
662
  `).replace(/\\t/g," "):e}function HU(e){let t=[];for(let r of e.split(`
663
663
  `)){if(r.trim()==="")continue;let n=r.slice(0,2),o=r.slice(3),i=o.indexOf(" -> ");i!==-1&&(o=o.slice(i+4)),o=I2r(o.trim()),o!==""&&t.push({path:o,status:n,setupOwned:C2r(o)})}return{dirty:t,setupOwned:t.filter(r=>r.setupOwned).map(r=>r.path),foreign:t.filter(r=>!r.setupOwned).map(r=>r.path)}}function XZ(e,t=w2r){if(e.length===0)return"none";let r=e.slice(0,t),n=e.length-r.length;return n>0?`${r.join(", ")}, +${n} more`:r.join(", ")}function Q_t(e){return e.dirty.length>0&&e.foreign.length===0}function $_t(e){let t=`condition failed: clean-tree (${e.dirty.length} dirty path(s): ${XZ(e.dirty.map(r=>r.path))})`;return e.setupOwned.length===0?t:`${t}; ${e.setupOwned.length} written by /red-setup and never committed (${XZ(e.setupOwned)}) \u2014 ${F_t}`}function U_t(e){return`tolerated ${e.setupOwned.length} /red-setup-owned dirty path(s) (${XZ(e.setupOwned)})`}function mTe(e){return e.setupOwned.length===0?{row:{check:"setup-owned-dirt",verdict:"ok",evidence:"no uncommitted /red-setup output in the working tree",fixHome:L_t},findings:[]}:{row:{check:"setup-owned-dirt",verdict:"warn",evidence:`${e.setupOwned.length} uncommitted /red-setup file(s): ${XZ(e.setupOwned)}`,fixHome:L_t},findings:[{kind:"uncommitted-setup-files",verdict:"warn",paths:e.setupOwned,reason:"/red-setup wrote these files and never commits them, so the tree it leaves is dirty by contract",remediation:F_t}]}}var R2r="refs/heads/red-trunk";async function Y_t(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"}}var K_t={maxAhead:40,maxBaseAgeHours:12};function v2r(e,t=K_t){let{ahead:r,baseAgeHours:n}=e;return!Number.isFinite(r)||n===void 0||!Number.isFinite(n)?{park:!1}:r<=t.maxAhead||n<=t.maxBaseAgeHours?{park:!1}:{park:!0,message:`the branch is ${r} commits ahead of a base that is ${Math.round(n)}h stale (limits: ${t.maxAhead} commits / ${t.maxBaseAgeHours}h); rebasing that micro-history onto current trunk would replay the same conflicts commit by commit. Rebuild the slice on a fresh base, or squash the branch to its net diff and re-run the landing.`}}var H_t=10;function gTe(e){let t=new Set;for(let r of e.split(`
664
664
  `)){let n=r.trim();n!==""&&t.add(n)}return[...t]}function ATe(e,t){if(t.length===0)return`the worker branch conflicts with ${e} (the conflicting paths could not be read)`;let r=t.slice(0,H_t).join(", "),n=t.length-H_t,o=n>0?`, and ${n} more`:"";return`the worker branch conflicts with ${e} in ${t.length} file(s): ${r}${o}`}async function yTe(e,t){let{repo:r,remote:n,base:o,branch:i}=t,s=t.maxPushRetries??2,a=Math.max(0,t.maxAgentResolveAttempts??2),c=`${n}/${o}`,l=t.squashAheadThreshold??1,u=async()=>{let g=await e(["git","-C",r,"merge-base",c,"HEAD"]),y=g.stdout.trim();if(g.code!==0||y.length===0)return;let x=await e(["git","-C",r,"rev-list","--count",`${y}..HEAD`]),k=Number.parseInt(x.stdout.trim(),10);if(x.code!==0||!Number.isFinite(k)||k<=l)return;let S=await e(["git","-C",r,"log","--reverse","--format=%s",`${y}..HEAD`]),w=S.code===0?S.stdout.trim().split(`
@@ -741,7 +741,7 @@ ${e.body}`),i=WJr($Jr(n),e,o);if(!i)return"";let s=lS.basename(lS.dirname(i.path
741
741
  `)}function yPt(e,t){return uS(e,`${t}.json`)}function e4r(e){let t=e.RED_AFK_RUNNER_TRANSIENT_COOLDOWN_S;if(t!==void 0){let r=Number(t);if(Number.isInteger(r)&&r>0)return r}return XJr}async function bPt(e,t,r,n){let o=e4r(n);await kf(e),await mPt(yPt(e,t),hPt({runner:t,opened_at:r,expires_at:r+o,reason:"runner-transient"}),"utf8")}async function xPt(e,t,r){try{let n=await KJr(yPt(e,t),"utf8"),o=gPt(n);return typeof o.expires_at=="number"&&o.expires_at>r}catch{return!1}}function LBe(e){let t=uS(e,"worktree");return YJr(uS(t,".git"))?t:void 0}function FBe(e){try{let t=pPt(uS(e,".worktree-path"),"utf8").trim();return t===uS(e,"worktree")?t:void 0}catch{return}}function EPt(e,t){if(!e)return 1;try{return ERe(lb(pPt(e,"utf8")),t)}catch{return 1}}var G5=6e4,SPt=15e3;function MP(e){if(e===void 0)return;let t=parseInt(e,10);return Number.isFinite(t)&&t>=0?t:void 0}function QBe({ctx:e,model:t,sandbox:r,feedback:n,current:o,fallbackRunner:i,runner:s,exec:a,maxIterations:c,laneIdle:l,inlineVerifyCommand:u,goVerifyRetries:d,workerId:f="unknown"}){let p={cwd:e.root,repo:e.repo,exec:a},h={cwd:e.root,exec:a,ghProbeTimeoutMs:G5},m=ir(e.root),g=k5({root:e.root}),y=g5({redRoot:Ps(e.root,".red"),workerId:f,attemptDir:()=>o.attemptDir,...g==null?{}:{publishHostLogLine:g}}),x=c??cU,k=0,S="",w=VTe(),R="",B={added:0,removed:0},T=0,P=0,O="",D=or(m.configPath,{warn:()=>{}}),Q="";try{Q=V5(m.configPath,"utf8")}catch{}let L=ABt({repoRoot:e.root,env:process.env}),v=iZ({repoRoot:e.root,configured:Te(D,"afk.sandbox_image"),envOverride:process.env.RED_AFK_SANDBOX_IMAGE}),F=Te(D,"afk.merge.wait_for_review")==="true"?{check:Te(D,"afk.merge.review_check")||"CodeRabbit",sleep:X=>new Promise(Re=>setTimeout(Re,X)),probeTimeoutMs:G5}:void 0,N=Te(D,"afk.landing.wait"),H=N==="ci"||N==="none"?N:"merge",$=Te(D,"afk.merge.ci_aware")==="true"||H!=="merge"?{sleep:X=>new Promise(Re=>setTimeout(Re,X)),intervalMs:1e4,maxPolls:Math.max(1,Math.ceil(GW(process.env)/10)),probeTimeoutMs:G5}:void 0,oe=LTt(D),fe=ETt(X=>Te(D,X)),pe=fe.enabled?async X=>{let Re=await Sg();return RTt({run:Re.run,agentFor:Re.agentFor,sandboxFor:cn=>Re.sandboxFor(cn),output:({tag:cn,schema:Ze,maxRetries:gr})=>bf.object({tag:cn,schema:Ze,maxRetries:gr}),cwd:e.root})({...X,runner:al(X.runner)})}:void 0,Je=Te(D,"afk.worktree_launches_pull_request")!=="false",Ke=Te(D,"afk.merge.native_queue")==="true",se=Ke||Te(D,"afk.merge.land_lock")==="false"?void 0:QTt(m.tmpDir,`pid-${process.pid}`),$e=vTt(D),Ct=BTt(D),Zr=Yv(D),xn=u&&u.trim()!==""?[...Zr,u.trim()]:Zr;return{gh:jDt(p),claimGh:GDt(p),reseedTrailGh:qDt(p),claimStale:PO(Math.floor(Date.now()/1e3),QW(process.env)),recoveredWorkerDeathCause:X=>XTt(m.tmpDir,X,Lk()),claimLock:ATt(m.tmpDir,f),fs:JDt(m),...zDt(h,e.remote),pnpm:n.pnpm,validationResourceBudget:zb(D),dirExists:I5,layout:n.layout,backpressure:n.backpressure,backpressureCommands:xn,outputShaping:Ct,...VDt(p),adversarialReview:fe,extractAdversarialReview:pe,goVerifyRetries:d,reseedGateBudget:(()=>{let X=Te(D,"dev.reseed.afk.gate_budget"),Re=X===void 0?NaN:Number(X);return Number.isInteger(Re)&&Re>=0?Re:void 0})(),postWorkerFormat:n.postWorkerFormat,postWorkerFormatCommands:XLe(D),runAgent:qBt({root:e.root,workerId:f,current:o,config:D,configText:Q,pluginRoots:L,castleBridge:y,sandbox:r,maxIterations:c,laneIdle:l,sandboxImage:v}),sandboxMode:r,sandboxAvailable:async X=>(await(a??Le)("sh",["-c",`command -v ${X}`],{cwd:e.root})).code===0,sandboxImage:v,sandboxImageAvailable:async(X,Re)=>(await(a??Le)(X,["image","inspect",Re],{cwd:e.root})).code===0,model:t,classifyIssue:n4r(D,s,e.root,a),resolveTier:(X,Re="think")=>Na(D,X,Re,process.env),fallbackRunner:i,waitForReview:F,ciAwait:$,landingWait:H,landingTailObserver:H==="merge"?void 0:async X=>{if(!a){let Re=GW(process.env),Zt=['if [ "$1" = "wait" ]; then',' rsp wait pr "$2" --timeout "$3" --reason "finish AFK landing for issue $5" || exit $?',"fi",'gh -R "$4" pr merge "$2" --merge --delete-branch || exit $?','gh -R "$4" issue close "$5" --reason completed >/dev/null 2>&1 || true','gh -R "$4" issue edit "$5" --remove-label running >/dev/null 2>&1 || true'].join(`
742
742
  `);return r4r("sh",["-c",Zt,"landing-tail",X.waitForCi?"wait":"ready",String(X.prNumber),`${Re}s`,e.repo,String(X.issue)],{cwd:e.root,env:process.env,detached:!0,stdio:"ignore"}).unref(),await new Promise(()=>{})}if(X.waitForCi){let Re=GW(process.env);if((await a("rsp",["wait","pr",String(X.prNumber),"--timeout",`${Re}s`,"--reason",`finish AFK landing for issue ${X.issue}`],{cwd:e.root})).code===0)return X.run(!0)}return X.run()},worktreeLaunchesPr:Je,landLock:se,nativeMergeQueue:Ke,mergeQueueWait:{sleep:X=>new Promise(Re=>setTimeout(Re,X)),intervalMs:SPt,maxPolls:Math.max(1,Math.ceil(eFe(process.env)/(SPt/1e3))),probeTimeoutMs:G5},reviewGate:oe,reviewGateLabel:uv,conflictResolver:async(X,Re)=>{let Zt=Na(D,s,"think",process.env),cn=s==="codex"?$v({prompt:X,worktree:Re,lastMessagePath:m.mergeResolveScratchPath,model:Zt.model,effort:Zt.effort}):Qv({prompt:X,worktree:Re});await N5({runner:s,phase:"merge-resolver",invocation:cn,cwd:Re,bridge:y,exec:a??Le})},resolveMechanicalConflict:yBe(h),resolveAgentConflict:SDt({config:D,runner:s,paths:m,bridge:y,exec:a??Le}),maxAgentConflictResolveAttempts:2,makeLandingWorktree:async X=>{let Re=MP(process.env.RED_AFK_SLOT)??0,Zt=X.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"base",cn=Ps(m.landingWorktreesDir,`${Zt}-${Re}`);await Ri(h,cn);let Ze=await wf(h,cn,X);return Ze.ok||gb(cn,X,Ze.stderr),Ze.ok?cn:null},removeLandingWorktree:X=>Ri(h,X),makeRebaseWorktree:async X=>{let Re=MP(process.env.RED_AFK_SLOT)??0,Zt=X.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"branch",cn=Ps(m.rebaseWorktreesDir,`${Zt}-${Re}`);await Ri(h,cn);let Ze=await wf(h,cn,X);return Ze.ok||gb(cn,X,Ze.stderr),Ze.ok?cn:null},removeRebaseWorktree:X=>Ri(h,X),hooks:sPt({config:D,root:e.root,repo:e.repo,runner:s,slot:MP(process.env.RED_AFK_SLOT)}),lookups:fPt({ghCtx:p,gitCtx:h,paths:m,config:D,exec:a}),envelope:aPt(p,h,o),nowEpoch:()=>Math.floor(Date.now()/1e3),nowIso:()=>new Date().toISOString(),appendIterLog:X=>{pP(Ps(o.attemptDir,"afk.log"),X)},recordAgentEvent:X=>{let Re=new Date().toISOString();if(X.type==="raw"){HD(Ps(o.attemptDir,"log.toonl"),"raw",{iteration:X.iteration,line:X.line},{ts:Re}).catch(()=>{});return}if(X.type==="sessionId"){HD(Ps(o.attemptDir,"log.toonl"),"session",`session ${X.sessionId}`,{ts:Re,fields:{extra:{kind:"sessionId",iteration:String(X.iteration),session_id:X.sessionId}}}).catch(()=>{});return}let Zt=o.attemptDir;if(Zt!==S&&(S=Zt,k=0),Zt!==R&&(R=Zt,w=VTe()),Zt!==O&&(O=Zt,T=0,P=0),(X.type==="text"||X.type==="toolCall"||X.type==="reasoning"||X.type==="usage")&&w.record(X),X.iteration!==k){let qn=(nr,hn,no)=>{pP(Ps(Zt,"afk.log"),nr),HD(Ps(Zt,"log.toonl"),"iteration",nr,{ts:Re,fields:{extra:{iteration:String(no),phase:hn}}}).catch(()=>{})};k>0&&qn(qTe(k,"ended",x),"ended",k),k=X.iteration,qn(qTe(k,"started",x),"started",k),sc(xo(Zt),{"current.iteration":String(k)}).catch(()=>{})}let cn=X.type==="text"?X.message:X.type==="reasoning"?`\u{1F9E0} reasoning${X.tokens?` (${X.tokens} tok)`:X.message?`: ${X.message.slice(0,80)}`:""}`:X.type==="usage"?`\u{1F4B0} usage (in:${X.inputTokens} out:${X.outputTokens}${X.reasoningTokens?` reason:${X.reasoningTokens}`:""})`:X.type==="result"?`result: ${X.result}`:`\u2192 ${X.name} ${X.formattedArgs}`;yCt(Ps(o.attemptDir,"agent.log.toonl"),cn,{ts:Re,fields:{extra:{iteration:String(X.iteration),kind:X.type}}}).catch(()=>{}),y.record("worker.heartbeat",{event:X.type,iteration:String(X.iteration)}).catch(()=>{}),HD(Ps(o.attemptDir,"log.toonl"),"agent",cn,{ts:Re,fields:{extra:{iteration:String(X.iteration),kind:X.type}}}).catch(()=>{});let Ze=MTe(X),gr=X.type==="toolCall"||X.type==="reasoning"||X.type==="usage"||X.type==="result",En=X.type==="usage"?{"current.input_tokens":w.peek().inputTokens,"current.output_tokens":w.peek().outputTokens,"current.cost_usd":w.peek().costUsd}:{};(Ze||gr)&&sc(xo(o.attemptDir),{...Ze?{"current.activity":Ze,"current.last_stream_line":cn.slice(0,200)}:{},"current.phase":"coding","current.last_event_at":Re,...En}).catch(()=>{})},emitHeartbeat:X=>{let Re=new Date().toISOString(),Zt=Math.max(0,Math.floor((X.nowMs-X.lastProgressMs)/1e3)),cn=new Date(X.lastProgressMs).toISOString(),Ze=X.head??"";(async()=>{let gr=FBe(o.attemptDir)??await _vt(h,o.attemptDir).catch(()=>{})??LBe(o.attemptDir)??Ps(o.attemptDir,"worktree"),En=X.base?`origin/${X.base}`:`origin/${Te(D,"dev.trunk")||"main"}`,qn=nBt(o.attemptDir,"/"),{added:nr,removed:hn}=await rBt({headSha:Ze,compute:()=>Rvt({cwd:gr},En).catch(()=>({added:0,removed:0})),computeUncommitted:()=>vvt({cwd:gr}).catch(()=>({added:0,removed:0})),readMemo:()=>{try{return OBe(V5(qn,"utf8"))}catch{return null}},writeMemo:Hr=>{try{kPt(qn,NBe(Hr),"utf8")}catch{}}});B={added:nr,removed:hn},nr>T&&(T=nr),hn>P&&(P=hn);let no=w.snapshotWindow(),Zu=tBt({secsSinceProgress:Zt,lastProgressAt:cn,head:Ze,added:nr,removed:hn,activity:no});await HD(Ps(o.attemptDir,"log.toonl"),"heartbeat",Zu.msg,{ts:Re,fields:{extra:Zu.extra}}).catch(()=>{}),await pP(Ps(o.attemptDir,"afk.log"),`[heartbeat] ${Zu.msg}`),await sc(xo(o.attemptDir),{...Zu.statePatch,"current.loc_peak_added":T,"current.loc_peak_removed":P,"current.worktree":gr,...X.base?{"current.base":X.base}:{}}).catch(()=>{}),await y.record("worker.heartbeat",{signal:"vitals-sampler",seconds_since_progress:Zt,head:Ze}).catch(()=>{})})()},heartbeatVitals:()=>{let X=w.peek();return{tools_called_count:X.toolsCalled,text_chunk_count:X.textChunks,reasoning_events:X.reasoningCount,reasoning_tokens:X.reasoningTokens,waiting_count:X.waiting,input_tokens:X.inputTokens,output_tokens:X.outputTokens,cost_usd:X.costUsd,loc_added:B.added,loc_removed:B.removed}},notesLoop:$e,writeNotes:(X,Re)=>{try{kPt(X,Re,"utf8")}catch{}},markPhase:X=>{(async()=>(await sc(xo(o.attemptDir),{"current.phase":X}).catch(()=>{}),await y.snapshot().catch(()=>{})))()},markState:X=>{(async()=>(await sc(xo(o.attemptDir),X).catch(()=>{}),await y.snapshot().catch(()=>{})))()},recordWorkerEvent:(X,Re)=>{y.record(X,Re).catch(()=>{})},historyPath:m.historyPath,historyClock:{ts:new Date().toISOString(),epoch:Math.floor(Date.now()/1e3)},recoveryEnv:process.env,healLedger:CO(zo(Ps(e.root,".red"))),recordOutcomeEvent:o4r(e.root,o,a),cascadeRebase:{async listAFKBranches(){return(await Cf(h,"afk/")).map(Re=>Re.branch)},isWorkerLive(X){try{let Re=YD(m.tmpDir,X),Zt=V5(Re,"utf8").trim();return/^[1-9][0-9]*$/.test(Zt)?(process.kill(Number(Zt),0),!0):!1}catch(Re){return Re.code==="EPERM"}},async rebaseAndPush(X,Re,Zt){let cn=Re.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40),Ze=MP(process.env.RED_AFK_SLOT)??0,gr=Ps(m.cascadeWorktreesDir,`${cn}-${Ze}`);try{await Ri(h,gr);let En=await wf(h,gr,Re);if(!En.ok)return{ok:!1,warn:`failed to create worktree for ${Re}: ${En.stderr||"no git detail"}`};let qn=a??(await Promise.resolve().then(()=>(jr(),oA))).execTool,nr=await qn("git",["rebase",Zt],{cwd:gr});if(nr.code!==0)return await qn("git",["rebase","--abort"],{cwd:gr}).catch(()=>{}),{ok:!1,warn:`rebase of ${Re} onto ${Zt} conflicted: ${nr.stderr.slice(0,200)}`};let hn=await qn("git",["push","origin",`HEAD:refs/heads/${Re}`,"--force-with-lease"],{cwd:gr});return hn.code!==0?{ok:!1,warn:`--force-with-lease push rejected for ${Re}: ${hn.stderr.slice(0,200)}`}:{ok:!0}}finally{await Ri(h,gr).catch(()=>{})}}}}}function n4r(e,t,r,n){return async o=>{let i=Na(e,t,"validate",process.env);return NTt(o,async({prompt:s})=>{let a=n??(await Promise.resolve().then(()=>(jr(),oA))).execTool,c={cwd:r,timeoutMs:45e3,maxBuffer:1024*1024},l=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 l.code===0?l.stdout.trim():void 0})}}function o4r(e,t,r){return async n=>{try{let o=ad(e),i=V5(o,"utf8");if(!WR(i,"brain"))return;let s={...process.env,BRAIN_REPO_ROOT:process.env.BRAIN_REPO_ROOT??e},a=i4r(e,s);if(!a)return;let c=t.attemptDir||e;await kf(c);let l=JSON.stringify(n);await t4r(Ps(c,`brain-outcome-event-${n.context?.issueNumber??"unknown"}.json`),l,"utf8");let u=r??(await Promise.resolve().then(()=>(jr(),oA))).execTool,[d,...f]=a;await u(d,[...f,"outcome-event","record","--root",e],{cwd:e,env:s,input:l})}catch(o){process.stderr.write(`[afk] brain outcome-event skipped (best-effort): ${String(o)}
743
743
  `)}}}function i4r(e,t){let r=t.RED_BRAIN_CLI;if(r)return q5(r)?["node",r]:void 0;if(s4r("brain",t.PATH))return["brain"];let o=t.CLAUDE_PLUGIN_ROOT??t.CODEX_PLUGIN_ROOT;if(o){let s=Ps(o,"..","brain","dist","cli.js");if(q5(s))return["node",s]}let i=Ps(e,"plugins","brain","dist","cli.js");if(q5(i))return["node",i]}function s4r(e,t){for(let r of(t??"").split(":").filter(Boolean)){let n=Ps(r,e);if(q5(n))return n}}ln();import{execFileSync as a4r}from"node:child_process";function c4r(e){let t=e.trim();if(t.length===0)return null;let r=t.split(/\s+/);if(r.length<3)return null;let n=Number(r[0]),o=Number(r[1]);return!Number.isInteger(n)||!Number.isInteger(o)?null:{pid:n,ppid:o,command:r.slice(2).join(" ")}}function l4r(e,t,r=12){let n=[],o=new Set,i=e;for(let s=0;s<r&&!(!Number.isInteger(i)||i<=1||o.has(i));s+=1){o.add(i);let a;try{a=t(i)}catch{break}let c=c4r(a);if(!c)break;c.command&&n.push(c.command),i=c.ppid}return n.join(`
744
- `)}function wPt(e=process.ppid){return l4r(e,t=>a4r("ps",["-o","pid=,ppid=,comm=","-p",String(t)],{encoding:"utf8",maxBuffer:64*1024,timeout:3e3}))}Ht();var $Be="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";function CPt(e,t=()=>!1){for(;;){let r="w";for(let n=0;n<4;n++){let o=Math.min($Be.length-1,Math.floor(e()*$Be.length));r+=$Be[o]}if(!t(r))return r}}function IPt(e,t){if(t!==void 0)return t;if(e.labels.includes(nOe))return"scout"}var RPt="RED_AFK_SUPERVISOR_LANE";qve();Ra();import{existsSync as g4r,readFileSync as A4r}from"node:fs";import{join as y4r,resolve as MPt}from"node:path";Ln();import{readFileSync as f4r}from"node:fs";import{dirname as z5,join as Rb,resolve as HBe}from"node:path";bt();Ln();Tg();Tg();function JR(e){let t=m4r(e)??HBe(e),r=p4r(t),n=iw(t);return{rootDir:t,socketPath:Rb(r,"rsp.sock"),pidPath:Rb(r,"rsp.pid"),lockPath:Rb(r,"rsp.lock"),wakeLockPath:Rb(t,".red","tmp","rsp","wake.lock"),summaryPath:Rb(n,"rsp-status-summary.json"),registryPath:Rb(n,"rsp-resident.pid.json")}}var Sxo=8*1024;function p4r(e){return RZ({key:e,socketFileName:"rsp.sock"})}function m4r(e){let t=HBe(e);for(let r=0;r<32;r++){try{let o=UBe(Rb(t,".git"));if(o!=null)return h4r(t,o)??t;if(UBe(Rb(t,".git","HEAD"))!=null||UBe(Rb(t,".red","config.yaml"))!=null)return t}catch{}let n=z5(t);if(n===t)return null;t=n}return null}function h4r(e,t){let r=/^gitdir:\s*(.+?)\s*$/m.exec(t);if(!r)return null;let n=HBe(e,r[1]);return/[/\\]worktrees[/\\][^/\\]+$/.test(n)?z5(z5(z5(n))):null}function UBe(e){try{return f4r(e,"utf8")}catch{return null}}Ln();bt();var TPt=250,BPt=1024*1024,DPt=64*1024,PPt=3,OPt=6*60*60*1e3;Ln();bt();var NPt=4*1024*1024;var b4r=8*1024;var J5=7,Y5=6,K5=64*1024*1024,x4r=90,E4r=4*1024*1024,k4r=3e4,S4r=2e3,w4r=5*6e4,C4r=5e3,I4r=0;function WBe(e,t,r){let n=u5(MPt(e),y4r(".red","config.yaml")),o=n?A4r(n,"utf8"):"",i=Sb(o,"rsp.enabled")==="true",s=Sb(o,"rsp.proxy.enabled"),a=s===void 0?i:s==="true",c=Xc(_a(o,"rsp.ttlDays"),J5),l=Xc(Qg(t.RSP_EPHEMERAL_TTL_HOURS)??_a(o,"rsp.ephemeralTtlHours"),Y5),u=Xc(_a(o,"rsp.byteBudget"),K5),d=Xc(_a(o,"rsp.telemetryTtlDays"),x4r),f=Xc(_a(o,"rsp.telemetryByteBudget")??_a(o,"rsp.byteBudget"),E4r),p=Xc(Qg(t.RSP_TELEMETRY_DRAIN_INTERVAL_MS)??_a(o,"rsp.telemetryDrainIntervalMs"),k4r),h=Xc(Qg(t.RSP_TELEMETRY_DRAIN_TIMEOUT_MS)??_a(o,"rsp.telemetryDrainTimeoutMs"),S4r),m=R4r(Qg(t.RSP_IDLE_MS)??_a(o,"rsp.idleMs"),w4r,C4r),g=Xc(Qg(t.RSP_HEAVY_GIT_BYTE_THRESHOLD)??_a(o,"rsp.heavyGitByteThreshold"),b4r),y=v4r(Qg(t.RSP_MEASUREMENT_HOLDOUT_SHARE)??_a(o,"rsp.measurement.holdoutShare"),I4r),x=Xc(Qg(t.RSP_GH_ETAG_CACHE_MAX_BYTES)??_a(o,"rsp.ghEtagCacheMaxBytes"),NPt),k={maxOverheadMs:Xc(Qg(t.RSP_MAX_OVERHEAD_MS)??_a(o,"rsp.overhead.maxOverheadMs"),TPt),maxSelfStateBytes:Xc(Qg(t.RSP_MAX_SELF_STATE_BYTES)??_a(o,"rsp.overhead.maxSelfStateBytes"),BPt),netLossFloorBytes:Xc(_a(o,"rsp.overhead.netLossFloorBytes"),DPt),consecutiveBreaches:Xc(Qg(t.RSP_OVERHEAD_CONSECUTIVE_BREACHES)??_a(o,"rsp.overhead.consecutiveBreaches"),PPt),cooldownMs:Xc(_a(o,"rsp.overhead.cooldownMs"),OPt)},S=JR(e).rootDir,w=r??t.RSP_STORE_URI??`file://${lFe(MPt(S),g4r)}`;return{enabled:i,proxyEnabled:a,storeUri:w,ttlDays:c,ephemeralTtlHours:l,byteBudget:u,telemetryTtlDays:d,telemetryByteBudget:f,telemetryDrainIntervalMs:p,telemetryDrainTimeoutMs:h,idleMs:m,heavyGitByteThreshold:g,measurementHoldoutShare:y,ghEtagCacheMaxBytes:x,overhead:k}}function _a(e,t){let r=Sb(e,t);if(r==null)return;let n=Number(r);return Number.isFinite(n)?n:void 0}function Xc(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:t}function R4r(e,t,r){let n=Xc(e,t);return Math.max(n,r)}function v4r(e,t){return typeof e!="number"||!Number.isFinite(e)?t:e<=0?0:e>=1?1:e}function Qg(e){if(e==null||e.trim()==="")return;let t=Number(e);return Number.isFinite(t)?t:void 0}Ln();bt();var gEo=64*1024;bt();var CEo=typeof globalThis.Bun<"u"&&typeof globalThis.Bun.spawn=="function",IEo=typeof globalThis.Deno<"u"&&typeof globalThis.Deno.Command=="function";import{fileURLToPath as N4r}from"node:url";import{dirname as M4r,resolve as L4r,join as DEo}from"node:path";var F4r=M4r(N4r(import.meta.url)),OEo=L4r(F4r,"..");var MEo=new TextEncoder,LEo=new TextDecoder("utf-8");var jBe=[{id:"git:status",command:["git","status"],wrapper:["git","status"]},{id:"git:log",command:["git","log"],wrapper:["git","log"]},{id:"git:diff",command:["git","diff"],wrapper:["git","diff"]},{id:"git:commit",command:["git","commit"],wrapper:["git","commit"]},{id:"git:push",command:["git","push"],wrapper:["git","push"]},{id:"git:blame",command:["git","blame"],wrapper:["git","blame"]},{id:"git:branch:av",command:["git","branch","-av"],wrapper:["git","branch","-av"]},{id:"git:show",command:["git","show"],wrapper:["git","show"]},{id:"gh:pr:list",command:["gh","pr","list"],wrapper:["gh","pr","list"]},{id:"gh:pr:view",command:["gh","pr","view"],wrapper:["gh","pr","view"]},{id:"gh:issue:list",command:["gh","issue","list"],wrapper:["gh","issue","list"]},{id:"gh:issue:view",command:["gh","issue","view"],wrapper:["gh","issue","view"]},{id:"gh:run:list",command:["gh","run","list"],wrapper:["gh","run","list"]},{id:"gh:run:view",command:["gh","run","view"],wrapper:["gh","run","view"]},{id:"gh:issues:batch",command:["gh","issues"],wrapper:["gh","issues"]},{id:"gh:prs:batch",command:["gh","prs"],wrapper:["gh","prs"]},{id:"gh:edit-labels:batch",command:["gh","edit-labels"],wrapper:["gh","edit-labels"]},{id:"gh:link-sub-issues:batch",command:["gh","link-sub-issues"],wrapper:["gh","link-sub-issues"]},{id:"vitest",command:["vitest"],wrapper:["vitest"]},{id:"vitest:run",command:["vitest","run"],wrapper:["vitest","run"]},{id:"cargo:test",command:["cargo","test"],wrapper:["cargo","test"]}],HSo=Y4r(jBe);function Y4r(e){let t=new Map;for(let r of e)t.set(K4r(r.command),["rsp",...r.wrapper]);return t}function K4r(e){return e.join("\0")}function sH(e=jBe,t={}){let r=e.map(i=>{let s=i.command.join(" "),a=["rsp",...i.wrapper].join(" ");return`| \`${s}\` | \`${a}\` |`}),n=e.map(i=>{let s=["rsp",...i.wrapper].join(" ");return`- For \`${i.command.join(" ")}\`, prefer \`${s}\` when the summarized output is enough.`}),o=Z4r(t.runner);return["# rsp \u2014 token-efficient command wrappers","","<!-- GENERATED FILE \u2014 do not edit by hand."," Source: apps/rsp/src/intercept.ts (RSP_WRAPPER_CAPABILITIES),"," rendered by apps/rsp/src/ambient-skill.ts."," Regenerate: pnpm --filter @reddb-io/rsp gen:ambient-skill -->","","`rsp` wraps noisy development commands and stores their full output in a","reversible elision store, so the agent reads a compact summary and can","recover the original bytes on demand with `rsp show el:<id>`.","Bare `rsp` renders a live TOON dashboard with recovery handles, active waits, today's savings snapshot, and degradation health instead of usage text.","Use `--help` after any subcommand for scoped flags, defaults, and examples.","Outputs may include `next_steps` templates with placeholders when a useful next action is not obvious.","","<supporting-info>","Troubleshooting recipes for hook silence, resident/store splits, and store growth live in `apps/rsp/docs/TROUBLESHOOTING.md`.","</supporting-info>","","## Core model","","The resident is the core. The CLI, the wrappers, the pre-exec hook, the","proxy, and the MCP server are peer clients of one resident process behind a","unix socket; no surface is a privileged or canonical contact point. The","resident is the sole owner of the elision store and the telemetry lanes under","`.red/state/rsp`, auto-spawns on first use, and exits on idle, so a host with","no MCP server connected is fully supported \u2014 summaries, `el:<id>` handles,","and recovery all work in headless and cron lanes.","",...o,...o.length>0?[""]:[],"## Permanent Proxy Model","","When `.red/config.yaml` sets `rsp.enabled: true`, proxy routing is on by","default (an explicit `rsp.proxy.enabled: false` is the opt-out) and the","pre-exec hook routes eligible shell commands through `rsp proxy -- <command>`","instead of matching only a top-level allowlist. The hook still passes through","missing commands, background jobs, recursive `rsp` calls, known interactive","commands, and commands opted out with `RSP_NO_PROXY=1` or","`RED_SKILLS_RSP_NO_PROXY=1`.","","`rsp proxy` executes the shell command and only contributes where it recognizes","a stdout-tail segment it can wrap. Recognized segment families are git","`status|log|diff|show|blame`, GitHub `pr|issue|run list|view`, `vitest`,","`vitest run`, `cargo test`, and simple `cat`/`head`/`tail` file reads.","Pipeline producers are left raw, so bytes inside pipes remain untouched.","`gh ... --json` and `gh ... --jq` selections are recorded as","`lossless-gh-json-jq` passes and execute byte-identically.","","Decision telemetry is the truth source for proxy coverage. A `contributed`","decision means rsp inserted a wrapper; `passed` means it deliberately left the","command or segment raw; `failed-open` means rsp ran the original command after","an internal proxy failure. Read `rsp stats` contribution metrics as measured","routing evidence, not a promise that every command family was compressed.","","## Wrapped commands","","When you would run one of these commands, run it through `rsp` instead:","","| Command | rsp wrapper |","| --- | --- |","| `cat <file>` | `rsp cat <file>` |","| `head <file>` / `head -n N <file>` | `rsp cat --head N <file>` |","| `tail <file>` / `tail -n N <file>` | `rsp cat --tail N <file>` |",...r,"","## When to prefer rsp","","- For deterministic file reads, prefer `rsp cat <file>`; code files render an outline plus bounded content, text/config files are threshold-gated, and binary files pass through untouched.","- For simple file dumps, the host pre-exec hook may rewrite bare `cat <file>`, `head <file>`, `head -n N <file>`, `tail <file>`, and `tail -n N <file>` when the path is an unquoted single file token.",...n,"","For arbitrary shell pipelines or compound commands where only final stdout",'should enter the agent context, call `rsp exec -- "<command line>"` directly.',"Bytes inside pipes remain untouched; stderr and exit status follow the raw","shell command.","","Use raw commands when exact stdout/stderr is the behavior under test, when","a wrapper does not support the command shape, or when resolving low-level","git conflicts where every byte matters.","","## Standardized Waiting","","Never hand-write sleep polling loops; run `rsp wait` in a background shell - process exit IS the signal.","","Examples:","",'- `rsp wait pr 123 --reason "before merge"` waits for a GitHub PR\'s checks and reports pass/fail plus mergeable state.',"- `rsp wait run 987654321` waits for a GitHub Actions run conclusion.","- `rsp wait run --branch feature/wait --latest` waits for the latest run on a branch.",'- `rsp wait release --tag "v2.*"` waits for the next matching release to publish.','- `rsp wait cmd -- "pnpm -C apps/rsp build"` runs a local async command and waits for its exit.',"- `rsp wait ls` lists active waits from `.red/tmp/waits/`.","","Exit codes: `0` = success verdict, `1` = failure verdict, `2` = timeout/indeterminate.","Every wait emits an `rsp.wait.result` v1 envelope as TOON by default or JSON with `--json`; `--result-file <path>` persists it atomically before signaling another process.","The verdict is sealed to disk with `delivery: pending` BEFORE any wake, so a signaled process always reads a complete, stable result; the receipt is stamped afterwards and never downgrades a provisional success.","The envelope separates `target_exit_code` from delivery failure. `--signal-pid` validates the PID and pins its start time, so a recycled PID fails delivery instead of signaling a stranger; `--notify-cmd` receives stable `RSP_WAIT_*` context and is bounded by `--notify-timeout`.","Command stdout/stderr capture holds at most `--capture-bytes` in memory and spools the rest; elided streams carry reversible `el:<id>` handles, binary heads are labeled base64, and an unavailable store keeps the spooled bytes instead of truncating.","Timeout or interruption sends TERM to the whole process group, waits a grace period, then sends KILL, and VERIFIES the pids are gone; a wait that cannot prove cleanup exits 2 rather than reporting success.","`--probe-timeout` (default 60s) bounds one GitHub probe, so a hung `gh` call cannot outlive `--timeout`.","Every wait writes an atomic v1 live registry entry under `.red/tmp/waits/` with kind, target, reason, PID/start time, deadline, attempts, last observation, last poll, poll tier, and status, then removes it on every exit path.","Linked git worktrees share the main checkout's registry, so a wait started in a worktree is visible to `rsp wait ls` anywhere in the repo.","GitHub waits retain their last observation; conflicting PRs fail, and `run --branch <branch> --latest` pins the resolved run ID before polling.","","## Loss levels","","Use `--brief` for compact summaries that keep enough inline context for","normal debugging. Use `--terse` for large or repetitive output; lossy output","mints an `el:<id>` handle, and `rsp show el:<id>` writes the original bytes","back to stdout. Use `--full` when exact inline output is required.","","`rsp cat <file>`, large `rsp git diff`, and large `rsp git log` output may","truncate by default; pass `--full` when exact inline output is required.","","## Recovering elided output","","`rsp show el:<id>` writes the original bytes verbatim to stdout. Expired or","evicted handles print `expired <ISO date> \u2014 re-run: <original command>` and","exit 1, so the exact command to reproduce the output is always in reach.","Ephemeral byte payloads are stored as short-TTL compressed content blobs;","identical outputs share one stored blob without changing handle recovery.","","## Failure behavior","","If an rsp wrapper is disabled, lacks its store, or fails, it passes through to the raw command","with the raw command's stdout, stderr, and exit status intact.","An unreachable resident costs the elision, never the command: every surface","hands back the raw stdout, stderr, and exit status, `stats` and the bare","dashboard degrade to the empty snapshot, and `wait` keeps its spooled bytes","rather than minting a handle nothing can recover.",""].join(`
744
+ `)}function wPt(e=process.ppid){return l4r(e,t=>a4r("ps",["-o","pid=,ppid=,comm=","-p",String(t)],{encoding:"utf8",maxBuffer:64*1024,timeout:3e3}))}Ht();var $Be="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";function CPt(e,t=()=>!1){for(;;){let r="w";for(let n=0;n<4;n++){let o=Math.min($Be.length-1,Math.floor(e()*$Be.length));r+=$Be[o]}if(!t(r))return r}}function IPt(e,t){if(t!==void 0)return t;if(e.labels.includes(nOe))return"scout"}var RPt="RED_AFK_SUPERVISOR_LANE";qve();Ra();import{existsSync as g4r,readFileSync as A4r}from"node:fs";import{join as y4r,resolve as MPt}from"node:path";Ln();import{readFileSync as f4r}from"node:fs";import{dirname as z5,join as Rb,resolve as HBe}from"node:path";bt();Ln();Tg();Tg();function JR(e){let t=m4r(e)??HBe(e),r=p4r(t),n=iw(t);return{rootDir:t,socketPath:Rb(r,"rsp.sock"),pidPath:Rb(r,"rsp.pid"),lockPath:Rb(r,"rsp.lock"),wakeLockPath:Rb(t,".red","tmp","rsp","wake.lock"),summaryPath:Rb(n,"rsp-status-summary.json"),registryPath:Rb(n,"rsp-resident.pid.json")}}var Cxo=8*1024;function p4r(e){return RZ({key:e,socketFileName:"rsp.sock"})}function m4r(e){let t=HBe(e);for(let r=0;r<32;r++){try{let o=UBe(Rb(t,".git"));if(o!=null)return h4r(t,o)??t;if(UBe(Rb(t,".git","HEAD"))!=null||UBe(Rb(t,".red","config.yaml"))!=null)return t}catch{}let n=z5(t);if(n===t)return null;t=n}return null}function h4r(e,t){let r=/^gitdir:\s*(.+?)\s*$/m.exec(t);if(!r)return null;let n=HBe(e,r[1]);return/[/\\]worktrees[/\\][^/\\]+$/.test(n)?z5(z5(z5(n))):null}function UBe(e){try{return f4r(e,"utf8")}catch{return null}}Ln();bt();var TPt=250,BPt=1024*1024,DPt=64*1024,PPt=3,OPt=6*60*60*1e3;Ln();bt();var NPt=4*1024*1024;var b4r=8*1024;var J5=7,Y5=6,K5=64*1024*1024,x4r=90,E4r=4*1024*1024,k4r=3e4,S4r=2e3,w4r=5*6e4,C4r=5e3,I4r=0;function WBe(e,t,r){let n=u5(MPt(e),y4r(".red","config.yaml")),o=n?A4r(n,"utf8"):"",i=Sb(o,"rsp.enabled")==="true",s=Sb(o,"rsp.proxy.enabled"),a=s===void 0?i:s==="true",c=Xc(_a(o,"rsp.ttlDays"),J5),l=Xc(Qg(t.RSP_EPHEMERAL_TTL_HOURS)??_a(o,"rsp.ephemeralTtlHours"),Y5),u=Xc(_a(o,"rsp.byteBudget"),K5),d=Xc(_a(o,"rsp.telemetryTtlDays"),x4r),f=Xc(_a(o,"rsp.telemetryByteBudget")??_a(o,"rsp.byteBudget"),E4r),p=Xc(Qg(t.RSP_TELEMETRY_DRAIN_INTERVAL_MS)??_a(o,"rsp.telemetryDrainIntervalMs"),k4r),h=Xc(Qg(t.RSP_TELEMETRY_DRAIN_TIMEOUT_MS)??_a(o,"rsp.telemetryDrainTimeoutMs"),S4r),m=R4r(Qg(t.RSP_IDLE_MS)??_a(o,"rsp.idleMs"),w4r,C4r),g=Xc(Qg(t.RSP_HEAVY_GIT_BYTE_THRESHOLD)??_a(o,"rsp.heavyGitByteThreshold"),b4r),y=v4r(Qg(t.RSP_MEASUREMENT_HOLDOUT_SHARE)??_a(o,"rsp.measurement.holdoutShare"),I4r),x=Xc(Qg(t.RSP_GH_ETAG_CACHE_MAX_BYTES)??_a(o,"rsp.ghEtagCacheMaxBytes"),NPt),k={maxOverheadMs:Xc(Qg(t.RSP_MAX_OVERHEAD_MS)??_a(o,"rsp.overhead.maxOverheadMs"),TPt),maxSelfStateBytes:Xc(Qg(t.RSP_MAX_SELF_STATE_BYTES)??_a(o,"rsp.overhead.maxSelfStateBytes"),BPt),netLossFloorBytes:Xc(_a(o,"rsp.overhead.netLossFloorBytes"),DPt),consecutiveBreaches:Xc(Qg(t.RSP_OVERHEAD_CONSECUTIVE_BREACHES)??_a(o,"rsp.overhead.consecutiveBreaches"),PPt),cooldownMs:Xc(_a(o,"rsp.overhead.cooldownMs"),OPt)},S=JR(e).rootDir,w=r??t.RSP_STORE_URI??`file://${lFe(MPt(S),g4r)}`;return{enabled:i,proxyEnabled:a,storeUri:w,ttlDays:c,ephemeralTtlHours:l,byteBudget:u,telemetryTtlDays:d,telemetryByteBudget:f,telemetryDrainIntervalMs:p,telemetryDrainTimeoutMs:h,idleMs:m,heavyGitByteThreshold:g,measurementHoldoutShare:y,ghEtagCacheMaxBytes:x,overhead:k}}function _a(e,t){let r=Sb(e,t);if(r==null)return;let n=Number(r);return Number.isFinite(n)?n:void 0}function Xc(e,t){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:t}function R4r(e,t,r){let n=Xc(e,t);return Math.max(n,r)}function v4r(e,t){return typeof e!="number"||!Number.isFinite(e)?t:e<=0?0:e>=1?1:e}function Qg(e){if(e==null||e.trim()==="")return;let t=Number(e);return Number.isFinite(t)?t:void 0}Ln();bt();var yEo=64*1024;bt();var REo=typeof globalThis.Bun<"u"&&typeof globalThis.Bun.spawn=="function",vEo=typeof globalThis.Deno<"u"&&typeof globalThis.Deno.Command=="function";import{fileURLToPath as N4r}from"node:url";import{dirname as M4r,resolve as L4r,join as OEo}from"node:path";var F4r=M4r(N4r(import.meta.url)),MEo=L4r(F4r,"..");var FEo=new TextEncoder,QEo=new TextDecoder("utf-8");var jBe=[{id:"git:status",command:["git","status"],wrapper:["git","status"]},{id:"git:log",command:["git","log"],wrapper:["git","log"]},{id:"git:diff",command:["git","diff"],wrapper:["git","diff"]},{id:"git:commit",command:["git","commit"],wrapper:["git","commit"]},{id:"git:push",command:["git","push"],wrapper:["git","push"]},{id:"git:blame",command:["git","blame"],wrapper:["git","blame"]},{id:"git:branch:av",command:["git","branch","-av"],wrapper:["git","branch","-av"]},{id:"git:show",command:["git","show"],wrapper:["git","show"]},{id:"gh:pr:list",command:["gh","pr","list"],wrapper:["gh","pr","list"]},{id:"gh:pr:view",command:["gh","pr","view"],wrapper:["gh","pr","view"]},{id:"gh:issue:list",command:["gh","issue","list"],wrapper:["gh","issue","list"]},{id:"gh:issue:view",command:["gh","issue","view"],wrapper:["gh","issue","view"]},{id:"gh:run:list",command:["gh","run","list"],wrapper:["gh","run","list"]},{id:"gh:run:view",command:["gh","run","view"],wrapper:["gh","run","view"]},{id:"gh:issues:batch",command:["gh","issues"],wrapper:["gh","issues"]},{id:"gh:prs:batch",command:["gh","prs"],wrapper:["gh","prs"]},{id:"gh:edit-labels:batch",command:["gh","edit-labels"],wrapper:["gh","edit-labels"]},{id:"gh:link-sub-issues:batch",command:["gh","link-sub-issues"],wrapper:["gh","link-sub-issues"]},{id:"vitest",command:["vitest"],wrapper:["vitest"]},{id:"vitest:run",command:["vitest","run"],wrapper:["vitest","run"]},{id:"cargo:test",command:["cargo","test"],wrapper:["cargo","test"]}],jSo=Y4r(jBe);function Y4r(e){let t=new Map;for(let r of e)t.set(K4r(r.command),["rsp",...r.wrapper]);return t}function K4r(e){return e.join("\0")}function sH(e=jBe,t={}){let r=e.map(i=>{let s=i.command.join(" "),a=["rsp",...i.wrapper].join(" ");return`| \`${s}\` | \`${a}\` |`}),n=e.map(i=>{let s=["rsp",...i.wrapper].join(" ");return`- For \`${i.command.join(" ")}\`, prefer \`${s}\` when the summarized output is enough.`}),o=Z4r(t.runner);return["# rsp \u2014 token-efficient command wrappers","","<!-- GENERATED FILE \u2014 do not edit by hand."," Source: apps/rsp/src/intercept.ts (RSP_WRAPPER_CAPABILITIES),"," rendered by apps/rsp/src/ambient-skill.ts."," Regenerate: pnpm --filter @reddb-io/rsp gen:ambient-skill -->","","`rsp` wraps noisy development commands and stores their full output in a","reversible elision store, so the agent reads a compact summary and can","recover the original bytes on demand with `rsp show el:<id>`.","Bare `rsp` renders a live TOON dashboard with recovery handles, active waits, today's savings snapshot, and degradation health instead of usage text.","Use `--help` after any subcommand for scoped flags, defaults, and examples.","Outputs may include `next_steps` templates with placeholders when a useful next action is not obvious.","","<supporting-info>","Troubleshooting recipes for hook silence, resident/store splits, and store growth live in `apps/rsp/docs/TROUBLESHOOTING.md`.","</supporting-info>","","## Core model","","The resident is the core. The CLI, the wrappers, the pre-exec hook, the","proxy, and the MCP server are peer clients of one resident process behind a","unix socket; no surface is a privileged or canonical contact point. The","resident is the sole owner of the elision store and the telemetry lanes under","`.red/state/rsp`, auto-spawns on first use, and exits on idle, so a host with","no MCP server connected is fully supported \u2014 summaries, `el:<id>` handles,","and recovery all work in headless and cron lanes.","",...o,...o.length>0?[""]:[],"## Permanent Proxy Model","","When `.red/config.yaml` sets `rsp.enabled: true`, proxy routing is on by","default (an explicit `rsp.proxy.enabled: false` is the opt-out) and the","pre-exec hook routes eligible shell commands through `rsp proxy -- <command>`","instead of matching only a top-level allowlist. The hook still passes through","missing commands, background jobs, recursive `rsp` calls, known interactive","commands, and commands opted out with `RSP_NO_PROXY=1` or","`RED_SKILLS_RSP_NO_PROXY=1`.","","`rsp proxy` executes the shell command and only contributes where it recognizes","a stdout-tail segment it can wrap. Recognized segment families are git","`status|log|diff|show|blame`, GitHub `pr|issue|run list|view`, `vitest`,","`vitest run`, `cargo test`, and simple `cat`/`head`/`tail` file reads.","Pipeline producers are left raw, so bytes inside pipes remain untouched.","`gh ... --json` and `gh ... --jq` selections are recorded as","`lossless-gh-json-jq` passes and execute byte-identically.","","Decision telemetry is the truth source for proxy coverage. A `contributed`","decision means rsp inserted a wrapper; `passed` means it deliberately left the","command or segment raw; `failed-open` means rsp ran the original command after","an internal proxy failure. Read `rsp stats` contribution metrics as measured","routing evidence, not a promise that every command family was compressed.","","## Wrapped commands","","When you would run one of these commands, run it through `rsp` instead:","","| Command | rsp wrapper |","| --- | --- |","| `cat <file>` | `rsp cat <file>` |","| `head <file>` / `head -n N <file>` | `rsp cat --head N <file>` |","| `tail <file>` / `tail -n N <file>` | `rsp cat --tail N <file>` |",...r,"","## When to prefer rsp","","- For deterministic file reads, prefer `rsp cat <file>`; code files render an outline plus bounded content, text/config files are threshold-gated, and binary files pass through untouched.","- For simple file dumps, the host pre-exec hook may rewrite bare `cat <file>`, `head <file>`, `head -n N <file>`, `tail <file>`, and `tail -n N <file>` when the path is an unquoted single file token.",...n,"","For arbitrary shell pipelines or compound commands where only final stdout",'should enter the agent context, call `rsp exec -- "<command line>"` directly.',"Bytes inside pipes remain untouched; stderr and exit status follow the raw","shell command.","","Use raw commands when exact stdout/stderr is the behavior under test, when","a wrapper does not support the command shape, or when resolving low-level","git conflicts where every byte matters.","","## Standardized Waiting","","Never hand-write sleep polling loops; run `rsp wait` in a background shell - process exit IS the signal.","","Examples:","",'- `rsp wait pr 123 --reason "before merge"` waits for a GitHub PR\'s checks and reports pass/fail plus mergeable state.',"- `rsp wait run 987654321` waits for a GitHub Actions run conclusion.","- `rsp wait run --branch feature/wait --latest` waits for the latest run on a branch.",'- `rsp wait release --tag "v2.*"` waits for the next matching release to publish.','- `rsp wait cmd -- "pnpm -C apps/rsp build"` runs a local async command and waits for its exit.',"- `rsp wait ls` lists active waits from `.red/tmp/waits/`.","","Exit codes: `0` = success verdict, `1` = failure verdict, `2` = timeout/indeterminate.","Every wait emits an `rsp.wait.result` v1 envelope as TOON by default or JSON with `--json`; `--result-file <path>` persists it atomically before signaling another process.","The verdict is sealed to disk with `delivery: pending` BEFORE any wake, so a signaled process always reads a complete, stable result; the receipt is stamped afterwards and never downgrades a provisional success.","The envelope separates `target_exit_code` from delivery failure. `--signal-pid` validates the PID and pins its start time, so a recycled PID fails delivery instead of signaling a stranger; `--notify-cmd` receives stable `RSP_WAIT_*` context and is bounded by `--notify-timeout`.","Command stdout/stderr capture holds at most `--capture-bytes` in memory and spools the rest; elided streams carry reversible `el:<id>` handles, binary heads are labeled base64, and an unavailable store keeps the spooled bytes instead of truncating.","Timeout or interruption sends TERM to the whole process group, waits a grace period, then sends KILL, and VERIFIES the pids are gone; a wait that cannot prove cleanup exits 2 rather than reporting success.","`--probe-timeout` (default 60s) bounds one GitHub probe, so a hung `gh` call cannot outlive `--timeout`.","Every wait writes an atomic v1 live registry entry under `.red/tmp/waits/` with kind, target, reason, PID/start time, deadline, attempts, last observation, last poll, poll tier, and status, then removes it on every exit path.","Linked git worktrees share the main checkout's registry, so a wait started in a worktree is visible to `rsp wait ls` anywhere in the repo.","GitHub waits retain their last observation; conflicting PRs fail, and `run --branch <branch> --latest` pins the resolved run ID before polling.","","## Loss levels","","Use `--brief` for compact summaries that keep enough inline context for","normal debugging. Use `--terse` for large or repetitive output; lossy output","mints an `el:<id>` handle, and `rsp show el:<id>` writes the original bytes","back to stdout. Use `--full` when exact inline output is required.","","`rsp cat <file>`, large `rsp git diff`, and large `rsp git log` output may","truncate by default; pass `--full` when exact inline output is required.","","## Recovering elided output","","`rsp show el:<id>` writes the original bytes verbatim to stdout. Expired or","evicted handles print `expired <ISO date> \u2014 re-run: <original command>` and","exit 1, so the exact command to reproduce the output is always in reach.","Ephemeral byte payloads are stored as short-TTL compressed content blobs;","identical outputs share one stored blob without changing handle recovery.","","## Failure behavior","","If an rsp wrapper is disabled, lacks its store, or fails, it passes through to the raw command","with the raw command's stdout, stderr, and exit status intact.","An unreachable resident costs the elision, never the command: every surface","hands back the raw stdout, stderr, and exit status, `stats` and the bare","dashboard degrade to the empty snapshot, and `wait` keeps its spooled bytes","rather than minting a handle nothing can recover.",""].join(`
745
745
  `)}function Z4r(e){return e==="codex"?["## Codex lane","","Codex pre-execution rewrite hook is available when the repo opts into","`rsp.enabled`; the permanent proxy route is the default (opt out with","`rsp.proxy.enabled: false`, which narrows it to recognized wrapper","families). Direct `rsp` calls","still help when composing commands deliberately. Codex PostToolUse cannot","replace completed Bash output, so post-exec output normalization remains","a Claude-only hook gap; invocation accounting comes from the rewritten","`rsp` command's telemetry event."]:e==="claude"?["## Claude lane","","Claude Code pre-execution interception is available for simple wrapped","commands, and direct calls still help when composing commands deliberately."]:e==="opencode"?["## OpenCode lane","","OpenCode receives this guidance through the generated opencode plugin surface.","The plugin can rewrite simple shell-tool commands before execution, and direct","`rsp` calls still help when composing commands deliberately."]:[]}var X4r='<details data-attempt-status="',eYr='<details data-kind="directive">';function tYr(e){return e.replace(/\s/g,"").length===0}function rYr(e){return e.startsWith(X4r)&&e.includes("</details>")}function nYr(e){return e.startsWith("\u{1F916} /afk started ")}function oYr(e){return e.startsWith("\u{1F916} /afk promoted to ready-for-agent")}function iYr(e){let t=e.replace(/\s/g,"");return/^:(one|two|three|four|five|six):$/.test(t)}function GBe(e){let t=[],r=0,n=!1,o="";for(let i of e.split(`
746
746
  `)){i.endsWith("\r")&&(i=i.slice(0,-1));let s=i.trim();if(s.startsWith("```")){r>0&&(o+=`
747
747
  `+i),n=!n;continue}if(n){r>0&&(o+=`
@@ -786,7 +786,7 @@ Closes #${e}`}function $Ot(e,t){let r=[],n,o,i=!1,s=async()=>i?!0:(i=(await Eb(e
786
786
  `);return r.slice(Math.max(0,r.length-t)).join(`
787
787
  `)}function lKr(e){let t=e.findings.flatMap((n,o)=>[`${o+1}. ${n.path??"(unanchored)"}:${n.line??0}`,n.body,""]),r=rDe(t.join(`
788
788
  `).replace(/\n+$/,""),oKr);return r?[e.summary,"",r]:[e.summary]}function VOt(e,t){let{outstanding:r}=t,n=r.gate,o=r.review,i=[e.replace(/\n+$/,""),"",`<${t.tag}>`,...t.directives,"","<reseed-history>",cKr(t.history),"</reseed-history>","","<outstanding-state>"];return n?.drift&&i.push(...bOt(n.drift),""),n&&i.push("<validation-tail>",rDe(n.validation,nKr),"</validation-tail>"),o&&(i.push("<review-critiques>",...lKr(o),"</review-critiques>"),o.diff&&i.push('<worktree-diff data-untrusted="true">',"```diff",rDe(o.diff,iKr),"```","</worktree-diff>")),!n&&!o&&i.push("Nothing is outstanding beyond the original task."),i.push("</outstanding-state>",`</${t.tag}>`,""),i.join(`
789
- `)}function zOt(e){return e.drift?[`The ${e.gate} machine gate failed after DONE, but the BASE moved under this run \u2014 this correction is FREE.`,"Merge the base, regenerate anything the base's move invalidated, commit, then emit the required terminal sentinel."]:[`The ${e.gate} machine gate failed after DONE. This is bounded correction retry ${e.retry}/${e.cap}.`,"Fix the failure on the existing branch, run the relevant gate, commit only the needed changes, then emit the required terminal sentinel."]}function JOt(e){return[`The feedback machine gate failed on the \`${e.from}\` tier. This Re-seed re-instructs you on the \`${e.to}\` tier (${e.retry}/${e.cap}) rather than spending another round at the tier that just failed.`,"Fix the failure on the existing branch, run the relevant gate, commit only the needed changes, then emit the required terminal sentinel."]}function YOt(e){return[`A blocking adversarial review found confirmed defects or acceptance-criteria gaps. This is bounded correction retry ${e.retry}/${e.cap}.`,"Fix only the blocking findings below on the existing branch, keep unrelated nits/style/suggestions out of scope, run the relevant gate, commit only the needed changes, then emit the required terminal sentinel."]}Wr();var cH=nw,oCo=cH[cH.length-1];function uKr(e){let t=cH.indexOf(e);if(!(t<0||t>=cH.length-1))return cH[t+1]}function KOt(e){let t=e.signature||KR;if(!(t!==KR&&t===e.previousSignature))return{escalate:!1,refusal:"no-repeat"};let n=uKr(e.tier);if(!n)return{escalate:!1,refusal:"ladder-top"};let o=oX(e.budget,"tier",e.spend??{});return o.allowed?{escalate:!0,from:e.tier,to:n}:{escalate:!1,refusal:o.refusal??"sub-cap"}}async function ZOt(e,t){let{repo:r,remote:n,base:o,branch:i}=t,s=`${n}/${o}`;if((await e(["git","-C",r,"fetch",n,o,"--quiet"])).code!==0)return{ok:!1,reason:"fetch-failed",message:`could not fetch ${s} before opening the pull request \u2014 the branch was left as it is and the landing keeps its own pre-merge barrier`};if((await e(["git","-C",r,"merge-base","--is-ancestor",s,"HEAD"])).code===0)return{ok:!0,action:"already-integrated"};if((await e(["git","-C",r,"merge","--no-edit",s])).code!==0){let d=await e(["git","-C",r,"diff","--name-only","--diff-filter=U"]),f=d.code===0?gTe(d.stdout):[];return await e(["git","-C",r,"merge","--abort"]),{ok:!1,reason:"conflict",conflictPaths:f,message:ATe(s,f)}}return(await e(["git","-C",r,"push",n,`HEAD:refs/heads/${i}`])).code!==0?{ok:!1,reason:"push-failed",message:`${s} merged cleanly into ${i} but the integrated tip could not be pushed \u2014 the branch on origin still carries the pre-integration work, which the landing will integrate`}:{ok:!0,action:"merged"}}b8();GD();SR();zu();um();Wk();Wr();Ht();ln();async function ZR(e,t,r){if(e.fs.writeValidationSidecar&&r.length!==0)try{await e.fs.writeValidationSidecar(`${t}/validation.jsonl`,r)}catch{}}async function Tb(e,t,r={}){let{deps:n,input:o}=e;if(n.recordOutcomeEvent)try{let i=r.durationS,s={schemaVersion:1,id:`afk:${o.repo}:${o.issue}:${o.attempt}`,emitter:"afk",occurredAt:n.nowIso(),taskClass:e.modelTier,chosenOption:{kind:"runner",runner:o.runner,model:e.model,effort:e.effort},outcome:nOt(t),cost:{signal:"unknown"},context:{repository:o.repo,issueNumber:o.issue,attemptNumber:o.attempt,issueType:e.issueType,workerId:o.workerId,branch:e.branch,durationMs:i!==void 0&&Number.isFinite(i)&&i>=0?Math.round(i*1e3):void 0,status:String(t)}};n.recordOutcomeEvent(s).catch(a=>{n.appendIterLog(`\u{1F916} /afk brain outcome-event for #${o.issue} failed (best-effort; ignored): ${String(a)}`)})}catch(i){n.appendIterLog(`\u{1F916} /afk brain outcome-event for #${o.issue} failed (best-effort; ignored): ${String(i)}`)}}async function iX(e,t){let{deps:r}=e;if(t===void 0||!r.postBackpressureReview)return;let n=tOt(e.backpressureChecks??[]);if(n!==null)try{await r.postBackpressureReview(t,n)}catch{}}async function UP(e,t,r,n){let{deps:o,input:i}=e,s=o.nowEpoch()-e.startedEpoch;return(await V$(o.envelope,{status:t,issue:i.issue,worker:i.workerId,durationS:s,branch:e.branch,attempt:i.attempt,diff:r,repo:e.noBranchLink?"":i.repo,repoDir:i.repoDir,worktreeRel:i.attemptDir,diffstat:"",sections:{...n,...e.resolvedBase?{base:ZBe(e.resolvedBase)}:{}},historyPath:o.historyPath,historyClock:o.historyClock,historyFields:{runner:i.runner}})).posted}function Yu(e,t){return(e??"").split(`
789
+ `)}function zOt(e){return e.drift?[`The ${e.gate} machine gate failed after DONE, but the BASE moved under this run \u2014 this correction is FREE.`,"Merge the base, regenerate anything the base's move invalidated, commit, then emit the required terminal sentinel."]:[`The ${e.gate} machine gate failed after DONE. This is bounded correction retry ${e.retry}/${e.cap}.`,"Fix the failure on the existing branch, run the relevant gate, commit only the needed changes, then emit the required terminal sentinel."]}function JOt(e){return[`The feedback machine gate failed on the \`${e.from}\` tier. This Re-seed re-instructs you on the \`${e.to}\` tier (${e.retry}/${e.cap}) rather than spending another round at the tier that just failed.`,"Fix the failure on the existing branch, run the relevant gate, commit only the needed changes, then emit the required terminal sentinel."]}function YOt(e){return[`A blocking adversarial review found confirmed defects or acceptance-criteria gaps. This is bounded correction retry ${e.retry}/${e.cap}.`,"Fix only the blocking findings below on the existing branch, keep unrelated nits/style/suggestions out of scope, run the relevant gate, commit only the needed changes, then emit the required terminal sentinel."]}Wr();var cH=nw,sCo=cH[cH.length-1];function uKr(e){let t=cH.indexOf(e);if(!(t<0||t>=cH.length-1))return cH[t+1]}function KOt(e){let t=e.signature||KR;if(!(t!==KR&&t===e.previousSignature))return{escalate:!1,refusal:"no-repeat"};let n=uKr(e.tier);if(!n)return{escalate:!1,refusal:"ladder-top"};let o=oX(e.budget,"tier",e.spend??{});return o.allowed?{escalate:!0,from:e.tier,to:n}:{escalate:!1,refusal:o.refusal??"sub-cap"}}async function ZOt(e,t){let{repo:r,remote:n,base:o,branch:i}=t,s=`${n}/${o}`;if((await e(["git","-C",r,"fetch",n,o,"--quiet"])).code!==0)return{ok:!1,reason:"fetch-failed",message:`could not fetch ${s} before opening the pull request \u2014 the branch was left as it is and the landing keeps its own pre-merge barrier`};if((await e(["git","-C",r,"merge-base","--is-ancestor",s,"HEAD"])).code===0)return{ok:!0,action:"already-integrated"};if((await e(["git","-C",r,"merge","--no-edit",s])).code!==0){let d=await e(["git","-C",r,"diff","--name-only","--diff-filter=U"]),f=d.code===0?gTe(d.stdout):[];return await e(["git","-C",r,"merge","--abort"]),{ok:!1,reason:"conflict",conflictPaths:f,message:ATe(s,f)}}return(await e(["git","-C",r,"push",n,`HEAD:refs/heads/${i}`])).code!==0?{ok:!1,reason:"push-failed",message:`${s} merged cleanly into ${i} but the integrated tip could not be pushed \u2014 the branch on origin still carries the pre-integration work, which the landing will integrate`}:{ok:!0,action:"merged"}}b8();GD();SR();zu();um();Wk();Wr();Ht();ln();async function ZR(e,t,r){if(e.fs.writeValidationSidecar&&r.length!==0)try{await e.fs.writeValidationSidecar(`${t}/validation.jsonl`,r)}catch{}}async function Tb(e,t,r={}){let{deps:n,input:o}=e;if(n.recordOutcomeEvent)try{let i=r.durationS,s={schemaVersion:1,id:`afk:${o.repo}:${o.issue}:${o.attempt}`,emitter:"afk",occurredAt:n.nowIso(),taskClass:e.modelTier,chosenOption:{kind:"runner",runner:o.runner,model:e.model,effort:e.effort},outcome:nOt(t),cost:{signal:"unknown"},context:{repository:o.repo,issueNumber:o.issue,attemptNumber:o.attempt,issueType:e.issueType,workerId:o.workerId,branch:e.branch,durationMs:i!==void 0&&Number.isFinite(i)&&i>=0?Math.round(i*1e3):void 0,status:String(t)}};n.recordOutcomeEvent(s).catch(a=>{n.appendIterLog(`\u{1F916} /afk brain outcome-event for #${o.issue} failed (best-effort; ignored): ${String(a)}`)})}catch(i){n.appendIterLog(`\u{1F916} /afk brain outcome-event for #${o.issue} failed (best-effort; ignored): ${String(i)}`)}}async function iX(e,t){let{deps:r}=e;if(t===void 0||!r.postBackpressureReview)return;let n=tOt(e.backpressureChecks??[]);if(n!==null)try{await r.postBackpressureReview(t,n)}catch{}}async function UP(e,t,r,n){let{deps:o,input:i}=e,s=o.nowEpoch()-e.startedEpoch;return(await V$(o.envelope,{status:t,issue:i.issue,worker:i.workerId,durationS:s,branch:e.branch,attempt:i.attempt,diff:r,repo:e.noBranchLink?"":i.repo,repoDir:i.repoDir,worktreeRel:i.attemptDir,diffstat:"",sections:{...n,...e.resolvedBase?{base:ZBe(e.resolvedBase)}:{}},historyPath:o.historyPath,historyClock:o.historyClock,historyFields:{runner:i.runner}})).posted}function Yu(e,t){return(e??"").split(`
790
790
  `).map(n=>n.replace(/^[-*]\s*(?:\[[^\]]+\]\s*)?/,"").replace(/\s+/g," ").trim()).find(n=>n.length>0)??t}function HP(e,t){switch(e){case"blocked":return Hl({kind:"spec",summary:Yu(t.notes,"Inner agent emitted BLOCKED."),next:"Review the blocker envelope and add human guidance."});case"feedback-failed":return Hl({kind:"validation",summary:Yu(t.validation??t.log,"Validation failed after implementation."),next:"Decide whether to fix forward, change scope, or adjust the acceptance criteria."});case"no-sentinel":return Hl({kind:"runner",summary:Yu(t.log,"Inner agent exited without an AFK completion sentinel."),next:"Review the attempt log and decide whether to retry or revise the issue brief."});case"host-config":return Hl({kind:"host-config",summary:Yu(t.log??t.notes,"Required runner host configuration is unavailable."),next:"Install or restore the required shell/workspace on the host, then requeue this issue."});case"stalled":return Hl({kind:"stalled",summary:Yu(t.log,"Inner agent made no progress (no new commit) within the attempt wall-clock."),next:"Review the work already pushed (branch/PR) and decide whether to continue, re-scope, or stop."});case"budget-exceeded":return Hl({kind:"budget",summary:Yu(t.log,"Attempt aborted \u2014 per-attempt resource budget exceeded (#908)."),next:"Review the salvaged partial work (branch/PR) and decide whether to continue with a larger budget, re-scope, or stop."});case"merge-conflict":return Hl({kind:"merge-conflict",summary:Yu(t.log,"Worker branch could not be merged cleanly."),next:"Resolve the merge conflict or add guidance for the next agent attempt."});case"ci-failed":return Hl({kind:"ci",summary:Yu(t.log,"A required status check failed on the completed, mergeable PR."),next:"Fix the failing required check on the open PR, then merge it (no full agent re-run needed)."});case"ci-pending":return Hl({kind:"ci",summary:Yu(t.log,"Required status checks were still pending on the completed, mergeable PR."),next:"Wait for the required checks to go green, then merge the open PR (no full agent re-run needed)."});case"trunk-diverged":return Hl({kind:"trunk-diverged",summary:Yu(t.log,"Local trunk diverged from origin; landing aborted (ADR 0083)."),next:"Reconcile the primary checkout's local trunk with origin (no reset/stash/force-push), then requeue."});case"base-stale":return Hl({kind:"base-stale",summary:Yu(t.log,"Remote base was unreachable and the local base is stale."),next:"Refresh the local base from origin, or restore remote access, then requeue."});case"infra":return Hl({kind:"infra",summary:Yu(t.log,"Landing infrastructure precondition failed."),next:"Fix the landing infrastructure failure, then requeue."});case"manual-landing":return Hl({kind:"manual-landing",summary:Yu(t.log,"Manual-landing hold: the full pipeline ran and the PR is open, awaiting a human merge."),next:"Merge the open PR to land the work (it auto-closes this issue); no full agent re-run is needed."});default:return null}}var dKr=new Set(["spec","validation","merge-conflict","push-failed","ci","stalled","decision","trunk-diverged","infra","host-config"]);function fKr(e,t){return!e||t.kind!=="runner"?!1:dKr.has(e.kind)}async function WP(e,t,r){if(!(!r||!e.gh.editBody))try{let n=ic(t.body),o=fKr(n,r)?n:r,{body:i,changed:s}=LIt(t.body,o);if(!s)return;await e.gh.editBody(t.issue,i)}catch{}}function sX(e){return{...e,preserved:!0,swept:!1}}async function Cm(e,t,r,n,o={}){let{deps:i,input:s}=e;rX(i,t),await _b(i,s.issue,t,vb(s))==="escalate"&&await WP(i,s,HP(t,n));let c=await UP(e,ub(t),r,n);return await Tb(e,t,{durationS:i.nowEpoch()-e.startedEpoch}),await Jl(i,s),sX({outcome:t,issue:s.issue,branch:e.branch,base:e.base,hooksFired:e.hooksFired,envelopePosted:c})}async function XOt(e,t,r,n,o,i){let{deps:s,input:a}=e,c=o?`${B5(o)}
791
791
  `:"",l=[i,`${c}${n.join(`
792
792
  `)}`].filter(d=>d&&d.trim().length>0).join(`
@@ -974,7 +974,7 @@ ${e.note}`:`Drift detected (\`${e.signal}\`) on attempt ${r}. ${e.reason}`;retur
974
974
  `);for(let d of u.reclaim)await o.deleteLocal(d.branch),r.write(`reaped (local live): ${d.branch} \u2014 ${d.reason}
975
975
  `);for(let d of u.spare)r.write(`spared (local live): ${d.branch} \u2014 ${d.reason}
976
976
  `);return 0}bt();Wr();Po();async function c8r(e,t){let r=await e.listBranches(),n=[];for(let i of r)YR(i.branch)!==null&&n.push({branch:i.branch,commitsAhead:await e.commitsAhead(i.branch,e.baseRef)});let o=aX({branches:n,openPullRequests:await e.openPullRequests()});return t.write(`${je({report:"orphan-branches",trunk:e.trunk,scanned:n.length,orphaned:o.length,branches:o.map(i=>({branch:i.branch,issue:i.issue,commits_ahead:i.commitsAhead??-1}))})}
977
- `),o.length>0?1:0}async function LLt(e,t=process.cwd(),r=process.stdout){let n=await oo(t),o={cwd:n.root},i={cwd:n.root,repo:n.repo},s=Te(await or(n.root),"dev.trunk")||Em;return await _g(o,s).catch(()=>{}),c8r({trunk:s,baseRef:QP(n.remote,s),listBranches:()=>Cf(o,"afk/"),commitsAhead:(a,c)=>xZ(o,a,c),openPullRequests:()=>DU(i)},r)}bt();import{homedir as g5r}from"node:os";import{join as MX,relative as A5r}from"node:path";import{readFile as _Qt,writeFile as vQt}from"node:fs/promises";Po();UR();W8();bt();ln();import{readdir as JDe,readFile as l8r,stat as u8r}from"node:fs/promises";import{join as JP,relative as d8r}from"node:path";var f8r="run the dev durable path migration entrypoint during boot (`red-path-migration`)";function p8r(e,t){let r=d8r(e,t).replace(/\\/g,"/");return r===""?".":r}async function FLt(e){try{return await u8r(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function QLt(e){try{return(await JDe(e)).length>0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function m8r(e){try{return(await JDe(e,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).sort()}catch(t){if(t.code==="ENOENT")return[];throw t}}async function h8r(e){try{return(await JDe(e,{withFileTypes:!0})).map(t=>({name:t.name,isDirectory:t.isDirectory(),isFile:t.isFile()})).sort((t,r)=>t.name.localeCompare(r.name))}catch(t){if(t.code==="ENOENT")return[];throw t}}function iv(e,t,r,n,o,i=f8r){return{path:p8r(e,t),kind:r,verdict:n,reason:o,canonicalFix:i,fixGate:"delegate"}}function g8r(e){if(e===null||typeof e!="object"||Array.isArray(e))throw new Error("castle validation record must be an object");let t={...e};if(t.schema!==Tv)throw new Error(`castle validation schema must be ${Tv}`);if(typeof t.name!="string"||t.name.length===0)throw new Error("castle validation record needs string name");if(t.status!=="passed"&&t.status!=="failed"&&t.status!=="skipped")throw new Error("castle validation status must be passed, failed, or skipped");if(t.command!==void 0&&typeof t.command!="string")throw new Error("castle validation command must be string");for(let r of["exitCode","durationMs"])if(t[r]!==void 0&&typeof t[r]!="number")throw new Error(`castle validation ${r} must be number`);if(t.summary!==void 0&&typeof t.summary!="string")throw new Error("castle validation summary must be string");return t}async function A8r(e,t){let r=[];if(await FLt(t.castleHistory))try{await zS(t.castleHistory)}catch(n){r.push(iv(e,t.castleHistory,"castle-history-invalid","error",`history.toonl is not TOON-decodable as red.castle.history.v1: ${n instanceof Error?n.message:String(n)}`))}if(await FLt(t.castleValidation))try{ii(await l8r(t.castleValidation,"utf8")).map(g8r)}catch(n){r.push(iv(e,t.castleValidation,"castle-validation-invalid","error",`validation.toonl is not TOON-decodable as ${Tv}: ${n instanceof Error?n.message:String(n)}`))}return r}async function $Lt(e,t,r){let n=[],o=r==="worker"?JP(t.castleStateRoot,"workers"):JP(t.castleStateRoot,"supervisors");for(let i of await m8r(o)){let s=JP(o,i,"state.toon");try{let a=await Nm(s);if(!a){n.push(iv(e,s,"castle-snapshot-invalid","error",`${r} snapshot directory is missing state.toon`));continue}xO(a),(a.kind!==r||a.id!==i)&&n.push(iv(e,s,"castle-snapshot-invalid","error",`${r} snapshot must carry kind=${r} and id=${i}`))}catch(a){n.push(iv(e,s,"castle-snapshot-invalid","error",`${r} snapshot is not TOON-decodable as red.castle.state.v1: ${a instanceof Error?a.message:String(a)}`))}}return n}async function y8r(e,t){let r=new Set(["history.toonl","validation.toonl"]),n=new Set(["workers","supervisors"]),o=[];for(let i of await h8r(t.castleStateRoot))i.isFile&&r.has(i.name)||i.isDirectory&&n.has(i.name)||o.push(iv(e,JP(t.castleStateRoot,i.name),"castle-live-artifact","error","live supervisor artifact belongs under .red/tmp/supervisors/default, not the durable castle state lane"));return o}async function ULt(e){let t=zo(JP(e,".red")),r=JP(e,".red","state","afk"),n=await QLt(t.castleStateRoot),o=await QLt(r),i=[];return n&&(i.push(...await y8r(e,t)),i.push(...await A8r(e,t)),i.push(...await $Lt(e,t,"worker")),i.push(...await $Lt(e,t,"supervisor"))),n&&o&&i.push(iv(e,r,"legacy-afk-residue","warn","legacy .red/state/afk contains state alongside the live castle state lane")),i.sort((s,a)=>s.path.localeCompare(a.path)||s.kind.localeCompare(a.kind)),{status:i.some(s=>s.verdict==="error")?"error":i.length>0?"warn":"pass",findings:i,checked:{castleLanePresent:n,legacyLanePresent:o}}}var KP="2.47.0",YP="0.13.0";function HLt(e){return e?.match(/(?:^|\s)v?(\d+\.\d+\.\d+)(?:\s|$|[-+()])/)?.[1]}function WLt(e){let t=/^(\d+)\.(\d+)\.(\d+)$/.exec(e);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:[0,0,0]}function b8r(e,t){let r=WLt(e),n=WLt(t);for(let o=0;o<r.length;o+=1)if(r[o]!==n[o])return r[o]<n[o]?-1:1;return 0}function x8r(e){let t=/^(?:\s*)github-cli(?:\s|$)/m.test(e.toolVersions??""),r=/(?:^|\/)\.?asdf\/shims\/gh$/.test(e.ghPath??"");return t||r?"asdf":e.brewManaged?"brew":e.aptManaged?"apt":e.ghPath?"direct":"unknown"}function IX(e){switch(e){case"asdf":return"asdf install github-cli latest && asdf global github-cli latest && asdf reshim github-cli";case"apt":return"sudo apt-get update && sudo apt-get install --only-upgrade gh";case"brew":return"brew upgrade gh";case"direct":return`replace the gh binary with gh >= ${KP} from https://github.com/cli/cli/releases/latest`;case"unknown":return`install gh >= ${KP} using https://github.com/cli/cli#installation`}}function RX(){let e=`v${YP}`;return`TQ_VERSION=${e} curl -fsSL https://raw.githubusercontent.com/reddb-io/toon/${e}/install.sh | sh`}function GLt(e){let t=x8r(e),r=HLt(e.ghOutput),n=HLt(e.tqOutput),o=[];return r?b8r(r,KP)<0&&o.push({tool:"gh",kind:"outdated",manager:t,reason:`gh ${r} is below required ${KP}`,remediation:IX(t)}):o.push({tool:"gh",kind:"missing",manager:t,reason:`gh is missing; required >= ${KP}`,remediation:IX(t)}),n?(n!==YP||e.tqRecordedVersion!==YP)&&o.push({tool:"tq",kind:"toolchain-drift",manager:"canonical-installer",reason:`tq toolchain drift: required ${YP}, config ${e.tqRecordedVersion??"missing"}, observed ${n}`,remediation:RX()}):o.push({tool:"tq",kind:"missing",manager:"canonical-installer",reason:`tq is missing; required ${YP}`,remediation:RX()}),{rows:[{tool:"gh",version:r??"missing",required:`>=${KP}`,manager:t,verdict:o.some(i=>i.tool==="gh")?"error":"ok"},{tool:"tq",version:n??"missing",required:YP,manager:"canonical-installer",verdict:o.some(i=>i.tool==="tq")?"error":"ok"}],findings:o}}function jLt(e,t){return t.code===0?{tool:e,status:"applied",reason:"command completed"}:{tool:e,status:"failed",reason:`command exited ${t.code}`}}async function qLt(e,t,r){if(!t.fix)return[];let n=[];for(let o of e.findings){if(!t.approved){n.push({tool:o.tool,status:"skipped",reason:"approval required"});continue}if(o.tool==="gh"){if(o.manager==="asdf")n.push(jLt("gh",await r.upgradeGhAsdf()));else{let i=o.manager==="apt"?"sudo-backed apt upgrade is report-only":`${o.manager} gh upgrade is report-only`;n.push({tool:"gh",status:"instruction",reason:i})}continue}n.push(jLt("tq",await r.installTq()))}return n}import{chmod as bTo,mkdir as xTo,readFile as XLt,stat as v8r,writeFile as ETo}from"node:fs/promises";import{homedir as eFt}from"node:os";import{dirname as wTo,join as KDe}from"node:path";import{join as E8r}from"node:path";var k8r=[".red","redskilled"],vX=448;function _X(e){return E8r(e,...k8r)}import{join as S8r}from"node:path";Ln();var VLt=["local","tmp","host"],w8r="local",gH="plugins.dev.workspace.target";var YDe=class extends Error{constructor(t){super(t),this.name="WorkspaceConfigError"}};function JLt(e){let t=Sb(e,gH),r=R8r(t??"").trim();return r===""?void 0:r}function YLt(e){let t=(e??"").trim();if(t==="")return{kind:"preset",preset:w8r};let r=VLt.find(n=>n===t.toLowerCase());if(r)return{kind:"preset",preset:r};if(t.startsWith("/")||t==="~"||t.startsWith("~/"))return{kind:"custom",parentDir:t};throw new YDe(`${gH}: unknown workspace target ${JSON.stringify(t)}. Use one of the presets (${VLt.join(", ")}) or an absolute parent directory for Workers.`)}function KLt(e,t){return e.kind==="preset"?e.preset==="host":I8r(C8r(e.parentDir,t),_X(t))}function C8r(e,t){return e==="~"?zLt(t):e.startsWith("~/")?S8r(t,e.slice(2)):zLt(e)}function I8r(e,t){return e===t?!0:t==="/"?e.startsWith("/"):e.startsWith(`${t}/`)}function zLt(e){let t=e.trim();return t.length>1?t.replace(/\/+$/,""):t}function R8r(e){let t=e.trim(),r=/^(["'])(.*)\1$/.exec(t);return r?r[2]:t}nS();AU();var ZP=`run \`/red-setup\` (Section E3 \u2014 execution daemon), or \`${wb("red-skills-redskilled",["provision"])}\` directly`;var tFt={needed:!1,declaredBy:`no ${gH} in view`};async function _8r(e={}){let t=e.homeDir??eFt(),r=e.declaredTarget?.trim();if(r)return ZLt(r,t,"stated on the command line");let n=e.projectRoot?.trim();if(!n)return tFt;let o=KDe(n,".red","config.yaml"),i=await XLt(o,"utf8").catch(()=>{});if(i===void 0)return{needed:!1,declaredBy:`no ${o}`};let s=JLt(i);return s===void 0?{needed:!1,declaredBy:`${o} declares no workspace target (default local)`}:ZLt(s,t,o)}function ZLt(e,t,r){let n=`${gH}: ${e} (${r})`;try{return{needed:KLt(YLt(e),t),declaredBy:n}}catch{return{needed:!1,declaredBy:`${n} \u2014 off-contract, so it names no lane under the home`}}}function rFt(e){let t=[T8r(e),B8r(e),D8r(e),P8r(e)],r=t.filter(o=>o.verdict!=="ok");return{verdict:r.some(o=>o.verdict==="missing")?"missing":r.length>0?"degraded":"ok",rows:t,findings:r}}function T8r(e){let t=e.homeNeed??tFt;if(!e.homePresent)return t.needed?{check:"home",verdict:"missing",evidence:`${e.homePath} does not exist, and it is needed \u2014 ${t.declaredBy}`,fix:ZP}:{check:"home",verdict:"ok",evidence:`${e.homePath} is absent and unneeded \u2014 ${t.declaredBy}; the daemon never reads it`,fix:""};let r=e.homeMode??vX;return r!==vX?{check:"home",verdict:"degraded",evidence:`${e.homePath} is mode ${r.toString(8)}, not owner-only ${vX.toString(8)}`,fix:`${ZP} \u2014 it narrows the home back to owner-only`}:{check:"home",verdict:"ok",evidence:`${e.homePath} (mode ${r.toString(8)})`,fix:""}}function B8r(e){return tS(e.entry)?{check:"daemon-entry",verdict:"ok",evidence:`${e.entry.entry??e.entry.command} (resolved as ${e.entry.source})`,fix:""}:{check:"daemon-entry",verdict:"missing",evidence:`no published redskilled bundle; probed ${e.entry.searched.join(", ")||"nothing"}`,fix:`install or warm the RedSkills bundle for this host, then re-run \`${wb("red-skills-redskilled",["provision"])}\``}}function D8r(e){return e.reachable?{check:"reach",verdict:"ok",evidence:`daemon answered on ${e.socketPath}`,fix:""}:{check:"reach",verdict:"missing",evidence:`no daemon answered on ${e.socketPath}`,fix:`${ZP} \u2014 it starts the daemon and waits for the socket`}}function P8r(e){return{check:"supervisor-unit",verdict:"ok",evidence:e.supervisorUnit==="installed"?"redskilled.service is installed (optional supervision, Restart=on-failure)":e.supervisorUnit==="unsupported"?"optional: this host has no systemd --user session; auto-spawn is the only start path":"optional: not installed; auto-spawn already starts the daemon on first use",fix:""}}async function nFt(e={}){let t=e.env??process.env,r=e.homeDir??eFt(),n=e.paths??DR({env:t}),o=_X(r),[i,s,a]=await Promise.all([F8r(o),oS(n.socketPath),e.homeNeed?Promise.resolve(e.homeNeed):_8r({homeDir:r,projectRoot:e.projectRoot,declaredTarget:e.declaredTarget})]);return{homePath:o,homePresent:i!==void 0,homeMode:i,homeNeed:a,entry:rS(e.entryOverride??{},{env:t,...e.entryLookup}),socketPath:n.socketPath,reachable:s,supervisorUnit:await M8r(L8r(e,t,r),t)}}var O8r="redskilled.service";function N8r(e){return KDe(e,"systemd","user",O8r)}async function M8r(e,t){if(process.platform!=="linux")return"unsupported";try{return await XLt(N8r(e),"utf8"),"installed"}catch{return t.XDG_RUNTIME_DIR?"absent":"unsupported"}}function L8r(e,t,r){return e.configHome??t.XDG_CONFIG_HOME?.trim()??KDe(r,".config")}async function F8r(e){try{return(await v8r(e)).mode&511}catch{return}}Wr();Ht();var oFt="<!-- red:acceptance-criteria-lint v1 -->",Q8r="> *This was generated by AI during triage.*",$8r=/^\s*(?:#{1,6}\s+)?acceptance\s+criteria\s*:?\s*$/i,U8r=/^\s*\*\*acceptance\s+criteria:?\*\*\s*$/i,H8r=/^\s*(?:#{1,6}\s+\S|\*\*[^*]+:?\*\*\s*$)/,W8r=/^\s*(?:[-*+]|\d+[.)])\s+(?:\[[ xX]\]\s*)?(.+?)\s*$/,j8r=[/`[^`]+`/,/\b(?:pnpm|npm|yarn|bun|cargo|go test|pytest|vitest|jest|playwright|make|gh|curl)\b/i,/\b(?:test|tests|fixture|fixtures|snapshot|assert|expect|regression|reproduction|command|workflow)\b/i],G8r=/\b(?:artifact|behavior|body|branch|comment|exit code|field|file|issue|label|output|pr|request|response|route|state|status|stderr|stdout|url|workflow)\b/i,q8r=/\b(?:at least|at most|blocks?|contains?|does not|emits?|equals?|exactly|exits?|fails?|idempotent|leaves?|machine-checkable|no duplicate|only one|prints?|receives?|rejects?|remains?|returns?|routes?|same observable|stays?|without|with no)\b/i,V8r=new Set(["automation","trusted"]);function TX(e){let t=Y8r(e);if(t===void 0)return{ok:!1,reason:"missing acceptance-criteria section",items:[]};let r=K8r(t);if(r.length===0)return{ok:!1,reason:"acceptance-criteria section has no checklist items",items:r};for(let n of r)if(!Z8r(n))return{ok:!1,reason:`acceptance criteria item is not machine-checkable: ${n}`,items:r};return{ok:!0,reason:"ok",items:r}}function z8r(e){return[Q8r,"",oFt,"","`dev triage` kept this issue in `needs-triage` because it is not yet safe for `ready-for-agent`.","",`Missing: ${e.reason}.`,"","Add a machine-checkable acceptance criteria section. Each item should name a verifiable artifact: a test, command, fixture, or pinned observable behavior.","","Template:","","```markdown","## Acceptance criteria","","- [ ] Running `pnpm --filter @reddb-io/dev test -- <focused-test>` passes.","- [ ] The failing fixture demonstrates the behavior before the fix.","- [ ] Re-running the command leaves the same observable state, with no duplicate comments or labels.","```"].join(`
977
+ `),o.length>0?1:0}async function LLt(e,t=process.cwd(),r=process.stdout){let n=await oo(t),o={cwd:n.root},i={cwd:n.root,repo:n.repo},s=Te(await or(n.root),"dev.trunk")||Em;return await _g(o,s).catch(()=>{}),c8r({trunk:s,baseRef:QP(n.remote,s),listBranches:()=>Cf(o,"afk/"),commitsAhead:(a,c)=>xZ(o,a,c),openPullRequests:()=>DU(i)},r)}bt();import{homedir as g5r}from"node:os";import{join as MX,relative as A5r}from"node:path";import{readFile as _Qt,writeFile as vQt}from"node:fs/promises";Po();UR();W8();bt();ln();import{readdir as JDe,readFile as l8r,stat as u8r}from"node:fs/promises";import{join as JP,relative as d8r}from"node:path";var f8r="run the dev durable path migration entrypoint during boot (`red-path-migration`)";function p8r(e,t){let r=d8r(e,t).replace(/\\/g,"/");return r===""?".":r}async function FLt(e){try{return await u8r(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function QLt(e){try{return(await JDe(e)).length>0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function m8r(e){try{return(await JDe(e,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).sort()}catch(t){if(t.code==="ENOENT")return[];throw t}}async function h8r(e){try{return(await JDe(e,{withFileTypes:!0})).map(t=>({name:t.name,isDirectory:t.isDirectory(),isFile:t.isFile()})).sort((t,r)=>t.name.localeCompare(r.name))}catch(t){if(t.code==="ENOENT")return[];throw t}}function iv(e,t,r,n,o,i=f8r){return{path:p8r(e,t),kind:r,verdict:n,reason:o,canonicalFix:i,fixGate:"delegate"}}function g8r(e){if(e===null||typeof e!="object"||Array.isArray(e))throw new Error("castle validation record must be an object");let t={...e};if(t.schema!==Tv)throw new Error(`castle validation schema must be ${Tv}`);if(typeof t.name!="string"||t.name.length===0)throw new Error("castle validation record needs string name");if(t.status!=="passed"&&t.status!=="failed"&&t.status!=="skipped")throw new Error("castle validation status must be passed, failed, or skipped");if(t.command!==void 0&&typeof t.command!="string")throw new Error("castle validation command must be string");for(let r of["exitCode","durationMs"])if(t[r]!==void 0&&typeof t[r]!="number")throw new Error(`castle validation ${r} must be number`);if(t.summary!==void 0&&typeof t.summary!="string")throw new Error("castle validation summary must be string");return t}async function A8r(e,t){let r=[];if(await FLt(t.castleHistory))try{await zS(t.castleHistory)}catch(n){r.push(iv(e,t.castleHistory,"castle-history-invalid","error",`history.toonl is not TOON-decodable as red.castle.history.v1: ${n instanceof Error?n.message:String(n)}`))}if(await FLt(t.castleValidation))try{ii(await l8r(t.castleValidation,"utf8")).map(g8r)}catch(n){r.push(iv(e,t.castleValidation,"castle-validation-invalid","error",`validation.toonl is not TOON-decodable as ${Tv}: ${n instanceof Error?n.message:String(n)}`))}return r}async function $Lt(e,t,r){let n=[],o=r==="worker"?JP(t.castleStateRoot,"workers"):JP(t.castleStateRoot,"supervisors");for(let i of await m8r(o)){let s=JP(o,i,"state.toon");try{let a=await Nm(s);if(!a){n.push(iv(e,s,"castle-snapshot-invalid","error",`${r} snapshot directory is missing state.toon`));continue}xO(a),(a.kind!==r||a.id!==i)&&n.push(iv(e,s,"castle-snapshot-invalid","error",`${r} snapshot must carry kind=${r} and id=${i}`))}catch(a){n.push(iv(e,s,"castle-snapshot-invalid","error",`${r} snapshot is not TOON-decodable as red.castle.state.v1: ${a instanceof Error?a.message:String(a)}`))}}return n}async function y8r(e,t){let r=new Set(["history.toonl","validation.toonl"]),n=new Set(["workers","supervisors"]),o=[];for(let i of await h8r(t.castleStateRoot))i.isFile&&r.has(i.name)||i.isDirectory&&n.has(i.name)||o.push(iv(e,JP(t.castleStateRoot,i.name),"castle-live-artifact","error","live supervisor artifact belongs under .red/tmp/supervisors/default, not the durable castle state lane"));return o}async function ULt(e){let t=zo(JP(e,".red")),r=JP(e,".red","state","afk"),n=await QLt(t.castleStateRoot),o=await QLt(r),i=[];return n&&(i.push(...await y8r(e,t)),i.push(...await A8r(e,t)),i.push(...await $Lt(e,t,"worker")),i.push(...await $Lt(e,t,"supervisor"))),n&&o&&i.push(iv(e,r,"legacy-afk-residue","warn","legacy .red/state/afk contains state alongside the live castle state lane")),i.sort((s,a)=>s.path.localeCompare(a.path)||s.kind.localeCompare(a.kind)),{status:i.some(s=>s.verdict==="error")?"error":i.length>0?"warn":"pass",findings:i,checked:{castleLanePresent:n,legacyLanePresent:o}}}var KP="2.47.0",YP="0.13.0";function HLt(e){return e?.match(/(?:^|\s)v?(\d+\.\d+\.\d+)(?:\s|$|[-+()])/)?.[1]}function WLt(e){let t=/^(\d+)\.(\d+)\.(\d+)$/.exec(e);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:[0,0,0]}function b8r(e,t){let r=WLt(e),n=WLt(t);for(let o=0;o<r.length;o+=1)if(r[o]!==n[o])return r[o]<n[o]?-1:1;return 0}function x8r(e){let t=/^(?:\s*)github-cli(?:\s|$)/m.test(e.toolVersions??""),r=/(?:^|\/)\.?asdf\/shims\/gh$/.test(e.ghPath??"");return t||r?"asdf":e.brewManaged?"brew":e.aptManaged?"apt":e.ghPath?"direct":"unknown"}function IX(e){switch(e){case"asdf":return"asdf install github-cli latest && asdf global github-cli latest && asdf reshim github-cli";case"apt":return"sudo apt-get update && sudo apt-get install --only-upgrade gh";case"brew":return"brew upgrade gh";case"direct":return`replace the gh binary with gh >= ${KP} from https://github.com/cli/cli/releases/latest`;case"unknown":return`install gh >= ${KP} using https://github.com/cli/cli#installation`}}function RX(){let e=`v${YP}`;return`TQ_VERSION=${e} curl -fsSL https://raw.githubusercontent.com/reddb-io/toon/${e}/install.sh | sh`}function GLt(e){let t=x8r(e),r=HLt(e.ghOutput),n=HLt(e.tqOutput),o=[];return r?b8r(r,KP)<0&&o.push({tool:"gh",kind:"outdated",manager:t,reason:`gh ${r} is below required ${KP}`,remediation:IX(t)}):o.push({tool:"gh",kind:"missing",manager:t,reason:`gh is missing; required >= ${KP}`,remediation:IX(t)}),n?(n!==YP||e.tqRecordedVersion!==YP)&&o.push({tool:"tq",kind:"toolchain-drift",manager:"canonical-installer",reason:`tq toolchain drift: required ${YP}, config ${e.tqRecordedVersion??"missing"}, observed ${n}`,remediation:RX()}):o.push({tool:"tq",kind:"missing",manager:"canonical-installer",reason:`tq is missing; required ${YP}`,remediation:RX()}),{rows:[{tool:"gh",version:r??"missing",required:`>=${KP}`,manager:t,verdict:o.some(i=>i.tool==="gh")?"error":"ok"},{tool:"tq",version:n??"missing",required:YP,manager:"canonical-installer",verdict:o.some(i=>i.tool==="tq")?"error":"ok"}],findings:o}}function jLt(e,t){return t.code===0?{tool:e,status:"applied",reason:"command completed"}:{tool:e,status:"failed",reason:`command exited ${t.code}`}}async function qLt(e,t,r){if(!t.fix)return[];let n=[];for(let o of e.findings){if(!t.approved){n.push({tool:o.tool,status:"skipped",reason:"approval required"});continue}if(o.tool==="gh"){if(o.manager==="asdf")n.push(jLt("gh",await r.upgradeGhAsdf()));else{let i=o.manager==="apt"?"sudo-backed apt upgrade is report-only":`${o.manager} gh upgrade is report-only`;n.push({tool:"gh",status:"instruction",reason:i})}continue}n.push(jLt("tq",await r.installTq()))}return n}import{chmod as ETo,mkdir as kTo,readFile as XLt,stat as v8r,writeFile as STo}from"node:fs/promises";import{homedir as eFt}from"node:os";import{dirname as ITo,join as KDe}from"node:path";import{join as E8r}from"node:path";var k8r=[".red","redskilled"],vX=448;function _X(e){return E8r(e,...k8r)}import{join as S8r}from"node:path";Ln();var VLt=["local","tmp","host"],w8r="local",gH="plugins.dev.workspace.target";var YDe=class extends Error{constructor(t){super(t),this.name="WorkspaceConfigError"}};function JLt(e){let t=Sb(e,gH),r=R8r(t??"").trim();return r===""?void 0:r}function YLt(e){let t=(e??"").trim();if(t==="")return{kind:"preset",preset:w8r};let r=VLt.find(n=>n===t.toLowerCase());if(r)return{kind:"preset",preset:r};if(t.startsWith("/")||t==="~"||t.startsWith("~/"))return{kind:"custom",parentDir:t};throw new YDe(`${gH}: unknown workspace target ${JSON.stringify(t)}. Use one of the presets (${VLt.join(", ")}) or an absolute parent directory for Workers.`)}function KLt(e,t){return e.kind==="preset"?e.preset==="host":I8r(C8r(e.parentDir,t),_X(t))}function C8r(e,t){return e==="~"?zLt(t):e.startsWith("~/")?S8r(t,e.slice(2)):zLt(e)}function I8r(e,t){return e===t?!0:t==="/"?e.startsWith("/"):e.startsWith(`${t}/`)}function zLt(e){let t=e.trim();return t.length>1?t.replace(/\/+$/,""):t}function R8r(e){let t=e.trim(),r=/^(["'])(.*)\1$/.exec(t);return r?r[2]:t}nS();AU();var ZP=`run \`/red-setup\` (Section E3 \u2014 execution daemon), or \`${wb("red-skills-redskilled",["provision"])}\` directly`;var tFt={needed:!1,declaredBy:`no ${gH} in view`};async function _8r(e={}){let t=e.homeDir??eFt(),r=e.declaredTarget?.trim();if(r)return ZLt(r,t,"stated on the command line");let n=e.projectRoot?.trim();if(!n)return tFt;let o=KDe(n,".red","config.yaml"),i=await XLt(o,"utf8").catch(()=>{});if(i===void 0)return{needed:!1,declaredBy:`no ${o}`};let s=JLt(i);return s===void 0?{needed:!1,declaredBy:`${o} declares no workspace target (default local)`}:ZLt(s,t,o)}function ZLt(e,t,r){let n=`${gH}: ${e} (${r})`;try{return{needed:KLt(YLt(e),t),declaredBy:n}}catch{return{needed:!1,declaredBy:`${n} \u2014 off-contract, so it names no lane under the home`}}}function rFt(e){let t=[T8r(e),B8r(e),D8r(e),P8r(e)],r=t.filter(o=>o.verdict!=="ok");return{verdict:r.some(o=>o.verdict==="missing")?"missing":r.length>0?"degraded":"ok",rows:t,findings:r}}function T8r(e){let t=e.homeNeed??tFt;if(!e.homePresent)return t.needed?{check:"home",verdict:"missing",evidence:`${e.homePath} does not exist, and it is needed \u2014 ${t.declaredBy}`,fix:ZP}:{check:"home",verdict:"ok",evidence:`${e.homePath} is absent and unneeded \u2014 ${t.declaredBy}; the daemon never reads it`,fix:""};let r=e.homeMode??vX;return r!==vX?{check:"home",verdict:"degraded",evidence:`${e.homePath} is mode ${r.toString(8)}, not owner-only ${vX.toString(8)}`,fix:`${ZP} \u2014 it narrows the home back to owner-only`}:{check:"home",verdict:"ok",evidence:`${e.homePath} (mode ${r.toString(8)})`,fix:""}}function B8r(e){return tS(e.entry)?{check:"daemon-entry",verdict:"ok",evidence:`${e.entry.entry??e.entry.command} (resolved as ${e.entry.source})`,fix:""}:{check:"daemon-entry",verdict:"missing",evidence:`no published redskilled bundle; probed ${e.entry.searched.join(", ")||"nothing"}`,fix:`install or warm the RedSkills bundle for this host, then re-run \`${wb("red-skills-redskilled",["provision"])}\``}}function D8r(e){return e.reachable?{check:"reach",verdict:"ok",evidence:`daemon answered on ${e.socketPath}`,fix:""}:{check:"reach",verdict:"missing",evidence:`no daemon answered on ${e.socketPath}`,fix:`${ZP} \u2014 it starts the daemon and waits for the socket`}}function P8r(e){return{check:"supervisor-unit",verdict:"ok",evidence:e.supervisorUnit==="installed"?"redskilled.service is installed (optional supervision, Restart=on-failure)":e.supervisorUnit==="unsupported"?"optional: this host has no systemd --user session; auto-spawn is the only start path":"optional: not installed; auto-spawn already starts the daemon on first use",fix:""}}async function nFt(e={}){let t=e.env??process.env,r=e.homeDir??eFt(),n=e.paths??DR({env:t}),o=_X(r),[i,s,a]=await Promise.all([F8r(o),oS(n.socketPath),e.homeNeed?Promise.resolve(e.homeNeed):_8r({homeDir:r,projectRoot:e.projectRoot,declaredTarget:e.declaredTarget})]);return{homePath:o,homePresent:i!==void 0,homeMode:i,homeNeed:a,entry:rS(e.entryOverride??{},{env:t,...e.entryLookup}),socketPath:n.socketPath,reachable:s,supervisorUnit:await M8r(L8r(e,t,r),t)}}var O8r="redskilled.service";function N8r(e){return KDe(e,"systemd","user",O8r)}async function M8r(e,t){if(process.platform!=="linux")return"unsupported";try{return await XLt(N8r(e),"utf8"),"installed"}catch{return t.XDG_RUNTIME_DIR?"absent":"unsupported"}}function L8r(e,t,r){return e.configHome??t.XDG_CONFIG_HOME?.trim()??KDe(r,".config")}async function F8r(e){try{return(await v8r(e)).mode&511}catch{return}}Wr();Ht();var oFt="<!-- red:acceptance-criteria-lint v1 -->",Q8r="> *This was generated by AI during triage.*",$8r=/^\s*(?:#{1,6}\s+)?acceptance\s+criteria\s*:?\s*$/i,U8r=/^\s*\*\*acceptance\s+criteria:?\*\*\s*$/i,H8r=/^\s*(?:#{1,6}\s+\S|\*\*[^*]+:?\*\*\s*$)/,W8r=/^\s*(?:[-*+]|\d+[.)])\s+(?:\[[ xX]\]\s*)?(.+?)\s*$/,j8r=[/`[^`]+`/,/\b(?:pnpm|npm|yarn|bun|cargo|go test|pytest|vitest|jest|playwright|make|gh|curl)\b/i,/\b(?:test|tests|fixture|fixtures|snapshot|assert|expect|regression|reproduction|command|workflow)\b/i],G8r=/\b(?:artifact|behavior|body|branch|comment|exit code|field|file|issue|label|output|pr|request|response|route|state|status|stderr|stdout|url|workflow)\b/i,q8r=/\b(?:at least|at most|blocks?|contains?|does not|emits?|equals?|exactly|exits?|fails?|idempotent|leaves?|machine-checkable|no duplicate|only one|prints?|receives?|rejects?|remains?|returns?|routes?|same observable|stays?|without|with no)\b/i,V8r=new Set(["automation","trusted"]);function TX(e){let t=Y8r(e);if(t===void 0)return{ok:!1,reason:"missing acceptance-criteria section",items:[]};let r=K8r(t);if(r.length===0)return{ok:!1,reason:"acceptance-criteria section has no checklist items",items:r};for(let n of r)if(!Z8r(n))return{ok:!1,reason:`acceptance criteria item is not machine-checkable: ${n}`,items:r};return{ok:!0,reason:"ok",items:r}}function z8r(e){return[Q8r,"",oFt,"","`dev triage` kept this issue in `needs-triage` because it is not yet safe for `ready-for-agent`.","",`Missing: ${e.reason}.`,"","Add a machine-checkable acceptance criteria section. Each item should name a verifiable artifact: a test, command, fixture, or pinned observable behavior.","","Template:","","```markdown","## Acceptance criteria","","- [ ] Running `pnpm --filter @reddb-io/dev test -- <focused-test>` passes.","- [ ] The failing fixture demonstrates the behavior before the fix.","- [ ] Re-running the command leaves the same observable state, with no duplicate comments or labels.","```"].join(`
978
978
  `)}function J8r(e){return e.find(t=>t.body.includes(oFt)?V8r.has(String(t.sourceTrust??"")):!1)}function iFt(e,t){let r=z8r(t),n=J8r(e);return n?n.body===r?{action:"none",id:n.id,body:r}:{action:"update",id:n.id,body:r}:{action:"create",body:r}}function Y8r(e){let t=e.split(/\r?\n/),r=t.findIndex(i=>$8r.test(i)||U8r.test(i));if(r<0)return;let n=t.slice(r+1),o=n.findIndex(i=>H8r.test(i));return(o<0?n:n.slice(0,o)).join(`
979
979
  `)}function K8r(e){return e.split(/\r?\n/).map(t=>W8r.exec(t)?.[1]?.trim()).filter(t=>!!t)}function Z8r(e){return j8r.some(t=>t.test(e))?!0:G8r.test(e)&&q8r.test(e)}function sFt(e,t={}){let r=t.transportFailures??[];if(r.length>0)return{row:{check:"executable-acceptance-criteria",verdict:"error",evidence:`candidate-list-unavailable: ${r.join("; ")}`,fixHome:"\u2192 /triage"},checked:{candidates:0},findings:[{issue:0,verdict:"error",reason:`could not list ready-for-agent candidates: ${r.join("; ")}`,remediation:"restore GitHub issue visibility, then re-run /red-doctor"}]};let n=e.filter(i=>i.labels.includes(We)).filter(i=>!i.labels.includes(Gg)).slice().sort((i,s)=>i.number-s.number),o=[];for(let i of n){let s=TX(i.body);s.ok||o.push({issue:i.number,verdict:"warn",reason:s.reason,remediation:"refresh ## Acceptance criteria with machine-checkable checklist items, then let /triage re-run readiness"})}return{row:{check:"executable-acceptance-criteria",verdict:o.length===0?"ok":"warn",evidence:o.length===0?`${n.length} executable candidates passed acceptance-criteria lint`:o.map(i=>`#${i.issue} ${i.reason}`).join("; "),fixHome:"\u2192 /triage"},checked:{candidates:n.length},findings:o}}Wr();var X8r="\u2192 /red-doctor --fix",eZr="declare the type in .red/config.yaml under plugins.dev.afk.labels.hitl_types (red-doctor --fix --yes merges it)";function XP(e,t,r,n,o=null){return{row:{check:"hitl-type-declaration",verdict:e,evidence:t,fixHome:X8r},checked:n,findings:r,plan:o}}function aFt(e){let t=e.transportFailures??[];if(t.length>0)return XP("error",`label-list-unavailable: ${t.join("; ")}`,[{label:"",verdict:"error",reason:`could not list the tracker's labels: ${t.join("; ")}`,remediation:"restore GitHub label visibility, then re-run /red-doctor"}],{installedTypeLabels:0,declaredTypes:0});if(e.installedLabels===null)return XP("ok","no issue tracker configured; nothing installs type labels here",[],{installedTypeLabels:0,declaredTypes:0});let r=fH(e.installedLabels),n;try{n=IDe(ow(e.configText??""))}catch(c){let l=c instanceof Error?c.message:String(c);return XP("error",`.red/config.yaml does not parse (${l}); the declaration cannot be read or written`,[{label:"",verdict:"error",reason:`.red/config.yaml does not parse (${l})`,remediation:"repair the YAML syntax, then re-run /red-doctor"}],{installedTypeLabels:r.length,declaredTypes:0})}let o={installedTypeLabels:r.length,declaredTypes:n.length};if(r.length===0)return XP("ok","no HUMAN-ONLY type label is installed; nothing to declare",[],o);let i=r.filter(c=>!n.includes(c));if(i.length===0)return XP("ok",`${r.length} HUMAN-ONLY type labels are declared in afk.labels.hitl_types`,[],o);let s=e.configText===null?null:vDe(e.configText,i),a=s===null?"run /red-setup to create .red/config.yaml, then re-run /red-doctor --fix":eZr;return XP("warn",`${i.join(", ")} installed but undeclared in afk.labels.hitl_types; unblocked Tickets of these types would route to the autonomous queue`,i.map(c=>({label:c,verdict:"warn",reason:`the ${c} label exists but afk.labels.hitl_types does not name it`,remediation:a})),o,s?.changed?s:null)}async function cFt(e,t,r){return t.fix?e.plan?(await r.showDiffPreview?.(e.plan.diff),t.approved?(await r.writeConfig(e.plan.after),{status:"applied",evidence:`declared ${e.plan.added.join(", ")} in afk.labels.hitl_types`}):{status:"declined",evidence:"approval required (--yes)"}):{status:"noop",evidence:"no declaration merge is available"}:{status:"noop",evidence:"diagnose-only run"}}import{existsSync as NX,readdirSync as OZr,readFileSync as NZr,statSync as yQt}from"node:fs";import{homedir as MZr}from"node:os";import{join as ps}from"node:path";fm();Wr();var ro=e=>({name:e,mutable:!1}),Mr=e=>({name:e,mutable:!0}),lFt={pre_session:{context:[Mr("runner"),Mr("worker_id"),Mr("filter"),Mr("iter_cap")],exit:"abort"},pre_pick:{context:[Mr("label"),Mr("state"),Mr("limit"),ro("filter")],exit:"abort"},post_pick:{context:[Mr("issues[]")],exit:"continue"},pre_worktree:{context:[Mr("issue"),Mr("target"),Mr("env"),ro("branch")],exit:"abort"},pre_attempt:{context:[Mr("issue"),Mr("workspace"),Mr("attempt_n"),ro("runner")],exit:"abort"},post_attempt:{context:[Mr("issue"),Mr("workspace"),Mr("result"),Mr("attempt_n")],exit:"continue"},pre_feedback:{context:[Mr("issue"),Mr("workspace"),Mr("scopes[]")],exit:"abort"},on_baseline_probe:{context:[ro("issue"),ro("workspace"),ro("ok"),ro("inconclusive[]")],exit:"continue"},on_feedback_classify:{context:[ro("issue"),ro("workspace"),Mr("class")],exit:"continue"},post_feedback:{context:[Mr("issue"),Mr("workspace"),Mr("result")],exit:"continue"},pre_merge:{context:[Mr("issue"),Mr("workspace"),Mr("diff"),ro("branch")],exit:"abort"},post_merge:{context:[Mr("issue"),Mr("workspace"),Mr("merge_commit")],exit:"continue"},on_attempt_error:{context:[Mr("issue"),Mr("workspace"),Mr("error"),Mr("attempt_n")],exit:"continue"},on_recovery_decision:{context:[ro("issue"),Mr("decision"),ro("reason"),ro("attempt_n")],exit:"continue"},on_blocked:{context:[ro("issue"),ro("blocked_label"),ro("reason"),ro("attempt_n")],exit:"continue"},on_reconcile:{context:[ro("issue"),ro("workspace"),ro("attempt_n"),ro("outcome")],exit:"continue"},on_idle:{context:[ro("stats")],exit:"continue"},on_heartbeat:{context:[ro("issue"),ro("workspace"),ro("runner"),ro("attempt_n"),ro("vitals")],exit:"continue"},post_session:{context:[Mr("runner"),Mr("worker_id"),Mr("stats")],exit:"continue"},on_session_error:{context:[ro("error")],exit:"continue"}};var tZr=new Set(["npm","pnpm","yarn","bun"]);function rZr(e){return e.includes("://")?!1:e.includes("/")?!0:/\.(sh|mjs|cjs|js|ts|py|rb)$/.test(e)}function nZr(e){let t=e.trim().split(/\s+/).filter(Boolean),r=0;for(;r<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[r]);)r++;return t.slice(r)}function uFt(e,t){let r=(s,a)=>({command:e,verdict:s,reason:a}),n=nZr(e);if(n.length===0)return r("warn","empty command after env prefix");let o=n[0];if(tZr.has(o)){let s=n[1]==="run",a=s?n[2]:n[1];return a!==void 0&&/^[A-Za-z0-9:_-]+$/.test(a)?t.packageScripts.has(a)?r("ok",`package.json script "${a}" exists`):s?r("error",`package.json has no script "${a}"`):r("warn",`cannot resolve "${o} ${a}" statically`):r("warn",`cannot resolve "${o}" invocation statically`)}if(o.startsWith("red-"))return t.libraryScripts.has(o)?r("ok",`library hook "${o}" resolves`):r("error",`no library/shadow hook named "${o}"`);let i=n.find(rZr);return i!==void 0?t.fileExists(i)?r("ok",`file "${i}" exists`):r("error",`file "${i}" does not exist`):r("warn",`cannot statically resolve "${o}" (PATH binary?)`)}function ZDe(e){let t=new Set(zR);return e.filter(r=>!t.has(r))}function dFt(e,t){return{backpressure:(e.backpressure??[]).map(r=>uFt(r,t)),hooks:(e.hookCommands??[]).map(({hook:r,command:n})=>({hook:r,finding:uFt(n,t)})),unknownHooks:ZDe(e.declaredHookNames??[])}}bt();var AH="re-trigger the launcher fetch (red-fetch.mjs <plugin> <version>) or rebuild locally";function oZr(e,t){let r=e.split("."),n=t.split("."),o=Math.max(r.length,n.length);for(let i=0;i<o;i++){let s=Number.parseInt(r[i]??"0",10)||0,a=Number.parseInt(n[i]??"0",10)||0;if(s!==a)return s<a?-1:1}return 0}function iZr(e){let t=(n,o,i)=>({verdict:n,finding:i,row:{plugin:e.plugin,enabled:e.enabled,state:o,verdict:n}});if(!e.enabled)return t("skip","disabled");let r=(n,o,i,s)=>({plugin:e.plugin,kind:n,verdict:o,reason:i,remediation:s,fixGate:"confirm"});return e.cache.kind==="absent"?t("error","missing",r("runtime-missing","error",`enabled but runtime missing \u2014 no cached bundle for ${e.plugin}@${e.installedVersion}`,AH)):e.cache.kind==="inert"?t("error","inert",r("inert-marker","error",`enabled but runtime inert \u2014 a failed fetch left an inert marker for ${e.plugin}`,AH)):e.cache.readable?e.cache.checksumOk?e.latestVersion!==void 0&&oZr(e.cache.version,e.latestVersion)<0?t("warn","stale",r("version-drift","warn",`cached ${e.plugin} bundle ${e.cache.version} is behind latest release ${e.latestVersion}`,AH)):t("ok","ready"):t("error","corrupt",r("cache-corrupt","error",`cached ${e.plugin} bundle failed checksum verification (corrupt)`,AH)):t("error","corrupt",r("cache-corrupt","error",`cached ${e.plugin} bundle is unreadable`,AH))}function fFt(e){let t=[],r=[];for(let n of e){let{finding:o,row:i}=iZr(n);r.push(i),o&&t.push(o)}return{findings:t,rows:r}}bt();function sZr(e,t){return e==="tq"?`install pinned tq with: TQ_VERSION=${t.tag} curl -fsSL https://raw.githubusercontent.com/reddb-io/toon/${t.tag}/install.sh | sh`:`install pinned ${e} version ${t.version}`}function aZr(e){let t=e.name,r=e.catalog.version,n=e.recordedVersion??"missing",o=e.observedVersion??"missing",i=(s,a)=>({binary:t,kind:s,verdict:"error",reason:a,remediation:sZr(t,e.catalog)});return e.recordedVersion!==r||e.observedVersion!==void 0&&e.observedVersion!==r?{finding:i("toolchain-drift",`required host binary ${t} toolchain drift: catalog pin ${r}, config pin ${n}, observed ${t} ${o}`),row:{binary:t,catalog:r,recorded:n,observed:o,verdict:"error"}}:e.observedVersion?{row:{binary:t,catalog:r,recorded:n,observed:o,verdict:"ok"}}:{finding:i("missing",`required host binary ${t} is missing`),row:{binary:t,catalog:r,recorded:n,observed:o,verdict:"error"}}}function pFt(e){let t=[],r=[];for(let n of e){let o=aZr(n);r.push(o.row),o.finding&&t.push(o.finding)}return{findings:t,rows:r}}bt();var BX="red-skills",DX="reddb-io/red-skills";function cZr(e,t=BX){return`${e} plugin marketplace remove ${t} && ${e} plugin marketplace add ${DX}`}function lZr(e){switch(e.trim().toLowerCase()){case"github":return"github";case"git":return"git";case"directory":case"local":case"path":return"directory";default:return"unknown"}}function mFt(e,t){if(e===void 0)return{kind:"unknown"};let r=!1;for(let n of e.split(/\r?\n/)){let o=n.replace(/^[\s❯>*•-]+/u,"").trimEnd();if(o.length===0)continue;let i=/^Source:\s*([A-Za-z]+)\s*(?:\(([^)]*)\))?/.exec(o);if(i){if(!r)continue;let s=lZr(i[1]),a=i[2]?.trim();return a?{kind:s,detail:a}:{kind:s}}r=o===t}return{kind:"absent"}}function uZr(e){let{host:t,marketplace:r}=e,n=e.detail??"\u2014";return e.hostPresent?e.kind==="directory"?{finding:{host:t,marketplace:r,kind:"frozen-directory-source",verdict:"error",reason:`${t} marketplace ${r} is Directory-sourced (${n}); the update flow re-reads that install-day snapshot and can never advance the plugins`,remediation:cZr(t,r)},row:{host:t,marketplace:r,source:e.kind,detail:n,verdict:"error"}}:e.kind==="unknown"?{finding:{host:t,marketplace:r,kind:"source-unknown",verdict:"warn",reason:`${t} marketplace ${r} source could not be read`,remediation:`${t} plugin marketplace list`},row:{host:t,marketplace:r,source:e.kind,detail:n,verdict:"warn"}}:{row:{host:t,marketplace:r,source:e.kind,detail:n,verdict:"ok"}}:{row:{host:t,marketplace:r,source:"absent",detail:"host not installed",verdict:"ok"}}}function hFt(e){let t=[],r=[];for(let n of e){let o=uZr(n);r.push(o.row),o.finding&&t.push(o.finding)}return{findings:t,rows:r}}async function gFt(e,t,r){if(!t.fix)return[];let n=[];for(let o of e.findings){let{host:i,marketplace:s}=o;if(o.kind!=="frozen-directory-source"){n.push({host:i,marketplace:s,status:"skipped",reason:"source could not be read"});continue}if(!t.approved){n.push({host:i,marketplace:s,status:"skipped",reason:"approval required"});continue}let a=await r.repoint(i,s);n.push(a.code===0?{host:i,marketplace:s,status:"applied",reason:`re-registered from ${DX}`}:{host:i,marketplace:s,status:"failed",reason:`repoint exited ${a.code}`})}return n}bt();var eO="--session-mcp",dZr="restart the session, or run /reload-plugins, to load the plugin's declared MCP servers",fZr=`re-run with ${eO} "<the MCP servers this session sees, or none>"`;function pZr(e){let t=e.trim(),r=/^mcp__(.+)$/.exec(t);if(!r)return t;let n=r[1],o=n.indexOf("__");return o===-1?n:n.slice(0,o)}function XDe(e){let t=e.trim();return t===""||t.toLowerCase()==="none"?[]:t.split(/[\s,]+/).map(r=>r.trim()).filter(r=>r.length>0)}function AFt(e,t){return t.some(r=>r===e||r.endsWith(`_${e}`)||r.endsWith(`-${e}`)||r.endsWith(`:${e}`))}function mZr(e){let{plugin:t}=e,r=[...e.declared],n=e.declarationSource??"\u2014";if(r.length===0)return{row:{plugin:t,declared:r,loaded:[],missing:[],source:n,verdict:"ok"}};if(e.sessionServers===null)return{finding:{plugin:t,kind:"session-unobserved",verdict:"warn",missing:r,reason:`${t} declares ${r.join(", ")} in ${n} and this run was not told which MCP servers the session sees, so the load state is unknown`,remediation:fZr},row:{plugin:t,declared:r,loaded:[],missing:r,source:n,verdict:"warn"}};let o=e.sessionServers.map(pZr).filter(c=>c.length>0),i=r.filter(c=>AFt(c,o)),s=r.filter(c=>!AFt(c,o));if(s.length===0)return{row:{plugin:t,declared:r,loaded:i,missing:s,source:n,verdict:"ok"}};let a=i.length===0;return{finding:{plugin:t,kind:a?"declared-unloaded":"partially-loaded",verdict:a?"error":"warn",missing:s,reason:a?`${t} declares ${r.join(", ")} in ${n} and the session sees none of them \u2014 a plugin installed or updated mid-session has its declaration written and its server processes never started`:`${t} declares ${r.join(", ")} in ${n} and the session is missing ${s.join(", ")}`,remediation:dZr},row:{plugin:t,declared:r,loaded:i,missing:s,source:n,verdict:a?"error":"warn"}}}function yFt(e){let t=[],r=[];for(let n of e){let o=mZr(n);r.push(o.row),o.finding&&t.push(o.finding)}return{findings:t,rows:r}}import{existsSync as EZr,readFileSync as kZr}from"node:fs";import{dirname as SZr,join as aQt,parse as wZr}from"node:path";function hZr(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var uc={},PX={},pS={},bFt;function yH(){if(bFt)return pS;bFt=1;function e(s){return typeof s>"u"||s===null}function t(s){return typeof s=="object"&&s!==null}function r(s){return Array.isArray(s)?s:e(s)?[]:[s]}function n(s,a){if(a){let c=Object.keys(a);for(let l=0,u=c.length;l<u;l+=1){let d=c[l];s[d]=a[d]}}return s}function o(s,a){let c="";for(let l=0;l<a;l+=1)c+=s;return c}function i(s){return s===0&&Number.NEGATIVE_INFINITY===1/s}return pS.isNothing=e,pS.isObject=t,pS.toArray=r,pS.repeat=o,pS.isNegativeZero=i,pS.extend=n,pS}var ePe,xFt;function bH(){if(xFt)return ePe;xFt=1;function e(r,n){let o="",i=r.reason||"(unknown reason)";return r.mark?(r.mark.name&&(o+='in "'+r.mark.name+'" '),o+="("+(r.mark.line+1)+":"+(r.mark.column+1)+")",!n&&r.mark.snippet&&(o+=`
980
980
 
@@ -1007,7 +1007,7 @@ ${e.note}`:`Drift detected (\`${e.signal}\`) on attempt ${r}. ${e.reason}`;retur
1007
1007
  `+_.slice(de,ke),de=ke+1),me=qe;return Ve+=`
1008
1008
  `,_.length-de>Z&&me>de?Ve+=_.slice(de,me)+`
1009
1009
  `+_.slice(me+1):Ve+=_.slice(de),Ve.slice(1)}function oa(_){let Z="",Ee=0;for(let ue=0;ue<_.length;Ee>=65536?ue+=2:ue++){Ee=Zt(_,ue);let de=v[Ee];!de&&Ct(Ee)?(Z+=_[ue],Ee>=65536&&(Z+=_[ue+1])):Z+=de||$(Ee)}return Z}function Mb(_,Z,Ee){let ue="",de=_.tag;for(let ke=0,me=Ee.length;ke<me;ke+=1){let qe=Ee[ke];_.replacer&&(qe=_.replacer.call(Ee,String(ke),qe)),(le(_,Z,qe,!1,!1)||typeof qe>"u"&&le(_,Z,null,!1,!1))&&(ue!==""&&(ue+=","+(_.condenseFlow?"":" ")),ue+=_.dump)}_.tag=de,_.dump="["+ue+"]"}function hS(_,Z,Ee,ue){let de="",ke=_.tag;for(let me=0,qe=Ee.length;me<qe;me+=1){let Ve=Ee[me];_.replacer&&(Ve=_.replacer.call(Ee,String(me),Ve)),(le(_,Z+1,Ve,!0,!0,!1,!0)||typeof Ve>"u"&&le(_,Z+1,null,!0,!0,!1,!0))&&((!ue||de!=="")&&(de+=Ke(_,Z)),_.dump&&a===_.dump.charCodeAt(0)?de+="-":de+="- ",de+=_.dump)}_.tag=ke,_.dump=de||"[]"}function Lb(_,Z,Ee){let ue="",de=_.tag,ke=Object.keys(Ee);for(let me=0,qe=ke.length;me<qe;me+=1){let Ve="";ue!==""&&(Ve+=", "),_.condenseFlow&&(Ve+='"');let at=ke[me],It=Ee[at];_.replacer&&(It=_.replacer.call(Ee,at,It)),le(_,Z,at,!1,!1)&&(_.dump.length>1024&&(Ve+="? "),Ve+=_.dump+(_.condenseFlow?'"':"")+":"+(_.condenseFlow?"":" "),le(_,Z,It,!1,!1)&&(Ve+=_.dump,ue+=Ve))}_.tag=de,_.dump="{"+ue+"}"}function b(_,Z,Ee,ue){let de="",ke=_.tag,me=Object.keys(Ee);if(_.sortKeys===!0)me.sort();else if(typeof _.sortKeys=="function")me.sort(_.sortKeys);else if(_.sortKeys)throw new t("sortKeys must be a boolean or a function");for(let qe=0,Ve=me.length;qe<Ve;qe+=1){let at="";(!ue||de!=="")&&(at+=Ke(_,Z));let It=me[qe],_r=Ee[It];if(_.replacer&&(_r=_.replacer.call(Ee,It,_r)),!le(_,Z+1,It,!0,!0,!0))continue;let Vn=_.tag!==null&&_.tag!=="?"||_.dump&&_.dump.length>1024;Vn&&(_.dump&&a===_.dump.charCodeAt(0)?at+="?":at+="? "),at+=_.dump,Vn&&(at+=Ke(_,Z)),le(_,Z+1,_r,!0,Vn)&&(_.dump&&a===_.dump.charCodeAt(0)?at+=":":at+=": ",at+=_.dump,de+=at)}_.tag=ke,_.dump=de||"{}"}function J(_,Z,Ee){let ue=Ee?_.explicitTypes:_.implicitTypes;for(let de=0,ke=ue.length;de<ke;de+=1){let me=ue[de];if((me.instanceOf||me.predicate)&&(!me.instanceOf||typeof Z=="object"&&Z instanceof me.instanceOf)&&(!me.predicate||me.predicate(Z))){if(Ee?me.multi&&me.representName?_.tag=me.representName(Z):_.tag=me.tag:_.tag="?",me.represent){let qe=_.styleMap[me.tag]||me.defaultStyle,Ve;if(n.call(me.represent)==="[object Function]")Ve=me.represent(Z,qe);else if(o.call(me.represent,qe))Ve=me.represent[qe](Z,qe);else throw new t("!<"+me.tag+'> tag resolver accepts not "'+qe+'" style');_.dump=Ve}return!0}}return!1}function le(_,Z,Ee,ue,de,ke,me){_.tag=null,_.dump=Ee,J(_,Ee,!1)||J(_,Ee,!0);let qe=n.call(_.dump),Ve=ue;ue&&(ue=_.flowLevel<0||_.flowLevel>Z);let at=qe==="[object Object]"||qe==="[object Array]",It,_r;if(at&&(It=_.duplicates.indexOf(Ee),_r=It!==-1),(_.tag!==null&&_.tag!=="?"||_r||_.indent!==2&&Z>0)&&(de=!1),_r&&_.usedDuplicates[It])_.dump="*ref_"+It;else{if(at&&_r&&!_.usedDuplicates[It]&&(_.usedDuplicates[It]=!0),qe==="[object Object]")ue&&Object.keys(_.dump).length!==0?(b(_,Z,_.dump,de),_r&&(_.dump="&ref_"+It+_.dump)):(Lb(_,Z,_.dump),_r&&(_.dump="&ref_"+It+" "+_.dump));else if(qe==="[object Array]")ue&&_.dump.length!==0?(_.noArrayIndent&&!me&&Z>0?hS(_,Z-1,_.dump,de):hS(_,Z,_.dump,de),_r&&(_.dump="&ref_"+It+_.dump)):(Mb(_,Z,_.dump),_r&&(_.dump="&ref_"+It+" "+_.dump));else if(qe==="[object String]")_.tag!=="?"&&no(_,_.dump,Z,ke,Ve);else{if(qe==="[object Undefined]")return!1;if(_.skipInvalid)return!1;throw new t("unacceptable kind of an object to dump "+qe)}if(_.tag!==null&&_.tag!=="?"){let Vn=encodeURI(_.tag[0]==="!"?_.tag.slice(1):_.tag).replace(/!/g,"%21");_.tag[0]==="!"?Vn="!"+Vn:Vn.slice(0,18)==="tag:yaml.org,2002:"?Vn="!!"+Vn.slice(18):Vn="!<"+Vn+">",_.dump=Vn+" "+_.dump}}return!0}function ge(_,Z){let Ee=[],ue=[];ae(_,Ee,ue);let de=ue.length;for(let ke=0;ke<de;ke+=1)Z.duplicates.push(Ee[ue[ke]]);Z.usedDuplicates=new Array(de)}function ae(_,Z,Ee){if(_!==null&&typeof _=="object"){let ue=Z.indexOf(_);if(ue!==-1)Ee.indexOf(ue)===-1&&Ee.push(ue);else if(Z.push(_),Array.isArray(_))for(let de=0,ke=_.length;de<ke;de+=1)ae(_[de],Z,Ee);else{let de=Object.keys(_);for(let ke=0,me=de.length;ke<me;ke+=1)ae(_[de[ke]],Z,Ee)}}}function ve(_,Z){Z=Z||{};let Ee=new pe(Z);Ee.noRefs||ge(_,Ee);let ue=_;return Ee.replacer&&(ue=Ee.replacer.call({"":ue},"",ue)),le(Ee,0,ue,!0,!0)?Ee.dump+`
1010
- `:""}return EPe.dump=ve,EPe}var WFt;function bZr(){if(WFt)return uc;WFt=1;let e=AZr(),t=yZr();function r(n,o){return function(){throw new Error("Function yaml."+n+" is removed in js-yaml 4. Use yaml."+o+" instead, which is now safe by default.")}}return uc.Type=el(),uc.Schema=jFt(),uc.FAILSAFE_SCHEMA=zFt(),uc.JSON_SCHEMA=XFt(),uc.CORE_SCHEMA=eQt(),uc.DEFAULT_SCHEMA=kPe(),uc.load=e.load,uc.loadAll=e.loadAll,uc.dump=t.dump,uc.YAMLException=bH(),uc.types={binary:nQt(),float:ZFt(),map:VFt(),null:JFt(),pairs:iQt(),set:sQt(),timestamp:tQt(),bool:YFt(),int:KFt(),merge:rQt(),omap:oQt(),seq:qFt(),str:GFt()},uc.safeLoad=r("safeLoad","load"),uc.safeLoadAll=r("safeLoadAll","loadAll"),uc.safeDump=r("safeDump","dump"),uc}var xZr=bZr(),SPe=hZr(xZr),{Type:KTo,Schema:ZTo,FAILSAFE_SCHEMA:XTo,JSON_SCHEMA:eBo,CORE_SCHEMA:tBo,DEFAULT_SCHEMA:rBo,load:nBo,loadAll:oBo,dump:iBo,YAMLException:sBo,types:aBo,safeLoad:cBo,safeLoadAll:lBo,safeDump:uBo}=SPe;var wPe="@reddb-io/toon",CZr=/^\d+\.\d+\.\d+$/;var cQt=[{name:"red-doctor.runtime.host-toolchain-pin",path:"apps/dev/src/core/host-toolchain-doctor.ts",form:"version",pattern:/TQ_PINNED_VERSION = "(\d+\.\d+\.\d+)"/},{name:"workflow.red-workspace-ci.tq-install-version",path:".github/workflows/red-workspace-ci.yml",form:"tag",pattern:/TQ_VERSION:\s+(v\d+\.\d+\.\d+)/},{name:"workflow.red-rsp-benchmark-ci.tq-install-version",path:".github/workflows/red-rsp-benchmark-ci.yml",form:"tag",pattern:/TQ_VERSION:\s+(v\d+\.\d+\.\d+)/},{name:"red-setup.interview.tq-install-env",path:"plugins/dev/skills/engineering/red-setup/INTERVIEW.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-setup.interview.tq-install-url",path:"plugins/dev/skills/engineering/red-setup/INTERVIEW.md",form:"tag",pattern:/raw\.githubusercontent\.com\/reddb-io\/toon\/(v\d+\.\d+\.\d+)\/install\.sh/},{name:"red-setup.interview.installed-version",path:"plugins/dev/skills/engineering/red-setup/INTERVIEW.md",form:"version",pattern:/The installed version must be `(\d+\.\d+\.\d+)`/},{name:"red-setup.reference.tq-install-env",path:"plugins/dev/skills/engineering/red-setup/REFERENCE.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-setup.reference.host-binary-check",path:"plugins/dev/skills/engineering/red-setup/REFERENCE.md",form:"version",pattern:/pinned to `(\d+\.\d+\.\d+)`/},{name:"red-setup.write-contract.host-binary-record",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"version",pattern:/host_binaries\.tq\.version: (\d+\.\d+\.\d+)/},{name:"red-setup.write-contract.tq-install-env",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-setup.write-contract.tq-install-url",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"tag",pattern:/raw\.githubusercontent\.com\/reddb-io\/toon\/(v\d+\.\d+\.\d+)\/install\.sh/},{name:"red-setup.write-contract.verify-version",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"version",pattern:/`tq --version` reports `(\d+\.\d+\.\d+)`/},{name:"red-setup.write-contract.config-record",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"version",pattern:/\n\s+version: (\d+\.\d+\.\d+)/},{name:"red-setup.config-template.host-binary-record",path:"plugins/dev/skills/engineering/red-setup/config-template.yaml",form:"version",pattern:/\n\s+version: (\d+\.\d+\.\d+)/},{name:"red-doctor.skill.host-binary-pin",path:"plugins/dev/skills/engineering/red-doctor/SKILL.md",form:"version",pattern:/host_binaries\.tq\.version` \(pin `(\d+\.\d+\.\d+)`\)/},{name:"red-doctor.skill.remediation-env",path:"plugins/dev/skills/engineering/red-doctor/SKILL.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-doctor.skill.remediation-url",path:"plugins/dev/skills/engineering/red-doctor/SKILL.md",form:"tag",pattern:/raw\.githubusercontent\.com\/reddb-io\/toon\/(v\d+\.\d+\.\d+)\/install\.sh/}];function CPe(e=process.cwd()){let t=e;for(;;){if(EZr(aQt(t,"pnpm-workspace.yaml")))return t;let r=SZr(t);if(r===t||wZr(t).root===t)throw new Error(`could not find pnpm-workspace.yaml from ${e}`);t=r}}function IZr(e){let r=SPe.load(e)?.catalog?.[wPe];if(typeof r!="string"||!CZr.test(r))throw new Error(`pnpm catalog entry ${wPe} must be an x.y.z version`);return{packageName:wPe,version:r,tag:`v${r}`}}function OX(e=CPe()){return IZr(kZr(aQt(e,"pnpm-workspace.yaml"),"utf8"))}SR();Ht();bt();var lQt="refresh dependency metadata with /triage so native blocked-by edges and req:N labels match";function RZr(e){let t=new Set;for(let r of e)Number.isInteger(r)&&r>0&&t.add(r);return[...t].sort((r,n)=>r-n)}function uQt(e,t){return e.filter(r=>!t.has(r))}function dQt(e){return e.join(" ")}function fQt(e){let t=[],r=[];for(let n of[...e].sort((o,i)=>o.number-i.number)){if(n.labels.includes(Gg))continue;let o=kR(n.labels),i=RZr(n.nativeBlockedBy),s=new Set(o),a=new Set(i);for(let c of uQt(i,s))t.push({ticket:n.number,blocker:c,kind:"native-without-req-label",verdict:"warn",reason:`#${n.number} has native blocked-by #${c} but no req:${c} label`,remediation:lQt});for(let c of uQt(o,a))t.push({ticket:n.number,blocker:c,kind:"req-label-without-native",verdict:"warn",reason:`#${n.number} has req:${c} label but no native blocked-by #${c} edge`,remediation:lQt});r.push({ticket:n.number,reqLabels:dQt(o),nativeBlockedBy:dQt(i),verdict:o.length===i.length&&o.every(c=>a.has(c))?"ok":"warn"})}return t.sort((n,o)=>n.ticket-o.ticket||n.blocker-o.blocker||n.kind.localeCompare(o.kind)),{findings:t,rows:r}}bt();var pQt="update ask-red so the router covers the registered skill set";function vZr(e){let t=e.trim().replace(/^\/+/,"");return t.length>0?t:null}function IPe(e){let t=new Set;for(let r of e){let n=vZr(r);n&&t.add(n)}return[...t].sort((r,n)=>r.localeCompare(n))}function mQt(e){let t=IPe(e.registeredSkills),r=IPe(e.routerSkills),n=new Set(t),o=new Set(r),i=[];for(let a of t)o.has(a)||i.push({skill:a,kind:"missing-from-router",verdict:"warn",reason:`registered skill /${a} is missing from ask-red`,remediation:pQt});for(let a of r)n.has(a)||i.push({skill:a,kind:"stale-router-entry",verdict:"warn",reason:`ask-red routes /${a} but that skill is not registered`,remediation:pQt});let s=IPe([...t,...r]).map(a=>{let c=n.has(a),l=o.has(a);return{skill:a,inRegisteredSet:c,inRouter:l,verdict:c===l?"ok":"warn"}});return{findings:i,rows:s}}bt();var _Zr=new Set(["config.yaml",".gitignore","adr","contexts","agents","contracts","hooks","memory","brain","wiki","state","tmp","researches"]),TZr=new Set(["workers","go-workers","scout-workers","supervisors","monitors","claims","waits","worktrees","logs","scratch","diagnostics","rsp"]),BZr=new Set(["manual","feedback","landing","rebase","cascade","adopt","docs"]),DZr=new Map([["afk-supervisor.state.json",{target:".red/tmp/supervisors/default/state.toon",owner:"dev/AFK supervisor"}],["afk-supervisor.pid",{target:".red/tmp/supervisors/default/afk-supervisor.pid",owner:"dev/AFK supervisor"}],["afk-supervisor.stop",{target:".red/tmp/supervisors/default/afk-supervisor.stop",owner:"dev/AFK supervisor"}],["afk-supervisor.restarts.json",{target:".red/tmp/supervisors/default/restarts.toon",owner:"dev/AFK supervisor"}],["monitor-log-cursors.json",{target:".red/tmp/supervisors/default/monitor-log-cursors.toon",owner:"dev/AFK supervisor"}],["runner-circuit",{target:".red/tmp/supervisors/default/runner-circuit",owner:"dev/AFK supervisor"}],["statusline-cache.json",{target:".red/state/statusline/statusline-cache.toon",owner:"dev/statusline"}],["statusline-repo-cache.json",{target:".red/state/statusline/statusline-repo-cache.toon",owner:"dev/statusline"}],["branch-lock.yaml",{target:".red/state/branch-lock.yaml",owner:"branch lock"}],["red-skills.rdb",{target:".red/state/red-skills.rdb",owner:"shared Repo store"}]]);function hQt(e){return e.replace(/\\/g,"/").replace(/\/+$/,"")}function PZr(e){let t=hQt(e);return t===".red"?[]:t.startsWith(".red/")?t.slice(5).split("/").filter(Boolean):null}function xH(e,t,r,n,o){return{path:e,kind:t,verdict:r,reason:n,target:o}}function gQt(e){let t=[];for(let r of e){let n=hQt(r.path),o=PZr(n);if(o===null||o.length===0)continue;let[i,s,...a]=o;if(i===void 0)continue;if(o.length===1&&r.kind==="dir"&&!_Zr.has(i)){t.push(xH(n,"undocumented-red-root","warn",`${n} is not documented by the ADR 0098 top-level taxonomy`,"extend ADR 0098 or move content into a documented .red tier"));continue}if(i!=="tmp"||s===void 0)continue;if(s==="worktrees"&&a.length===1&&r.kind==="dir"){BZr.has(a[0])||t.push(xH(n,"unknown-tmp-lane","warn",`${n} is not a registered .red/tmp/worktrees lane`,"registered .red/tmp/worktrees lane (or extend ADR 0098)"));continue}if(a.length>0)continue;let c=DZr.get(s);if(c){t.push(xH(n,"durable-state-in-tmp","error",`${n} is durable ${c.owner} state in the disposable tmp tier`,c.target));continue}if(r.kind==="file"){t.push(xH(n,"loose-tmp-file","warn",`${n} is a loose file at the .red/tmp root`,".red/tmp/scratch/"));continue}TZr.has(s)||t.push(xH(n,"unknown-tmp-lane","warn",`${n} is not a registered .red/tmp lane`,"registered .red/tmp lane (or extend ADR 0098)"))}return t.sort((r,n)=>r.path.localeCompare(n.path)||r.kind.localeCompare(n.kind)),{findings:t}}bt();D8();var AQt="land .red docs through the ADR 0092 doc-landing lane",RPe="\u2192 ADR 0092 doc-landing lane";function vPe(e){let t=eP(e),r=B8(t.files);if(t.action==="clean")return{plan:t,row:{check:"unlanded-red-docs",verdict:"ok",evidence:`origin/${t.base} has no unlanded .red docs`,fixHome:RPe},findings:[]};if(t.action==="halt"){let n=t.haltReason??"unknown";return{plan:t,row:{check:"unlanded-red-docs",verdict:"error",evidence:`${n}: ${r}`,fixHome:RPe},findings:[{kind:"landing-blocked",verdict:"error",base:t.base,files:r,reason:`Docs landing is blocked: ${n}`,remediation:AQt}]}}return{plan:t,row:{check:"unlanded-red-docs",verdict:"warn",evidence:r,fixHome:RPe},findings:[{kind:"unlanded-docs",verdict:"warn",base:t.base,files:r,reason:`.red docs are not landed on origin/${t.base}`,remediation:AQt}]}}Po();var LZr=["claude","codex"],bQt=["dev","memory","brain"],FZr=XDt.map(e=>`red-${e}`),QZr={backpressure:[],hooks:[],unknownHooks:[]};function xQt(e){try{return yQt(e).isDirectory()}catch{return!1}}function tO(e){try{return OZr(e)}catch{return[]}}function rO(e){try{return NZr(e,"utf8")}catch{return}}function $Zr(e,t){let r=new Set,n=[];for(let[o,i]of Object.entries(e)){if(!o.startsWith("afk.hooks.")||o.startsWith("afk.hooks.defaults."))continue;let s=o.slice(10).split(".")[0];if(s){r.add(s);for(let a of i.split(`
1010
+ `:""}return EPe.dump=ve,EPe}var WFt;function bZr(){if(WFt)return uc;WFt=1;let e=AZr(),t=yZr();function r(n,o){return function(){throw new Error("Function yaml."+n+" is removed in js-yaml 4. Use yaml."+o+" instead, which is now safe by default.")}}return uc.Type=el(),uc.Schema=jFt(),uc.FAILSAFE_SCHEMA=zFt(),uc.JSON_SCHEMA=XFt(),uc.CORE_SCHEMA=eQt(),uc.DEFAULT_SCHEMA=kPe(),uc.load=e.load,uc.loadAll=e.loadAll,uc.dump=t.dump,uc.YAMLException=bH(),uc.types={binary:nQt(),float:ZFt(),map:VFt(),null:JFt(),pairs:iQt(),set:sQt(),timestamp:tQt(),bool:YFt(),int:KFt(),merge:rQt(),omap:oQt(),seq:qFt(),str:GFt()},uc.safeLoad=r("safeLoad","load"),uc.safeLoadAll=r("safeLoadAll","loadAll"),uc.safeDump=r("safeDump","dump"),uc}var xZr=bZr(),SPe=hZr(xZr),{Type:XTo,Schema:eBo,FAILSAFE_SCHEMA:tBo,JSON_SCHEMA:rBo,CORE_SCHEMA:nBo,DEFAULT_SCHEMA:oBo,load:iBo,loadAll:sBo,dump:aBo,YAMLException:cBo,types:lBo,safeLoad:uBo,safeLoadAll:dBo,safeDump:fBo}=SPe;var wPe="@reddb-io/toon",CZr=/^\d+\.\d+\.\d+$/;var cQt=[{name:"red-doctor.runtime.host-toolchain-pin",path:"apps/dev/src/core/host-toolchain-doctor.ts",form:"version",pattern:/TQ_PINNED_VERSION = "(\d+\.\d+\.\d+)"/},{name:"workflow.red-workspace-ci.tq-install-version",path:".github/workflows/red-workspace-ci.yml",form:"tag",pattern:/TQ_VERSION:\s+(v\d+\.\d+\.\d+)/},{name:"workflow.red-rsp-benchmark-ci.tq-install-version",path:".github/workflows/red-rsp-benchmark-ci.yml",form:"tag",pattern:/TQ_VERSION:\s+(v\d+\.\d+\.\d+)/},{name:"red-setup.interview.tq-install-env",path:"plugins/dev/skills/engineering/red-setup/INTERVIEW.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-setup.interview.tq-install-url",path:"plugins/dev/skills/engineering/red-setup/INTERVIEW.md",form:"tag",pattern:/raw\.githubusercontent\.com\/reddb-io\/toon\/(v\d+\.\d+\.\d+)\/install\.sh/},{name:"red-setup.interview.installed-version",path:"plugins/dev/skills/engineering/red-setup/INTERVIEW.md",form:"version",pattern:/The installed version must be `(\d+\.\d+\.\d+)`/},{name:"red-setup.reference.tq-install-env",path:"plugins/dev/skills/engineering/red-setup/REFERENCE.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-setup.reference.host-binary-check",path:"plugins/dev/skills/engineering/red-setup/REFERENCE.md",form:"version",pattern:/pinned to `(\d+\.\d+\.\d+)`/},{name:"red-setup.write-contract.host-binary-record",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"version",pattern:/host_binaries\.tq\.version: (\d+\.\d+\.\d+)/},{name:"red-setup.write-contract.tq-install-env",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-setup.write-contract.tq-install-url",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"tag",pattern:/raw\.githubusercontent\.com\/reddb-io\/toon\/(v\d+\.\d+\.\d+)\/install\.sh/},{name:"red-setup.write-contract.verify-version",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"version",pattern:/`tq --version` reports `(\d+\.\d+\.\d+)`/},{name:"red-setup.write-contract.config-record",path:"plugins/dev/skills/engineering/red-setup/WRITE-CONTRACT.md",form:"version",pattern:/\n\s+version: (\d+\.\d+\.\d+)/},{name:"red-setup.config-template.host-binary-record",path:"plugins/dev/skills/engineering/red-setup/config-template.yaml",form:"version",pattern:/\n\s+version: (\d+\.\d+\.\d+)/},{name:"red-doctor.skill.host-binary-pin",path:"plugins/dev/skills/engineering/red-doctor/SKILL.md",form:"version",pattern:/host_binaries\.tq\.version` \(pin `(\d+\.\d+\.\d+)`\)/},{name:"red-doctor.skill.remediation-env",path:"plugins/dev/skills/engineering/red-doctor/SKILL.md",form:"tag",pattern:/TQ_VERSION=(v\d+\.\d+\.\d+)/},{name:"red-doctor.skill.remediation-url",path:"plugins/dev/skills/engineering/red-doctor/SKILL.md",form:"tag",pattern:/raw\.githubusercontent\.com\/reddb-io\/toon\/(v\d+\.\d+\.\d+)\/install\.sh/}];function CPe(e=process.cwd()){let t=e;for(;;){if(EZr(aQt(t,"pnpm-workspace.yaml")))return t;let r=SZr(t);if(r===t||wZr(t).root===t)throw new Error(`could not find pnpm-workspace.yaml from ${e}`);t=r}}function IZr(e){let r=SPe.load(e)?.catalog?.[wPe];if(typeof r!="string"||!CZr.test(r))throw new Error(`pnpm catalog entry ${wPe} must be an x.y.z version`);return{packageName:wPe,version:r,tag:`v${r}`}}function OX(e=CPe()){return IZr(kZr(aQt(e,"pnpm-workspace.yaml"),"utf8"))}SR();Ht();bt();var lQt="refresh dependency metadata with /triage so native blocked-by edges and req:N labels match";function RZr(e){let t=new Set;for(let r of e)Number.isInteger(r)&&r>0&&t.add(r);return[...t].sort((r,n)=>r-n)}function uQt(e,t){return e.filter(r=>!t.has(r))}function dQt(e){return e.join(" ")}function fQt(e){let t=[],r=[];for(let n of[...e].sort((o,i)=>o.number-i.number)){if(n.labels.includes(Gg))continue;let o=kR(n.labels),i=RZr(n.nativeBlockedBy),s=new Set(o),a=new Set(i);for(let c of uQt(i,s))t.push({ticket:n.number,blocker:c,kind:"native-without-req-label",verdict:"warn",reason:`#${n.number} has native blocked-by #${c} but no req:${c} label`,remediation:lQt});for(let c of uQt(o,a))t.push({ticket:n.number,blocker:c,kind:"req-label-without-native",verdict:"warn",reason:`#${n.number} has req:${c} label but no native blocked-by #${c} edge`,remediation:lQt});r.push({ticket:n.number,reqLabels:dQt(o),nativeBlockedBy:dQt(i),verdict:o.length===i.length&&o.every(c=>a.has(c))?"ok":"warn"})}return t.sort((n,o)=>n.ticket-o.ticket||n.blocker-o.blocker||n.kind.localeCompare(o.kind)),{findings:t,rows:r}}bt();var pQt="update ask-red so the router covers the registered skill set";function vZr(e){let t=e.trim().replace(/^\/+/,"");return t.length>0?t:null}function IPe(e){let t=new Set;for(let r of e){let n=vZr(r);n&&t.add(n)}return[...t].sort((r,n)=>r.localeCompare(n))}function mQt(e){let t=IPe(e.registeredSkills),r=IPe(e.routerSkills),n=new Set(t),o=new Set(r),i=[];for(let a of t)o.has(a)||i.push({skill:a,kind:"missing-from-router",verdict:"warn",reason:`registered skill /${a} is missing from ask-red`,remediation:pQt});for(let a of r)n.has(a)||i.push({skill:a,kind:"stale-router-entry",verdict:"warn",reason:`ask-red routes /${a} but that skill is not registered`,remediation:pQt});let s=IPe([...t,...r]).map(a=>{let c=n.has(a),l=o.has(a);return{skill:a,inRegisteredSet:c,inRouter:l,verdict:c===l?"ok":"warn"}});return{findings:i,rows:s}}bt();var _Zr=new Set(["config.yaml",".gitignore","adr","contexts","agents","contracts","hooks","memory","brain","wiki","state","tmp","researches"]),TZr=new Set(["workers","go-workers","scout-workers","supervisors","monitors","claims","waits","worktrees","logs","scratch","diagnostics","rsp"]),BZr=new Set(["manual","feedback","landing","rebase","cascade","adopt","docs"]),DZr=new Map([["afk-supervisor.state.json",{target:".red/tmp/supervisors/default/state.toon",owner:"dev/AFK supervisor"}],["afk-supervisor.pid",{target:".red/tmp/supervisors/default/afk-supervisor.pid",owner:"dev/AFK supervisor"}],["afk-supervisor.stop",{target:".red/tmp/supervisors/default/afk-supervisor.stop",owner:"dev/AFK supervisor"}],["afk-supervisor.restarts.json",{target:".red/tmp/supervisors/default/restarts.toon",owner:"dev/AFK supervisor"}],["monitor-log-cursors.json",{target:".red/tmp/supervisors/default/monitor-log-cursors.toon",owner:"dev/AFK supervisor"}],["runner-circuit",{target:".red/tmp/supervisors/default/runner-circuit",owner:"dev/AFK supervisor"}],["statusline-cache.json",{target:".red/state/statusline/statusline-cache.toon",owner:"dev/statusline"}],["statusline-repo-cache.json",{target:".red/state/statusline/statusline-repo-cache.toon",owner:"dev/statusline"}],["branch-lock.yaml",{target:".red/state/branch-lock.yaml",owner:"branch lock"}],["red-skills.rdb",{target:".red/state/red-skills.rdb",owner:"shared Repo store"}]]);function hQt(e){return e.replace(/\\/g,"/").replace(/\/+$/,"")}function PZr(e){let t=hQt(e);return t===".red"?[]:t.startsWith(".red/")?t.slice(5).split("/").filter(Boolean):null}function xH(e,t,r,n,o){return{path:e,kind:t,verdict:r,reason:n,target:o}}function gQt(e){let t=[];for(let r of e){let n=hQt(r.path),o=PZr(n);if(o===null||o.length===0)continue;let[i,s,...a]=o;if(i===void 0)continue;if(o.length===1&&r.kind==="dir"&&!_Zr.has(i)){t.push(xH(n,"undocumented-red-root","warn",`${n} is not documented by the ADR 0098 top-level taxonomy`,"extend ADR 0098 or move content into a documented .red tier"));continue}if(i!=="tmp"||s===void 0)continue;if(s==="worktrees"&&a.length===1&&r.kind==="dir"){BZr.has(a[0])||t.push(xH(n,"unknown-tmp-lane","warn",`${n} is not a registered .red/tmp/worktrees lane`,"registered .red/tmp/worktrees lane (or extend ADR 0098)"));continue}if(a.length>0)continue;let c=DZr.get(s);if(c){t.push(xH(n,"durable-state-in-tmp","error",`${n} is durable ${c.owner} state in the disposable tmp tier`,c.target));continue}if(r.kind==="file"){t.push(xH(n,"loose-tmp-file","warn",`${n} is a loose file at the .red/tmp root`,".red/tmp/scratch/"));continue}TZr.has(s)||t.push(xH(n,"unknown-tmp-lane","warn",`${n} is not a registered .red/tmp lane`,"registered .red/tmp lane (or extend ADR 0098)"))}return t.sort((r,n)=>r.path.localeCompare(n.path)||r.kind.localeCompare(n.kind)),{findings:t}}bt();D8();var AQt="land .red docs through the ADR 0092 doc-landing lane",RPe="\u2192 ADR 0092 doc-landing lane";function vPe(e){let t=eP(e),r=B8(t.files);if(t.action==="clean")return{plan:t,row:{check:"unlanded-red-docs",verdict:"ok",evidence:`origin/${t.base} has no unlanded .red docs`,fixHome:RPe},findings:[]};if(t.action==="halt"){let n=t.haltReason??"unknown";return{plan:t,row:{check:"unlanded-red-docs",verdict:"error",evidence:`${n}: ${r}`,fixHome:RPe},findings:[{kind:"landing-blocked",verdict:"error",base:t.base,files:r,reason:`Docs landing is blocked: ${n}`,remediation:AQt}]}}return{plan:t,row:{check:"unlanded-red-docs",verdict:"warn",evidence:r,fixHome:RPe},findings:[{kind:"unlanded-docs",verdict:"warn",base:t.base,files:r,reason:`.red docs are not landed on origin/${t.base}`,remediation:AQt}]}}Po();var LZr=["claude","codex"],bQt=["dev","memory","brain"],FZr=XDt.map(e=>`red-${e}`),QZr={backpressure:[],hooks:[],unknownHooks:[]};function xQt(e){try{return yQt(e).isDirectory()}catch{return!1}}function tO(e){try{return OZr(e)}catch{return[]}}function rO(e){try{return NZr(e,"utf8")}catch{return}}function $Zr(e,t){let r=new Set,n=[];for(let[o,i]of Object.entries(e)){if(!o.startsWith("afk.hooks.")||o.startsWith("afk.hooks.defaults."))continue;let s=o.slice(10).split(".")[0];if(s){r.add(s);for(let a of i.split(`
1011
1011
  `).map(c=>c.trim()).filter(Boolean))n.push({hook:s,command:a})}}for(let o of tO(t)){if(o.startsWith("."))continue;let i=ps(t,o);if(xQt(i)){r.add(o);for(let s of tO(i))s.startsWith(".")||n.push({hook:o,command:ps(t,o,s)})}}return{declared:[...r].sort((o,i)=>o.localeCompare(i)),commands:n}}function UZr(e,t){let r=ps(e,".red","hooks"),{declared:n,commands:o}=$Zr(t,r),i=new Set,s=rO(ps(e,"package.json"));if(s)try{let f=JSON.parse(s).scripts;for(let p of Object.keys(f??{}))i.add(p)}catch{}let a=new Set(FZr);for(let f of tO(r))f.startsWith("red-")&&a.add(f);let c={packageScripts:i,fileExists:f=>NX(f.startsWith("/")?f:ps(e,f)),libraryScripts:a},l=dFt({backpressure:Yv(t),hookCommands:o,declaredHookNames:n},c),u=new Set(ZDe(n)),d=n.map(f=>({hook:f,exit:u.has(f)?"unknown":lFt[f]?.exit??"unknown",commands:l.hooks.filter(p=>p.hook===f).length}));return{report:l,points:d}}function HZr(e,t){let r=rO(ps(e,"plugins",t,".claude-plugin","plugin.json"));if(r)try{let n=JSON.parse(r).version;return typeof n=="string"&&n.trim()!==""?n.trim():void 0}catch{return}}function WZr(e,t,r){let n=ps(e,`${t}-${r}.bundle.min.mjs`);if(!NX(n)){let o=ps(e,`.staging-${t}-${r}`);return NX(o)?{kind:"inert"}:{kind:"absent"}}try{let o=yQt(n).size;return{kind:"present",version:r,readable:!0,checksumOk:o>0}}catch{return{kind:"present",version:r,readable:!1,checksumOk:!1}}}function jZr(e,t){let r=pb(),n=[],o=[],i="0.0.0-dev";for(let s of bQt){let a=s==="dev"?Tf("dev").version:void 0,c=HZr(e,s)??(a===i?void 0:a);if(!c||!oc(c)){o.push(s);continue}let l=t?WR(t,s):!1,u=nve(s,c);n.push({plugin:s,enabled:l,installedVersion:c,cache:WZr(r,s,c),...u?{latestVersion:u}:{}})}return{report:fFt(n),unresolved:o}}var GZr="reddb-io-red-skills";function qZr(e,t){let r=process.env.CLAUDE_PLUGIN_ROOT??process.env.CODEX_PLUGIN_ROOT;return[ps(e,"plugins",t,".mcp.json"),...r?[ps(r,"..",t,".mcp.json")]:[],ps(MZr(),".claude","plugins","marketplaces",GZr,"plugins",t,".mcp.json")]}function VZr(e){let t=rO(e);if(t)try{let r=JSON.parse(t).mcpServers;return!r||typeof r!="object"?[]:Object.keys(r)}catch{return}}function zZr(e,t,r,n){let o=[];for(let i of bQt){if(!t||!WR(t,i))continue;let s=qZr(e,i).find(c=>NX(c));if(!s){n.push(`mcp load audit skipped for ${i}: no .mcp.json resolved on this host`);continue}let a=VZr(s);if(!a){n.push(`mcp load audit skipped for ${i}: ${s} did not parse`);continue}o.push({plugin:i,declared:a,declarationSource:s,sessionServers:r})}return yFt(o)}function JZr(e){let t=rO(ps(e,"plugins","dev",".claude-plugin","plugin.json"));if(t)try{let r=JSON.parse(t).skills;return Array.isArray(r)?r.map(n=>String(n).replace(/\/+$/,"").split("/").pop()??"").filter(n=>n.length>0):void 0}catch{return}}function YZr(e){let t=e.replace(/^```[\s\S]*?^```/gm,""),r=new Set;for(let n of t.matchAll(/`([^`\n]+)`/g)){let o=/^\/([a-z0-9][a-z0-9-]*)$/.exec(n[1].trim());o&&r.add(o[1])}return[...r].sort((n,o)=>n.localeCompare(o))}function KZr(e){let t=[],r=(s,a)=>{t.push({path:s,kind:xQt(a)?"dir":"file"})},n=ps(e,".red");for(let s of tO(n))r(`.red/${s}`,ps(n,s));let o=ps(n,"tmp");for(let s of tO(o))r(`.red/tmp/${s}`,ps(o,s));let i=ps(o,"worktrees");for(let s of tO(i))r(`.red/tmp/worktrees/${s}`,ps(i,s));return t}async function EQt(e,t={}){let r=[],n=ps(e.root,".red","config.yaml"),o=rO(n),i=or(n,{ignoreActivationGate:!0,warn:()=>{}}),s=QZr,a=[];try{let R=UZr(e.root,i);s=R.report,a=R.points}catch(R){r.push(`hook validation unavailable: ${Pb(R)}`)}let c={findings:[],rows:[]},l=[];try{let R=jZr(e.root,o);c=R.report,l=R.unresolved}catch(R){r.push(`runtime distribution audit unavailable: ${Pb(R)}`)}let u={findings:[],rows:[]};try{let R=OX(e.root),B=await(t.readToolVersion??e5r)("tq"),T=Te(i,"host_binaries.tq.version");u=pFt([{name:"tq",catalog:R,...T?{recordedVersion:T}:{},...B?{observedVersion:B}:{}}])}catch(R){r.push(`host binary pin audit skipped: ${Pb(R)}`)}let d={findings:[],rows:[]};try{let R=t.readMarketplaceList??XZr,B=[];for(let T of LZr){let P=await R(T),O=mFt(P.output,BX);B.push({host:T,hostPresent:P.present,marketplace:BX,kind:O.kind,...O.detail?{detail:O.detail}:{}})}d=hFt(B)}catch(R){r.push(`marketplace source audit unavailable: ${Pb(R)}`)}let f={findings:[],rows:[]};try{f=zZr(e.root,o,t.sessionMcpServers??null,r)}catch(R){r.push(`mcp load audit unavailable: ${Pb(R)}`)}let p={findings:[],rows:[]},h=[];if(e.repo)try{let R=await(t.listDependencyEdges??T_e)({cwd:e.root,repo:e.repo});p=fQt(R.tickets),h=[...R.unread]}catch(R){r.push(`dependency-edge audit unavailable: ${Pb(R)}`)}else r.push("dependency-edge audit skipped: no issue tracker for this repo");let m={findings:[],rows:[]},g=JZr(e.root),y=rO(ps(e.root,"plugins","dev","skills","engineering","ask-red","SKILL.md"));g&&y?m=mQt({registeredSkills:g,routerSkills:YZr(y)}):r.push("ask-red router sync skipped: this repo hosts no dev plugin manifest or router");let x={findings:[]};try{x=gQt(KZr(e.root))}catch(R){r.push(`.red taxonomy audit unavailable: ${Pb(R)}`)}let k=Te(i,"dev.trunk")?.trim()||"main",S=vPe({base:k,files:[]});try{S=vPe(await(t.collectDocsSweep??UU)(e,k))}catch(R){r.push(`unlanded .red docs audit unavailable: ${Pb(R)}`)}let w=mTe(HU(""));try{w=mTe(HU(await(t.readPorcelainStatus??ZZr)(e)))}catch(R){r.push(`uncommitted /red-setup output audit unavailable: ${Pb(R)}`)}return{hooks:s,hookPoints:a,runtime:c,runtimeUnresolved:l,hostBinaries:u,marketplaceSources:d,mcpLoad:f,dependencyEdges:p,dependencyEdgesUnread:h,askRedRouter:m,redTaxonomy:x,unlandedDocs:S,setupOwnedDirt:w,notes:r}}async function ZZr(e){let{execTool:t}=await Promise.resolve().then(()=>(jr(),oA)),r=await t("git",["status","--porcelain"],{cwd:e.root});if(r.code!==0)throw new Error(`git status --porcelain exited ${r.code}`);return r.stdout}async function XZr(e){let{execTool:t}=await Promise.resolve().then(()=>(jr(),oA)),r=await t(e,["plugin","marketplace","list"],{timeoutMs:2e4});return r.code===127?{present:!1}:r.code!==0?{present:!0}:{present:!0,output:r.stdout}}async function e5r(e){let{execTool:t}=await Promise.resolve().then(()=>(jr(),oA)),r=await t(e,["--version"],{});if(r.code===0)return/(\d+\.\d+\.\d+)/.exec(r.stdout)?.[1]}function Pb(e){return e instanceof Error?e.message:String(e)}Ht();var Ob={dangling_claim:"claim_release",red_pr_dead_owner:"retake",superseded_pr:"close_superseded_pr",active_current_blocker:"quarantine",dependency_all_closed:"unblock_sweep",human_queue_age_outlier:"hitl_review",stale_worktree:"worktree_remove"},kQt=["dangling_claim","red_pr_dead_owner","superseded_pr","active_current_blocker","dependency_all_closed","human_queue_age_outlier","stale_worktree"],t5r=/^req:(\d+)$/;function r5r(e){let t=[];for(let r of e){let n=t5r.exec(r);n&&t.push(Number(n[1]))}return t}var _Pe="<!-- red:blocker-state v1 -->",n5r="<!-- /red:blocker-state -->";function o5r(e){let t=e.indexOf(_Pe);if(t<0)return!1;let r=e.indexOf(n5r,t+_Pe.length);if(r<0)return!1;let n=e.slice(t+_Pe.length,r),o={};for(let i of n.split(`
1012
1012
  `)){let s=/^([a-z_]+):\s*(.*)$/.exec(i.trim());s&&(o[s[1]]=s[2].trim())}return o.status==="blocked"&&!!o.summary&&!!o.next}function i5r(e,t){let r=[];for(let n of e.claims)t.has(n.worker)||r.push({deadendClass:"dangling_claim",cure:Ob.dangling_claim,subject:`#${n.issue}`,detail:`claim held by dead worker ${n.worker}`,healTarget:n.issue});return r}function s5r(e,t){let r=[];for(let n of e.prs)!n.checksRed||n.owner.trim()===""||t.has(n.owner)||r.push({deadendClass:"red_pr_dead_owner",cure:Ob.red_pr_dead_owner,subject:`PR #${n.number}`,detail:`failing checks with dead owner ${n.owner}`,healTarget:n.issue});return r}function a5r(e){let t=new Map;for(let n of e.prs){if(n.issue===void 0)continue;let o=t.get(n.issue);o?o.push(n):t.set(n.issue,[n])}let r=[];for(let[n,o]of t){if(o.length<2)continue;let i=o.reduce((s,a)=>a.number>s.number?a:s);for(let s of o)s.number!==i.number&&r.push({deadendClass:"superseded_pr",cure:Ob.superseded_pr,subject:`PR #${s.number}`,detail:`superseded by PR #${i.number} on Ticket #${n}`,healTarget:s.number})}return r}function c5r(e){let t=[];for(let r of e.issues)r.labels.includes(We)&&o5r(r.body)&&t.push({deadendClass:"active_current_blocker",cure:Ob.active_current_blocker,subject:`#${r.number}`,detail:"ready-for-agent Ticket carries an active Current blocker",healTarget:r.number});return t}function l5r(e){let t=[];for(let r of e.issues){if(!r.labels.includes(ia))continue;let n=r5r(r.labels);n.length===0||!n.every(i=>e.issueStates.get(i)==="CLOSED")||t.push({deadendClass:"dependency_all_closed",cure:Ob.dependency_all_closed,subject:`#${r.number}`,detail:`blocked:dependency with all req targets closed (${n.map(i=>`#${i}`).join(", ")})`,healTarget:r.number})}return t}function u5r(e){let t=[];for(let r of e.issues){if(!r.labels.includes(ct)||!r.updatedAt)continue;let n=Date.parse(r.updatedAt);if(!Number.isFinite(n))continue;let o=e.nowMs-n;if(o<=e.humanQueueMaxAgeMs)continue;let i=Math.floor(o/(60*60*1e3));t.push({deadendClass:"human_queue_age_outlier",cure:Ob.human_queue_age_outlier,subject:`#${r.number}`,detail:`ready-for-human for ${i}h, past the age threshold`})}return t}function d5r(e){let t=[];for(let r of e.worktrees)r.live||t.push({deadendClass:"stale_worktree",cure:Ob.stale_worktree,subject:r.path,detail:`stale ${r.lane} worktree with no live owner`});return t}var f5r={dangling_claim:i5r,red_pr_dead_owner:s5r,superseded_pr:e=>a5r(e),active_current_blocker:e=>c5r(e),dependency_all_closed:e=>l5r(e),human_queue_age_outlier:e=>u5r(e),stale_worktree:e=>d5r(e)};function SQt(e){return{generatedAtMs:e,total:0,classes:kQt.map(t=>({deadendClass:t,cure:Ob[t],count:0,findings:[]}))}}function wQt(e){let t=new Set(e.liveWorkers),r=0,n=kQt.map(o=>{let i=f5r[o](e,t);return r+=i.length,{deadendClass:o,cure:Ob[o],count:i.length,findings:i}});return{generatedAtMs:e.nowMs,total:r,classes:n}}var p5r=2*24*60*60*1e3;async function CQt(e,t={}){let[r,n,o,i,s,a]=await Promise.all([e.liveWorkers(),e.openIssues(),e.openPrs(),e.claims(),e.worktrees(),e.issueStates()]);return wQt({nowMs:e.now(),liveWorkers:r,issues:n,prs:o,claims:i,worktrees:s,issueStates:a,humanQueueMaxAgeMs:t.humanQueueMaxAgeMs??p5r})}SR();um();Ht();Po();If();TU();function EH(e){let t=e.toUpperCase();return t==="CLOSED"?"CLOSED":t==="OPEN"?"OPEN":"UNKNOWN"}function IQt(e){let t=Qm(e.map(o=>({id:o.id,body:o.body,createdAt:o.createdAt}))),r=new Map;for(let o of t){let i=r.get(o.worker);(!i||o.commentId>i.commentId)&&r.set(o.worker,{commentId:o.commentId,kind:o.kind})}let n=[];for(let[o,i]of r)i.kind==="claim"&&n.push(o);return n}function m5r(e){return(e.statusCheckRollup??[]).some(r=>{let n=String(r.conclusion??r.state??"").toUpperCase();return n==="FAILURE"||n==="ERROR"||n==="TIMED_OUT"})}async function h5r(e){let t=await LR(e,["pr","list","--repo",e.repo,"--state","open","--limit","200","--json","number,headRefName,statusCheckRollup"]),r=[];for(let n of t){if(!Bg(n))continue;let o=String(n.headRefName??""),i=VRe(o);i!==null&&r.push({number:Number(n.number),issue:i,red:m5r(n)})}return r}async function RQt(e,t={}){let r=await oo(e),n={cwd:r.root,repo:r.repo},o=ir(e);return CQt({now:()=>Date.now(),async liveWorkers(){return(await _f(e)).workers.filter(a=>a.pidLive===!0||a.live===!0).map(a=>a.state.worker_id).filter(a=>typeof a=="string"&&a.length>0)},async openIssues(){let[s,a,c]=await Promise.all([Rf(n),E_e(n),Wl(n)]),l=new Map,u=(f,p,h,m)=>{let g=l.get(f)??{labels:new Set,body:""};for(let y of p)g.labels.add(y);h&&(g.body=h),m&&(g.updatedAt=m),l.set(f,g)};for(let f of s)u(f.number,f.labels,f.body);for(let f of a)u(f.number,f.labels,void 0,f.createdAt??void 0);for(let[f,p]of c)EH(p.state)==="OPEN"&&p.labels.includes(ia)&&u(f,p.labels);let d=[];for(let[f,p]of l)d.push({number:f,labels:[...p.labels],body:p.body,...p.updatedAt?{updatedAt:p.updatedAt}:{}});return d},async openPrs(){let[s,a]=await Promise.all([h5r(n),Wl(n)]),c=new Map,l=[...a].filter(([,d])=>EH(d.state)==="OPEN"&&d.labels.includes(ut));await Promise.all(l.map(async([d])=>{let f=IQt(await bm(n,d));f.length>0&&c.set(d,f[0])}));let u=[];for(let d of s)u.push({number:d.number,issue:d.issue,owner:c.get(d.issue)??"",checksRed:d.red});return u},async claims(){let a=[...await Wl(n)].filter(([,l])=>EH(l.state)==="OPEN"&&l.labels.includes(ut)),c=[];return await Promise.all(a.map(async([l])=>{for(let u of IQt(await bm(n,l)))c.push({issue:l,worker:u})})),c},async worktrees(){let s=await Wl(n),a=await OR(o.tmpDir,Math.floor(Date.now()/1e3),l=>EH(s.get(l)?.state??"UNKNOWN")),c=[];for(let l of a.orphanFeedback.reclaim)c.push({lane:"feedback",path:l.path,live:!1});return c},async issueStates(){let s=await Wl(n),a=new Map;for(let[c,l]of s)a.set(c,EH(l.state));return a}},t)}Ht();jr();function y5r(e,t){let r={fix:!1,json:!1,yes:!1,root:t,sessionMcpServers:null};for(let n=0;n<e.length;n+=1){let o=e[n];if(o==="--fix"){r.fix=!0;continue}if(o===eO){let i=e[++n];if(i===void 0)throw new Error(`${eO} requires a value`);r.sessionMcpServers=XDe(i);continue}if(o.startsWith(`${eO}=`)){r.sessionMcpServers=XDe(o.slice(eO.length+1));continue}if(o==="--json"){r.json=!0;continue}if(o==="--yes"||o==="-y"){r.yes=!0;continue}if(o==="--root"){let i=e[++n];if(!i)throw new Error("--root requires a value");r.root=i;continue}if(o.startsWith("--root=")){r.root=o.slice(7);continue}throw new Error(`unknown red-doctor argument: ${o}`)}return r}function dc(e,t){let r=A5r(e,t);return r===""?".":r}function TQt(e){return[...e.plan.logs.reclaim,...e.plan.scratch.reclaim,...e.plan.diagnostics.reclaim,...e.plan.feedbackWorktrees.reclaim,...e.plan.legacySlotLogs.reclaim].map(t=>t.path)}async function TPe(e){try{return await _Qt(e,"utf8")}catch{return}}async function b5r(e){let[t,r,n,o,i]=await Promise.all([Le("gh",["--version"],{cwd:e}),Le("tq",["--version"],{cwd:e}),Le("sh",["-c","command -v gh"],{cwd:e}),TPe(MX(e,".tool-versions")),TPe(MX(g5r(),".tool-versions"))]),s=n.code===0?n.stdout.trim():void 0,[a,c]=s?await Promise.all([Le("dpkg-query",["-S",s],{cwd:e}),Le("brew",["--prefix","gh"],{cwd:e})]):[{code:1},{code:1}],l=or(MX(e,".red","config.yaml"),{ignoreActivationGate:!0,warn:()=>{}});return GLt({ghOutput:t.code===0?t.stdout:void 0,tqOutput:r.code===0?r.stdout:void 0,ghPath:s,toolVersions:[o,i].filter(Boolean).join(`
1013
1013
  `),aptManaged:a.code===0,brewManaged:c.code===0,tqRecordedVersion:Te(l,"host_binaries.tq.version")||void 0})}async function x5r(e){try{return rFt(await nFt({projectRoot:e}))}catch(t){let r=t instanceof Error?t.message:String(t);return{verdict:"missing",rows:[{check:"home",verdict:"missing",evidence:r,fix:ZP}],findings:[{check:"home",verdict:"missing",evidence:r,fix:ZP}]}}}var E5r={ok:"\u2705",warn:"\u26A0\uFE0F",error:"\u274C"},k5r={ok:"\u2705",warn:"\u26A0\uFE0F",error:"\u274C"};function S5r(e,t=[]){let{hooks:r,hookPoints:n,runtime:o,runtimeUnresolved:i,hostBinaries:s,marketplaceSources:a,mcpLoad:c,dependencyEdges:l,dependencyEdgesUnread:u,askRedRouter:d,redTaxonomy:f,unlandedDocs:p,setupOwnedDirt:h,notes:m}=e;return["","red-doctor AFK hook / backpressure static validation",`declared hook points: ${n.length}`,...n.map(g=>` ${g.hook} exit=${g.exit} commands=${g.commands}`),`backpressure commands: ${r.backpressure.length}`,...r.backpressure.map(g=>` ${g.verdict} ${g.command}: ${g.reason}`),`hook commands: ${r.hooks.length}`,...r.hooks.map(g=>` ${g.finding.verdict} ${g.hook} ${g.finding.command}: ${g.finding.reason}`),`unknown hook names: ${r.unknownHooks.length}`,...r.unknownHooks.map(g=>` unknown hook name '${g}'`),"","red-doctor per-plugin runtime distribution",...o.rows.map(g=>` ${g.verdict} ${g.plugin} enabled=${g.enabled} state=${g.state}`),`runtime findings: ${o.findings.length}`,...o.findings.map(g=>` ${g.verdict} ${g.plugin} ${g.kind}: ${g.reason}`),...o.findings.map(g=>` fix: ${g.remediation}`),...i.length>0?[`unaudited plugins: ${i.join(" ")}`]:[],"","red-doctor required host binaries",...s.rows.map(g=>` ${g.verdict==="ok"?"\u2705":"\u274C"} ${g.binary} catalog=${g.catalog} config=${g.recorded} observed=${g.observed}`),`host binary findings: ${s.findings.length}`,...s.findings.map(g=>` ${g.kind}: ${g.reason}`),...s.findings.map(g=>` fix: ${g.remediation}`),"","red-doctor marketplace registration source",...a.rows.map(g=>` ${E5r[g.verdict]} ${g.host} ${g.marketplace} source=${g.source} (${g.detail})`),`marketplace findings: ${a.findings.length}`,...a.findings.map(g=>` ${g.kind}: ${g.reason}`),...a.findings.map(g=>` fix: ${g.remediation}`),...t.map(g=>` fix ${g.host}: ${g.status} (${g.reason})`),"","red-doctor declared MCP servers loaded in this session",...c.rows.map(g=>` ${k5r[g.verdict]} ${g.plugin} declared=${g.declared.join(",")||"\u2014"} loaded=${g.loaded.join(",")||"\u2014"} missing=${g.missing.join(",")||"\u2014"}`),`mcp load findings: ${c.findings.length}`,...c.findings.map(g=>` ${g.verdict} ${g.kind}: ${g.reason}`),...c.findings.map(g=>` fix: ${g.remediation}`),"","red-doctor native blocked-by vs req:N divergence",`tickets compared: ${l.rows.length}`,`dependency edge findings: ${l.findings.length}`,...l.findings.map(g=>` ${g.verdict} ${g.kind}: ${g.reason}`),...l.findings.map(g=>` fix: ${g.remediation}`),`tickets unread: ${u.length}`,...u.length>0?[` unread: ${u.join(" ")}`]:[],"","red-doctor ask-red router coverage sync",`router-covered skills: ${d.rows.filter(g=>g.inRouter).length}`,`router findings: ${d.findings.length}`,...d.findings.map(g=>` ${g.verdict} ${g.kind}: ${g.reason}`),...d.findings.map(g=>` fix: ${g.remediation}`),"","red-doctor .red lifecycle taxonomy",`taxonomy findings: ${f.findings.length}`,...f.findings.map(g=>` ${g.verdict} ${g.kind} ${g.path}: ${g.reason}`),...f.findings.map(g=>` target: ${g.target}`),"","red-doctor unlanded .red docs",`verdict: ${p.row.verdict}`,`evidence: ${p.row.evidence}`,`unlanded docs findings: ${p.findings.length}`,...p.findings.map(g=>` ${g.verdict} ${g.kind}: ${g.reason}`),...p.findings.map(g=>` fix: ${g.remediation}`),"","red-doctor uncommitted /red-setup output",`verdict: ${h.row.verdict}`,`evidence: ${h.row.evidence}`,`setup-owned dirt findings: ${h.findings.length}`,...h.findings.map(g=>` ${g.verdict} ${g.kind}: ${g.reason}`),...h.findings.map(g=>` paths: ${g.paths.join(" ")}`),...h.findings.map(g=>` fix: ${g.remediation}`),...m.length>0?["","red-doctor classifier notes",...m.map(g=>` ${g}`)]:[]]}function w5r(e,t,r,n,o,i,s,a,c,l,u,d=[],f=[],p,h=[]){let m=TQt(o).map(S=>dc(e,S)),g=o.staleWorkers.reclaim.map(S=>dc(e,S.path)),y=o.plan.unknownTmpRoots.map(S=>`.red/tmp/${S}`),x=o.workerReclaim,k=["red-doctor host toolchain",...i.rows.map(S=>` ${S.verdict==="ok"?"\u2705":"\u274C"} ${S.tool} ${S.version} (required ${S.required}; manager ${S.manager})`),...i.findings.map(S=>` ${S.reason}`),...i.findings.map(S=>` fix: ${S.remediation}`),...f.map(S=>` fix ${S.tool}: ${S.status} (${S.reason})`),"","red-doctor operational probes",`probes: ${t.probes.length}`,...t.probes.map(S=>` ${S.verdict} ${S.name}`),`red probes: ${t.findings.length}`,...t.findings.map(S=>` ${S.name}: ${S.evidence}`),...t.findings.map(S=>` fix: ${S.canonicalFix}`),...d.map(S=>` fix ${S.probeId}: ${S.status} (${S.evidence})`),"","red-doctor castle state lane",`castle lane: ${r.checked.castleLanePresent?"present":"absent"}`,`legacy afk lane: ${r.checked.legacyLanePresent?"present":"absent"}`,`castle findings: ${r.findings.length}`,...r.findings.map(S=>` ${S.verdict} ${S.kind}: ${S.path} \u2014 ${S.reason}`),...r.findings.map(S=>` fix: ${S.canonicalFix}`),"","red-doctor executable acceptance criteria",`candidates: ${n.checked.candidates}`,`verdict: ${n.row.verdict}`,`evidence: ${n.row.evidence}`,`acceptance findings: ${n.findings.length}`,...n.findings.map(S=>S.issue>0?` ${S.verdict} #${S.issue}: ${S.reason}`:` ${S.verdict}: ${S.reason}`),...n.findings.map(S=>` fix: ${S.remediation}`),"","red-doctor tmp janitor",`expired lanes: ${m.length}`,...m.map(S=>` ${S}`),`stale workers: ${g.length}`,...g.map(S=>` ${S}`),`unknown tmp roots: ${y.length}`,...y.map(S=>` ${S}`),`worker artifacts considered: ${x.totals.considered}`,`worker artifacts reclaimable: ${x.totals.reclaim}`,`worker artifacts retained: ${x.totals.retain}`,`worker artifacts dropped: ${x.dropped.length}${x.truncated?" (truncated)":""}`,...x.dropped.map(S=>` ${S.reason} ${S.path?dc(e,S.path):S.worker_id??""}: ${S.detail}`),"","red-doctor redskilled daemon",`provisioning: ${a.verdict}`,...a.rows.map(S=>` ${S.verdict==="ok"?"\u2705":"\u274C"} ${S.check}: ${S.evidence}`),...a.findings.map(S=>` fix: ${S.fix}`),"","red-doctor HUMAN-ONLY type declaration",`installed HUMAN-ONLY type labels: ${c.checked.installedTypeLabels}`,`declared hitl_types: ${c.checked.declaredTypes}`,`verdict: ${c.row.verdict}`,`evidence: ${c.row.evidence}`,...c.findings.map(S=>` ${S.verdict} ${S.label||"(repo)"}: ${S.reason}`),...c.findings.map(S=>` fix: ${S.remediation}`),...p?[` fix hitl-type-declaration: ${p.status} (${p.evidence})`]:[],"","red-doctor deadend audit",`deadends: ${s.total}`,...s.classes.flatMap(S=>S.findings.map(w=>` ${w.deadendClass} ${w.subject} \u2192 cure: ${w.cure} (${w.detail})`)),...S5r(l,h)];return u&&k.push(`applied expired lanes: ${u.expiredLanes.length}`,`applied stale workers: ${u.staleWorkers.length}`,`applied unknown tmp roots: ${u.unknownTmpRoots.length}`,`protected live workers: ${u.protectedLiveWorkers.length}`,`protected live feedback worktrees: ${u.protectedLiveFeedback.length}`,`applied worker workspaces: ${u.workerWorkspaces.length}`,`protected live workspaces: ${u.protectedLiveWorkspaces.length}`,`refused outside tmp: ${u.refusedOutsideTmp.length}`,...u.removals.map(S=>` remove=${dc(e,S.path)} liveness=${S.livenessVerdict}`)),`${k.join(`
@@ -1089,7 +1089,7 @@ requeued to ready-for-agent${e.activeBlocker?` (cleared active blocker: ${e.acti
1089
1089
  `);for(let a=0;a<s.length;a+=1){let c=s[a],l=/^(\s*)'@reddb-io\/toon':\s*$/.exec(c);if(!l)continue;let u=l[1].length;for(let d=a+1;d<s.length;d+=1){let f=s[d];if(f.trim()!==""&&$Pe(f)<=u)break;f.includes(t)&&/^\s+(specifier|version):\s+/.test(f)&&(s[d]=f.split(t).join(r),n.push({site:"lockfile.catalogs-and-importers",before:t,after:r}))}}return{text:s.join(`
1090
1090
  `),replacements:n}}function ken(e,t,r){let n=t.form==="tag"?r.tag:r.version,o=t.pattern.exec(e);if(!o?.[1])throw new Error(`toon pin site ${t.name} did not match ${t.path}`);let i=o[1];if(i===n)return{text:e,replacements:[]};let s=o[0],a=s.replace(i,n);return{text:`${e.slice(0,o.index)}${a}${e.slice(o.index+s.length)}`,replacements:[{site:t.name,before:i,after:n}]}}function Sen(e,t,r){let n=e.split(`
1091
1091
  `),o=[];for(let i=0;i<n.length;i+=1){let s=n[i],a=new RegExp(`^(\\s*)'?${wen(t)}'?:`).exec(s);if(!a){o.push(s);continue}let c=a[1].length;for(;i+1<n.length;){let l=n[i+1];if(l.trim()!==""&&$Pe(l)<=c||l.trim()===""&&$Pe(n[i+2]??"")<=c)break;i+=1}r.push({site:"lockfile.stale-resolution-removed",before:t,after:""})}return o.join(`
1092
- `)}function wen(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Cen(e,t,r,n,o){let i=t.exec(e);if(!i?.[2])throw new Error(`could not find ${n}`);let s=i[2];return s===r?e:(o.push({site:n,before:s,after:r}),`${e.slice(0,i.index)}${i[1]}${r}${i[3]}${e.slice(i.index+i[0].length)}`)}function $Pe(e){return/^\s*/.exec(e)?.[0].length??0}function Ien(e){if(!yen.test(e))throw new Error(`target version must be x.y.z, got ${e}`);return{packageName:"@reddb-io/toon",version:e,tag:`v${e}`}}function Ren(e){let t=CPe(),r="",n=!1;for(let o=0;o<e.length;o+=1){let i=e[o];if(i==="--dry-run"){n=!0;continue}if(i==="--root"){t=$1t(e[++o],"--root");continue}if(i.startsWith("--root=")){t=i.slice(7);continue}if(i==="--target"){r=$1t(e[++o],"--target");continue}if(i.startsWith("--target=")){r=i.slice(9);continue}if(!i.startsWith("-")&&!r){r=i;continue}throw new Error(`unknown argument: ${i}`)}if(!r)throw new Error("toon-bump requires a target version");return{rootDir:UPe(t),targetVersion:r,dryRun:n}}function $1t(e,t){if(!e)throw new Error(`${t} requires a value`);return e}import{resolve as Jen}from"node:path";bt();Ln();import{accessSync as aNo,constants as ven}from"node:fs";import{access as _en,mkdir as Ten,readFile as zX,readdir as HPe,rm as Ben,writeFile as Den}from"node:fs/promises";import{dirname as Pen,join as Ff}from"node:path";function Oen(e){return je(e,{keyedMapCollapse:!0})}var Nen=[{id:"memory.config",plugin:"memory",legacyPath:".red/memory/config.json",toonPath:".red/memory/config.toon",kind:"toon"}],Men=[{id:"dev.afk-history",plugin:"dev",legacyPath:".red/state/afk-history.jsonl",toonPath:".red/state/castle/history.toonl",kind:"toonl"},{id:"dev.agent-log",plugin:"dev",legacyPath:".red/tmp/agent.log.toonl",toonPath:".red/tmp/agent.log.toonl",kind:"toonl"},{id:"dev.supervisor-firehose",plugin:"dev",legacyPath:".red/tmp/afk-supervisor.log.toonl",toonPath:".red/tmp/supervisors/default/supervisor.log.toonl",kind:"toonl",migration:"sniff-read"},{id:"dev.code-understanding-bench-runs",plugin:"dev",legacyPath:".red/tmp/bench/code-understanding/runs.jsonl",toonPath:".red/tmp/bench/code-understanding/runs.toonl",kind:"toonl"},{id:"dev.attempt-state",plugin:"dev",legacyPath:".red/tmp/{workers,go-workers,scout-workers}/*/*/afk.state.toon",toonPath:".red/tmp/{workers,go-workers,scout-workers}/*/*/afk.state.toon",kind:"toon"},{id:"dev.statusline-count-cache",plugin:"dev",legacyPath:".red/tmp/statusline-cache.json",toonPath:".red/state/statusline/statusline-cache.toon",kind:"toon"},{id:"dev.statusline-repo-cache",plugin:"dev",legacyPath:".red/tmp/statusline-repo-cache.json",toonPath:".red/state/statusline/statusline-repo-cache.toon",kind:"toon"},{id:"dev.rsp-resident-registry",plugin:"dev",legacyPath:".red/state/rsp/rsp-resident.pid.json",toonPath:".red/state/rsp/rsp-resident.pid.json",kind:"toon"},{id:"dev.rsp-status-summary",plugin:"dev",legacyPath:".red/state/rsp/rsp-status-summary.json",toonPath:".red/state/rsp/rsp-status-summary.json",kind:"toon"},{id:"dev.rsp-wait-registry",plugin:"dev",legacyPath:".red/tmp/waits/*.json",toonPath:".red/tmp/waits/*.json",kind:"toon"}],W1t=[...Nen,...Men];function Len(e,t=W1t){return t.filter(r=>r.plugin===e)}async function j1t(e){let t=e.surfaces??W1t,r=e.plugin===void 0?t:Len(e.plugin,t),n=await Uen(e.rootDir);if(n.length>0)return{status:"refused",converted:[],skipped:[],missing:[],reasons:n};let o=[],i=[],s=[];for(let a of r){if(a.migration==="sniff-read"){await wH(Ff(e.rootDir,a.toonPath))||await wH(Ff(e.rootDir,a.legacyPath))?i.push(a.id):s.push(a.id);continue}let c=await Fen(e.rootDir,a);if(c.length===0){s.push(a.id);continue}let l=!1,u=!1;for(let d of c){let f=d.toonPath;if(await Qen(d)){u=!0;continue}let p=d.legacyPath;if(!await wH(p))continue;let h=await Hen(p,a.kind);await Ten(Pen(f),{recursive:!0}),await Den(f,jen(h,a),"utf8"),a.id==="dev.afk-history"&&p!==f&&await Ben(p,{force:!0}),l=!0}l?o.push(a.id):u?i.push(a.id):s.push(a.id)}return{status:o.length>0?"converted":"noop",converted:o,skipped:i,missing:s,reasons:[]}}async function Fen(e,t){if(t.id==="dev.rsp-wait-registry"){let n=Ff(e,".red","tmp","waits"),o;try{o=await HPe(n)}catch{return[]}return o.filter(i=>i.endsWith(".json")).map(i=>{let s=Ff(n,i);return{surface:t,legacyPath:s,toonPath:s}})}if(t.id!=="dev.attempt-state")return[{surface:t,legacyPath:Ff(e,t.legacyPath),toonPath:Ff(e,t.toonPath)}];let r=[];for(let n of["workers","go-workers","scout-workers"]){let o=Ff(e,".red","tmp",n),i;try{i=await HPe(o)}catch{continue}for(let s of i){let a=Ff(o,s),c;try{c=await HPe(a)}catch{continue}for(let l of c){let u=Ff(a,l,"afk.state.toon");await wH(u)&&r.push({surface:t,legacyPath:u,toonPath:u})}}}return r}async function Qen(e){return await wH(e.toonPath)?e.legacyPath!==e.toonPath?!0:$en(e.toonPath,e.surface.kind):!1}async function $en(e,t){try{return await Wen(e,t),!0}catch{return!1}}async function Uen(e){let t=[],r=Ff(e,".red","tmp"),n=await qen(Ff(r,"afk-supervisor.pid"));n!==null&&H1t(n)&&t.push("active fleet supervisor is running");let o=await Ven(Ff(iw(e),"rsp-resident.pid.json"));return o!==null&&H1t(o)&&t.push("active rsp resident is running"),t}async function Hen(e,t){let r=await zX(e,"utf8");if(t==="toonl"){let n=[];for(let o of r.split(/\r?\n/)){let i=o.trim();if(i)try{n.push(JSON.parse(i))}catch{}}return n}return JSON.parse(r)}async function Wen(e,t){let r=await zX(e,"utf8");return zt(r)}function jen(e,t){if(t.kind==="toonl"){let r=Gen(t,Array.isArray(e)?e:[e]);return je(r)}return Oen(e)}function Gen(e,t){return e.id==="dev.agent-log"?t.map(r=>{let n=r&&typeof r=="object"?r:{};return{ts:typeof n.ts=="string"?n.ts:"",lvl:typeof n.lvl=="string"&&n.lvl.length>0?n.lvl:null,worker:typeof n.worker=="string"&&n.worker.length>0?n.worker:null,issue:Number.isFinite(Number(n.issue))?Number(n.issue):null,attempt:Number.isFinite(Number(n.attempt))?Number(n.attempt):null,type:typeof n.type=="string"?n.type:"",msg:n.msg===void 0?"":n.msg,iteration:n.iteration===void 0?null:n.iteration,kind:n.kind===void 0?null:n.kind}}):e.id!=="dev.afk-history"?t:t.map(r=>{let n=r&&typeof r=="object"?r:{};return{ts:typeof n.ts=="string"?n.ts:"",epoch:Number.isFinite(Number(n.epoch))?Number(n.epoch):0,worker:typeof n.worker=="string"?n.worker:"",issue:Number.isFinite(Number(n.issue))?Number(n.issue):0,event:typeof n.event=="string"?n.event:"",duration_s:Number.isFinite(Number(n.duration_s))?Number(n.duration_s):0,runner:typeof n.runner=="string"?n.runner:"",merge_sha:typeof n.merge_sha=="string"&&n.merge_sha.length>0?n.merge_sha:null,reason:typeof n.reason=="string"&&n.reason.length>0?n.reason:null}})}async function qen(e){try{return G1t((await zX(e,"utf8")).trim())}catch{return null}}async function Ven(e){try{let t=zen(await zX(e,"utf8"));return typeof t.pid=="number"?G1t(String(t.pid)):null}catch{return null}}function zen(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return zt(t)}}function G1t(e){if(!/^[1-9][0-9]*$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}function H1t(e){try{return process.kill(e,0),!0}catch{return!1}}async function wH(e){try{return await _en(e,ven.F_OK),!0}catch{return!1}}var Yen=new Set(["memory","brain","dev"]);async function z1t(e,t={stdout:process.stdout,stderr:process.stderr}){try{let r=Ken(e),n=await j1t({rootDir:r.rootDir,plugin:r.plugin});return r.json?t.stdout.write(`${JSON.stringify(n,null,2)}
1092
+ `)}function wen(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Cen(e,t,r,n,o){let i=t.exec(e);if(!i?.[2])throw new Error(`could not find ${n}`);let s=i[2];return s===r?e:(o.push({site:n,before:s,after:r}),`${e.slice(0,i.index)}${i[1]}${r}${i[3]}${e.slice(i.index+i[0].length)}`)}function $Pe(e){return/^\s*/.exec(e)?.[0].length??0}function Ien(e){if(!yen.test(e))throw new Error(`target version must be x.y.z, got ${e}`);return{packageName:"@reddb-io/toon",version:e,tag:`v${e}`}}function Ren(e){let t=CPe(),r="",n=!1;for(let o=0;o<e.length;o+=1){let i=e[o];if(i==="--dry-run"){n=!0;continue}if(i==="--root"){t=$1t(e[++o],"--root");continue}if(i.startsWith("--root=")){t=i.slice(7);continue}if(i==="--target"){r=$1t(e[++o],"--target");continue}if(i.startsWith("--target=")){r=i.slice(9);continue}if(!i.startsWith("-")&&!r){r=i;continue}throw new Error(`unknown argument: ${i}`)}if(!r)throw new Error("toon-bump requires a target version");return{rootDir:UPe(t),targetVersion:r,dryRun:n}}function $1t(e,t){if(!e)throw new Error(`${t} requires a value`);return e}import{resolve as Jen}from"node:path";bt();Ln();import{accessSync as lNo,constants as ven}from"node:fs";import{access as _en,mkdir as Ten,readFile as zX,readdir as HPe,rm as Ben,writeFile as Den}from"node:fs/promises";import{dirname as Pen,join as Ff}from"node:path";function Oen(e){return je(e,{keyedMapCollapse:!0})}var Nen=[{id:"memory.config",plugin:"memory",legacyPath:".red/memory/config.json",toonPath:".red/memory/config.toon",kind:"toon"}],Men=[{id:"dev.afk-history",plugin:"dev",legacyPath:".red/state/afk-history.jsonl",toonPath:".red/state/castle/history.toonl",kind:"toonl"},{id:"dev.agent-log",plugin:"dev",legacyPath:".red/tmp/agent.log.toonl",toonPath:".red/tmp/agent.log.toonl",kind:"toonl"},{id:"dev.supervisor-firehose",plugin:"dev",legacyPath:".red/tmp/afk-supervisor.log.toonl",toonPath:".red/tmp/supervisors/default/supervisor.log.toonl",kind:"toonl",migration:"sniff-read"},{id:"dev.code-understanding-bench-runs",plugin:"dev",legacyPath:".red/tmp/bench/code-understanding/runs.jsonl",toonPath:".red/tmp/bench/code-understanding/runs.toonl",kind:"toonl"},{id:"dev.attempt-state",plugin:"dev",legacyPath:".red/tmp/{workers,go-workers,scout-workers}/*/*/afk.state.toon",toonPath:".red/tmp/{workers,go-workers,scout-workers}/*/*/afk.state.toon",kind:"toon"},{id:"dev.statusline-count-cache",plugin:"dev",legacyPath:".red/tmp/statusline-cache.json",toonPath:".red/state/statusline/statusline-cache.toon",kind:"toon"},{id:"dev.statusline-repo-cache",plugin:"dev",legacyPath:".red/tmp/statusline-repo-cache.json",toonPath:".red/state/statusline/statusline-repo-cache.toon",kind:"toon"},{id:"dev.rsp-resident-registry",plugin:"dev",legacyPath:".red/state/rsp/rsp-resident.pid.json",toonPath:".red/state/rsp/rsp-resident.pid.json",kind:"toon"},{id:"dev.rsp-status-summary",plugin:"dev",legacyPath:".red/state/rsp/rsp-status-summary.json",toonPath:".red/state/rsp/rsp-status-summary.json",kind:"toon"},{id:"dev.rsp-wait-registry",plugin:"dev",legacyPath:".red/tmp/waits/*.json",toonPath:".red/tmp/waits/*.json",kind:"toon"}],W1t=[...Nen,...Men];function Len(e,t=W1t){return t.filter(r=>r.plugin===e)}async function j1t(e){let t=e.surfaces??W1t,r=e.plugin===void 0?t:Len(e.plugin,t),n=await Uen(e.rootDir);if(n.length>0)return{status:"refused",converted:[],skipped:[],missing:[],reasons:n};let o=[],i=[],s=[];for(let a of r){if(a.migration==="sniff-read"){await wH(Ff(e.rootDir,a.toonPath))||await wH(Ff(e.rootDir,a.legacyPath))?i.push(a.id):s.push(a.id);continue}let c=await Fen(e.rootDir,a);if(c.length===0){s.push(a.id);continue}let l=!1,u=!1;for(let d of c){let f=d.toonPath;if(await Qen(d)){u=!0;continue}let p=d.legacyPath;if(!await wH(p))continue;let h=await Hen(p,a.kind);await Ten(Pen(f),{recursive:!0}),await Den(f,jen(h,a),"utf8"),a.id==="dev.afk-history"&&p!==f&&await Ben(p,{force:!0}),l=!0}l?o.push(a.id):u?i.push(a.id):s.push(a.id)}return{status:o.length>0?"converted":"noop",converted:o,skipped:i,missing:s,reasons:[]}}async function Fen(e,t){if(t.id==="dev.rsp-wait-registry"){let n=Ff(e,".red","tmp","waits"),o;try{o=await HPe(n)}catch{return[]}return o.filter(i=>i.endsWith(".json")).map(i=>{let s=Ff(n,i);return{surface:t,legacyPath:s,toonPath:s}})}if(t.id!=="dev.attempt-state")return[{surface:t,legacyPath:Ff(e,t.legacyPath),toonPath:Ff(e,t.toonPath)}];let r=[];for(let n of["workers","go-workers","scout-workers"]){let o=Ff(e,".red","tmp",n),i;try{i=await HPe(o)}catch{continue}for(let s of i){let a=Ff(o,s),c;try{c=await HPe(a)}catch{continue}for(let l of c){let u=Ff(a,l,"afk.state.toon");await wH(u)&&r.push({surface:t,legacyPath:u,toonPath:u})}}}return r}async function Qen(e){return await wH(e.toonPath)?e.legacyPath!==e.toonPath?!0:$en(e.toonPath,e.surface.kind):!1}async function $en(e,t){try{return await Wen(e,t),!0}catch{return!1}}async function Uen(e){let t=[],r=Ff(e,".red","tmp"),n=await qen(Ff(r,"afk-supervisor.pid"));n!==null&&H1t(n)&&t.push("active fleet supervisor is running");let o=await Ven(Ff(iw(e),"rsp-resident.pid.json"));return o!==null&&H1t(o)&&t.push("active rsp resident is running"),t}async function Hen(e,t){let r=await zX(e,"utf8");if(t==="toonl"){let n=[];for(let o of r.split(/\r?\n/)){let i=o.trim();if(i)try{n.push(JSON.parse(i))}catch{}}return n}return JSON.parse(r)}async function Wen(e,t){let r=await zX(e,"utf8");return zt(r)}function jen(e,t){if(t.kind==="toonl"){let r=Gen(t,Array.isArray(e)?e:[e]);return je(r)}return Oen(e)}function Gen(e,t){return e.id==="dev.agent-log"?t.map(r=>{let n=r&&typeof r=="object"?r:{};return{ts:typeof n.ts=="string"?n.ts:"",lvl:typeof n.lvl=="string"&&n.lvl.length>0?n.lvl:null,worker:typeof n.worker=="string"&&n.worker.length>0?n.worker:null,issue:Number.isFinite(Number(n.issue))?Number(n.issue):null,attempt:Number.isFinite(Number(n.attempt))?Number(n.attempt):null,type:typeof n.type=="string"?n.type:"",msg:n.msg===void 0?"":n.msg,iteration:n.iteration===void 0?null:n.iteration,kind:n.kind===void 0?null:n.kind}}):e.id!=="dev.afk-history"?t:t.map(r=>{let n=r&&typeof r=="object"?r:{};return{ts:typeof n.ts=="string"?n.ts:"",epoch:Number.isFinite(Number(n.epoch))?Number(n.epoch):0,worker:typeof n.worker=="string"?n.worker:"",issue:Number.isFinite(Number(n.issue))?Number(n.issue):0,event:typeof n.event=="string"?n.event:"",duration_s:Number.isFinite(Number(n.duration_s))?Number(n.duration_s):0,runner:typeof n.runner=="string"?n.runner:"",merge_sha:typeof n.merge_sha=="string"&&n.merge_sha.length>0?n.merge_sha:null,reason:typeof n.reason=="string"&&n.reason.length>0?n.reason:null}})}async function qen(e){try{return G1t((await zX(e,"utf8")).trim())}catch{return null}}async function Ven(e){try{let t=zen(await zX(e,"utf8"));return typeof t.pid=="number"?G1t(String(t.pid)):null}catch{return null}}function zen(e){let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{return zt(t)}}function G1t(e){if(!/^[1-9][0-9]*$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}function H1t(e){try{return process.kill(e,0),!0}catch{return!1}}async function wH(e){try{return await _en(e,ven.F_OK),!0}catch{return!1}}var Yen=new Set(["memory","brain","dev"]);async function z1t(e,t={stdout:process.stdout,stderr:process.stderr}){try{let r=Ken(e),n=await j1t({rootDir:r.rootDir,plugin:r.plugin});return r.json?t.stdout.write(`${JSON.stringify(n,null,2)}
1093
1093
  `):n.status==="refused"?t.stderr.write(`toon-migrate: refused: ${n.reasons.join("; ")}
1094
1094
  `):t.stdout.write(`toon-migrate: ${n.status} converted=${n.converted.length} skipped=${n.skipped.length} missing=${n.missing.length}
1095
1095
  `),n.status==="refused"?1:0}catch(r){let n=r instanceof Error?r.message:String(r);return t.stderr.write(`toon-migrate: ${n}
@@ -6602,7 +6602,7 @@ Usage:
6602
6602
  ${n} archive --candidate <json> [--root <dir>] [--archive-dir <rel>]
6603
6603
  ${n} restore <name> [--root <dir>] [--archive-dir <rel>]`}function d9(n){return $yn(typeof n.root=="string"?n.root:process.cwd())}function qbt(n){return typeof n["archive-dir"]=="string"?n["archive-dir"]:void 0}async function gK(n){let r=await xs(n);return r?r.mode!=="graph"?{ok:!1,message:`curate: skill telemetry needs graph mode (this project is "${r.mode}") \u2014 run \`${p_e}\``}:Ku(r)?{ok:!0}:{ok:!1,message:`curate: skill telemetry is not enabled here \u2014 run \`${p_e}\``}:{ok:!1,message:`curate: memory is not initialized here \u2014 run \`${p_e}\``}}function tRn(){let n=qyn(eRn(import.meta.url));return n.includes("dist/curate-skill")||n.endsWith("dist/curate-skill")?Kbt(n,"..","cli.js"):Kbt(n,"..","cli.ts")}async function nRn(n,r){let i=["curate","skills","--json"];r!==void 0&&i.push("--stale-days",String(r));let d=tRn(),h=d.endsWith(".ts")?Dbt(process.execPath,["--import","tsx",d,...i,"--root",n],{encoding:"utf8"}):Dbt(process.execPath,[d,...i,"--root",n],{encoding:"utf8"}),V=h.status??1;if(V!==0)throw new Error(`memory curate skills exited ${V}`);return Bbt(h.stdout??"")}function IRn(n){return typeof n.flags["stale-days"]=="string"?Number(n.flags["stale-days"]):void 0}async function $bt(n,r){return(r.loadCuratorReport??nRn)(d9(n.flags),IRn(n))}async function lRn(n){let r=d9(n.flags),i=await gK(r);return i.ok?(console.log("curate: skill telemetry is enabled \u2014 ready to curate"),0):(console.error(i.message),2)}async function rRn(n,r){let i=d9(n.flags),d=await gK(i);if(!d.ok)return console.error(d.message),2;let m;try{m=await $bt(n,r)}catch(_){return console.error(`curate: ${_.message}`),1}let{candidates:h,byCategory:V,filtered:v}=u_e(m);return console.log(JSON.stringify({candidates:h,byCategory:V,filtered:v,totals:{totalSkills:m.totalSkills,curatableSkills:m.curatableSkills,readOnlySkills:m.readOnlySkills}},null,2)),0}async function aRn(n,r){let i=d9(n.flags),d=await gK(i);if(!d.ok)return console.error(d.message),2;let m;try{m=await $bt(n,r)}catch(_){return console.error(`curate: ${_.message}`),1}let{byCategory:h}=u_e(m);if(b_e(h)===0)return console.error("curate: no candidates \u2014 no issue filed"),0;let V=typeof n.flags.label=="string"?n.flags.label:void 0,v=await jbt({byCategory:h,totals:{totalSkills:m.totalSkills,curatableSkills:m.curatableSkills,readOnlySkills:m.readOnlySkills},generatedAt:m.generatedAt},{cwd:i,label:V});return console.log(`curate: filed background issue \u2014 ${v.output||v.title}`),0}async function cRn(n){let r=d9(n.flags),i=await gK(r);if(!i.ok)return console.error(i.message),2;let d=n.flags.candidate;if(typeof d!="string")return console.error("curate archive: --candidate <json> is required"),2;let m;try{m=JSON.parse(d)}catch(V){return console.error(`curate archive: invalid --candidate JSON: ${V.message}`),2}let h=await Sbt(m,{rootDir:r,archiveDir:qbt(n.flags)});return h.ok?(console.log(`curate: archived "${h.receipt.name}" \u2192 ${h.receipt.archiveRoot} (${h.receipt.files.length} file(s), manifest at ${h.receipt.manifestPath})`),0):(console.error(`curate archive: refused \u2014 ${h.rejection.reason}: ${h.rejection.detail}`),3)}async function iRn(n){let r=d9(n.flags),i=await gK(r);if(!i.ok)return console.error(i.message),2;let d=n.positional[0];if(!d)return console.error("curate restore: skill name is required"),2;let m=await Ubt(d,{rootDir:r,archiveDir:qbt(n.flags)});return console.log(`curate: restored "${m.name}" \u2192 ${m.restoredRoot} (${m.files.length} file(s) hash-verified)`),0}async function Z_e(n,r={}){switch(n.command){case"check":return lRn(n);case"list":return rRn(n,r);case"background":return aRn(n,r);case"archive":return cRn(n);case"restore":return iRn(n);case void 0:case"--help":case"-h":return console.log(Pbt(r.usageCommand)),0;default:return console.error(`unknown curate subcommand: ${n.command}
6604
6604
 
6605
- ${Pbt(r.usageCommand)}`),2}}function h_e(n){let r={app:n,version:sRn(G9("__RED_BUILD_VERSION__",()=>"3.3.10")??"0.0.0-dev"),gitSha:G9("__RED_BUILD_GIT_SHA__",()=>"efacf48c6512520601e438c4e755e96b51509e23")??"unknown",buildTime:G9("__RED_BUILD_TIME__",()=>"2026-08-02T23:09:28-03:00")??"unknown",bundleAsset:G9("__RED_BUNDLE_ASSET__",()=>"memory.bundle.min.mjs")??"unknown"},i=G9("__REDDB_SDK_VERSION__",()=>"1.23.1"),d=G9("__REDDB_BINARY_TAG__",()=>"v1.23.1");return i&&(r.reddbSdkVersion=i),d&&(r.reddbBinaryTag=d),r}function sRn(n){return n.startsWith("v")?n.slice(1):n}function W_e(n){return`${n.app} ${n.version} ${n.gitSha}`}function G9(n,r){try{let i=r();return typeof i=="string"&&i.length>0?i:void 0}catch{return process.env[n.replace(/^__|__$/g,"")]}}async function rpt(n){let{store:r}=await gr(n);try{let i=await r.stats();console.log(`memory: ${i.nodes} node(s), ${i.edges} edge(s)`)}finally{await r.close()}}async function apt(n){let r=n.positional[0];if(r!=="status"&&r!=="status-viewer"&&r!=="maintain"&&r!=="search")throw new Error("vector needs an action \u2014 supported: memory vector status|status-viewer|maintain|search");let i=process.env.RED_MEMORY_VECTOR_PROVIDER;n.flags.local===!0&&(process.env.RED_MEMORY_VECTOR_PROVIDER="local");let{store:d}=await gr(n);try{if(r==="search"){let h=n.positional.slice(1).join(" ").trim();if(!h)throw new Error("nothing to search \u2014 pass a query: memory vector search <query>");let V=await R5(d,h,{limit:la(n.flags,"limit")});if(n.flags.json===!0){console.log(JSON.stringify(V,null,2));return}if(V.status==="unavailable"){let v=V.error?` \u2014 ${V.error}`:"";console.log(`memory: vector search unavailable${v}`);return}console.log(`memory: vector search ${V.hits.length}/${V.limit} hit(s) for "${h}"`);for(let v of V.hits){let _=v.source?` source=${v.source}`:"";console.log(` ${v.score.toFixed(3)} memory_nodes:${v.rid} (${v.node_type}) ${v.title}${_}`),v.excerpt&&console.log(` ${v.excerpt}`)}return}if(r==="status-viewer"){let h=Wr(n.flags),V=Vl(n.flags,"out")??qa(h,".red/memory/vector-status-viewer.html"),v=mK(await d.vectorStatus());await hs(Ps(V),{recursive:!0}),await Xi(V,v.html,"utf8"),console.log(`memory: vector status viewer written ${V}`),console.log(` status: ${v.report.overall}`),console.log(` contract: ${v.contract.consumes}`);return}let m=r==="maintain"?await d.maintainVectorProjection({strict:n.flags.strict===!0}):await d.vectorStatus();if(n.flags.json===!0){console.log(JSON.stringify(m,null,2));return}console.log(`memory: vector projection ${m.overall} \u2014 ${m.ready}/${m.total} ready`),m.stale>0&&console.log(` stale: ${m.stale}`),m.unavailable>0&&console.log(` unavailable: ${m.unavailable}`),m.failed>0&&console.log(` failed: ${m.failed}`);for(let h of m.nodes.filter(V=>V.status!=="ready")){let V=h.error?` \u2014 ${h.error}`:"";console.log(` ${h.rid} (${h.node_type}) ${h.label}: ${h.status}${V}`)}for(let h of m.docs.filter(V=>V.status!=="ready")){let V=h.error?` \u2014 ${h.error}`:"";console.log(` doc:${h.rid} ${h.path}: ${h.status}${V}`)}}finally{await d.close(),n.flags.local===!0&&(i==null?delete process.env.RED_MEMORY_VECTOR_PROVIDER:process.env.RED_MEMORY_VECTOR_PROVIDER=i)}}async function cpt(n){let{store:r}=await gr(n);try{let i=la(n.flags,"stale-days")??90,d=await hy(r,{staleDays:i});if(d.stale.length===0){console.log(`memory: healthy \u2014 0 of ${d.totalNodes} node(s) stale (unaccessed ${i}+ days, never recalled)`);return}console.log(`memory: ${d.stale.length} of ${d.totalNodes} node(s) stale (unaccessed ${i}+ days, never recalled):`);for(let V of d.stale)console.log(` ${V.rid} (${V.node_type}) ${V.title} \u2014 ${V.ageDays}d idle`);if(n.flags.prune!==!0){console.log(`
6605
+ ${Pbt(r.usageCommand)}`),2}}function h_e(n){let r={app:n,version:sRn(G9("__RED_BUILD_VERSION__",()=>"3.3.11")??"0.0.0-dev"),gitSha:G9("__RED_BUILD_GIT_SHA__",()=>"0ac7e9947aa678cf8956b86c0428874cb3a09c31")??"unknown",buildTime:G9("__RED_BUILD_TIME__",()=>"2026-08-02T23:50:43-03:00")??"unknown",bundleAsset:G9("__RED_BUNDLE_ASSET__",()=>"memory.bundle.min.mjs")??"unknown"},i=G9("__REDDB_SDK_VERSION__",()=>"1.23.1"),d=G9("__REDDB_BINARY_TAG__",()=>"v1.23.1");return i&&(r.reddbSdkVersion=i),d&&(r.reddbBinaryTag=d),r}function sRn(n){return n.startsWith("v")?n.slice(1):n}function W_e(n){return`${n.app} ${n.version} ${n.gitSha}`}function G9(n,r){try{let i=r();return typeof i=="string"&&i.length>0?i:void 0}catch{return process.env[n.replace(/^__|__$/g,"")]}}async function rpt(n){let{store:r}=await gr(n);try{let i=await r.stats();console.log(`memory: ${i.nodes} node(s), ${i.edges} edge(s)`)}finally{await r.close()}}async function apt(n){let r=n.positional[0];if(r!=="status"&&r!=="status-viewer"&&r!=="maintain"&&r!=="search")throw new Error("vector needs an action \u2014 supported: memory vector status|status-viewer|maintain|search");let i=process.env.RED_MEMORY_VECTOR_PROVIDER;n.flags.local===!0&&(process.env.RED_MEMORY_VECTOR_PROVIDER="local");let{store:d}=await gr(n);try{if(r==="search"){let h=n.positional.slice(1).join(" ").trim();if(!h)throw new Error("nothing to search \u2014 pass a query: memory vector search <query>");let V=await R5(d,h,{limit:la(n.flags,"limit")});if(n.flags.json===!0){console.log(JSON.stringify(V,null,2));return}if(V.status==="unavailable"){let v=V.error?` \u2014 ${V.error}`:"";console.log(`memory: vector search unavailable${v}`);return}console.log(`memory: vector search ${V.hits.length}/${V.limit} hit(s) for "${h}"`);for(let v of V.hits){let _=v.source?` source=${v.source}`:"";console.log(` ${v.score.toFixed(3)} memory_nodes:${v.rid} (${v.node_type}) ${v.title}${_}`),v.excerpt&&console.log(` ${v.excerpt}`)}return}if(r==="status-viewer"){let h=Wr(n.flags),V=Vl(n.flags,"out")??qa(h,".red/memory/vector-status-viewer.html"),v=mK(await d.vectorStatus());await hs(Ps(V),{recursive:!0}),await Xi(V,v.html,"utf8"),console.log(`memory: vector status viewer written ${V}`),console.log(` status: ${v.report.overall}`),console.log(` contract: ${v.contract.consumes}`);return}let m=r==="maintain"?await d.maintainVectorProjection({strict:n.flags.strict===!0}):await d.vectorStatus();if(n.flags.json===!0){console.log(JSON.stringify(m,null,2));return}console.log(`memory: vector projection ${m.overall} \u2014 ${m.ready}/${m.total} ready`),m.stale>0&&console.log(` stale: ${m.stale}`),m.unavailable>0&&console.log(` unavailable: ${m.unavailable}`),m.failed>0&&console.log(` failed: ${m.failed}`);for(let h of m.nodes.filter(V=>V.status!=="ready")){let V=h.error?` \u2014 ${h.error}`:"";console.log(` ${h.rid} (${h.node_type}) ${h.label}: ${h.status}${V}`)}for(let h of m.docs.filter(V=>V.status!=="ready")){let V=h.error?` \u2014 ${h.error}`:"";console.log(` doc:${h.rid} ${h.path}: ${h.status}${V}`)}}finally{await d.close(),n.flags.local===!0&&(i==null?delete process.env.RED_MEMORY_VECTOR_PROVIDER:process.env.RED_MEMORY_VECTOR_PROVIDER=i)}}async function cpt(n){let{store:r}=await gr(n);try{let i=la(n.flags,"stale-days")??90,d=await hy(r,{staleDays:i});if(d.stale.length===0){console.log(`memory: healthy \u2014 0 of ${d.totalNodes} node(s) stale (unaccessed ${i}+ days, never recalled)`);return}console.log(`memory: ${d.stale.length} of ${d.totalNodes} node(s) stale (unaccessed ${i}+ days, never recalled):`);for(let V of d.stale)console.log(` ${V.rid} (${V.node_type}) ${V.title} \u2014 ${V.ageDays}d idle`);if(n.flags.prune!==!0){console.log(`
6606
6606
  Re-run with --prune to delete these (asks for confirmation first).`);return}let m=n.flags.yes===!0;if(!m){if(!process.stdin.isTTY){console.log(`
6607
6607
  refusing to prune without confirmation \u2014 re-run with --yes in a non-interactive shell`);return}let V=ise({input:process.stdin,output:process.stdout}),v=(await V.question(`
6608
6608
  Delete ${d.stale.length} stale node(s)? Type "yes" to confirm: `)).trim();V.close(),m=v==="yes"}if(!m){console.log("memory: aborted \u2014 nothing deleted");return}let{pruned:h}=await Xfe(r,d.stale);console.log(`memory: pruned ${h} stale node(s)`)}finally{await r.close()}}async function ipt(n){let r=Wr(n.flags),i=n.positional[0]??".red/memory/export",d=Lm(i)?i:za(r,i),m=n.flags.communities===!0,h=n.flags.interop===!0,{store:V}=await gr(n);try{let v=await dQ(V,d,{communities:m,interop:h});console.log(`memory: exported ${v.nodes} node(s), ${v.edges} edge(s)`),m&&console.log(" communities: coloured via native Louvain"),console.log(` graph: ${v.htmlPath}`),console.log(` json: ${v.jsonPath}`),console.log(` audit: ${v.auditPath}`),v.interop&&(console.log(` nodes: ${v.interop.nodesJsonlPath}`),console.log(` edges: ${v.interop.edgesJsonlPath}`),console.log(` graphml:${v.interop.graphmlPath}`),console.log(` cypher: ${v.interop.cypherPath}`))}finally{await V.close()}}async function spt(n){let r=n.positional.join(" ").trim();if(!r)throw new Error("nothing to search \u2014 pass a query: memory global-search <query>");let i=typeof n.flags.limit=="string"?Number(n.flags.limit):void 0,{store:d,config:m}=await gr(n);try{let h=await tF("memory.global-search",{store:d,providerConfig:m.provider},{query:r,limit:i,cache:n.flags["no-cache"]===!0?"off":"read-only"});if(n.flags.json===!0){console.log(JSON.stringify(h,null,2));return}console.log(`memory: ${h.total_hits} global-search hit(s) for "${h.query}"`),console.log(` source: ${h.generated_from.operation_id}`),console.log(` graph hash: ${h.generated_from.graph_hash}`),console.log(` provider: ${h.generated_from.provider.status}${h.generated_from.provider.error?` (${h.generated_from.provider.error})`:""}`);for(let V of h.evidence)console.log(` ${V.community_id}: score ${V.score}, ${V.size} node(s)`),console.log(` matched: ${V.matched_terms.join(", ")}`),console.log(` top label: ${V.top_label}`),console.log(` top type: ${V.top_node_type}`),V.narrative_summary&&console.log(` summary: ${V.narrative_summary}`)}finally{await d.close()}}async function GRn(n,r){let i=Vl(n.flags,"from");if(i){let m=Lm(i)?i:za(r,i),h=JSON.parse(await Bb(m,"utf8")),V=h.contract??h,v=Zfe(V);if(!v.valid)throw new Error(`architecture-overview: ${m} is not a valid graph contract \u2014 ${v.errors.join("; ")}`);return V}let{store:d}=await gr(n);try{let[m,h,V]=await Promise.all([d.listNodes(),d.listEdges(),d.communities()]);return AX({nodes:m,edges:h.map(qX),communities:V})}finally{await d.close()}}async function opt(n){let r=Wr(n.flags),i=await GRn(n,r),d=qXe(i);if(n.flags.json===!0){console.log(JSON.stringify(d,null,2));return}if(n.flags.stdout===!0){process.stdout.write(d.markdown);return}let m=Vl(n.flags,"out")??".red/memory/architecture-overview.md",h=Lm(m)?m:za(r,m);await hs(Ps(h),{recursive:!0}),await Xi(h,d.markdown,"utf8"),console.log(`memory: architecture overview written ${h}`),console.log(` contract: ${d.generated_from.contract_version}`),console.log(` ${d.totals.nodes} node(s), ${d.layers.length} layer(s), ${d.communities.length} community(ies)`)}async function E5(){if(process.stdin.isTTY)return"";let n=[];for await(let r of process.stdin)n.push(r);return Buffer.concat(n).toString("utf8")}var mRn=["SessionStart","PostToolUse","Stop","PreCompact"];async function dpt(n){let r=n.positional[0],i=n.flags.runner==="codex"?"codex":"claude";if(!r||!mRn.includes(r)){process.stdout.write("{}");return}try{let d=await E5(),m=d.trim()?JSON.parse(d):{},h=Wr(n.flags)!==process.cwd()?Wr(n.flags):typeof m.cwd=="string"?m.cwd:process.cwd(),V=await I1e(i,r,m);try{r==="SessionStart"?await vy(h,V.sessionId?{id:V.sessionId}:{}):await rN(h)||(V.sessionId?await vy(h,{id:V.sessionId}):await VHe(h))}catch{}let v=await vHe(V,h);process.stdout.write(l1e(i,r,v))}catch{process.stdout.write("{}")}}var uRn=["post-commit","post-checkout"];async function Gpt(n){switch(n.positional[0]){case"refresh":return bRn(n);case"install-hooks":return ZRn(n);case"uninstall-hooks":return hRn(n);default:throw new Error("vcs needs a subcommand \u2014 memory vcs refresh|install-hooks|uninstall-hooks")}}async function bRn(n){let r=Wr(n.flags),i=Vl(n.flags,"event"),d=n.flags.json===!0;if(!i||!uRn.includes(i)){d&&console.log(JSON.stringify({noop:!0,reason:"unknown vcs event"}));return}try{let m=await FHe(r,{event:i,prevHead:Vl(n.flags,"prev"),newHead:Vl(n.flags,"new"),flag:Vl(n.flags,"flag"),export:n.flags["no-export"]!==!0});if(d){console.log(JSON.stringify(m,null,2));return}if(m.noop){console.log(`memory: ${i} \u2014 no-op (${m.reason})`);return}let h=m.refresh;console.log(`memory: ${i} refreshed ${h?.files??0} changed file(s) \u2014 ${h?.added??0} added, ${h?.updated??0} updated, ${h?.stale??0} stale`),m.exported&&console.log(` exported ${m.exported.nodes} node(s) \u2192 ${m.exported.jsonPath}`)}catch(m){let h=`error: ${m instanceof Error?m.message:String(m)}`;console.log(d?JSON.stringify({noop:!0,reason:h}):`memory: ${i} \u2014 no-op (${h})`)}}async function mpt(n){try{let{stdout:r}=await wy("git",["-C",n,"rev-parse","--git-path","hooks"],{encoding:"utf8"}),i=r.trim();return i?Lm(i)?i:za(n,i):za(n,".git/hooks")}catch{return za(n,".git/hooks")}}function pRn(){let n=process.env.CLAUDE_PLUGIN_ROOT??process.env.CODEX_PLUGIN_ROOT,r=Ipt(new URL("../cli.ts",import.meta.url)),i=[n?qa(n,"scripts","bootstrap.mjs"):void 0,qa(Ps(Ps(r)),"scripts","bootstrap.mjs")];for(let d of i)if(d&&yK(d))return d}async function ZRn(n){let r=Wr(n.flags),i=await xs(r);if(!i){console.log("memory: not initialized here \u2014 run `memory init --mode graph` before installing git hooks");return}if(i.mode!=="graph"){console.log(`memory: git hooks need graph mode \u2014 this project is "${i.mode}". Re-run \`memory init --mode graph\` first`);return}let d=await mpt(r),m=await XHe({hooksDir:d,bootstrapPath:pRn(),force:n.flags.force===!0});if(n.flags.json===!0){console.log(JSON.stringify({hooksDir:d,...m},null,2));return}m.installed.length>0&&console.log(`memory: installed ${m.installed.join(", ")} into ${d}`);for(let h of m.backedUp)console.log(` backed up existing hook \u2192 ${h}`);for(let h of m.skipped)console.log(` skipped ${h.hook}: ${h.reason}`)}async function hRn(n){let r=Wr(n.flags),i=await mpt(r),d=await wHe(i);if(n.flags.json===!0){console.log(JSON.stringify({hooksDir:i,...d},null,2));return}d.removed.length>0?console.log(`memory: removed ${d.removed.join(", ")} from ${i}`):console.log(`memory: no managed hooks found in ${i}`);for(let m of d.restored)console.log(` restored backed-up hook \u2192 ${m}`);for(let m of d.skipped)console.log(` ${m.reason}`)}async function upt(n){let r=n.positional[0];if(r==="learn")return WRn(n);if(r!=="record")throw new Error("unknown worker command \u2014 expected: memory worker record|learn");let i=await E5();if(!i.trim())throw new Error("worker record needs a JSON payload on stdin");let d=JSON.parse(i),{store:m}=await gr(n);try{let h=await I_e(m,d);console.log(`memory: recorded worker ${d.repository}#${d.issueNumber}/${d.attemptNumber} (rid ${h.workerRid})`)}finally{await m.close()}}async function WRn(n){let r=n.positional[1];if(r==="apply")return NRn(n);if(r!=null)throw new Error("memory worker learn supports: apply");let i=Wr(n.flags),d=n.flags.json===!0,m=n.flags["write-proposal"]===!0,{store:h}=await gr(n);try{let V=await l_e(h),v=m?await r_e(i,V):null,_=V.proposals.length===0?"no-candidates":m?"proposal-written":"proposal-ready";if(d){console.log(JSON.stringify({state:_,proposalFile:v,...V},null,2));return}console.log(`memory: worker learning - ${_}`);for(let M of V.proposals)console.log(` [${M.kind}] ${M.title}`),console.log(` evidence: ${M.evidenceSummary}`);for(let M of V.rejected)console.log(` ${M.action}: ${M.kind} - ${M.reason}`);v&&console.log(` proposal: ${v}`),console.log(`