@reddb-io/red-skills 2.43.0 → 2.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brain.bundle.min.mjs +1 -1
- package/dist/code-nav.bundle.min.mjs +1 -1
- package/dist/dev.bundle.min.mjs +298 -298
- package/dist/memory.bundle.min.mjs +2 -2
- package/dist/rsp.bundle.min.mjs +60 -59
- package/package.json +1 -1
|
@@ -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 Ohn(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",rwe="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=Uhn(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:`${rwe} 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 Gfe(n,b.artifact_id,"accepted",{now:d,approver:i,reason:a.reason,source:`${rwe} 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 Gfe(n,b.artifact_id,"dismissed",{now:d,approver:i,reason:a.reason,source:`${rwe} 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 Uhn(n){for(let a of n.pair_evidence)for(let i of a.evidence??[]){let d=Mhn(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 Mhn(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}pH();import{resolve as zst}from"node:path";import{createHash as Shn,randomUUID as swe}from"node:crypto";import{spawn as Thn}from"node:child_process";import{constants as iwe}from"node:fs";import{readFileSync as jhn}from"node:fs";import{mkdir as Jst,open as Dhn,rm as kst}from"node:fs/promises";import{tmpdir as Khn}from"node:os";import{dirname as owe,join as Q1,resolve as dwe}from"node:path";import{fileURLToPath as Phn}from"node:url";import{createConnection as Bhn}from"node:net";async function Fre(n,a){let i=n.timeoutMs??1e3;return await new Promise((d,b)=>{let h=Bhn(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 qhn=108;function Ast(n){let a=aWn(n)??dwe(n),i=lWn(a);return{rootDir:a,socketPath:Q1(i,"rsp.sock"),lockPath:Q1(i,"rsp.lock"),wakeLockPath:Q1(a,".red","tmp","rsp.wake.lock"),summaryPath:Q1(a,".red","tmp","rsp-status-summary.json")}}var Xre=class{constructor(a,i){this.paths=a;this.config=i}async request(a){await $hn(this.paths,this.config);let i=await Fre(this.paths,{...a,id:swe()});if(!i.ok)throw new Error(i.error);return i.value}};async function $hn(n,a){if(await Jst(owe(n.socketPath),{recursive:!0,mode:448}),await _st(n.socketPath,a))return;let i=await tWn(n.lockPath);if(i)try{if(await _st(n.socketPath,a))return;await eWn(n.socketPath);let d=nWn(n,a);await Qst(n.socketPath,d);return}finally{await i.close(),await kst(n.lockPath,{force:!0})}await Qst(n.socketPath)}async function Lst(n,a=200){try{return await xst(n,a)!=null}catch{return!1}}async function xst(n,a=200){let i=await Fre({socketPath:n,timeoutMs:a},{id:swe(),op:"ping"});return i.ok?sWn(i.value)?{version:oWn(i.value.version)}:{}:null}async function Qst(n,a){let i=Date.now()+5e3,d;for(;Date.now()<i;){if(await Lst(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 eWn(n){await kst(n,{force:!0})}async function tWn(n){await Jst(owe(n),{recursive:!0,mode:448});try{return await Dhn(n,iwe.O_CREAT|iwe.O_EXCL|iwe.O_RDWR)}catch(a){if(a.code!=="EEXIST")throw a;return null}}function nWn(n,a){let[i,d]=IWn(a),b=Thn(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),"--telemetry-drain-interval-ms",String(a.telemetryDrainIntervalMs??3e4),"--telemetry-drain-timeout-ms",String(a.telemetryDrainTimeoutMs??2e3),"--resident-version",a.clientVersion??"0.0.0-dev"],{cwd:n.rootDir,detached:!0,stdio:"ignore",env:{...process.env,RSP_RESIDENT_SERVER:"1"}});return b.unref(),b}function IWn(n){if(n.serverCommand)return[n.serverCommand,n.serverArgs??[]];let a=process.argv[1]?dwe(process.argv[1]):Phn(import.meta.url);return[process.execPath,[...process.execArgv,a]]}function lWn(n){let a=Shn("sha256").update(n).digest("hex").slice(0,20),i=process.env.XDG_RUNTIME_DIR;if(i){let b=Q1(i,"red-skills",a);if(Q1(b,"rsp.sock").length<qhn)return b}let d=typeof process.getuid=="function"?process.getuid():"nouid";return Q1(Khn(),`red-skills-${d}`,a)}function aWn(n){let a=dwe(n);for(let i=0;i<32;i++){try{if(Est(Q1(a,".red","config.yaml"))!=null||Est(Q1(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 jhn(n,"utf8")}catch{return null}}async function _st(n,a){let i=await xst(n).catch(()=>null);return i?rWn(a.clientVersion,i.version)?(await cWn(n,a.clientVersion),await dWn(n),!1):!0:!1}async function cWn(n,a){try{await Fre({socketPath:n,timeoutMs:200},{id:swe(),op:"handover",clientVersion:a})}catch{}}function rWn(n,a){return!n||!a?!1:iWn(n,a)>0}function iWn(n,a){let i=Cst(n),d=Cst(a);return!i||!d?0:i.major-d.major||i.minor-d.minor||i.patch-d.patch}function Cst(n){let a=/^(\d+)\.(\d+)\.(\d+)/.exec(String(n).trim());return a?{major:Number(a[1]),minor:Number(a[2]),patch:Number(a[3])}:null}function sWn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function oWn(n){return typeof n=="string"&&n.length>0?n:void 0}async function dWn(n){let a=Date.now()+1e3;for(;Date.now()<a;){if(!await Lst(n,50))return;await new Promise(i=>setTimeout(i,50))}}var Gwe=".red/tmp/red-skills.rdb",GWn=7,mWn=64*1024*1024;function mwe(n,a){if(a.mode!=="graph")return!1;let i=a.storePath??"";return i===Gwe?!0:zst(n,i).endsWith(`/${Gwe}`)}async function bwe(n,a,i,d){let b=Ast(n);return await new Xre(b,{storeUri:`file://${zst(n,Gwe)}`,ttlDays:GWn,byteBudget:mWn,serverCommand:process.env.RSP_BIN??"rsp"}).request({op:"memory",action:i,payload:d})}mT();N3();BZ();import{execFile as bWn}from"node:child_process";import{createHash as uWn}from"node:crypto";import{existsSync as Ost}from"node:fs";import{dirname as Ust,join as pWn}from"node:path";import{fileURLToPath as Sst}from"node:url";import{promisify as ZWn}from"node:util";var hWn=ZWn(bWn),Mst="vcs:last-meaningful-commit";async function Tst(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=Sst(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 WWn(y,w),ne=YWn(await y.kvGet(Mst))}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 VWn(h,d,i),D={fingerprint:B,hash:Ze.hash},qe=await Js.open({uri:b});try{await qe.kvPut(Mst,D)}finally{await qe.close()}return{status:"committed",committed:!0,message:d,included:w,skipped:J,fingerprint:B,commit:Ze}}async function WWn(n,a){let i={};for(let d of a)i[d]=await NWn(n,d);return uWn("sha256").update(uwe(i)).digest("hex")}async function NWn(n,a){if(a===Hr.docs)try{let{items:d}=await n.raw.documents.list(Hr.docs,{limit:1e5});return Bst(d)}catch{return[]}let i=await n.raw.query(`SELECT * FROM ${a}`);return Bst(i.rows)}function Bst(n){return[...n].sort((a,i)=>uwe(a).localeCompare(uwe(i)))}function uwe(n){return JSON.stringify(pwe(n))}function YWn(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 VWn(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 hWn(gWn(),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 gWn(){let n=process.env.REDDB_BIN;if(n&&Ost(n))return n;let a=process.platform==="win32"?"red.exe":"red",i=Ust(Ust(Sst(import.meta.url))),d=pWn(i,"node_modules","@reddb-io","sdk","bin",a);if(Ost(d))return d;throw new Error(`red binary not found \u2014 set REDDB_BIN or install @reddb-io/sdk (looked at ${d})`)}async function jst(n,a){let i=yWn(a.issueBody),d=vWn(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=FWn(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=HWn(a.touchedFiles),B=QWn(a.hooks),ne=XWn(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:fWn(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=EWn(a.validationRecords),Zn=[],Tt=[];for(let An of ft){let Ia={label:wWn(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 RWn(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 yWn(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 RWn(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 vWn(n,a){return`issue:${n}#${a}`}function FWn(n,a){return`prd:${n}#${a}`}function XWn(n,a,i,d){let b=`attempt:${n}#${a}/${i}`;return d?`${b}@${d}`:b}function fWn(n){return`file:${n}`}function wWn(n,a,i,d){return`validation:${n}#${a}/${i}/${d}`}function HWn(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 QWn(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 EWn(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 _Wn,writeFile as CWn}from"node:fs/promises";import{join as Dst,relative as JWn}from"node:path";async function tot(n){let a=await n.listNodes(),i=await n.listEdges(),d=a.filter(w=>w.node_type==="attempt").sort(AWn),b=a.filter(w=>w.node_type==="validation").sort((w,J)=>w.rid-J.rid),h=[],y=[];for(let w of d){let J=[LWn(w)],B=fre(w,"summary")??fre(w,"content")??"",ne=fre(w,"notes")??"",Ze=Kst(ne||B,J);if(Ze&&y.push(Ze),zWn(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=UWn(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}))}OWn(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=[xWn(w)],B=BWn(w),ne=String(w.properties.summary??""),Ze=Kst(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})),SWn(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=MWn(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:kWn(h).sort((w,J)=>w.kind.localeCompare(J.kind)||w.title.localeCompare(J.title)),rejected:y}}async function not(n,a){if(a.proposals.length===0)return null;let i=TWn(a),d=Dst(n,".red","memory","proposals");await _Wn(d,{recursive:!0});let b=`attempt-learning-${i.slice(0,12)}.md`,h=Dst(d,b);return await CWn(h,jWn(a,i),"utf8"),DWn(JWn(n,h))}function Iot(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 lot(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 kWn(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 AWn(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 LWn(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 xWn(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 Kst(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 zWn(n){let a=String(n.properties.status??"").toLowerCase();return a!==""&&a!=="done"}function OWn(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 UWn(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 MWn(n,a,i){let d=i.find(B=>Pst(B)==="TESTED_BY"&&$st(B)===n.rid),b=qst(d);if(!Number.isFinite(b))return null;let h=i.find(B=>Pst(B)==="TOUCHED"&&qst(B)===b),y=$st(h);if(!Number.isFinite(y))return null;let w=a.find(B=>B.rid===y),J=eot(w,"title")??eot(w,"source")??"";return/(^|\/)skills\/.*\/SKILL\.md$/i.test(J)?J:null}function Pst(n){return String(n?.label??n?.LABEL??"")}function qst(n){return Number(n?.from??n?.from_rid??n?.FROM??n?.FROM_RID)}function $st(n){return Number(n?.to??n?.to_rid??n?.TO??n?.TO_RID)}function BWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="failed"||a==="error"||a==="timed-out"}function SWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="passed"||a==="succeeded"||a==="success"}function fre(n,a){let i=n.properties[a];return typeof i=="string"&&i.trim()?i.trim():null}function eot(n,a){return n?fre(n,a):null}function lQ(n){return n.replace(/\s+/g," ").trim().slice(0,500)}function TWn(n){return li("attempt-learning-report",...n.proposals.map(a=>a.id))}function jWn(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 qhn=108;function Ast(n){let a=aWn(n)??dwe(n),i=lWn(a);return{rootDir:a,socketPath:Q1(i,"rsp.sock"),lockPath:Q1(i,"rsp.lock"),wakeLockPath:Q1(a,".red","tmp","rsp.wake.lock"),summaryPath:Q1(a,".red","tmp","rsp-status-summary.json")}}var Xre=class{constructor(a,i){this.paths=a;this.config=i}async request(a){await $hn(this.paths,this.config);let i=await Fre(this.paths,{...a,id:swe()});if(!i.ok)throw new Error(i.error);return i.value}};async function $hn(n,a){if(await Jst(owe(n.socketPath),{recursive:!0,mode:448}),await _st(n.socketPath,a))return;let i=await tWn(n.lockPath);if(i)try{if(await _st(n.socketPath,a))return;await eWn(n.socketPath);let d=nWn(n,a);await Qst(n.socketPath,d);return}finally{await i.close(),await kst(n.lockPath,{force:!0})}await Qst(n.socketPath)}async function Lst(n,a=200){try{return await xst(n,a)!=null}catch{return!1}}async function xst(n,a=200){let i=await Fre({socketPath:n,timeoutMs:a},{id:swe(),op:"ping"});return i.ok?sWn(i.value)?{version:oWn(i.value.version)}:{}:null}async function Qst(n,a){let i=Date.now()+5e3,d;for(;Date.now()<i;){if(await Lst(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 eWn(n){await kst(n,{force:!0})}async function tWn(n){await Jst(owe(n),{recursive:!0,mode:448});try{return await Dhn(n,iwe.O_CREAT|iwe.O_EXCL|iwe.O_RDWR)}catch(a){if(a.code!=="EEXIST")throw a;return null}}function nWn(n,a){let[i,d]=IWn(a),b=Thn(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),"--telemetry-drain-interval-ms",String(a.telemetryDrainIntervalMs??3e4),"--telemetry-drain-timeout-ms",String(a.telemetryDrainTimeoutMs??2e3),"--idle-ms",String(a.idleMs??3e5),"--resident-version",a.clientVersion??"0.0.0-dev"],{cwd:n.rootDir,detached:!0,stdio:"ignore",env:{...process.env,RSP_RESIDENT_SERVER:"1"}});return b.unref(),b}function IWn(n){if(n.serverCommand)return[n.serverCommand,n.serverArgs??[]];let a=process.argv[1]?dwe(process.argv[1]):Phn(import.meta.url);return[process.execPath,[...process.execArgv,a]]}function lWn(n){let a=Shn("sha256").update(n).digest("hex").slice(0,20),i=process.env.XDG_RUNTIME_DIR;if(i){let b=Q1(i,"red-skills",a);if(Q1(b,"rsp.sock").length<qhn)return b}let d=typeof process.getuid=="function"?process.getuid():"nouid";return Q1(Khn(),`red-skills-${d}`,a)}function aWn(n){let a=dwe(n);for(let i=0;i<32;i++){try{if(Est(Q1(a,".red","config.yaml"))!=null||Est(Q1(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 jhn(n,"utf8")}catch{return null}}async function _st(n,a){let i=await xst(n).catch(()=>null);return i?rWn(a.clientVersion,i.version)?(await cWn(n,a.clientVersion),await dWn(n),!1):!0:!1}async function cWn(n,a){try{await Fre({socketPath:n,timeoutMs:200},{id:swe(),op:"handover",clientVersion:a})}catch{}}function rWn(n,a){return!n||!a?!1:iWn(n,a)>0}function iWn(n,a){let i=Cst(n),d=Cst(a);return!i||!d?0:i.major-d.major||i.minor-d.minor||i.patch-d.patch}function Cst(n){let a=/^(\d+)\.(\d+)\.(\d+)/.exec(String(n).trim());return a?{major:Number(a[1]),minor:Number(a[2]),patch:Number(a[3])}:null}function sWn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function oWn(n){return typeof n=="string"&&n.length>0?n:void 0}async function dWn(n){let a=Date.now()+1e3;for(;Date.now()<a;){if(!await Lst(n,50))return;await new Promise(i=>setTimeout(i,50))}}var Gwe=".red/tmp/red-skills.rdb",GWn=7,mWn=64*1024*1024;function mwe(n,a){if(a.mode!=="graph")return!1;let i=a.storePath??"";return i===Gwe?!0:zst(n,i).endsWith(`/${Gwe}`)}async function bwe(n,a,i,d){let b=Ast(n);return await new Xre(b,{storeUri:`file://${zst(n,Gwe)}`,ttlDays:GWn,byteBudget:mWn,serverCommand:process.env.RSP_BIN??"rsp"}).request({op:"memory",action:i,payload:d})}mT();N3();BZ();import{execFile as bWn}from"node:child_process";import{createHash as uWn}from"node:crypto";import{existsSync as Ost}from"node:fs";import{dirname as Ust,join as pWn}from"node:path";import{fileURLToPath as Sst}from"node:url";import{promisify as ZWn}from"node:util";var hWn=ZWn(bWn),Mst="vcs:last-meaningful-commit";async function Tst(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=Sst(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 WWn(y,w),ne=YWn(await y.kvGet(Mst))}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 VWn(h,d,i),D={fingerprint:B,hash:Ze.hash},qe=await Js.open({uri:b});try{await qe.kvPut(Mst,D)}finally{await qe.close()}return{status:"committed",committed:!0,message:d,included:w,skipped:J,fingerprint:B,commit:Ze}}async function WWn(n,a){let i={};for(let d of a)i[d]=await NWn(n,d);return uWn("sha256").update(uwe(i)).digest("hex")}async function NWn(n,a){if(a===Hr.docs)try{let{items:d}=await n.raw.documents.list(Hr.docs,{limit:1e5});return Bst(d)}catch{return[]}let i=await n.raw.query(`SELECT * FROM ${a}`);return Bst(i.rows)}function Bst(n){return[...n].sort((a,i)=>uwe(a).localeCompare(uwe(i)))}function uwe(n){return JSON.stringify(pwe(n))}function YWn(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 VWn(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 hWn(gWn(),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 gWn(){let n=process.env.REDDB_BIN;if(n&&Ost(n))return n;let a=process.platform==="win32"?"red.exe":"red",i=Ust(Ust(Sst(import.meta.url))),d=pWn(i,"node_modules","@reddb-io","sdk","bin",a);if(Ost(d))return d;throw new Error(`red binary not found \u2014 set REDDB_BIN or install @reddb-io/sdk (looked at ${d})`)}async function jst(n,a){let i=yWn(a.issueBody),d=vWn(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=FWn(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=HWn(a.touchedFiles),B=QWn(a.hooks),ne=XWn(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:fWn(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=EWn(a.validationRecords),Zn=[],Tt=[];for(let An of ft){let Ia={label:wWn(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 RWn(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 yWn(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 RWn(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 vWn(n,a){return`issue:${n}#${a}`}function FWn(n,a){return`prd:${n}#${a}`}function XWn(n,a,i,d){let b=`attempt:${n}#${a}/${i}`;return d?`${b}@${d}`:b}function fWn(n){return`file:${n}`}function wWn(n,a,i,d){return`validation:${n}#${a}/${i}/${d}`}function HWn(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 QWn(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 EWn(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 _Wn,writeFile as CWn}from"node:fs/promises";import{join as Dst,relative as JWn}from"node:path";async function tot(n){let a=await n.listNodes(),i=await n.listEdges(),d=a.filter(w=>w.node_type==="attempt").sort(AWn),b=a.filter(w=>w.node_type==="validation").sort((w,J)=>w.rid-J.rid),h=[],y=[];for(let w of d){let J=[LWn(w)],B=fre(w,"summary")??fre(w,"content")??"",ne=fre(w,"notes")??"",Ze=Kst(ne||B,J);if(Ze&&y.push(Ze),zWn(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=UWn(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}))}OWn(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=[xWn(w)],B=BWn(w),ne=String(w.properties.summary??""),Ze=Kst(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})),SWn(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=MWn(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:kWn(h).sort((w,J)=>w.kind.localeCompare(J.kind)||w.title.localeCompare(J.title)),rejected:y}}async function not(n,a){if(a.proposals.length===0)return null;let i=TWn(a),d=Dst(n,".red","memory","proposals");await _Wn(d,{recursive:!0});let b=`attempt-learning-${i.slice(0,12)}.md`,h=Dst(d,b);return await CWn(h,jWn(a,i),"utf8"),DWn(JWn(n,h))}function Iot(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 lot(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 kWn(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 AWn(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 LWn(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 xWn(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 Kst(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 zWn(n){let a=String(n.properties.status??"").toLowerCase();return a!==""&&a!=="done"}function OWn(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 UWn(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 MWn(n,a,i){let d=i.find(B=>Pst(B)==="TESTED_BY"&&$st(B)===n.rid),b=qst(d);if(!Number.isFinite(b))return null;let h=i.find(B=>Pst(B)==="TOUCHED"&&qst(B)===b),y=$st(h);if(!Number.isFinite(y))return null;let w=a.find(B=>B.rid===y),J=eot(w,"title")??eot(w,"source")??"";return/(^|\/)skills\/.*\/SKILL\.md$/i.test(J)?J:null}function Pst(n){return String(n?.label??n?.LABEL??"")}function qst(n){return Number(n?.from??n?.from_rid??n?.FROM??n?.FROM_RID)}function $st(n){return Number(n?.to??n?.to_rid??n?.TO??n?.TO_RID)}function BWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="failed"||a==="error"||a==="timed-out"}function SWn(n){let a=String(n.properties.status??"").toLowerCase();return a==="passed"||a==="succeeded"||a==="success"}function fre(n,a){let i=n.properties[a];return typeof i=="string"&&i.trim()?i.trim():null}function eot(n,a){return n?fre(n,a):null}function lQ(n){return n.replace(/\s+/g," ").trim().slice(0,500)}function TWn(n){return li("attempt-learning-report",...n.proposals.map(a=>a.id))}function jWn(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 XNn(typeof n.root=="string"?n.root:process.cwd())}function got(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 wNn(){let n=FNn(fNn(import.meta.url));return n.includes("dist/curate-skill")||n.endsWith("dist/curate-skill")?Yot(n,"..","cli.js"):Yot(n,"..","cli.ts")}async function HNn(n,a){let i=["curate","skills","--json"];a!==void 0&&i.push("--stale-days",String(a));let d=wNn(),h=d.endsWith(".ts")?Not(process.execPath,["--import","tsx",d,...i,"--root",n],{encoding:"utf8"}):Not(process.execPath,[d,...i,"--root",n],{encoding:"utf8"}),y=h.status??1;if(y!==0)throw new Error(`memory curate skills exited ${y}`);return Zot(h.stdout??"")}function QNn(n){return typeof n.flags["stale-days"]=="string"?Number(n.flags["stale-days"]):void 0}async function yot(n,a){return(a.loadCuratorReport??HNn)(Xx(n.flags),QNn(n))}async function ENn(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 _Nn(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 CNn(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 Wot({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 JNn(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 uot(b,{rootDir:a,archiveDir:got(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 kNn(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 pot(d,{rootDir:a,archiveDir:got(n.flags)});return console.log(`curate: restored "${b.name}" \u2192 ${b.restoredRoot} (${b.files.length} file(s) hash-verified)`),0}async function Rot(n,a={}){switch(n.command){case"check":return ENn(n);case"list":return _Nn(n,a);case"background":return CNn(n,a);case"archive":return JNn(n);case"restore":return kNn(n);case void 0:case"--help":case"-h":return console.log(Vot(a.usageCommand)),0;default:return console.error(`unknown curate subcommand: ${n.command}
|
|
6565
6565
|
|
|
6566
|
-
${Vot(a.usageCommand)}`),2}}function vot(n){let a={app:n,version:ANn(fx("__RED_BUILD_VERSION__",()=>"2.
|
|
6566
|
+
${Vot(a.usageCommand)}`),2}}function vot(n){let a={app:n,version:ANn(fx("__RED_BUILD_VERSION__",()=>"2.44.0")??"0.0.0-dev"),gitSha:fx("__RED_BUILD_GIT_SHA__",()=>"525a5c20b8019baf3432c78899c6d8d5cd266889")??"unknown",buildTime:fx("__RED_BUILD_TIME__",()=>"2026-07-13T03:44:30-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 ANn(n){return n.startsWith("v")?n.slice(1):n}function Fot(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 Xot=`memory \u2014 governed operational memory for code agents
|
|
6567
6567
|
|
|
6568
6568
|
Common workflows:
|
|
6569
6569
|
remember one fact memory store "Decision: ..."
|