@reddb-io/red-skills 2.34.2 → 2.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6523,7 +6523,7 @@ ${d.body}`))}));for(let d=0;d<i.length;d++)for(let b=d+1;b<i.length;b++){let h=i
6523
6523
  ${n.citationExcerpt}
6524
6524
  ${n.intent}`.toLowerCase();return/\b(user preference|personal fact|personal context|human-facing|biographical|identity context)\b/.test(a)?{risk:"high",reason:"risk_requires_evidence_review:personal_or_human_context"}:/\b(always|never|must|should|do not|don't|remember to|instruction|agent rule)\b/.test(a)?{risk:"high",reason:"risk_requires_evidence_review:instruction_like_memory"}:{risk:"low",reason:"low_risk_validation_evidence_stored"}}function Lhn(n){return n==="medium"?"Medium blast-radius governed writes require Evidence review before promotion.":"High blast-radius governed writes require Evidence review before promotion."}var vre="memory.governance_tidy_review.v1",cwe="memory tidy-review";async function Fst(n,a={}){let i=a.now??Date.now(),b=(await Nce(n,a)).recommendations.map(Mct),h=await Jct(n,b,{now:i,operation:Qv});return{schema_version:vre,action:"refresh",refreshed_at:new Date(i).toISOString(),summary:{recommendations:h.artifacts.length,stale:h.stale.length},artifacts:h.artifacts.map(y=>({artifact_id:y.artifact_id,recommendation_id:y.recommendation_id,status:y.status,fingerprint:y.fingerprint})),stale_artifacts:h.stale.map(y=>({artifact_id:y.artifact_id,recommendation_id:y.recommendation_id,status:"stale",fingerprint:y.fingerprint}))}}async function Xst(n,a){let i=Hst(a.approver,"accept"),d=a.now??Date.now(),b=await wst(n,a.id),h=xhn(b),[y,w]=await Promise.all([n.getNode(h.from_rid),n.getNode(h.to_rid)]);if(!y)throw new Error(`tidy recommendation source node not found: ${h.from_rid}`);if(!w)throw new Error(`tidy recommendation target node not found: ${h.to_rid}`);let J=await n.upsertEdge({label:h.label,from_rid:h.from_rid,to_rid:h.to_rid,properties:{reason:a.reason??"accepted provider tidy recommendation",approved_by:i,approved_at:d,approval_source:`${cwe} accept`,provider_review_artifact_id:b.artifact_id,provider_review_recommendation_id:b.recommendation_id,provider_review_recommendation_key:b.recommendation_key,provider_review_fingerprint:b.fingerprint,schema_version:vre}}),B=await dfe(n,b.artifact_id,"accepted",{now:d,approver:i,reason:a.reason,source:`${cwe} accept`});return{schema_version:vre,action:"accept",recommendation_id:B.recommendation_id,artifact_id:B.artifact_id,accepted_by:i,accepted_at:new Date(d).toISOString(),edge:{edge_rid:J,label:h.label,from_rid:h.from_rid,to_rid:h.to_rid},artifact:{status:"accepted",fingerprint:B.fingerprint}}}async function fst(n,a){let i=Hst(a.approver,"dismiss"),d=a.now??Date.now(),b=await wst(n,a.id),h=await dfe(n,b.artifact_id,"dismissed",{now:d,approver:i,reason:a.reason,source:`${cwe} dismiss`});return{schema_version:vre,action:"dismiss",recommendation_id:h.recommendation_id,artifact_id:h.artifact_id,dismissed_by:i,dismissed_at:new Date(d).toISOString(),artifact:{status:"dismissed",fingerprint:h.fingerprint}}}async function wst(n,a){let i=a.trim();if(!i)throw new Error("memory tidy-review requires a recommendation id");let d=(await oj(n,{operation:Qv})).filter(h=>h.artifact_id===i||h.recommendation_id===i);if(d.length===0)throw new Error(`tidy recommendation not found: ${i}`);let b=d.filter(h=>h.status==="open");if(b.length===1)return b[0];throw b.length>1?new Error(`tidy recommendation id is ambiguous; use an artifact id: ${b.map(h=>h.artifact_id).join(", ")}`):d.some(h=>h.status==="stale")?new Error(`tidy recommendation is stale: ${i}; refresh provider review evidence before accepting or dismissing it`):new Error(`tidy recommendation is not open: ${i} (${d[0].status})`)}function xhn(n){for(let a of n.pair_evidence)for(let i of a.evidence??[]){let d=zhn(i.proposed_edge_label??i.edge_label),b=vst(i.duplicate_rid??i.from_rid??i.from),h=vst(i.canonical_rid??i.to_rid??i.to);if(d&&b!=null&&h!=null)return{label:d,from_rid:b,to_rid:h}}throw new Error(`tidy recommendation has no supported Soft-merge edge: ${n.artifact_id}`)}function zhn(n){if(typeof n!="string")return null;let a=n.trim().toUpperCase();return a==="SAME_AS"||a==="MERGED_INTO"?a:null}function vst(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function Hst(n,a){let i=n.trim();if(!i)throw new Error(`memory tidy-review ${a} requires --approver`);return i}uH();import{resolve as Ast}from"node:path";import{createHash as Uhn,randomUUID as _st}from"node:crypto";import{spawn as Mhn}from"node:child_process";import{constants as iwe}from"node:fs";import{readFileSync as Bhn}from"node:fs";import{mkdir as Cst,open as Shn,rm as Jst}from"node:fs/promises";import{tmpdir as Thn}from"node:os";import{dirname as owe,join as IQ,resolve as dwe}from"node:path";import{fileURLToPath as jhn}from"node:url";import{createConnection as Ohn}from"node:net";async function rwe(n,a){let i=n.timeoutMs??1e3;return await new Promise((d,b)=>{let h=Ohn(n.socketPath),y=!1,w="",J=setTimeout(()=>{B(()=>b(new Error("resident rsp server timed out"))),h.destroy()},i);function B(ne){y||(y=!0,clearTimeout(J),ne())}h.on("connect",()=>{h.write(`${JSON.stringify(a)}
6525
6525
  `)}),h.on("data",ne=>{w+=ne.toString("utf8");let Ze=w.indexOf(`
6526
- `);if(Ze<0)return;let D=w.slice(0,Ze);B(()=>{try{d(JSON.parse(D))}catch(qe){b(qe)}}),h.end()}),h.on("error",ne=>B(()=>b(ne))),h.on("close",()=>{y||B(()=>b(new Error("resident rsp server closed without response")))})})}var Dhn=108;function kst(n){let a=nWn(n)??dwe(n),i=tWn(a);return{rootDir:a,socketPath:IQ(i,"rsp.sock"),lockPath:IQ(i,"rsp.lock"),wakeLockPath:IQ(i,"rsp.wake.lock")}}var Fre=class{constructor(a,i){this.paths=a;this.config=i}async request(a){await Khn(this.paths,this.config);let i=await rwe(this.paths,{...a,id:_st()});if(!i.ok)throw new Error(i.error);return i.value}};async function Khn(n,a){if(await Cst(owe(n.socketPath),{recursive:!0,mode:448}),await swe(n.socketPath))return;let i=await qhn(n.lockPath);if(i)try{if(await swe(n.socketPath))return;await Phn(n.socketPath);let d=$hn(n,a);await Qst(n.socketPath,d);return}finally{await i.close(),await Jst(n.lockPath,{force:!0})}await Qst(n.socketPath)}async function swe(n,a=200){try{return(await rwe({socketPath:n,timeoutMs:a},{id:_st(),op:"ping"})).ok}catch{return!1}}async function Qst(n,a){let i=Date.now()+5e3,d;for(;Date.now()<i;){if(await swe(n))return;if(a&&a.exitCode!=null)throw new Error(`resident rsp server exited before ready (${a.exitCode})`);await new Promise(b=>setTimeout(b,50))}throw d instanceof Error?d:new Error("resident rsp server did not start")}async function Phn(n){await Jst(n,{force:!0})}async function qhn(n){await Cst(owe(n),{recursive:!0,mode:448});try{return await Shn(n,iwe.O_CREAT|iwe.O_EXCL|iwe.O_RDWR)}catch(a){if(a.code!=="EEXIST")throw a;return null}}function $hn(n,a){let[i,d]=eWn(a),b=Mhn(i,[...d,"server","--socket",n.socketPath,"--store-uri",a.storeUri,"--ttl-days",String(a.ttlDays),"--byte-budget",String(a.byteBudget)],{cwd:n.rootDir,detached:!0,stdio:"ignore",env:{...process.env,RSP_RESIDENT_SERVER:"1"}});return b.unref(),b}function eWn(n){if(n.serverCommand)return[n.serverCommand,n.serverArgs??[]];let a=process.argv[1]?dwe(process.argv[1]):jhn(import.meta.url);return[process.execPath,[...process.execArgv,a]]}function tWn(n){let a=Uhn("sha256").update(n).digest("hex").slice(0,20),i=process.env.XDG_RUNTIME_DIR;if(i){let b=IQ(i,"red-skills",a);if(IQ(b,"rsp.sock").length<Dhn)return b}let d=typeof process.getuid=="function"?process.getuid():"nouid";return IQ(Thn(),`red-skills-${d}`,a)}function nWn(n){let a=dwe(n);for(let i=0;i<32;i++){try{if(Est(IQ(a,".red","config.yaml"))!=null||Est(IQ(a,".git","HEAD"))!=null)return a}catch{}let d=owe(a);if(d===a)return null;a=d}return null}function Est(n){try{return Bhn(n,"utf8")}catch{return null}}var Gwe=".red/tmp/red-skills.rdb",IWn=7,lWn=64*1024*1024;function mwe(n,a){if(a.mode!=="graph")return!1;let i=a.storePath??"";return i===Gwe?!0:Ast(n,i).endsWith(`/${Gwe}`)}async function bwe(n,a,i,d){let b=kst(n);return await new Fre(b,{storeUri:`file://${Ast(n,Gwe)}`,ttlDays:IWn,byteBudget:lWn,serverCommand:process.env.RSP_BIN??"rsp"}).request({op:"memory",action:i,payload:d})}mT();N3();BZ();import{execFile as aWn}from"node:child_process";import{createHash as cWn}from"node:crypto";import{existsSync as Lst}from"node:fs";import{dirname as xst,join as rWn}from"node:path";import{fileURLToPath as Ust}from"node:url";import{promisify as iWn}from"node:util";var sWn=iWn(aWn),zst="vcs:last-meaningful-commit";async function Mst(n,a,i={}){if(a.mode!=="graph")throw new Error(`memory commit needs graph mode \u2014 this project is "${a.mode}". Re-run \`memory init --mode graph\` first`);let d=i.message??"memory graph checkpoint",b=Ys(n,a),h=Ust(b),y=await Js.open({uri:b}),w=[],J=[],B="",ne=null;try{let ye=await ire(y);w=ye.versioned,J=ye.skipped,B=await oWn(y,w),ne=GWn(await y.kvGet(zst))}finally{await y.close()}if(ne?.fingerprint===B)return{status:"unchanged",committed:!1,message:d,included:w,skipped:J,fingerprint:B,previousCommit:ne.hash};let Ze=await mWn(h,d,i),D={fingerprint:B,hash:Ze.hash},qe=await Js.open({uri:b});try{await qe.kvPut(zst,D)}finally{await qe.close()}return{status:"committed",committed:!0,message:d,included:w,skipped:J,fingerprint:B,commit:Ze}}async function oWn(n,a){let i={};for(let d of a)i[d]=await dWn(n,d);return cWn("sha256").update(uwe(i)).digest("hex")}async function dWn(n,a){if(a===Hr.docs)try{let{items:d}=await n.raw.documents.list(Hr.docs,{limit:1e5});return Ost(d)}catch{return[]}let i=await n.raw.query(`SELECT * FROM ${a}`);return Ost(i.rows)}function Ost(n){return[...n].sort((a,i)=>uwe(a).localeCompare(uwe(i)))}function uwe(n){return JSON.stringify(pwe(n))}function GWn(n){let a;try{a=typeof n=="string"?JSON.parse(n):n}catch{return null}if(!a||typeof a!="object")return null;let i=a;return typeof i.fingerprint!="string"||typeof i.hash!="string"?null:{fingerprint:i.fingerprint,hash:i.hash}}function pwe(n){if(Array.isArray(n))return n.map(pwe);if(n&&typeof n=="object"){let a={};for(let i of Object.keys(n).sort())a[i]=pwe(n[i]);return a}return n}async function mWn(n,a,i){let d=["vcs","commit","--path",n,"--message",a,"--json"];i.author&&d.push("--author",i.author),i.email&&d.push("--email",i.email);let{stdout:b}=await sWn(bWn(),d,{encoding:"utf8",maxBuffer:1024*1024}),h=JSON.parse(b);if(!h.ok||!h.data?.hash)throw new Error(`red vcs commit failed${h.error?`: ${h.error}`:""}`);return{hash:h.data.hash,height:Number(h.data.height??0),parents:h.data.parents??[]}}function bWn(){let n=process.env.REDDB_BIN;if(n&&Lst(n))return n;let a=process.platform==="win32"?"red.exe":"red",i=xst(xst(Ust(import.meta.url))),d=rWn(i,"node_modules","@reddb-io","sdk","bin",a);if(Lst(d))return d;throw new Error(`red binary not found \u2014 set REDDB_BIN or install @reddb-io/sdk (looked at ${d})`)}async function Bst(n,a){let i=uWn(a.issueBody),d=ZWn(a.repository,a.issueNumber),b={label:d,node_type:"issue",properties:{title:a.issueTitle??d,repository:a.repository,issue_number:a.issueNumber,url:a.issueUrl,source:"github-issues",...i!=null?{parent_prd:i}:{},hash:li("issue",a.repository,String(a.issueNumber))}},h=await n.upsertNode(b),y,w;if(i!=null){let An=hWn(a.repository,i),Ia={label:An,node_type:"prd",properties:{title:An,repository:a.repository,prd_number:i,source:"github-issues",hash:li("prd",a.repository,String(i))}};y=await n.upsertNode(Ia),w=await n.upsertEdge({label:"CONTAINS",from_rid:y,to_rid:h})}let J=VWn(a.touchedFiles),B=gWn(a.hooks),ne=WWn(a.repository,a.issueNumber,a.attemptNumber,a.workerId),Ze={label:ne,node_type:"attempt",properties:{title:a.summary??ne,content:a.summary,repository:a.repository,issue_number:a.issueNumber,attempt_number:a.attemptNumber,worker_id:a.workerId,...i!=null?{parent_prd:i}:{},status:a.status,issue_type:a.issueType,model_tier:a.modelTier,outcome:a.outcome,branch:a.branch,duration_ms:a.durationMs,diffstat:a.diffstat,envelope_ref:a.envelopeRef,envelope_hash:a.envelopeHash,merge_commit:a.mergeCommit,failure_branch:a.failureBranch,touched_files:J,notes:a.notes,error_class:a.errorClass,validation_summary:a.validationSummary,...B.length>0?{hooks:B}:{},summary:a.summary,source:"afk",hash:li("attempt",a.repository,String(a.issueNumber),String(a.attemptNumber),a.workerId??"",a.envelopeHash??"")}},D=await n.upsertNode(Ze),qe=await n.upsertEdge({label:"CONTAINS",from_rid:h,to_rid:D}),ye=[],fe=[];for(let An of J){let Ia={label:NWn(An),node_type:"file",properties:{title:An,source:An,hash:li("file",An)}},$n=await n.upsertNode(Ia);ye.push($n),fe.push(await n.upsertEdge({label:"TOUCHED",from_rid:D,to_rid:$n}))}let ft=yWn(a.validationRecords),Zn=[],Tt=[];for(let An of ft){let Ia={label:YWn(a.repository,a.issueNumber,a.attemptNumber,An.name),node_type:"validation",properties:{title:An.name,repository:a.repository,issue_number:a.issueNumber,attempt_number:a.attemptNumber,worker_id:a.workerId,name:An.name,command:An.command,status:An.status,duration_ms:An.durationMs,summary:An.summary,source:"afk-validation-sidecar",hash:li("validation",a.repository,String(a.issueNumber),String(a.attemptNumber),a.workerId??"",a.envelopeHash??"",An.name)}},$n=await n.upsertNode(Ia);Zn.push($n),Tt.push(await n.upsertEdge({label:"TESTED_BY",from_rid:D,to_rid:$n}))}let aI=await pWn(n,a.repository,a.issueNumber);return{attemptRid:D,issueRid:h,prdRid:y,parentPrd:i??void 0,prdContainsIssueEdge:w,fileRids:ye,touchedEdges:fe,validationRids:Zn,testedByEdges:Tt,containsEdge:qe,precedesEdges:aI,touchedFiles:J}}function uWn(n){if(!n)return null;let a=n.match(/^[ \t]*parent-prd[ \t]*:[ \t]*#?(\d+)\b/im);if(a)return Number(a[1]);let i=n.match(/^[ \t]*prd[ \t]*:[ \t]*#?(\d+)\b/im);return i?Number(i[1]):null}async function pWn(n,a,i){let b=(await n.listNodes()).filter(y=>y.node_type==="attempt").filter(y=>y.properties.repository===a&&Number(y.properties.issue_number)===i).map(y=>({rid:y.rid,attemptNumber:Number(y.properties.attempt_number??0)})).filter(y=>Number.isFinite(y.attemptNumber));b.sort((y,w)=>y.attemptNumber!==w.attemptNumber?y.attemptNumber-w.attemptNumber:y.rid-w.rid);let h=[];for(let y=1;y<b.length;y++)h.push(await n.upsertEdge({label:"PRECEDES",from_rid:b[y-1].rid,to_rid:b[y].rid}));return h}function ZWn(n,a){return`issue:${n}#${a}`}function hWn(n,a){return`prd:${n}#${a}`}function WWn(n,a,i,d){let b=`attempt:${n}#${a}/${i}`;return d?`${b}@${d}`:b}function NWn(n){return`file:${n}`}function YWn(n,a,i,d){return`validation:${n}#${a}/${i}/${d}`}function VWn(n){if(!n||n.length===0)return[];let a=new Set,i=[];for(let d of n){if(typeof d!="string")continue;let b=d.trim();b.length===0||a.has(b)||(a.add(b),i.push(b))}return i}function gWn(n){if(!Array.isArray(n))return[];let a=[];for(let i of n){if(i==null||typeof i!="object")continue;let d=i,b=typeof d.lifecycle=="string"?d.lifecycle.trim():"",h=typeof d.command=="string"?d.command.trim():"",y=d.exit_code,w=typeof y=="number"&&Number.isFinite(y)?Math.trunc(y):typeof y=="string"&&/^-?\d+$/.test(y.trim())?Number(y.trim()):NaN;!b||!h||!Number.isFinite(w)||a.push({lifecycle:b,command:h,exit_code:w})}return a}function yWn(n){if(!Array.isArray(n))return[];let a=[];for(let i of n){if(i==null||typeof i!="object")continue;let d=i,b=typeof d.name=="string"?d.name.trim():"",h=typeof d.status=="string"?d.status.trim():"";if(!b||!h)continue;let y=typeof d.command=="string"?d.command.trim():void 0,w=typeof d.summary=="string"?d.summary.trim():void 0,J=typeof d.durationMs=="number"&&Number.isFinite(d.durationMs)?d.durationMs:void 0;a.push({name:b,status:h,...y?{command:y}:{},...J!=null?{durationMs:J}:{},...w?{summary:w.slice(0,1e3)}:{}})}return a}import{mkdir as RWn,writeFile as vWn}from"node:fs/promises";import{join as Sst,relative as FWn}from"node:path";async function qst(n){let a=await n.listNodes(),i=await n.listEdges(),d=a.filter(w=>w.node_type==="attempt").sort(fWn),b=a.filter(w=>w.node_type==="validation").sort((w,J)=>w.rid-J.rid),h=[],y=[];for(let w of d){let J=[wWn(w)],B=Xre(w,"summary")??Xre(w,"content")??"",ne=Xre(w,"notes")??"",Ze=Tst(ne||B,J);if(Ze&&y.push(Ze),QWn(w)){h.push(MJ({kind:"failure",title:`Failure: ${String(w.properties.status??"attempt failed")} on ${w.label}`,recommendation:lQ(B||`${w.label} ended with status ${String(w.properties.status??"unknown")}.`),targetNodeType:"problem",confidence:"EXTRACTED",evidence:J}));let D=_Wn(w);D&&h.push(MJ({kind:"skill_improvement",title:`Skill improvement candidate: ${D}`,recommendation:lQ(`Review ${D} for missing prerequisites, validation guidance, or recovery steps related to ${String(w.properties.error_class??w.properties.status??"the failed attempt")}.`),targetNodeType:"workflow",confidence:"INFERRED",evidence:J}))}EWn(B)&&h.push(MJ({kind:"durable_fact",title:`Durable fact from ${w.label}`,recommendation:lQ(B),targetNodeType:"decision",confidence:"INFERRED",evidence:J}))}for(let w of b){let J=[HWn(w)],B=JWn(w),ne=String(w.properties.summary??""),Ze=Tst(ne,J);if(Ze&&y.push(Ze),h.push(MJ({kind:"validation",title:`Validation ${String(w.properties.name??w.label)} ${String(w.properties.status??"recorded")}`,recommendation:lQ([w.properties.command?`Command \`${String(w.properties.command)}\``:`Validation ${String(w.properties.name??w.label)}`,`finished with status ${String(w.properties.status??"unknown")}.`,Ze?"":ne].join(" ")),targetNodeType:"validation",confidence:"EXTRACTED",evidence:J})),kWn(w)&&h.push(MJ({kind:"durable_fact",title:`Durable fact from validation ${String(w.properties.name??w.label)}`,recommendation:lQ(`Validation ${String(w.properties.name??w.label)} passed for issue ${String(w.properties.issue_number??"unknown")}.`),targetNodeType:"decision",confidence:"EXTRACTED",evidence:J})),B){h.push(MJ({kind:"failure",title:`Failure: validation ${String(w.properties.name??w.label)} failed`,recommendation:lQ(String(w.properties.summary??"")||`Validation ${String(w.properties.name??w.label)} failed.`),targetNodeType:"problem",confidence:"EXTRACTED",evidence:J}));let D=CWn(w,a,i);D&&h.push(MJ({kind:"skill_improvement",title:`Skill improvement candidate: ${D}`,recommendation:lQ(`Review ${D} for validation guidance related to failed check ${String(w.properties.name??w.label)}.`),targetNodeType:"workflow",confidence:"INFERRED",evidence:J}))}}return{proposals:XWn(h).sort((w,J)=>w.kind.localeCompare(J.kind)||w.title.localeCompare(J.title)),rejected:y}}async function $st(n,a){if(a.proposals.length===0)return null;let i=AWn(a),d=Sst(n,".red","memory","proposals");await RWn(d,{recursive:!0});let b=`attempt-learning-${i.slice(0,12)}.md`,h=Sst(d,b);return await vWn(h,LWn(a,i),"utf8"),xWn(FWn(n,h))}function eot(n){let a=n.match(/```json memory-learning-proposal\s*([\s\S]*?)```/);if(!a)throw new Error("proposal needs a structured memory-learning-proposal block");let i=JSON.parse(a[1]);if(!i||typeof i!="object"||Array.isArray(i))throw new Error("memory-learning-proposal must be a JSON object");let d=i;if(!Array.isArray(d.proposals))throw new Error("memory-learning-proposal.proposals is required");return{proposals:d.proposals,rejected:Array.isArray(d.rejected)?d.rejected:[]}}async function tot(n,a){let i=[],d=[];for(let b of a.proposals){let h={label:`learning:${b.kind}:${b.id.slice(0,16)}`,node_type:b.targetNodeType,properties:{title:b.title,content:b.recommendation,summary:b.evidenceSummary,source:"attempt-learning",confidence:b.confidence,tags:["attempt-learning",b.kind],hash:li("attempt-learning",b.id),provenance:{source_kind:"derived",writer:"memory attempt learn apply",command:"memory attempt learn apply",confidence:b.confidence,evidence:b.evidence.map(w=>w.description)}}},y=await n.upsertNode(h);i.push(y);for(let w of b.evidence)d.push(await n.upsertEdge({label:"LEARNED_FROM",from_rid:y,to_rid:w.rid,properties:{reason:b.kind,source:"attempt-learning"}}))}return{applied:a.proposals.length,nodeRids:i,edgeRids:d}}function MJ(n){let a=n.evidence.map(d=>d.description).join("; "),i=li("attempt-learning",n.kind,n.title,n.recommendation,a);return{...n,id:i,evidenceSummary:a}}function XWn(n){let a=new Set,i=[];for(let d of n)a.has(d.id)||(a.add(d.id),i.push(d));return i}function fWn(n,a){let i=String(n.properties.repository??"").localeCompare(String(a.properties.repository??""));if(i!==0)return i;let d=Number(n.properties.issue_number??0)-Number(a.properties.issue_number??0);if(d!==0)return d;let b=Number(n.properties.attempt_number??0)-Number(a.properties.attempt_number??0);return b!==0?b:n.rid-a.rid}function wWn(n){let a=String(n.properties.status??"unknown"),i=lQ(String(n.properties.summary??n.properties.content??n.properties.title??""));return{rid:n.rid,label:n.label,nodeType:"attempt",description:`attempt rid=${n.rid} label=${n.label} status=${a}${i?` summary=${i}`:""}`}}function HWn(n){return{rid:n.rid,label:n.label,nodeType:"validation",description:`validation rid=${n.rid} label=${n.label} name=${String(n.properties.name??"")} status=${String(n.properties.status??"unknown")}`}}function Tst(n,a){return n?/\b(raw stdout|raw stderr|operational log|tail of .*log|bg-task|\/tmp\/)\b/i.test(n)?{kind:"raw_operational_log",action:"rejected",reason:"raw operational logs are not durable Memory facts",evidence:a}:/\b(wip|in progress|still running|trying|next step|todo|temporary)\b/i.test(n)?{kind:"temporary_progress",action:"downgraded",reason:"temporary progress is attempt evidence, not a durable learning",evidence:a}:null:null}function QWn(n){let a=String(n.properties.status??"").toLowerCase();return a!==""&&a!=="done"}function EWn(n){return!n||n.length<24||/\b(wip|still running|trying|todo|raw stdout|raw stderr|operational log)\b/i.test(n)?!1:/\b(must|uses?|stores?|records?|creates?|links?|dedupes?|verifies?|rejects?|requires?|without|approval-gated)\b/i.test(n)}function _Wn(n){let a=n.properties.touched_files;if(!Array.isArray(a))return null;for(let i of a)if(typeof i=="string"&&/((^|\/)skills\/.*\/SKILL\.md$)|(^|\/)SKILL\.md$/i.test(i))return i;return null}function CWn(n,a,i){let d=i.find(B=>jst(B)==="TESTED_BY"&&Kst(B)===n.rid),b=Dst(d);if(!Number.isFinite(b))return null;let h=i.find(B=>jst(B)==="TOUCHED"&&Dst(B)===b),y=Kst(h);if(!Number.isFinite(y))return null;let w=a.find(B=>B.rid===y),J=Pst(w,"title")??Pst(w,"source")??"";return/(^|\/)skills\/.*\/SKILL\.md$/i.test(J)?J:null}function jst(n){return String(n?.label??n?.LABEL??"")}function Dst(n){return Number(n?.from??n?.from_rid??n?.FROM??n?.FROM_RID)}function Kst(n){return Number(n?.to??n?.to_rid??n?.TO??n?.TO_RID)}function JWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="failed"||a==="error"||a==="timed-out"}function kWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="passed"||a==="succeeded"||a==="success"}function Xre(n,a){let i=n.properties[a];return typeof i=="string"&&i.trim()?i.trim():null}function Pst(n,a){return n?Xre(n,a):null}function lQ(n){return n.replace(/\s+/g," ").trim().slice(0,500)}function AWn(n){return li("attempt-learning-report",...n.proposals.map(a=>a.id))}function LWn(n,a){let i=[...new Set(n.proposals.map(d=>d.kind))].join(", ");return`# Attempt Learning Proposal
6526
+ `);if(Ze<0)return;let D=w.slice(0,Ze);B(()=>{try{d(JSON.parse(D))}catch(qe){b(qe)}}),h.end()}),h.on("error",ne=>B(()=>b(ne))),h.on("close",()=>{y||B(()=>b(new Error("resident rsp server closed without response")))})})}var Dhn=108;function kst(n){let a=nWn(n)??dwe(n),i=tWn(a);return{rootDir:a,socketPath:IQ(i,"rsp.sock"),lockPath:IQ(i,"rsp.lock"),wakeLockPath:IQ(i,"rsp.wake.lock")}}var Fre=class{constructor(a,i){this.paths=a;this.config=i}async request(a){await Khn(this.paths,this.config);let i=await rwe(this.paths,{...a,id:_st()});if(!i.ok)throw new Error(i.error);return i.value}};async function Khn(n,a){if(await Cst(owe(n.socketPath),{recursive:!0,mode:448}),await swe(n.socketPath))return;let i=await qhn(n.lockPath);if(i)try{if(await swe(n.socketPath))return;await Phn(n.socketPath);let d=$hn(n,a);await Qst(n.socketPath,d);return}finally{await i.close(),await Jst(n.lockPath,{force:!0})}await Qst(n.socketPath)}async function swe(n,a=200){try{return(await rwe({socketPath:n,timeoutMs:a},{id:_st(),op:"ping"})).ok}catch{return!1}}async function Qst(n,a){let i=Date.now()+5e3,d;for(;Date.now()<i;){if(await swe(n))return;if(a&&a.exitCode!=null)throw new Error(`resident rsp server exited before ready (${a.exitCode})`);await new Promise(b=>setTimeout(b,50))}throw d instanceof Error?d:new Error("resident rsp server did not start")}async function Phn(n){await Jst(n,{force:!0})}async function qhn(n){await Cst(owe(n),{recursive:!0,mode:448});try{return await Shn(n,iwe.O_CREAT|iwe.O_EXCL|iwe.O_RDWR)}catch(a){if(a.code!=="EEXIST")throw a;return null}}function $hn(n,a){let[i,d]=eWn(a),b=Mhn(i,[...d,"server","--socket",n.socketPath,"--store-uri",a.storeUri,"--ttl-days",String(a.ttlDays),"--byte-budget",String(a.byteBudget),"--telemetry-ttl-days",String(a.telemetryTtlDays??90),"--telemetry-byte-budget",String(a.telemetryByteBudget??a.byteBudget)],{cwd:n.rootDir,detached:!0,stdio:"ignore",env:{...process.env,RSP_RESIDENT_SERVER:"1"}});return b.unref(),b}function eWn(n){if(n.serverCommand)return[n.serverCommand,n.serverArgs??[]];let a=process.argv[1]?dwe(process.argv[1]):jhn(import.meta.url);return[process.execPath,[...process.execArgv,a]]}function tWn(n){let a=Uhn("sha256").update(n).digest("hex").slice(0,20),i=process.env.XDG_RUNTIME_DIR;if(i){let b=IQ(i,"red-skills",a);if(IQ(b,"rsp.sock").length<Dhn)return b}let d=typeof process.getuid=="function"?process.getuid():"nouid";return IQ(Thn(),`red-skills-${d}`,a)}function nWn(n){let a=dwe(n);for(let i=0;i<32;i++){try{if(Est(IQ(a,".red","config.yaml"))!=null||Est(IQ(a,".git","HEAD"))!=null)return a}catch{}let d=owe(a);if(d===a)return null;a=d}return null}function Est(n){try{return Bhn(n,"utf8")}catch{return null}}var Gwe=".red/tmp/red-skills.rdb",IWn=7,lWn=64*1024*1024;function mwe(n,a){if(a.mode!=="graph")return!1;let i=a.storePath??"";return i===Gwe?!0:Ast(n,i).endsWith(`/${Gwe}`)}async function bwe(n,a,i,d){let b=kst(n);return await new Fre(b,{storeUri:`file://${Ast(n,Gwe)}`,ttlDays:IWn,byteBudget:lWn,serverCommand:process.env.RSP_BIN??"rsp"}).request({op:"memory",action:i,payload:d})}mT();N3();BZ();import{execFile as aWn}from"node:child_process";import{createHash as cWn}from"node:crypto";import{existsSync as Lst}from"node:fs";import{dirname as xst,join as rWn}from"node:path";import{fileURLToPath as Ust}from"node:url";import{promisify as iWn}from"node:util";var sWn=iWn(aWn),zst="vcs:last-meaningful-commit";async function Mst(n,a,i={}){if(a.mode!=="graph")throw new Error(`memory commit needs graph mode \u2014 this project is "${a.mode}". Re-run \`memory init --mode graph\` first`);let d=i.message??"memory graph checkpoint",b=Ys(n,a),h=Ust(b),y=await Js.open({uri:b}),w=[],J=[],B="",ne=null;try{let ye=await ire(y);w=ye.versioned,J=ye.skipped,B=await oWn(y,w),ne=GWn(await y.kvGet(zst))}finally{await y.close()}if(ne?.fingerprint===B)return{status:"unchanged",committed:!1,message:d,included:w,skipped:J,fingerprint:B,previousCommit:ne.hash};let Ze=await mWn(h,d,i),D={fingerprint:B,hash:Ze.hash},qe=await Js.open({uri:b});try{await qe.kvPut(zst,D)}finally{await qe.close()}return{status:"committed",committed:!0,message:d,included:w,skipped:J,fingerprint:B,commit:Ze}}async function oWn(n,a){let i={};for(let d of a)i[d]=await dWn(n,d);return cWn("sha256").update(uwe(i)).digest("hex")}async function dWn(n,a){if(a===Hr.docs)try{let{items:d}=await n.raw.documents.list(Hr.docs,{limit:1e5});return Ost(d)}catch{return[]}let i=await n.raw.query(`SELECT * FROM ${a}`);return Ost(i.rows)}function Ost(n){return[...n].sort((a,i)=>uwe(a).localeCompare(uwe(i)))}function uwe(n){return JSON.stringify(pwe(n))}function GWn(n){let a;try{a=typeof n=="string"?JSON.parse(n):n}catch{return null}if(!a||typeof a!="object")return null;let i=a;return typeof i.fingerprint!="string"||typeof i.hash!="string"?null:{fingerprint:i.fingerprint,hash:i.hash}}function pwe(n){if(Array.isArray(n))return n.map(pwe);if(n&&typeof n=="object"){let a={};for(let i of Object.keys(n).sort())a[i]=pwe(n[i]);return a}return n}async function mWn(n,a,i){let d=["vcs","commit","--path",n,"--message",a,"--json"];i.author&&d.push("--author",i.author),i.email&&d.push("--email",i.email);let{stdout:b}=await sWn(bWn(),d,{encoding:"utf8",maxBuffer:1024*1024}),h=JSON.parse(b);if(!h.ok||!h.data?.hash)throw new Error(`red vcs commit failed${h.error?`: ${h.error}`:""}`);return{hash:h.data.hash,height:Number(h.data.height??0),parents:h.data.parents??[]}}function bWn(){let n=process.env.REDDB_BIN;if(n&&Lst(n))return n;let a=process.platform==="win32"?"red.exe":"red",i=xst(xst(Ust(import.meta.url))),d=rWn(i,"node_modules","@reddb-io","sdk","bin",a);if(Lst(d))return d;throw new Error(`red binary not found \u2014 set REDDB_BIN or install @reddb-io/sdk (looked at ${d})`)}async function Bst(n,a){let i=uWn(a.issueBody),d=ZWn(a.repository,a.issueNumber),b={label:d,node_type:"issue",properties:{title:a.issueTitle??d,repository:a.repository,issue_number:a.issueNumber,url:a.issueUrl,source:"github-issues",...i!=null?{parent_prd:i}:{},hash:li("issue",a.repository,String(a.issueNumber))}},h=await n.upsertNode(b),y,w;if(i!=null){let An=hWn(a.repository,i),Ia={label:An,node_type:"prd",properties:{title:An,repository:a.repository,prd_number:i,source:"github-issues",hash:li("prd",a.repository,String(i))}};y=await n.upsertNode(Ia),w=await n.upsertEdge({label:"CONTAINS",from_rid:y,to_rid:h})}let J=VWn(a.touchedFiles),B=gWn(a.hooks),ne=WWn(a.repository,a.issueNumber,a.attemptNumber,a.workerId),Ze={label:ne,node_type:"attempt",properties:{title:a.summary??ne,content:a.summary,repository:a.repository,issue_number:a.issueNumber,attempt_number:a.attemptNumber,worker_id:a.workerId,...i!=null?{parent_prd:i}:{},status:a.status,issue_type:a.issueType,model_tier:a.modelTier,outcome:a.outcome,branch:a.branch,duration_ms:a.durationMs,diffstat:a.diffstat,envelope_ref:a.envelopeRef,envelope_hash:a.envelopeHash,merge_commit:a.mergeCommit,failure_branch:a.failureBranch,touched_files:J,notes:a.notes,error_class:a.errorClass,validation_summary:a.validationSummary,...B.length>0?{hooks:B}:{},summary:a.summary,source:"afk",hash:li("attempt",a.repository,String(a.issueNumber),String(a.attemptNumber),a.workerId??"",a.envelopeHash??"")}},D=await n.upsertNode(Ze),qe=await n.upsertEdge({label:"CONTAINS",from_rid:h,to_rid:D}),ye=[],fe=[];for(let An of J){let Ia={label:NWn(An),node_type:"file",properties:{title:An,source:An,hash:li("file",An)}},$n=await n.upsertNode(Ia);ye.push($n),fe.push(await n.upsertEdge({label:"TOUCHED",from_rid:D,to_rid:$n}))}let ft=yWn(a.validationRecords),Zn=[],Tt=[];for(let An of ft){let Ia={label:YWn(a.repository,a.issueNumber,a.attemptNumber,An.name),node_type:"validation",properties:{title:An.name,repository:a.repository,issue_number:a.issueNumber,attempt_number:a.attemptNumber,worker_id:a.workerId,name:An.name,command:An.command,status:An.status,duration_ms:An.durationMs,summary:An.summary,source:"afk-validation-sidecar",hash:li("validation",a.repository,String(a.issueNumber),String(a.attemptNumber),a.workerId??"",a.envelopeHash??"",An.name)}},$n=await n.upsertNode(Ia);Zn.push($n),Tt.push(await n.upsertEdge({label:"TESTED_BY",from_rid:D,to_rid:$n}))}let aI=await pWn(n,a.repository,a.issueNumber);return{attemptRid:D,issueRid:h,prdRid:y,parentPrd:i??void 0,prdContainsIssueEdge:w,fileRids:ye,touchedEdges:fe,validationRids:Zn,testedByEdges:Tt,containsEdge:qe,precedesEdges:aI,touchedFiles:J}}function uWn(n){if(!n)return null;let a=n.match(/^[ \t]*parent-prd[ \t]*:[ \t]*#?(\d+)\b/im);if(a)return Number(a[1]);let i=n.match(/^[ \t]*prd[ \t]*:[ \t]*#?(\d+)\b/im);return i?Number(i[1]):null}async function pWn(n,a,i){let b=(await n.listNodes()).filter(y=>y.node_type==="attempt").filter(y=>y.properties.repository===a&&Number(y.properties.issue_number)===i).map(y=>({rid:y.rid,attemptNumber:Number(y.properties.attempt_number??0)})).filter(y=>Number.isFinite(y.attemptNumber));b.sort((y,w)=>y.attemptNumber!==w.attemptNumber?y.attemptNumber-w.attemptNumber:y.rid-w.rid);let h=[];for(let y=1;y<b.length;y++)h.push(await n.upsertEdge({label:"PRECEDES",from_rid:b[y-1].rid,to_rid:b[y].rid}));return h}function ZWn(n,a){return`issue:${n}#${a}`}function hWn(n,a){return`prd:${n}#${a}`}function WWn(n,a,i,d){let b=`attempt:${n}#${a}/${i}`;return d?`${b}@${d}`:b}function NWn(n){return`file:${n}`}function YWn(n,a,i,d){return`validation:${n}#${a}/${i}/${d}`}function VWn(n){if(!n||n.length===0)return[];let a=new Set,i=[];for(let d of n){if(typeof d!="string")continue;let b=d.trim();b.length===0||a.has(b)||(a.add(b),i.push(b))}return i}function gWn(n){if(!Array.isArray(n))return[];let a=[];for(let i of n){if(i==null||typeof i!="object")continue;let d=i,b=typeof d.lifecycle=="string"?d.lifecycle.trim():"",h=typeof d.command=="string"?d.command.trim():"",y=d.exit_code,w=typeof y=="number"&&Number.isFinite(y)?Math.trunc(y):typeof y=="string"&&/^-?\d+$/.test(y.trim())?Number(y.trim()):NaN;!b||!h||!Number.isFinite(w)||a.push({lifecycle:b,command:h,exit_code:w})}return a}function yWn(n){if(!Array.isArray(n))return[];let a=[];for(let i of n){if(i==null||typeof i!="object")continue;let d=i,b=typeof d.name=="string"?d.name.trim():"",h=typeof d.status=="string"?d.status.trim():"";if(!b||!h)continue;let y=typeof d.command=="string"?d.command.trim():void 0,w=typeof d.summary=="string"?d.summary.trim():void 0,J=typeof d.durationMs=="number"&&Number.isFinite(d.durationMs)?d.durationMs:void 0;a.push({name:b,status:h,...y?{command:y}:{},...J!=null?{durationMs:J}:{},...w?{summary:w.slice(0,1e3)}:{}})}return a}import{mkdir as RWn,writeFile as vWn}from"node:fs/promises";import{join as Sst,relative as FWn}from"node:path";async function qst(n){let a=await n.listNodes(),i=await n.listEdges(),d=a.filter(w=>w.node_type==="attempt").sort(fWn),b=a.filter(w=>w.node_type==="validation").sort((w,J)=>w.rid-J.rid),h=[],y=[];for(let w of d){let J=[wWn(w)],B=Xre(w,"summary")??Xre(w,"content")??"",ne=Xre(w,"notes")??"",Ze=Tst(ne||B,J);if(Ze&&y.push(Ze),QWn(w)){h.push(MJ({kind:"failure",title:`Failure: ${String(w.properties.status??"attempt failed")} on ${w.label}`,recommendation:lQ(B||`${w.label} ended with status ${String(w.properties.status??"unknown")}.`),targetNodeType:"problem",confidence:"EXTRACTED",evidence:J}));let D=_Wn(w);D&&h.push(MJ({kind:"skill_improvement",title:`Skill improvement candidate: ${D}`,recommendation:lQ(`Review ${D} for missing prerequisites, validation guidance, or recovery steps related to ${String(w.properties.error_class??w.properties.status??"the failed attempt")}.`),targetNodeType:"workflow",confidence:"INFERRED",evidence:J}))}EWn(B)&&h.push(MJ({kind:"durable_fact",title:`Durable fact from ${w.label}`,recommendation:lQ(B),targetNodeType:"decision",confidence:"INFERRED",evidence:J}))}for(let w of b){let J=[HWn(w)],B=JWn(w),ne=String(w.properties.summary??""),Ze=Tst(ne,J);if(Ze&&y.push(Ze),h.push(MJ({kind:"validation",title:`Validation ${String(w.properties.name??w.label)} ${String(w.properties.status??"recorded")}`,recommendation:lQ([w.properties.command?`Command \`${String(w.properties.command)}\``:`Validation ${String(w.properties.name??w.label)}`,`finished with status ${String(w.properties.status??"unknown")}.`,Ze?"":ne].join(" ")),targetNodeType:"validation",confidence:"EXTRACTED",evidence:J})),kWn(w)&&h.push(MJ({kind:"durable_fact",title:`Durable fact from validation ${String(w.properties.name??w.label)}`,recommendation:lQ(`Validation ${String(w.properties.name??w.label)} passed for issue ${String(w.properties.issue_number??"unknown")}.`),targetNodeType:"decision",confidence:"EXTRACTED",evidence:J})),B){h.push(MJ({kind:"failure",title:`Failure: validation ${String(w.properties.name??w.label)} failed`,recommendation:lQ(String(w.properties.summary??"")||`Validation ${String(w.properties.name??w.label)} failed.`),targetNodeType:"problem",confidence:"EXTRACTED",evidence:J}));let D=CWn(w,a,i);D&&h.push(MJ({kind:"skill_improvement",title:`Skill improvement candidate: ${D}`,recommendation:lQ(`Review ${D} for validation guidance related to failed check ${String(w.properties.name??w.label)}.`),targetNodeType:"workflow",confidence:"INFERRED",evidence:J}))}}return{proposals:XWn(h).sort((w,J)=>w.kind.localeCompare(J.kind)||w.title.localeCompare(J.title)),rejected:y}}async function $st(n,a){if(a.proposals.length===0)return null;let i=AWn(a),d=Sst(n,".red","memory","proposals");await RWn(d,{recursive:!0});let b=`attempt-learning-${i.slice(0,12)}.md`,h=Sst(d,b);return await vWn(h,LWn(a,i),"utf8"),xWn(FWn(n,h))}function eot(n){let a=n.match(/```json memory-learning-proposal\s*([\s\S]*?)```/);if(!a)throw new Error("proposal needs a structured memory-learning-proposal block");let i=JSON.parse(a[1]);if(!i||typeof i!="object"||Array.isArray(i))throw new Error("memory-learning-proposal must be a JSON object");let d=i;if(!Array.isArray(d.proposals))throw new Error("memory-learning-proposal.proposals is required");return{proposals:d.proposals,rejected:Array.isArray(d.rejected)?d.rejected:[]}}async function tot(n,a){let i=[],d=[];for(let b of a.proposals){let h={label:`learning:${b.kind}:${b.id.slice(0,16)}`,node_type:b.targetNodeType,properties:{title:b.title,content:b.recommendation,summary:b.evidenceSummary,source:"attempt-learning",confidence:b.confidence,tags:["attempt-learning",b.kind],hash:li("attempt-learning",b.id),provenance:{source_kind:"derived",writer:"memory attempt learn apply",command:"memory attempt learn apply",confidence:b.confidence,evidence:b.evidence.map(w=>w.description)}}},y=await n.upsertNode(h);i.push(y);for(let w of b.evidence)d.push(await n.upsertEdge({label:"LEARNED_FROM",from_rid:y,to_rid:w.rid,properties:{reason:b.kind,source:"attempt-learning"}}))}return{applied:a.proposals.length,nodeRids:i,edgeRids:d}}function MJ(n){let a=n.evidence.map(d=>d.description).join("; "),i=li("attempt-learning",n.kind,n.title,n.recommendation,a);return{...n,id:i,evidenceSummary:a}}function XWn(n){let a=new Set,i=[];for(let d of n)a.has(d.id)||(a.add(d.id),i.push(d));return i}function fWn(n,a){let i=String(n.properties.repository??"").localeCompare(String(a.properties.repository??""));if(i!==0)return i;let d=Number(n.properties.issue_number??0)-Number(a.properties.issue_number??0);if(d!==0)return d;let b=Number(n.properties.attempt_number??0)-Number(a.properties.attempt_number??0);return b!==0?b:n.rid-a.rid}function wWn(n){let a=String(n.properties.status??"unknown"),i=lQ(String(n.properties.summary??n.properties.content??n.properties.title??""));return{rid:n.rid,label:n.label,nodeType:"attempt",description:`attempt rid=${n.rid} label=${n.label} status=${a}${i?` summary=${i}`:""}`}}function HWn(n){return{rid:n.rid,label:n.label,nodeType:"validation",description:`validation rid=${n.rid} label=${n.label} name=${String(n.properties.name??"")} status=${String(n.properties.status??"unknown")}`}}function Tst(n,a){return n?/\b(raw stdout|raw stderr|operational log|tail of .*log|bg-task|\/tmp\/)\b/i.test(n)?{kind:"raw_operational_log",action:"rejected",reason:"raw operational logs are not durable Memory facts",evidence:a}:/\b(wip|in progress|still running|trying|next step|todo|temporary)\b/i.test(n)?{kind:"temporary_progress",action:"downgraded",reason:"temporary progress is attempt evidence, not a durable learning",evidence:a}:null:null}function QWn(n){let a=String(n.properties.status??"").toLowerCase();return a!==""&&a!=="done"}function EWn(n){return!n||n.length<24||/\b(wip|still running|trying|todo|raw stdout|raw stderr|operational log)\b/i.test(n)?!1:/\b(must|uses?|stores?|records?|creates?|links?|dedupes?|verifies?|rejects?|requires?|without|approval-gated)\b/i.test(n)}function _Wn(n){let a=n.properties.touched_files;if(!Array.isArray(a))return null;for(let i of a)if(typeof i=="string"&&/((^|\/)skills\/.*\/SKILL\.md$)|(^|\/)SKILL\.md$/i.test(i))return i;return null}function CWn(n,a,i){let d=i.find(B=>jst(B)==="TESTED_BY"&&Kst(B)===n.rid),b=Dst(d);if(!Number.isFinite(b))return null;let h=i.find(B=>jst(B)==="TOUCHED"&&Dst(B)===b),y=Kst(h);if(!Number.isFinite(y))return null;let w=a.find(B=>B.rid===y),J=Pst(w,"title")??Pst(w,"source")??"";return/(^|\/)skills\/.*\/SKILL\.md$/i.test(J)?J:null}function jst(n){return String(n?.label??n?.LABEL??"")}function Dst(n){return Number(n?.from??n?.from_rid??n?.FROM??n?.FROM_RID)}function Kst(n){return Number(n?.to??n?.to_rid??n?.TO??n?.TO_RID)}function JWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="failed"||a==="error"||a==="timed-out"}function kWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="passed"||a==="succeeded"||a==="success"}function Xre(n,a){let i=n.properties[a];return typeof i=="string"&&i.trim()?i.trim():null}function Pst(n,a){return n?Xre(n,a):null}function lQ(n){return n.replace(/\s+/g," ").trim().slice(0,500)}function AWn(n){return li("attempt-learning-report",...n.proposals.map(a=>a.id))}function LWn(n,a){let i=[...new Set(n.proposals.map(d=>d.kind))].join(", ");return`# Attempt Learning Proposal
6527
6527
 
6528
6528
  Status: approval-gated
6529
6529
  Generated: ${new Date().toISOString()}
@@ -6563,7 +6563,7 @@ Usage:
6563
6563
  ${n} archive --candidate <json> [--root <dir>] [--archive-dir <rel>]
6564
6564
  ${n} restore <name> [--root <dir>] [--archive-dir <rel>]`}function Xx(n){return WNn(typeof n.root=="string"?n.root:process.cwd())}function Not(n){return typeof n["archive-dir"]=="string"?n["archive-dir"]:void 0}async function gj(n){let a=await Co(n);return a?a.mode!=="graph"?{ok:!1,message:`curate: skill telemetry needs graph mode (this project is "${a.mode}") \u2014 run \`${Nwe}\``}:sZ(a)?{ok:!0}:{ok:!1,message:`curate: skill telemetry is not enabled here \u2014 run \`${Nwe}\``}:{ok:!1,message:`curate: memory is not initialized here \u2014 run \`${Nwe}\``}}function YNn(){let n=hNn(NNn(import.meta.url));return n.includes("dist/curate-skill")||n.endsWith("dist/curate-skill")?hot(n,"..","cli.js"):hot(n,"..","cli.ts")}async function VNn(n,a){let i=["curate","skills","--json"];a!==void 0&&i.push("--stale-days",String(a));let d=YNn(),h=d.endsWith(".ts")?Zot(process.execPath,["--import","tsx",d,...i,"--root",n],{encoding:"utf8"}):Zot(process.execPath,[d,...i,"--root",n],{encoding:"utf8"}),y=h.status??1;if(y!==0)throw new Error(`memory curate skills exited ${y}`);return bot(h.stdout??"")}function gNn(n){return typeof n.flags["stale-days"]=="string"?Number(n.flags["stale-days"]):void 0}async function Yot(n,a){return(a.loadCuratorReport??VNn)(Xx(n.flags),gNn(n))}async function yNn(n){let a=Xx(n.flags),i=await gj(a);return i.ok?(console.log("curate: skill telemetry is enabled \u2014 ready to curate"),0):(console.error(i.message),2)}async function RNn(n,a){let i=Xx(n.flags),d=await gj(i);if(!d.ok)return console.error(d.message),2;let b;try{b=await Yot(n,a)}catch(J){return console.error(`curate: ${J.message}`),1}let{candidates:h,byCategory:y,filtered:w}=hwe(b);return console.log(JSON.stringify({candidates:h,byCategory:y,filtered:w,totals:{totalSkills:b.totalSkills,curatableSkills:b.curatableSkills,readOnlySkills:b.readOnlySkills}},null,2)),0}async function vNn(n,a){let i=Xx(n.flags),d=await gj(i);if(!d.ok)return console.error(d.message),2;let b;try{b=await Yot(n,a)}catch(J){return console.error(`curate: ${J.message}`),1}let{byCategory:h}=hwe(b);if(Wwe(h)===0)return console.error("curate: no candidates \u2014 no issue filed"),0;let y=typeof n.flags.label=="string"?n.flags.label:void 0,w=await pot({byCategory:h,totals:{totalSkills:b.totalSkills,curatableSkills:b.curatableSkills,readOnlySkills:b.readOnlySkills},generatedAt:b.generatedAt},{cwd:i,label:y});return console.log(`curate: filed background issue \u2014 ${w.output||w.title}`),0}async function FNn(n){let a=Xx(n.flags),i=await gj(a);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 b;try{b=JSON.parse(d)}catch(y){return console.error(`curate archive: invalid --candidate JSON: ${y.message}`),2}let h=await Got(b,{rootDir:a,archiveDir:Not(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 XNn(n){let a=Xx(n.flags),i=await gj(a);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 b=await mot(d,{rootDir:a,archiveDir:Not(n.flags)});return console.log(`curate: restored "${b.name}" \u2192 ${b.restoredRoot} (${b.files.length} file(s) hash-verified)`),0}async function Vot(n,a={}){switch(n.command){case"check":return yNn(n);case"list":return RNn(n,a);case"background":return vNn(n,a);case"archive":return FNn(n);case"restore":return XNn(n);case void 0:case"--help":case"-h":return console.log(Wot(a.usageCommand)),0;default:return console.error(`unknown curate subcommand: ${n.command}
6565
6565
 
6566
- ${Wot(a.usageCommand)}`),2}}function got(n){let a={app:n,version:fNn(fx("__RED_BUILD_VERSION__",()=>"2.34.2")??"0.0.0-dev"),gitSha:fx("__RED_BUILD_GIT_SHA__",()=>"682b7f708440a51e42b660bf394d401ff2b406f8")??"unknown",buildTime:fx("__RED_BUILD_TIME__",()=>"2026-07-12T18:38:08-03:00")??"unknown",bundleAsset:fx("__RED_BUNDLE_ASSET__",()=>"memory.bundle.min.mjs")??"unknown"},i=fx("__REDDB_SDK_VERSION__",()=>"1.23.1"),d=fx("__REDDB_BINARY_TAG__",()=>"v1.23.1");return i&&(a.reddbSdkVersion=i),d&&(a.reddbBinaryTag=d),a}function fNn(n){return n.startsWith("v")?n.slice(1):n}function yot(n){return`${n.app} ${n.version} ${n.gitSha}`}function fx(n,a){try{let i=a();return typeof i=="string"&&i.length>0?i:void 0}catch{return process.env[n.replace(/^__|__$/g,"")]}}var Rot=`memory \u2014 governed operational memory for code agents
6566
+ ${Wot(a.usageCommand)}`),2}}function got(n){let a={app:n,version:fNn(fx("__RED_BUILD_VERSION__",()=>"2.35.0")??"0.0.0-dev"),gitSha:fx("__RED_BUILD_GIT_SHA__",()=>"bfe0d890ef8bc608d7adf7cc91bd2aa9a73ba457")??"unknown",buildTime:fx("__RED_BUILD_TIME__",()=>"2026-07-12T19:36:46-03:00")??"unknown",bundleAsset:fx("__RED_BUNDLE_ASSET__",()=>"memory.bundle.min.mjs")??"unknown"},i=fx("__REDDB_SDK_VERSION__",()=>"1.23.1"),d=fx("__REDDB_BINARY_TAG__",()=>"v1.23.1");return i&&(a.reddbSdkVersion=i),d&&(a.reddbBinaryTag=d),a}function fNn(n){return n.startsWith("v")?n.slice(1):n}function yot(n){return`${n.app} ${n.version} ${n.gitSha}`}function fx(n,a){try{let i=a();return typeof i=="string"&&i.length>0?i:void 0}catch{return process.env[n.replace(/^__|__$/g,"")]}}var Rot=`memory \u2014 governed operational memory for code agents
6567
6567
 
6568
6568
  Common workflows:
6569
6569
  remember one fact memory store "Decision: ..."