@reddb-io/red-skills 2.77.1 → 2.78.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/afk-mcp.bundle.min.mjs +232 -232
- package/dist/brain.bundle.min.mjs +1 -1
- package/dist/code-nav.bundle.min.mjs +1 -1
- package/dist/dev.bundle.min.mjs +569 -566
- package/dist/memory.bundle.min.mjs +2 -2
- package/dist/rsp.bundle.min.mjs +101 -100
- package/package.json +1 -1
|
@@ -6537,7 +6537,7 @@ ${d.body}`))}));for(let d=0;d<i.length;d++)for(let u=d+1;u<i.length;u++){let h=i
|
|
|
6537
6537
|
${n.citationExcerpt}
|
|
6538
6538
|
${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 b0n(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 Rie="memory.governance_tidy_review.v1",tEe="memory tidy-review";async function nEe(n,a={}){let i=a.now??Date.now(),u=(await xce(n,a)).recommendations.map(rst),h=await qit(n,u,{now:i,operation:Uv});return{schema_version:Rie,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 IEe(n,a){let i=Qmt(a.approver,"accept"),d=a.now??Date.now(),u=await Hmt(n,a.id),h=p0n(u),[y,f]=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(!f)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:`${tEe} accept`,provider_review_artifact_id:u.artifact_id,provider_review_recommendation_id:u.recommendation_id,provider_review_recommendation_key:u.recommendation_key,provider_review_fingerprint:u.fingerprint,schema_version:Rie}}),S=await VHe(n,u.artifact_id,"accepted",{now:d,approver:i,reason:a.reason,source:`${tEe} accept`});return{schema_version:Rie,action:"accept",recommendation_id:S.recommendation_id,artifact_id:S.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:S.fingerprint}}}async function lEe(n,a){let i=Qmt(a.approver,"dismiss"),d=a.now??Date.now(),u=await Hmt(n,a.id),h=await VHe(n,u.artifact_id,"dismissed",{now:d,approver:i,reason:a.reason,source:`${tEe} dismiss`});return{schema_version:Rie,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 Hmt(n,a){let i=a.trim();if(!i)throw new Error("memory tidy-review requires a recommendation id");let d=(await oD(n,{operation:Uv})).filter(h=>h.artifact_id===i||h.recommendation_id===i);if(d.length===0)throw new Error(`tidy recommendation not found: ${i}`);let u=d.filter(h=>h.status==="open");if(u.length===1)return u[0];throw u.length>1?new Error(`tidy recommendation id is ambiguous; use an artifact id: ${u.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 p0n(n){for(let a of n.pair_evidence)for(let i of a.evidence??[]){let d=Z0n(i.proposed_edge_label??i.edge_label),u=wmt(i.duplicate_rid??i.from_rid??i.from),h=wmt(i.canonical_rid??i.to_rid??i.to);if(d&&u!=null&&h!=null)return{label:d,from_rid:u,to_rid:h}}throw new Error(`tidy recommendation has no supported Soft-merge edge: ${n.artifact_id}`)}function Z0n(n){if(typeof n!="string")return null;let a=n.trim().toUpperCase();return a==="SAME_AS"||a==="MERGED_INTO"?a:null}function wmt(n){return typeof n=="number"&&Number.isFinite(n)?n:null}function Qmt(n,a){let i=n.trim();if(!i)throw new Error(`memory tidy-review ${a} requires --approver`);return i}AH();Hae();import{existsSync as D0n}from"node:fs";import{resolve as oEe}from"node:path";E3();Hae();import{createHash as W0n,randomUUID as iEe}from"node:crypto";import{spawn as N0n}from"node:child_process";import{constants as aEe}from"node:fs";import{readFileSync as Y0n}from"node:fs";import{mkdir as kmt,open as V0n,readFile as g0n,rename as hLn,rm as KD,stat as WLn,writeFile as NLn}from"node:fs/promises";import{tmpdir as y0n}from"node:os";import{dirname as Ox,join as EV,resolve as Xie}from"node:path";import{fileURLToPath as R0n}from"node:url";import{createConnection as h0n}from"node:net";async function vie(n,a){let i=n.timeoutMs??1e3;return await new Promise((d,u)=>{let h=h0n(n.socketPath),y=!1,f="",J=setTimeout(()=>{S(()=>u(new Error("resident rsp server timed out"))),h.destroy()},i);function S(ne){y||(y=!0,clearTimeout(J),ne())}h.on("connect",()=>{h.write(`${JSON.stringify(a)}
|
|
6539
6539
|
`)}),h.on("data",ne=>{f+=ne.toString("utf8");let be=f.indexOf(`
|
|
6540
|
-
`);if(be<0)return;let j=f.slice(0,be);S(()=>{try{d(JSON.parse(j))}catch(De){u(De)}}),h.end()}),h.on("error",ne=>S(()=>u(ne))),h.on("close",()=>{y||S(()=>u(new Error("resident rsp server closed without response")))})})}var v0n=108,F0n=1,X0n=5e3;function Amt(n){let a=O0n(n)??Xie(n),i=z0n(a),d=ZFe(a);return{rootDir:a,socketPath:EV(i,"rsp.sock"),pidPath:EV(i,"rsp.pid"),lockPath:EV(i,"rsp.lock"),wakeLockPath:EV(a,".red","tmp","rsp
|
|
6540
|
+
`);if(be<0)return;let j=f.slice(0,be);S(()=>{try{d(JSON.parse(j))}catch(De){u(De)}}),h.end()}),h.on("error",ne=>S(()=>u(ne))),h.on("close",()=>{y||S(()=>u(new Error("resident rsp server closed without response")))})})}var v0n=108,F0n=1,X0n=5e3;function Amt(n){let a=O0n(n)??Xie(n),i=z0n(a),d=ZFe(a);return{rootDir:a,socketPath:EV(i,"rsp.sock"),pidPath:EV(i,"rsp.pid"),lockPath:EV(i,"rsp.lock"),wakeLockPath:EV(a,".red","tmp","rsp","wake.lock"),summaryPath:EV(d,"rsp-status-summary.json"),registryPath:EV(d,"rsp-resident.pid.json")}}var Fie=class{constructor(a,i){this.paths=a;this.config=i}async request(a){await f0n(this.paths,this.config);let i=await vie(this.paths,{...a,id:iEe()});if(!i.ok)throw new Error(i.error);return i.value}};async function f0n(n,a){if(await kmt(Ox(n.socketPath),{recursive:!0,mode:448}),await Cmt(n.socketPath,a))return;await _mt(n,a);let i=await E0n(n.lockPath);if(i)try{if(await Cmt(n.socketPath,a))return;await _mt(n,a),await Q0n(n.socketPath);let d=_0n(n,a);await Emt(n.socketPath,d);return}finally{await i.close(),await KD(n.lockPath,{force:!0})}await Emt(n.socketPath)}async function sEe(n,a=200){try{return await Lmt(n,a)!=null}catch{return!1}}async function Lmt(n,a=200){let i=await vie({socketPath:n,timeoutMs:a},{id:iEe(),op:"ping"});return i.ok?zmt(i.value)?{version:B0n(i.value.version)}:{}:null}async function w0n(n){try{let a=k0n(await g0n(n,"utf8"));return T0n(a)?a:null}catch{return null}}async function Emt(n,a){let i=Date.now()+H0n(),d;for(;Date.now()<i;){if(await sEe(n))return;if(a){let u=a.spawnError();if(u)throw new Error(rEe("resident rsp server spawn failed",a,u));if(a.child.exitCode!=null||a.child.signalCode!=null)throw new Error(rEe("resident rsp server exited before ready",a))}await new Promise(u=>setTimeout(u,50))}throw d instanceof Error?d:new Error(a?rEe("resident rsp server did not start",a):"resident rsp server did not start")}function H0n(){let n=Number(process.env.RSP_RESIDENT_READY_TIMEOUT_MS??"");return Number.isFinite(n)&&n>0?n:X0n}async function Q0n(n){await KD(n,{force:!0})}async function E0n(n){await kmt(Ox(n),{recursive:!0,mode:448});try{return await V0n(n,aEe.O_CREAT|aEe.O_EXCL|aEe.O_RDWR)}catch(a){if(a.code!=="EEXIST")throw a;return null}}function _0n(n,a){let[i,d]=x0n(a),u=process.env.RSP_DEBUG==="1",h,y="",f=N0n(i,[...d,"server","--socket",n.socketPath,"--pid-file",n.pidPath,"--store-uri",a.storeUri,"--ttl-days",String(a.ttlDays),"--ephemeral-ttl-hours",String(a.ephemeralTtlHours??6),"--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","--registry",n.registryPath],{cwd:n.rootDir,detached:!0,stdio:u?["ignore","ignore","pipe"]:"ignore",env:{...process.env,RSP_RESIDENT_SERVER:"1"}});return f.on("error",J=>{h=J}),u&&(f.stderr?.setEncoding("utf8"),f.stderr?.on("data",J=>{y=J0n(`${y}${J}`,C0n)})),f.unref(),{child:f,stderrTail:()=>y,spawnError:()=>h}}var C0n=8*1024;function rEe(n,a,i){let d=[n];i&&d.push(`error: ${i.message}`),a.child.exitCode!=null&&d.push(`exit code: ${a.child.exitCode}`),a.child.signalCode!=null&&d.push(`signal: ${a.child.signalCode}`);let u=a.stderrTail().trimEnd();return u&&d.push(`stderr tail:
|
|
6541
6541
|
${u}`),d.join(`
|
|
6542
6542
|
`)}function J0n(n,a){let i=Buffer.byteLength(n,"utf8");return i<=a?n:Buffer.from(n,"utf8").subarray(i-a).toString("utf8").replace(/^\uFFFD+/,"")}function k0n(n){let a=n.trim();if(!a)return null;try{return JSON.parse(a)}catch{return Xv(a)}}async function _mt(n,a){try{let i=await w0n(n.registryPath);if(!i||i.socket_path!==n.socketPath||i.store_uri!==a.storeUri)return;if(!PD(i.pid)){await KD(n.registryPath,{force:!0});return}if(await sEe(i.socket_path,100))return;if(xmt(a.clientVersion,i.resident_version)&&(await L0n(i.pid,1500),!PD(i.pid))){await KD(n.registryPath,{force:!0});return}await A0n(i.pid),await KD(n.registryPath,{force:!0})}catch{}}function PD(n){if(!Number.isInteger(n)||n<=0)return!1;try{return process.kill(n,0),!0}catch{return!1}}async function A0n(n){if(!PD(n))return;try{process.kill(n,"SIGTERM")}catch{return}let a=Date.now()+1e3;for(;Date.now()<a;){if(!PD(n))return;await new Promise(i=>setTimeout(i,50))}try{process.kill(n,"SIGKILL")}catch{}}async function L0n(n,a){let i=Date.now()+a;for(;Date.now()<i;){if(!PD(n))return;await new Promise(d=>setTimeout(d,50))}}function x0n(n){if(n.serverCommand)return[n.serverCommand,n.serverArgs??[]];let a=process.argv[1]?Xie(process.argv[1]):R0n(import.meta.url);return[process.execPath,[...process.execArgv,a]]}function z0n(n){let a=W0n("sha256").update(n).digest("hex").slice(0,20),i=process.env.XDG_RUNTIME_DIR;if(i){let u=EV(i,"red-skills",a);if(EV(u,"rsp.sock").length<v0n)return u}let d=typeof process.getuid=="function"?process.getuid():"nouid";return EV(y0n(),`red-skills-${d}`,a)}function O0n(n){let a=Xie(n);for(let i=0;i<32;i++){try{let u=cEe(EV(a,".git"));if(u!=null)return M0n(a,u)??a;if(cEe(EV(a,".git","HEAD"))!=null||cEe(EV(a,".red","config.yaml"))!=null)return a}catch{}let d=Ox(a);if(d===a)return null;a=d}return null}function M0n(n,a){let i=/^gitdir:\s*(.+?)\s*$/m.exec(a);if(!i)return null;let d=Xie(n,i[1]);return/[/\\]worktrees[/\\][^/\\]+$/.test(d)?Ox(Ox(Ox(d))):null}function cEe(n){try{return Y0n(n,"utf8")}catch{return null}}async function Cmt(n,a){let i=await Lmt(n).catch(()=>null);return i?xmt(a.clientVersion,i.version)?(await S0n(n,a.clientVersion),await j0n(n),!1):!0:!1}async function S0n(n,a){try{await vie({socketPath:n,timeoutMs:200},{id:iEe(),op:"handover",clientVersion:a})}catch{}}function xmt(n,a){return!n||!a?!1:U0n(n,a)>0}function U0n(n,a){let i=Jmt(n),d=Jmt(a);return!i||!d?0:i.major-d.major||i.minor-d.minor||i.patch-d.patch}function Jmt(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 zmt(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function B0n(n){return typeof n=="string"&&n.length>0?n:void 0}function T0n(n){return zmt(n)&&n.version===F0n&&Number.isInteger(n.pid)&&typeof n.socket_path=="string"&&typeof n.store_uri=="string"&&typeof n.resident_version=="string"&&typeof n.started_at=="string"}async function j0n(n){let a=Date.now()+1e3;for(;Date.now()<a;){if(!await sEe(n,50))return;await new Promise(i=>setTimeout(i,50))}}var K0n=7,P0n=64*1024*1024;function qD(n,a){if(a.mode!=="graph")return!1;let i=a.storePath??"";if(R7e(n,i))throw WFe();return i===hFe?!0:oEe(n,i)===oEe(n,hFe)}async function $D(n,a,i,d){let u=Amt(n);return await new Fie(u,{storeUri:`file://${y7e(oEe(n),D0n)}`,ttlDays:K0n,byteBudget:P0n,serverCommand:process.env.RSP_BIN??"rsp"}).request({op:"memory",action:i,payload:d})}BT();T3();KZ();import{execFile as q0n}from"node:child_process";import{createHash as $0n}from"node:crypto";import{existsSync as Omt}from"node:fs";import{dirname as Mmt,join as e2n}from"node:path";import{fileURLToPath as Bmt}from"node:url";import{promisify as t2n}from"node:util";var n2n=t2n(q0n),Smt="vcs:last-meaningful-commit";async function mEe(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",u=Zi(n,a),h=Bmt(u),y=await Fi.open({uri:u}),f=[],J=[],S="",ne=null;try{let ye=await aie(y);f=ye.versioned,J=ye.skipped,S=await I2n(y,f),ne=a2n(await y.kvGet(Smt))}finally{await y.close()}if(ne?.fingerprint===S)return{status:"unchanged",committed:!1,message:d,included:f,skipped:J,fingerprint:S,previousCommit:ne.hash};let be=await r2n(h,d,i),j={fingerprint:S,hash:be.hash},De=await Fi.open({uri:u});try{await De.kvPut(Smt,j)}finally{await De.close()}return{status:"committed",committed:!0,message:d,included:f,skipped:J,fingerprint:S,commit:be}}async function I2n(n,a){let i={};for(let d of a)i[d]=await l2n(n,d);return $0n("sha256").update(dEe(i)).digest("hex")}async function l2n(n,a){if(a===wc.docs)try{let{items:d}=await n.raw.documents.list(wc.docs,{limit:1e5});return Umt(d)}catch{return[]}let i=await n.raw.query(`SELECT * FROM ${a}`);return Umt(i.rows)}function Umt(n){return[...n].sort((a,i)=>dEe(a).localeCompare(dEe(i)))}function dEe(n){return JSON.stringify(GEe(n))}function a2n(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 GEe(n){if(Array.isArray(n))return n.map(GEe);if(n&&typeof n=="object"){let a={};for(let i of Object.keys(n).sort())a[i]=GEe(n[i]);return a}return n}async function r2n(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:u}=await n2n(c2n(),d,{encoding:"utf8",maxBuffer:1024*1024}),h=JSON.parse(u);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 c2n(){let n=process.env.REDDB_BIN;if(n&&Omt(n))return n;let a=process.platform==="win32"?"red.exe":"red",i=Mmt(Mmt(Bmt(import.meta.url))),d=e2n(i,"node_modules","@reddb-io","sdk","bin",a);if(Omt(d))return d;throw new Error(`red binary not found \u2014 set REDDB_BIN or install @reddb-io/sdk (looked at ${d})`)}async function uEe(n,a){let i=i2n(a.issueBody),d=o2n(a.repository,a.issueNumber),u={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:jc("issue",a.repository,String(a.issueNumber))}},h=await n.upsertNode(u),y,f;if(i!=null){let An=d2n(a.repository,i),Ia={label:An,node_type:"prd",properties:{title:An,repository:a.repository,prd_number:i,source:"github-issues",hash:jc("prd",a.repository,String(i))}};y=await n.upsertNode(Ia),f=await n.upsertEdge({label:"CONTAINS",from_rid:y,to_rid:h})}let J=b2n(a.touchedFiles),S=p2n(a.hooks),ne=G2n(a.repository,a.issueNumber,a.attemptNumber,a.workerId),be={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,...S.length>0?{hooks:S}:{},summary:a.summary,source:"afk",hash:jc("attempt",a.repository,String(a.issueNumber),String(a.attemptNumber),a.workerId??"",a.envelopeHash??"")}},j=await n.upsertNode(be),De=await n.upsertEdge({label:"CONTAINS",from_rid:h,to_rid:j}),ye=[],Fe=[];for(let An of J){let Ia={label:m2n(An),node_type:"file",properties:{title:An,source:An,hash:jc("file",An)}},$n=await n.upsertNode(Ia);ye.push($n),Fe.push(await n.upsertEdge({label:"TOUCHED",from_rid:j,to_rid:$n}))}let vt=Z2n(a.validationRecords),pn=[],Tt=[];for(let An of vt){let Ia={label:u2n(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:jc("validation",a.repository,String(a.issueNumber),String(a.attemptNumber),a.workerId??"",a.envelopeHash??"",An.name)}},$n=await n.upsertNode(Ia);pn.push($n),Tt.push(await n.upsertEdge({label:"TESTED_BY",from_rid:j,to_rid:$n}))}let aI=await s2n(n,a.repository,a.issueNumber);return{attemptRid:j,issueRid:h,prdRid:y,parentPrd:i??void 0,prdContainsIssueEdge:f,fileRids:ye,touchedEdges:Fe,validationRids:pn,testedByEdges:Tt,containsEdge:De,precedesEdges:aI,touchedFiles:J}}function i2n(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 s2n(n,a,i){let u=(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));u.sort((y,f)=>y.attemptNumber!==f.attemptNumber?y.attemptNumber-f.attemptNumber:y.rid-f.rid);let h=[];for(let y=1;y<u.length;y++)h.push(await n.upsertEdge({label:"PRECEDES",from_rid:u[y-1].rid,to_rid:u[y].rid}));return h}function o2n(n,a){return`issue:${n}#${a}`}function d2n(n,a){return`prd:${n}#${a}`}function G2n(n,a,i,d){let u=`attempt:${n}#${a}/${i}`;return d?`${u}@${d}`:u}function m2n(n){return`file:${n}`}function u2n(n,a,i,d){return`validation:${n}#${a}/${i}/${d}`}function b2n(n){if(!n||n.length===0)return[];let a=new Set,i=[];for(let d of n){if(typeof d!="string")continue;let u=d.trim();u.length===0||a.has(u)||(a.add(u),i.push(u))}return i}function p2n(n){if(!Array.isArray(n))return[];let a=[];for(let i of n){if(i==null||typeof i!="object")continue;let d=i,u=typeof d.lifecycle=="string"?d.lifecycle.trim():"",h=typeof d.command=="string"?d.command.trim():"",y=d.exit_code,f=typeof y=="number"&&Number.isFinite(y)?Math.trunc(y):typeof y=="string"&&/^-?\d+$/.test(y.trim())?Number(y.trim()):NaN;!u||!h||!Number.isFinite(f)||a.push({lifecycle:u,command:h,exit_code:f})}return a}function Z2n(n){if(!Array.isArray(n))return[];let a=[];for(let i of n){if(i==null||typeof i!="object")continue;let d=i,u=typeof d.name=="string"?d.name.trim():"",h=typeof d.status=="string"?d.status.trim():"";if(!u||!h)continue;let y=typeof d.command=="string"?d.command.trim():void 0,f=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:u,status:h,...y?{command:y}:{},...J!=null?{durationMs:J}:{},...f?{summary:f.slice(0,1e3)}:{}})}return a}import{mkdir as h2n,writeFile as W2n}from"node:fs/promises";import{join as Tmt,relative as N2n}from"node:path";async function bEe(n){let a=await n.listNodes(),i=await n.listEdges(),d=a.filter(f=>f.node_type==="attempt").sort(V2n),u=a.filter(f=>f.node_type==="validation").sort((f,J)=>f.rid-J.rid),h=[],y=[];for(let f of d){let J=[g2n(f)],S=fie(f,"summary")??fie(f,"content")??"",ne=fie(f,"notes")??"",be=jmt(ne||S,J);if(be&&y.push(be),R2n(f)){h.push(b5({kind:"failure",title:`Failure: ${String(f.properties.status??"attempt failed")} on ${f.label}`,recommendation:FQ(S||`${f.label} ended with status ${String(f.properties.status??"unknown")}.`),targetNodeType:"problem",confidence:"EXTRACTED",evidence:J}));let j=F2n(f);j&&h.push(b5({kind:"skill_improvement",title:`Skill improvement candidate: ${j}`,recommendation:FQ(`Review ${j} for missing prerequisites, validation guidance, or recovery steps related to ${String(f.properties.error_class??f.properties.status??"the failed attempt")}.`),targetNodeType:"workflow",confidence:"INFERRED",evidence:J}))}v2n(S)&&h.push(b5({kind:"durable_fact",title:`Durable fact from ${f.label}`,recommendation:FQ(S),targetNodeType:"decision",confidence:"INFERRED",evidence:J}))}for(let f of u){let J=[y2n(f)],S=f2n(f),ne=String(f.properties.summary??""),be=jmt(ne,J);if(be&&y.push(be),h.push(b5({kind:"validation",title:`Validation ${String(f.properties.name??f.label)} ${String(f.properties.status??"recorded")}`,recommendation:FQ([f.properties.command?`Command \`${String(f.properties.command)}\``:`Validation ${String(f.properties.name??f.label)}`,`finished with status ${String(f.properties.status??"unknown")}.`,be?"":ne].join(" ")),targetNodeType:"validation",confidence:"EXTRACTED",evidence:J})),w2n(f)&&h.push(b5({kind:"durable_fact",title:`Durable fact from validation ${String(f.properties.name??f.label)}`,recommendation:FQ(`Validation ${String(f.properties.name??f.label)} passed for issue ${String(f.properties.issue_number??"unknown")}.`),targetNodeType:"decision",confidence:"EXTRACTED",evidence:J})),S){h.push(b5({kind:"failure",title:`Failure: validation ${String(f.properties.name??f.label)} failed`,recommendation:FQ(String(f.properties.summary??"")||`Validation ${String(f.properties.name??f.label)} failed.`),targetNodeType:"problem",confidence:"EXTRACTED",evidence:J}));let j=X2n(f,a,i);j&&h.push(b5({kind:"skill_improvement",title:`Skill improvement candidate: ${j}`,recommendation:FQ(`Review ${j} for validation guidance related to failed check ${String(f.properties.name??f.label)}.`),targetNodeType:"workflow",confidence:"INFERRED",evidence:J}))}}return{proposals:Y2n(h).sort((f,J)=>f.kind.localeCompare(J.kind)||f.title.localeCompare(J.title)),rejected:y}}async function pEe(n,a){if(a.proposals.length===0)return null;let i=H2n(a),d=Tmt(n,".red","memory","proposals");await h2n(d,{recursive:!0});let u=`attempt-learning-${i.slice(0,12)}.md`,h=Tmt(d,u);return await W2n(h,Q2n(a,i),"utf8"),E2n(N2n(n,h))}function ZEe(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 hEe(n,a){let i=[],d=[];for(let u of a.proposals){let h={label:`learning:${u.kind}:${u.id.slice(0,16)}`,node_type:u.targetNodeType,properties:{title:u.title,content:u.recommendation,summary:u.evidenceSummary,source:"attempt-learning",confidence:u.confidence,tags:["attempt-learning",u.kind],hash:jc("attempt-learning",u.id),provenance:{source_kind:"derived",writer:"memory attempt learn apply",command:"memory attempt learn apply",confidence:u.confidence,evidence:u.evidence.map(f=>f.description)}}},y=await n.upsertNode(h);i.push(y);for(let f of u.evidence)d.push(await n.upsertEdge({label:"LEARNED_FROM",from_rid:y,to_rid:f.rid,properties:{reason:u.kind,source:"attempt-learning"}}))}return{applied:a.proposals.length,nodeRids:i,edgeRids:d}}function b5(n){let a=n.evidence.map(d=>d.description).join("; "),i=jc("attempt-learning",n.kind,n.title,n.recommendation,a);return{...n,id:i,evidenceSummary:a}}function Y2n(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 V2n(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 u=Number(n.properties.attempt_number??0)-Number(a.properties.attempt_number??0);return u!==0?u:n.rid-a.rid}function g2n(n){let a=String(n.properties.status??"unknown"),i=FQ(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 y2n(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 jmt(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 R2n(n){let a=String(n.properties.status??"").toLowerCase();return a!==""&&a!=="done"}function v2n(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 F2n(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 X2n(n,a,i){let d=i.find(S=>Dmt(S)==="TESTED_BY"&&Pmt(S)===n.rid),u=Kmt(d);if(!Number.isFinite(u))return null;let h=i.find(S=>Dmt(S)==="TOUCHED"&&Kmt(S)===u),y=Pmt(h);if(!Number.isFinite(y))return null;let f=a.find(S=>S.rid===y),J=qmt(f,"title")??qmt(f,"source")??"";return/(^|\/)skills\/.*\/SKILL\.md$/i.test(J)?J:null}function Dmt(n){return String(n?.label??n?.LABEL??"")}function Kmt(n){return Number(n?.from??n?.from_rid??n?.FROM??n?.FROM_RID)}function Pmt(n){return Number(n?.to??n?.to_rid??n?.TO??n?.TO_RID)}function f2n(n){let a=String(n.properties.status??"").toLowerCase();return a==="failed"||a==="error"||a==="timed-out"}function w2n(n){let a=String(n.properties.status??"").toLowerCase();return a==="passed"||a==="succeeded"||a==="success"}function fie(n,a){let i=n.properties[a];return typeof i=="string"&&i.trim()?i.trim():null}function qmt(n,a){return n?fie(n,a):null}function FQ(n){return n.replace(/\s+/g," ").trim().slice(0,500)}function H2n(n){return jc("attempt-learning-report",...n.proposals.map(a=>a.id))}function Q2n(n,a){let i=[...new Set(n.proposals.map(d=>d.kind))].join(", ");return`# Attempt Learning Proposal
|
|
6543
6543
|
|
|
@@ -6578,7 +6578,7 @@ Usage:
|
|
|
6578
6578
|
${n} archive --candidate <json> [--root <dir>] [--archive-dir <rel>]
|
|
6579
6579
|
${n} restore <name> [--root <dir>] [--archive-dir <rel>]`}function Ux(n){return mVn(typeof n.root=="string"?n.root:process.cwd())}function hut(n){return typeof n["archive-dir"]=="string"?n["archive-dir"]:void 0}async function eK(n){let a=await xs(n);return a?a.mode!=="graph"?{ok:!1,message:`curate: skill telemetry needs graph mode (this project is "${a.mode}") \u2014 run \`${VEe}\``}:ju(a)?{ok:!0}:{ok:!1,message:`curate: skill telemetry is not enabled here \u2014 run \`${VEe}\``}:{ok:!1,message:`curate: memory is not initialized here \u2014 run \`${VEe}\``}}function bVn(){let n=GVn(uVn(import.meta.url));return n.includes("dist/curate-skill")||n.endsWith("dist/curate-skill")?put(n,"..","cli.js"):put(n,"..","cli.ts")}async function pVn(n,a){let i=["curate","skills","--json"];a!==void 0&&i.push("--stale-days",String(a));let d=bVn(),h=d.endsWith(".ts")?but(process.execPath,["--import","tsx",d,...i,"--root",n],{encoding:"utf8"}):but(process.execPath,[d,...i,"--root",n],{encoding:"utf8"}),y=h.status??1;if(y!==0)throw new Error(`memory curate skills exited ${y}`);return Gut(h.stdout??"")}function ZVn(n){return typeof n.flags["stale-days"]=="string"?Number(n.flags["stale-days"]):void 0}async function Wut(n,a){return(a.loadCuratorReport??pVn)(Ux(n.flags),ZVn(n))}async function hVn(n){let a=Ux(n.flags),i=await eK(a);return i.ok?(console.log("curate: skill telemetry is enabled \u2014 ready to curate"),0):(console.error(i.message),2)}async function WVn(n,a){let i=Ux(n.flags),d=await eK(i);if(!d.ok)return console.error(d.message),2;let u;try{u=await Wut(n,a)}catch(J){return console.error(`curate: ${J.message}`),1}let{candidates:h,byCategory:y,filtered:f}=NEe(u);return console.log(JSON.stringify({candidates:h,byCategory:y,filtered:f,totals:{totalSkills:u.totalSkills,curatableSkills:u.curatableSkills,readOnlySkills:u.readOnlySkills}},null,2)),0}async function NVn(n,a){let i=Ux(n.flags),d=await eK(i);if(!d.ok)return console.error(d.message),2;let u;try{u=await Wut(n,a)}catch(J){return console.error(`curate: ${J.message}`),1}let{byCategory:h}=NEe(u);if(YEe(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,f=await uut({byCategory:h,totals:{totalSkills:u.totalSkills,curatableSkills:u.curatableSkills,readOnlySkills:u.readOnlySkills},generatedAt:u.generatedAt},{cwd:i,label:y});return console.log(`curate: filed background issue \u2014 ${f.output||f.title}`),0}async function YVn(n){let a=Ux(n.flags),i=await eK(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 u;try{u=JSON.parse(d)}catch(y){return console.error(`curate archive: invalid --candidate JSON: ${y.message}`),2}let h=await out(u,{rootDir:a,archiveDir:hut(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 VVn(n){let a=Ux(n.flags),i=await eK(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 u=await dut(d,{rootDir:a,archiveDir:hut(n.flags)});return console.log(`curate: restored "${u.name}" \u2192 ${u.restoredRoot} (${u.files.length} file(s) hash-verified)`),0}async function gEe(n,a={}){switch(n.command){case"check":return hVn(n);case"list":return WVn(n,a);case"background":return NVn(n,a);case"archive":return YVn(n);case"restore":return VVn(n);case void 0:case"--help":case"-h":return console.log(Zut(a.usageCommand)),0;default:return console.error(`unknown curate subcommand: ${n.command}
|
|
6580
6580
|
|
|
6581
|
-
${Zut(a.usageCommand)}`),2}}function yEe(n){let a={app:n,version:gVn(Bx("__RED_BUILD_VERSION__",()=>"2.
|
|
6581
|
+
${Zut(a.usageCommand)}`),2}}function yEe(n){let a={app:n,version:gVn(Bx("__RED_BUILD_VERSION__",()=>"2.78.0")??"0.0.0-dev"),gitSha:Bx("__RED_BUILD_GIT_SHA__",()=>"e80da4d23205eb67f2c781487862c51a8f58a76a")??"unknown",buildTime:Bx("__RED_BUILD_TIME__",()=>"2026-07-21T19:09:10.905Z")??"unknown",bundleAsset:Bx("__RED_BUNDLE_ASSET__",()=>"memory.bundle.min.mjs")??"unknown"},i=Bx("__REDDB_SDK_VERSION__",()=>"1.23.1"),d=Bx("__REDDB_BINARY_TAG__",()=>"v1.23.1");return i&&(a.reddbSdkVersion=i),d&&(a.reddbBinaryTag=d),a}function gVn(n){return n.startsWith("v")?n.slice(1):n}function REe(n){return`${n.app} ${n.version} ${n.gitSha}`}function Bx(n,a){try{let i=a();return typeof i=="string"&&i.length>0?i:void 0}catch{return process.env[n.replace(/^__|__$/g,"")]}}async function Rut(n){let{store:a}=await ga(n);try{let i=await a.stats();console.log(`memory: ${i.nodes} node(s), ${i.edges} edge(s)`)}finally{await a.close()}}async function vut(n){let a=n.positional[0];if(a!=="status"&&a!=="status-viewer"&&a!=="maintain"&&a!=="search")throw new Error("vector needs an action \u2014 supported: memory vector status|status-viewer|maintain|search");let i=process.env.RED_MEMORY_VECTOR_PROVIDER;n.flags.local===!0&&(process.env.RED_MEMORY_VECTOR_PROVIDER="local");let{store:d}=await ga(n);try{if(a==="search"){let h=n.positional.slice(1).join(" ").trim();if(!h)throw new Error("nothing to search \u2014 pass a query: memory vector search <query>");let y=await G5(d,h,{limit:Ir(n.flags,"limit")});if(n.flags.json===!0){console.log(JSON.stringify(y,null,2));return}if(y.status==="unavailable"){let f=y.error?` \u2014 ${y.error}`:"";console.log(`memory: vector search unavailable${f}`);return}console.log(`memory: vector search ${y.hits.length}/${y.limit} hit(s) for "${h}"`);for(let f of y.hits){let J=f.source?` source=${f.source}`:"";console.log(` ${f.score.toFixed(3)} memory_nodes:${f.rid} (${f.node_type}) ${f.title}${J}`),f.excerpt&&console.log(` ${f.excerpt}`)}return}if(a==="status-viewer"){let h=Wa(n.flags),y=Vl(n.flags,"out")??Pr(h,".red/memory/vector-status-viewer.html"),f=BD(await d.vectorStatus());await hs(Ps(y),{recursive:!0}),await fi(y,f.html,"utf8"),console.log(`memory: vector status viewer written ${y}`),console.log(` status: ${f.report.overall}`),console.log(` contract: ${f.contract.consumes}`);return}let u=a==="maintain"?await d.maintainVectorProjection({strict:n.flags.strict===!0}):await d.vectorStatus();if(n.flags.json===!0){console.log(JSON.stringify(u,null,2));return}console.log(`memory: vector projection ${u.overall} \u2014 ${u.ready}/${u.total} ready`),u.stale>0&&console.log(` stale: ${u.stale}`),u.unavailable>0&&console.log(` unavailable: ${u.unavailable}`),u.failed>0&&console.log(` failed: ${u.failed}`);for(let h of u.nodes.filter(y=>y.status!=="ready")){let y=h.error?` \u2014 ${h.error}`:"";console.log(` ${h.rid} (${h.node_type}) ${h.label}: ${h.status}${y}`)}for(let h of u.docs.filter(y=>y.status!=="ready")){let y=h.error?` \u2014 ${h.error}`:"";console.log(` doc:${h.rid} ${h.path}: ${h.status}${y}`)}}finally{await d.close(),n.flags.local===!0&&(i==null?delete process.env.RED_MEMORY_VECTOR_PROVIDER:process.env.RED_MEMORY_VECTOR_PROVIDER=i)}}async function Fut(n){let{store:a}=await ga(n);try{let i=Ir(n.flags,"stale-days")??90,d=await Gy(a,{staleDays:i});if(d.stale.length===0){console.log(`memory: healthy \u2014 0 of ${d.totalNodes} node(s) stale (unaccessed ${i}+ days, never recalled)`);return}console.log(`memory: ${d.stale.length} of ${d.totalNodes} node(s) stale (unaccessed ${i}+ days, never recalled):`);for(let y of d.stale)console.log(` ${y.rid} (${y.node_type}) ${y.title} \u2014 ${y.ageDays}d idle`);if(n.flags.prune!==!0){console.log(`
|
|
6582
6582
|
Re-run with --prune to delete these (asks for confirmation first).`);return}let u=n.flags.yes===!0;if(!u){if(!process.stdin.isTTY){console.log(`
|
|
6583
6583
|
refusing to prune without confirmation \u2014 re-run with --yes in a non-interactive shell`);return}let y=Qie({input:process.stdin,output:process.stdout}),f=(await y.question(`
|
|
6584
6584
|
Delete ${d.stale.length} stale node(s)? Type "yes" to confirm: `)).trim();y.close(),u=f==="yes"}if(!u){console.log("memory: aborted \u2014 nothing deleted");return}let{pruned:h}=await UFe(a,d.stale);console.log(`memory: pruned ${h} stale node(s)`)}finally{await a.close()}}async function Xut(n){let a=Wa(n.flags),i=n.positional[0]??".red/memory/export",d=km(i)?i:xr(a,i),u=n.flags.communities===!0,h=n.flags.interop===!0,{store:y}=await ga(n);try{let f=await tQ(y,d,{communities:u,interop:h});console.log(`memory: exported ${f.nodes} node(s), ${f.edges} edge(s)`),u&&console.log(" communities: coloured via native Louvain"),console.log(` graph: ${f.htmlPath}`),console.log(` json: ${f.jsonPath}`),console.log(` audit: ${f.auditPath}`),f.interop&&(console.log(` nodes: ${f.interop.nodesJsonlPath}`),console.log(` edges: ${f.interop.edgesJsonlPath}`),console.log(` graphml:${f.interop.graphmlPath}`),console.log(` cypher: ${f.interop.cypherPath}`))}finally{await y.close()}}async function fut(n){let a=n.positional.join(" ").trim();if(!a)throw new Error("nothing to search \u2014 pass a query: memory global-search <query>");let i=typeof n.flags.limit=="string"?Number(n.flags.limit):void 0,{store:d,config:u}=await ga(n);try{let h=await jv("memory.global-search",{store:d,providerConfig:u.provider},{query:a,limit:i,cache:n.flags["no-cache"]===!0?"off":"read-only"});if(n.flags.json===!0){console.log(JSON.stringify(h,null,2));return}console.log(`memory: ${h.total_hits} global-search hit(s) for "${h.query}"`),console.log(` source: ${h.generated_from.operation_id}`),console.log(` graph hash: ${h.generated_from.graph_hash}`),console.log(` provider: ${h.generated_from.provider.status}${h.generated_from.provider.error?` (${h.generated_from.provider.error})`:""}`);for(let y of h.evidence)console.log(` ${y.community_id}: score ${y.score}, ${y.size} node(s)`),console.log(` matched: ${y.matched_terms.join(", ")}`),console.log(` top label: ${y.top_label}`),console.log(` top type: ${y.top_node_type}`),y.narrative_summary&&console.log(` summary: ${y.narrative_summary}`)}finally{await d.close()}}async function vVn(n,a){let i=Vl(n.flags,"from");if(i){let u=km(i)?i:xr(a,i),h=JSON.parse(await Sb(u,"utf8")),y=h.contract??h,f=EFe(y);if(!f.valid)throw new Error(`architecture-overview: ${u} is not a valid graph contract \u2014 ${f.errors.join("; ")}`);return y}let{store:d}=await ga(n);try{let[u,h,y]=await Promise.all([d.listNodes(),d.listEdges(),d.communities()]);return Ff({nodes:u,edges:h.map(zf),communities:y})}finally{await d.close()}}async function wut(n){let a=Wa(n.flags),i=await vVn(n,a),d=ufe(i);if(n.flags.json===!0){console.log(JSON.stringify(d,null,2));return}if(n.flags.stdout===!0){process.stdout.write(d.markdown);return}let u=Vl(n.flags,"out")??".red/memory/architecture-overview.md",h=km(u)?u:xr(a,u);await hs(Ps(h),{recursive:!0}),await fi(h,d.markdown,"utf8"),console.log(`memory: architecture overview written ${h}`),console.log(` contract: ${d.generated_from.contract_version}`),console.log(` ${d.totals.nodes} node(s), ${d.layers.length} layer(s), ${d.communities.length} community(ies)`)}async function h5(){if(process.stdin.isTTY)return"";let n=[];for await(let a of process.stdin)n.push(a);return Buffer.concat(n).toString("utf8")}var FVn=["SessionStart","PostToolUse","Stop","PreCompact"];async function Hut(n){let a=n.positional[0],i=n.flags.runner==="codex"?"codex":"claude";if(!a||!FVn.includes(a)){process.stdout.write("{}");return}try{let d=await h5(),u=d.trim()?JSON.parse(d):{},h=Wa(n.flags)!==process.cwd()?Wa(n.flags):typeof u.cwd=="string"?u.cwd:process.cwd(),y=await Wfe(i,a,u);try{a==="SessionStart"?await Ny(h,y.sessionId?{id:y.sessionId}:{}):await eN(h)||(y.sessionId?await Ny(h,{id:y.sessionId}):await Awe(h))}catch{}let f=await Owe(y,h);process.stdout.write(Nfe(i,a,f))}catch{process.stdout.write("{}")}}var XVn=["post-commit","post-checkout"];async function Qut(n){switch(n.positional[0]){case"refresh":return fVn(n);case"install-hooks":return HVn(n);case"uninstall-hooks":return QVn(n);default:throw new Error("vcs needs a subcommand \u2014 memory vcs refresh|install-hooks|uninstall-hooks")}}async function fVn(n){let a=Wa(n.flags),i=Vl(n.flags,"event"),d=n.flags.json===!0;if(!i||!XVn.includes(i)){d&&console.log(JSON.stringify({noop:!0,reason:"unknown vcs event"}));return}try{let u=await Mwe(a,{event:i,prevHead:Vl(n.flags,"prev"),newHead:Vl(n.flags,"new"),flag:Vl(n.flags,"flag"),export:n.flags["no-export"]!==!0});if(d){console.log(JSON.stringify(u,null,2));return}if(u.noop){console.log(`memory: ${i} \u2014 no-op (${u.reason})`);return}let h=u.refresh;console.log(`memory: ${i} refreshed ${h?.files??0} changed file(s) \u2014 ${h?.added??0} added, ${h?.updated??0} updated, ${h?.stale??0} stale`),u.exported&&console.log(` exported ${u.exported.nodes} node(s) \u2192 ${u.exported.jsonPath}`)}catch(u){let h=`error: ${u instanceof Error?u.message:String(u)}`;console.log(d?JSON.stringify({noop:!0,reason:h}):`memory: ${i} \u2014 no-op (${h})`)}}async function Eut(n){try{let{stdout:a}=await yy("git",["-C",n,"rev-parse","--git-path","hooks"],{encoding:"utf8"}),i=a.trim();return i?km(i)?i:xr(n,i):xr(n,".git/hooks")}catch{return xr(n,".git/hooks")}}function wVn(){let n=process.env.CLAUDE_PLUGIN_ROOT??process.env.CODEX_PLUGIN_ROOT,a=gut(new URL("../cli.ts",import.meta.url)),i=[n?Pr(n,"scripts","bootstrap.mjs"):void 0,Pr(Ps(Ps(a)),"scripts","bootstrap.mjs")];for(let d of i)if(d&&tK(d))return d}async function HVn(n){let a=Wa(n.flags),i=await xs(a);if(!i){console.log("memory: not initialized here \u2014 run `memory init --mode graph` before installing git hooks");return}if(i.mode!=="graph"){console.log(`memory: git hooks need graph mode \u2014 this project is "${i.mode}". Re-run \`memory init --mode graph\` first`);return}let d=await Eut(a),u=await Uwe({hooksDir:d,bootstrapPath:wVn(),force:n.flags.force===!0});if(n.flags.json===!0){console.log(JSON.stringify({hooksDir:d,...u},null,2));return}u.installed.length>0&&console.log(`memory: installed ${u.installed.join(", ")} into ${d}`);for(let h of u.backedUp)console.log(` backed up existing hook \u2192 ${h}`);for(let h of u.skipped)console.log(` skipped ${h.hook}: ${h.reason}`)}async function QVn(n){let a=Wa(n.flags),i=await Eut(a),d=await Bwe(i);if(n.flags.json===!0){console.log(JSON.stringify({hooksDir:i,...d},null,2));return}d.removed.length>0?console.log(`memory: removed ${d.removed.join(", ")} from ${i}`):console.log(`memory: no managed hooks found in ${i}`);for(let u of d.restored)console.log(` restored backed-up hook \u2192 ${u}`);for(let u of d.skipped)console.log(` ${u.reason}`)}async function _ut(n){let a=n.positional[0];if(a==="learn")return EVn(n);if(a!=="record")throw new Error("unknown attempt command \u2014 expected: memory attempt record|learn");let i=await h5();if(!i.trim())throw new Error("attempt record needs a JSON payload on stdin");let d=JSON.parse(i),{store:u}=await ga(n);try{let h=await uEe(u,d);console.log(`memory: recorded attempt ${d.repository}#${d.issueNumber}/${d.attemptNumber} (rid ${h.attemptRid})`)}finally{await u.close()}}async function EVn(n){let a=n.positional[1];if(a==="apply")return _Vn(n);if(a!=null)throw new Error("memory attempt learn supports: apply");let i=Wa(n.flags),d=n.flags.json===!0,u=n.flags["write-proposal"]===!0,{store:h}=await ga(n);try{let y=await bEe(h),f=u?await pEe(i,y):null,J=y.proposals.length===0?"no-candidates":u?"proposal-written":"proposal-ready";if(d){console.log(JSON.stringify({state:J,proposalFile:f,...y},null,2));return}console.log(`memory: attempt learning - ${J}`);for(let S of y.proposals)console.log(` [${S.kind}] ${S.title}`),console.log(` evidence: ${S.evidenceSummary}`);for(let S of y.rejected)console.log(` ${S.action}: ${S.kind} - ${S.reason}`);f&&console.log(` proposal: ${f}`),console.log(`
|