@cachly-dev/mcp-server 0.10.151 → 0.10.152

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.
@@ -1,10 +1,10 @@
1
- import{ckgSlug as E}from"../ckg.js";import{safeJsonParse as v,darfHeraus as j}from"../utils.js";import{ersparteMinuten as L,zaehltAlsErsparnis as K}from"../wertbeitrag.js";import{findePaare as F}from"../zulassung-und-urteil.js";function B(A){return j(A)&&!A.group}const P=new Set(["memory_consolidate","brain_diff","causal_trace","knowledge_decay","autopilot"]);async function z(A,C,M,N){switch(A){case"memory_consolidate":{const{instance_id:u,dry_run:h=!1,stale_days:y=90}=C,g=await M(u),l=Date.now(),$=y*86400*1e3;let _=0;const m=[];do{const[s,o]=await g.scan(_,"MATCH","cachly:lesson:best:*","COUNT",200);_=parseInt(s),m.push(...o)}while(_!==0);if(m.length===0)return"\u{1F9E0} **Brain is empty** \u2014 no lessons to consolidate yet. Use `learn_from_attempts` after your next bug fix.";const c=new Map;for(const s of m){const o=await g.get(s);if(!o)continue;const e=v(o,null);e&&c.set(s,e)}const w=new Map;for(const[s,o]of c){const e=o.topic.split(":")[0],a=w.get(e)??[];a.push(s),w.set(e,a)}const b=[...c.values()],x=F(b),k=x.filter(s=>s.beziehung==="widerspruch"),p=x.filter(s=>s.beziehung==="ersetzung"),i=[],t=new Map;for(const[s,o]of c){const e=t.get(o.topic)??[];e.push(s),t.set(o.topic,e)}for(const[s,o]of t)new Set(o.map(a=>c.get(a)?.outcome)).size>1&&i.push({topic:s,keys:o});const n=[];for(const[s,o]of c){const e=l-new Date(o.ts).getTime(),a=o.recall_count??0;e>$&&a===0&&n.push(s)}const r=0;if(!h)for(const s of n)await g.expire(s,86400*30);return[`\u{1F52C} **Memory Consolidation Report** ${h?"(dry run \u2014 no changes made)":"\u2705 Applied"}`,"",`\u{1F4CA} **Before:** ${m.length} lessons`,"",`\u{1F501} **Contradictions \u2014 exact topic match (old rule):** ${i.length}`,`\u{1F50E} **Same subject, admitted for judgement:** ${x.length} \u2192 contradiction ${k.length} \xB7 supersession ${p.length}`,...k.slice(0,5).map(s=>` \u2192 \`${s.a.topic}\` vs \`${s.b.topic}\` (${s.naehe.toFixed(2)}): ${s.grund}`),k.length>5?` \u2026 and ${k.length-5} more`:"",...p.slice(0,3).map(s=>` \u21BB \`${s.a.topic}\` \u2192 \`${s.b.topic}\`: ${s.grund}`),...i.slice(0,5).map(s=>` \u2192 \`${s.topic}\`: ${s.keys.length} conflicting entries (kept: success)`),i.length>5?` \u2026 and ${i.length-5} more`:"","",`\u267B\uFE0F **Duplicate clusters (counted, never deleted):** ${Array.from(w.values()).filter(s=>s.length>1).length}`,"",`\u{1F570}\uFE0F **Stale entries (${y}d, 0 recalls):** ${n.length}`+(n.length>0&&!h?" \u2192 set to expire in 30 days":""),"",`\u{1F4CA} **After:** ${m.length-r} lessons`,"",h?"\u{1F4A1} Re-run without dry_run=true to apply changes.":'\u2728 Brain consolidated. Run `brain_diff(since="1h")` to see the delta.'].filter(s=>s!=="").join(`
2
- `)}case"brain_diff":{const{instance_id:u,since:h="7d",format:y="summary"}=C,g=await M(u);let l;const $=h.match(/^(\d+)([dhm])$/);if($){const e=parseInt($[1]),a=$[2],d=a==="d"?864e5:a==="h"?36e5:6e4;l=Date.now()-e*d}else l=new Date(h).getTime()||Date.now()-7*864e5;let _=0;const m=[];do{const[e,a]=await g.scan(_,"MATCH","cachly:lesson:best:*","COUNT",200);_=parseInt(e),m.push(...a)}while(_!==0);const c=[],w=[],b=[],x=m.length;for(const e of m){const a=await g.get(e);if(a){const d=v(a,null);if(!d)continue;if(new Date(d.ts).getTime()>=l){const D=`cachly:lesson:history:${d.topic}`;await g.llen(D)<=1?c.push(d):w.push(d)}(d.recall_count??0)>0&&b.push(d)}}const p=[`\u{1F4CA} **Brain Diff** \u2014 ${$?`last ${h}`:new Date(l).toLocaleDateString("de-DE")}`,"",`Total lessons in brain: **${x}**`,"",`\u2705 **New** (${c.length}):`,...c.slice(0,y==="detailed"?20:5).map(e=>` + \`${e.topic}\` \u2014 ${e.outcome} ${e.severity==="critical"?"\u{1F534}":e.severity==="major"?"\u{1F7E0}":"\u{1F7E2}"}`),c.length>5&&y==="summary"?` \u2026 and ${c.length-5} more`:"","",`\u{1F504} **Updated** (${w.length}):`,...w.slice(0,y==="detailed"?20:5).map(e=>` ~ \`${e.topic}\` \u2014 now: ${e.outcome}`),w.length>5&&y==="summary"?` \u2026 and ${w.length-5} more`:"","",`\u{1F50D} **Active** (recalled at least once): ${b.length}`,""].filter(e=>e!==""),i=[],t=g.scanStream({match:"cachly:ckg:node:resolution-*",count:100});await new Promise((e,a)=>{t.on("data",d=>i.push(...d)),t.on("end",e),t.on("error",a)});const n=[];for(const e of i){const a=await g.get(e);if(a){const d=v(a,null);d?.ts&&new Date(d.ts).getTime()>=l&&n.push({topic:d.topic??e,resolution:d.resolution??"unknown",ts:d.ts})}}if(n.length>0){p.push(`\u{1F5F3}\uFE0F **MADC Resolutions** (${n.length} contested beliefs resolved):`);for(const e of n.slice(0,5)){const a=e.resolution==="unanimous_success"?"\u2705":e.resolution==="unanimous_failure"?"\u274C":"\u26A0\uFE0F";p.push(` ${a} \`${e.topic}\` \u2192 ${e.resolution}`)}p.push("")}const r=new Set(w.concat(b).map(e=>e.topic.split(":")[0])),f=[...new Set(c.map(e=>e.topic.split(":")[0]))].filter(e=>!r.has(e));f.length>0&&p.push(`\u{1F331} **New domains bootstrapped:** ${f.map(e=>`\`${e}\``).join(", ")}`,"");const o=(await g.lrange("cachly:fedbrain:federations",-20,-1)).map(e=>v(e,null)).filter(e=>e!==null&&new Date(e.transferred_at).getTime()>=l);if(o.length>0){p.push(`\u{1F9E0} **FedBrain transfers received (${o.length}):**`);for(const e of o.slice(0,3))p.push(` \u{1F4E5} domain \`${e.domain}\` from \`${e.source.slice(0,16)}\u2026\` \u2014 ${e.nodes} nodes, ${e.edges} edges`);p.push("")}return p.push("\u{1F4A1} Run `memory_consolidate` to merge duplicates \xB7 `knowledge_decay` to see confidence scores."),p.join(`
3
- `)}case"causal_trace":{const{instance_id:u,problem:h,max_depth:y=5,tags:g=[]}=C,l=await M(u),$=h.toLowerCase().replace(/[^a-z0-9\s\-_:]/g," ").split(/\s+/).filter(t=>t.length>2),_={critical:"\u{1F534}",major:"\u{1F7E0}",minor:"\u{1F7E1}"},m=[];try{for(const t of $.slice(0,4)){const n=await l.smembers(`cachly:ckg:idx:from:${E(t)}`),r=await l.smembers(`cachly:ckg:idx:to:${E(t)}`),f=[],s=l.scanStream({match:`cachly:ckg:node:*${t}*`,count:50});await new Promise((o,e)=>{s.on("data",a=>f.push(...a)),s.on("end",o),s.on("error",e)});for(const o of f.slice(0,10)){const e=await l.get(o);if(!e)continue;const a=v(e,null);if(!a)continue;const d=await l.smembers(`cachly:ckg:idx:from:${a.id}`);for(const T of d.slice(0,20)){const D=await l.get(T);if(!D)continue;const S=v(D,null);if(!S||S.edgeType!=="fixes"&&S.edgeType!=="requires")continue;const I=await l.get(`cachly:lesson:best:${S.from.replace(/-/g,":").replace(/^fix:/,"fix:")}`),R=I?v(I,null)??void 0:void 0;m.push({conceptId:a.id,edge:S,lesson:R&&B(R)?R:void 0})}}for(const o of[...n,...r].slice(0,20)){const e=await l.get(o);if(!e)continue;const a=v(e,null);if(!a)continue;const d=await l.get(`cachly:lesson:best:${a.from}`),T=d?v(d,null)??void 0:void 0;m.push({conceptId:a.from,edge:a,lesson:T&&B(T)?T:void 0})}}}catch{}const c=new Set,w=m.filter(t=>{const n=`${t.edge.from}:${t.edge.edgeType}:${t.edge.to}`;return c.has(n)?!1:(c.add(n),!0)}).sort((t,n)=>n.edge.confidence-t.edge.confidence).slice(0,y);let b=0;const x=[];do{const[t,n]=await l.scan(b,"MATCH","cachly:lesson:*","COUNT",200);b=parseInt(t),x.push(...n)}while(b!==0);const k=[];for(const t of x){const n=await l.get(t);if(n){const r=v(n,null);if(!r||!B(r)||g.length>0&&!(r.tags??[]).some(o=>g.includes(o)))continue;const f=[r.topic,r.what_failed??"",r.what_worked??"",r.context??""].join(" ").toLowerCase(),s=$.reduce((o,e)=>o+(f.includes(e)?1:0),0);s>0&&k.push({score:s,lesson:r,key:t})}}k.sort((t,n)=>n.score-t.score);const p=k.slice(0,y);if(p.length===0&&w.length===0)return[`\u{1F50D} **Causal Trace: "${h}"**`,"","No matching lessons found in brain.","","\u{1F4A1} After you solve this, call:","```","learn_from_attempts(",` instance_id = "${u}",`,` topic = "fix:${$[0]??"issue"}",`,' outcome = "success",',' what_worked = "...",',` what_failed = "${h}",`,")","```"].join(`
1
+ import{ckgSlug as E}from"../ckg.js";import{safeJsonParse as v,darfHeraus as j}from"../utils.js";import{ersparteMinuten as L,zaehltAlsErsparnis as K}from"../wertbeitrag.js";import{findePaare as N}from"../zulassung-und-urteil.js";function B(C){return j(C)&&!C.group}const W=new Set(["memory_consolidate","brain_diff","causal_trace","knowledge_decay","autopilot"]);async function z(C,A,M,F){switch(C){case"memory_consolidate":{const{instance_id:u,dry_run:h=!1,stale_days:y=90}=A,g=await M(u),l=Date.now(),$=y*86400*1e3;let _=0;const m=[];do{const[s,o]=await g.scan(_,"MATCH","cachly:lesson:best:*","COUNT",200);_=parseInt(s),m.push(...o)}while(_!==0);if(m.length===0)return"\u{1F9E0} **Brain is empty** \u2014 no lessons to consolidate yet. Use `learn_from_attempts` after your next bug fix.";const c=new Map;for(const s of m){const o=await g.get(s);if(!o)continue;const e=v(o,null);e&&c.set(s,e)}const w=new Map;for(const[s,o]of c){const e=o.topic.split(":")[0],a=w.get(e)??[];a.push(s),w.set(e,a)}const b=[...c.values()],x=N(b),k=x.filter(s=>s.beziehung==="widerspruch"),p=x.filter(s=>s.beziehung==="ersetzung"),i=[],t=new Map;for(const[s,o]of c){const e=t.get(o.topic)??[];e.push(s),t.set(o.topic,e)}for(const[s,o]of t)new Set(o.map(a=>c.get(a)?.outcome)).size>1&&i.push({topic:s,keys:o});const n=[];for(const[s,o]of c){const e=l-new Date(o.ts).getTime(),a=o.recall_count??0;e>$&&a===0&&n.push(s)}const r=0;if(!h)for(const s of n)await g.expire(s,86400*30);return[`\u{1F52C} **Memory Consolidation Report** ${h?"(dry run \u2014 no changes made)":"\u2705 Applied"}`,"",`\u{1F4CA} **Before:** ${m.length} lessons`,"",`\u{1F501} **Contradictions \u2014 exact topic match (old rule):** ${i.length}`,`\u{1F50E} **Same subject, admitted for judgement:** ${x.length} \u2192 contradiction ${k.length} \xB7 supersession ${p.length}`,...k.slice(0,5).map(s=>` \u2192 \`${s.a.topic}\` vs \`${s.b.topic}\` (${s.naehe.toFixed(2)}): ${s.grund}`),k.length>5?` \u2026 and ${k.length-5} more`:"",...p.slice(0,3).map(s=>` \u21BB \`${s.a.topic}\` \u2192 \`${s.b.topic}\`: ${s.grund}`),...i.slice(0,5).map(s=>` \u2192 \`${s.topic}\`: ${s.keys.length} conflicting entries (kept: success)`),i.length>5?` \u2026 and ${i.length-5} more`:"","",`\u267B\uFE0F **Duplicate clusters (counted, never deleted):** ${Array.from(w.values()).filter(s=>s.length>1).length}`,"",`\u{1F570}\uFE0F **Stale entries (${y}d, 0 recalls):** ${n.length}`+(n.length>0&&!h?" \u2192 set to expire in 30 days":""),"",`\u{1F4CA} **After:** ${m.length-r} lessons`,"",h?"\u{1F4A1} Re-run without dry_run=true to apply changes.":'\u2728 Brain consolidated. Run `brain_diff(since="1h")` to see the delta.'].filter(s=>s!=="").join(`
2
+ `)}case"brain_diff":{const{instance_id:u,since:h="7d",format:y="summary"}=A,g=await M(u);let l;const $=h.match(/^(\d+)([dhm])$/);if($){const e=parseInt($[1]),a=$[2],d=a==="d"?864e5:a==="h"?36e5:6e4;l=Date.now()-e*d}else l=new Date(h).getTime()||Date.now()-7*864e5;let _=0;const m=[];do{const[e,a]=await g.scan(_,"MATCH","cachly:lesson:best:*","COUNT",200);_=parseInt(e),m.push(...a)}while(_!==0);const c=[],w=[],b=[],x=m.length;for(const e of m){const a=await g.get(e);if(a){const d=v(a,null);if(!d)continue;if(new Date(d.ts).getTime()>=l){const D=`cachly:lesson:history:${d.topic}`;await g.llen(D)<=1?c.push(d):w.push(d)}(d.recall_count??0)>0&&b.push(d)}}const p=[`\u{1F4CA} **Brain Diff** \u2014 ${$?`last ${h}`:new Date(l).toLocaleDateString("de-DE")}`,"",`Total lessons in brain: **${x}**`,"",`\u2705 **New** (${c.length}):`,...c.slice(0,y==="detailed"?20:5).map(e=>` + \`${e.topic}\` \u2014 ${e.outcome} ${e.severity==="critical"?"\u{1F534}":e.severity==="major"?"\u{1F7E0}":"\u{1F7E2}"}`),c.length>5&&y==="summary"?` \u2026 and ${c.length-5} more`:"","",`\u{1F504} **Updated** (${w.length}):`,...w.slice(0,y==="detailed"?20:5).map(e=>` ~ \`${e.topic}\` \u2014 now: ${e.outcome}`),w.length>5&&y==="summary"?` \u2026 and ${w.length-5} more`:"","",`\u{1F50D} **Active** (recalled at least once): ${b.length}`,""].filter(e=>e!==""),i=[],t=g.scanStream({match:"cachly:ckg:node:resolution-*",count:100});await new Promise((e,a)=>{t.on("data",d=>i.push(...d)),t.on("end",e),t.on("error",a)});const n=[];for(const e of i){const a=await g.get(e);if(a){const d=v(a,null);d?.ts&&new Date(d.ts).getTime()>=l&&n.push({topic:d.topic??e,resolution:d.resolution??"unknown",ts:d.ts})}}if(n.length>0){p.push(`\u{1F5F3}\uFE0F **MADC Resolutions** (${n.length} contested beliefs resolved):`);for(const e of n.slice(0,5)){const a=e.resolution==="unanimous_success"?"\u2705":e.resolution==="unanimous_failure"?"\u274C":"\u26A0\uFE0F";p.push(` ${a} \`${e.topic}\` \u2192 ${e.resolution}`)}p.push("")}const r=new Set(w.concat(b).map(e=>e.topic.split(":")[0])),f=[...new Set(c.map(e=>e.topic.split(":")[0]))].filter(e=>!r.has(e));f.length>0&&p.push(`\u{1F331} **New domains bootstrapped:** ${f.map(e=>`\`${e}\``).join(", ")}`,"");const o=(await g.lrange("cachly:fedbrain:federations",-20,-1)).map(e=>v(e,null)).filter(e=>e!==null&&new Date(e.transferred_at).getTime()>=l);if(o.length>0){p.push(`\u{1F9E0} **FedBrain transfers received (${o.length}):**`);for(const e of o.slice(0,3))p.push(` \u{1F4E5} domain \`${e.domain}\` from \`${e.source.slice(0,16)}\u2026\` \u2014 ${e.nodes} nodes, ${e.edges} edges`);p.push("")}return p.push("\u{1F4A1} Run `memory_consolidate` to merge duplicates \xB7 `knowledge_decay` to see confidence scores."),p.join(`
3
+ `)}case"causal_trace":{const{instance_id:u,problem:h,max_depth:y=5,tags:g=[]}=A,l=await M(u),$=h.toLowerCase().replace(/[^a-z0-9\s\-_:]/g," ").split(/\s+/).filter(t=>t.length>2),_={critical:"\u{1F534}",major:"\u{1F7E0}",minor:"\u{1F7E1}"},m=[];try{for(const t of $.slice(0,4)){const n=await l.smembers(`cachly:ckg:idx:from:${E(t)}`),r=await l.smembers(`cachly:ckg:idx:to:${E(t)}`),f=[],s=l.scanStream({match:`cachly:ckg:node:*${t}*`,count:50});await new Promise((o,e)=>{s.on("data",a=>f.push(...a)),s.on("end",o),s.on("error",e)});for(const o of f.slice(0,10)){const e=await l.get(o);if(!e)continue;const a=v(e,null);if(!a)continue;const d=await l.smembers(`cachly:ckg:idx:from:${a.id}`);for(const T of d.slice(0,20)){const D=await l.get(T);if(!D)continue;const S=v(D,null);if(!S||S.edgeType!=="fixes"&&S.edgeType!=="requires")continue;const I=await l.get(`cachly:lesson:best:${S.from.replace(/-/g,":").replace(/^fix:/,"fix:")}`),R=I?v(I,null)??void 0:void 0;m.push({conceptId:a.id,edge:S,lesson:R&&B(R)?R:void 0})}}for(const o of[...n,...r].slice(0,20)){const e=await l.get(o);if(!e)continue;const a=v(e,null);if(!a)continue;const d=await l.get(`cachly:lesson:best:${a.from}`),T=d?v(d,null)??void 0:void 0;m.push({conceptId:a.from,edge:a,lesson:T&&B(T)?T:void 0})}}}catch{}const c=new Set,w=m.filter(t=>{const n=`${t.edge.from}:${t.edge.edgeType}:${t.edge.to}`;return c.has(n)?!1:(c.add(n),!0)}).sort((t,n)=>n.edge.confidence-t.edge.confidence).slice(0,y);let b=0;const x=[];do{const[t,n]=await l.scan(b,"MATCH","cachly:lesson:*","COUNT",200);b=parseInt(t),x.push(...n)}while(b!==0);const k=[];for(const t of x){const n=await l.get(t);if(n){const r=v(n,null);if(!r||!B(r)||g.length>0&&!(r.tags??[]).some(o=>g.includes(o)))continue;const f=[r.topic,r.what_failed??"",r.what_worked??"",r.context??""].join(" ").toLowerCase(),s=$.reduce((o,e)=>o+(f.includes(e)?1:0),0);s>0&&k.push({score:s,lesson:r,key:t})}}k.sort((t,n)=>n.score-t.score);const p=k.slice(0,y);if(p.length===0&&w.length===0)return[`\u{1F50D} **Causal Trace: "${h}"**`,"","No matching lessons found in brain.","","\u{1F4A1} After you solve this, call:","```","learn_from_attempts(",` instance_id = "${u}",`,` topic = "fix:${$[0]??"issue"}",`,' outcome = "success",',' what_worked = "...",',` what_failed = "${h}",`,")","```"].join(`
4
4
  `);const i=[`\u{1F50D} **Causal Trace: "${h}"**`,""];if(w.length>0){i.push("### \u{1F578}\uFE0F CKG Graph (confidence-ranked)");for(const t of w){const n=Math.round(t.edge.confidence*100),r="\u2593".repeat(Math.round(n/10))+"\u2591".repeat(10-Math.round(n/10));i.push(` ${t.edge.from} **\u2192[${t.edge.edgeType}]\u2192** ${t.edge.to}`),i.push(` ${r} ${n}% confidence (${t.edge.successes}/${t.edge.trials} confirmed)`),t.lesson?.what_worked&&i.push(` \u2705 Fix: ${t.lesson.what_worked.slice(0,150)}`),i.push("")}}if(p.length>0){i.push(w.length>0?`### \u{1F4DA} Text Search (${p.length} related lessons)`:`Found **${p.length}** related lessons. Reconstructed causal chain:`,"");const t=p.filter(f=>f.lesson.outcome!=="success"),n=p.filter(f=>f.lesson.outcome==="success");t.length>0&&(i.push("**Root causes & failure chain:**"),t.forEach((f,s)=>{const o=f.lesson,e=_[o.severity??"minor"]??"\u{1F7E1}";i.push(`${s===0?" Root:":" \u2192 :"} ${e} \`${o.topic}\``),o.what_failed&&i.push(` \u21B3 ${o.what_failed.slice(0,120)}`)}),i.push("")),n.length>0&&(i.push("**Solutions that worked before:**"),n.forEach((f,s)=>{const o=f.lesson,e=new Date(o.ts).toLocaleDateString("de-DE");i.push(` ${s+1}. \u2705 \`${o.topic}\` \u2014 ${e} \xB7 recalled ${o.recall_count??0}\xD7`),o.what_worked&&i.push(` ${o.what_worked.slice(0,200)}`)}),i.push(""));const r=n[0]?.lesson;if(r?.what_worked){i.push("**\u26A1 Most likely fix:**"),i.push("```"),i.push(r.what_worked.slice(0,500)),i.push("```"),i.push("");const f=K(r)?L(r,"trace"):0;f>0&&l.incrbyfloat(`cachly:stats:time_saved_mins:${u}`,f).catch(()=>{})}}return i.push(`\u{1F4A1} After applying: \`learn_from_attempts(topic="fix:${$[0]??"issue"}", outcome="success", ...)\``),w.length>0&&i.push(`\u{1F578}\uFE0F Explore graph: \`ckg_inspect(concept="${$[0]??"fix"}")\``),i.join(`
5
- `)}case"knowledge_decay":{let b=function(t){const n=Math.round(t/10);return"\u2588".repeat(n)+"\u2591".repeat(10-n)+` ${t}%`};const{instance_id:u,min_age_days:h=0,show_top:y=20}=C,g=await M(u),l=Date.now(),$=h*864e5;let _=0;const m=[];do{const[t,n]=await g.scan(_,"MATCH","cachly:lesson:best:*","COUNT",200);_=parseInt(t),m.push(...n)}while(_!==0);const c=[];for(const t of m){const n=await g.get(t);if(n){const r=v(n,null);if(!r)continue;const f=l-new Date(r.ts).getTime();if(f<$)continue;const s=Math.floor(f/864e5),o=r.recall_count??0,e=Math.max(0,s-7),a=Math.max(5,100-e),d=Math.min(50,o*5),T=r.outcome==="failure"?-20:0,D=Math.min(100,Math.max(0,a+d+T));c.push({topic:r.topic,confidence:D,age_days:s,recalls:o,outcome:r.outcome})}}c.sort((t,n)=>t.confidence-n.confidence);const w=c.slice(0,y),x=c.length>0?Math.round(c.reduce((t,n)=>t+n.confidence,0)/c.length):0,k=c.filter(t=>t.confidence<30).length,p=c.filter(t=>t.confidence>=70).length;return[`\u{1F9EA} **Knowledge Decay Report** \u2014 ${c.length} lessons`,"",`Average confidence: **${b(x)}**`,`\u{1F534} Critical (<30%): ${k} \u{1F7E2} Healthy (\u226570%): ${p}`,"","Lowest confidence lessons (fix these first):","",...w.map((t,n)=>`${(n+1).toString().padStart(2)}. \`${t.topic}\`
5
+ `)}case"knowledge_decay":{let b=function(t){const n=Math.round(t/10);return"\u2588".repeat(n)+"\u2591".repeat(10-n)+` ${t}%`};const{instance_id:u,min_age_days:h=0,show_top:y=20}=A,g=await M(u),l=Date.now(),$=h*864e5;let _=0;const m=[];do{const[t,n]=await g.scan(_,"MATCH","cachly:lesson:best:*","COUNT",200);_=parseInt(t),m.push(...n)}while(_!==0);const c=[];for(const t of m){const n=await g.get(t);if(n){const r=v(n,null);if(!r)continue;const f=l-new Date(r.ts).getTime();if(f<$)continue;const s=Math.floor(f/864e5),o=r.recall_count??0,e=Math.max(0,s-7),a=Math.max(5,100-e),d=Math.min(50,o*5),T=r.outcome==="failure"?-20:0,D=Math.min(100,Math.max(0,a+d+T));c.push({topic:r.topic,confidence:D,age_days:s,recalls:o,outcome:r.outcome})}}c.sort((t,n)=>t.confidence-n.confidence);const w=c.slice(0,y),x=c.length>0?Math.round(c.reduce((t,n)=>t+n.confidence,0)/c.length):0,k=c.filter(t=>t.confidence<30).length,p=c.filter(t=>t.confidence>=70).length;return[`\u{1F9EA} **Knowledge Decay Report** \u2014 ${c.length} lessons`,"",`Average confidence: **${b(x)}**`,`\u{1F534} Critical (<30%): ${k} \u{1F7E2} Healthy (\u226570%): ${p}`,"","Lowest confidence lessons (fix these first):","",...w.map((t,n)=>`${(n+1).toString().padStart(2)}. \`${t.topic}\`
6
6
  ${b(t.confidence)} \xB7 ${t.age_days}d old \xB7 ${t.recalls} recalls \xB7 ${t.outcome}`),"",c.length>y?`\u2026 and ${c.length-y} more lessons`:"","",k>0?`\u26A0\uFE0F ${k} lessons are critically stale. Validate them and re-run \`learn_from_attempts\` with updated findings.`:"\u2705 Brain confidence is healthy overall.","","\u{1F4A1} Run `memory_consolidate` to prune stale entries \xB7 `causal_trace` to find root causes."].filter(t=>t!=="").join(`
7
- `)}case"autopilot":{const{instance_id:u,editor:h="claude",project_name:y="this project",style:g="full"}=C,l=`## Cachly AI Brain \u2014 Autopilot
7
+ `)}case"autopilot":{const{instance_id:u,editor:h="claude",project_name:y="this project",style:g="full"}=A,l=`## Cachly AI Brain \u2014 Autopilot
8
8
 
9
9
  **Instance:** \`${u}\`
10
10
 
@@ -99,5 +99,5 @@ smart_recall(
99
99
  ---
100
100
 
101
101
  *Cachly v0.6 \xB7 Generated ${new Date().toISOString().slice(0,10)}*
102
- `,_=g==="minimal"?l:$,m=h==="copilot"?".github/copilot-instructions.md":h==="continue"?".continue/cachly-autopilot.md":"CLAUDE.md";return[`\u{1F916} **Autopilot instructions generated** for **${h==="all"?"all editors":h}**`,"",`**File to create:** \`${m}\``,"","```markdown",_,"```","","**How to apply:**","```bash","# Copy to your project root:",`cat > ${m} << 'EOF'`,_,"EOF","```","",`\u2728 Once this file is in place, **${h==="copilot"?"GitHub Copilot":h==="continue"?"Continue.dev":"Claude/Cursor/Windsurf"}** will manage the Brain automatically \u2014 no manual calls needed, ever.`].join(`
103
- `)}default:return null}}export{P as ADVANCED_TOOL_NAMES,z as handleAdvancedTool};
102
+ `,_=g==="minimal"?l:$,m=h==="copilot"?".github/copilot-instructions.md":h==="continue"?".continue/cachly-autopilot.md":"CLAUDE.md";return[`\u{1F916} **Autopilot instructions generated** for **${h==="all"?"all editors":h}**`,"",`**File:** \`${m}\` \u2014 create it, or APPEND to your existing one`,"","```markdown",_,"```","",`**How to apply** (\`>>\` appends \u2014 an existing ${m} keeps every line you wrote):`,"```bash",`cat >> ${m} << 'EOF'`,_,"EOF","```","",`\u2728 Once this file is in place, **${h==="copilot"?"GitHub Copilot":h==="continue"?"Continue.dev":"Claude/Cursor/Windsurf"}** will manage the Brain automatically \u2014 no manual calls needed, ever.`].join(`
103
+ `)}default:return null}}export{W as ADVANCED_TOOL_NAMES,z as handleAdvancedTool};
@@ -1,40 +1,40 @@
1
- import{createHmac as ie}from"node:crypto";import{ckgSlug as $,extractProblemConcept as ae,ckgUpsertNode as J,ckgUpdateEdge as T,ckgUpsertPersonNode as ce,ckgUpsertFileNode as re,ckgRecordCollaboration as le}from"../ckg.js";import{safeJsonParse as A,normalizeGitPath as ue}from"../utils.js";import{buildClsPostCommitHook as de}from"../cls-hook.js";import{installBrainWatchHook as fe}from"../brain-watch-hook.js";import{keywordSearch as he}from"../search.js";import{buildFirstContactReport as te,suggestRecallQueries as me}from"../first-contact.js";let pe=null,ge=null,W=0;const _e=10,se=[];function ye(){return W<_e?(W++,Promise.resolve()):new Promise(E=>se.push(E))}function we(){const E=se.shift();E?E():W--}const Oe=new Set(["madc_deliberate","cls_ingest","cls_install_hooks","fedbrain_contribute","fedbrain_search","fedbrain_confirm","fedbrain_status","brain_federate","crystal_view","compact_recover","brain_from_git","brain_from_ci","brain_predict_failures","brain_contribute_signal","brain_import_meta","brain_watch"]);async function Ne(E,N,I,G){switch(E){case"madc_deliberate":{const{instance_id:y,topic:a}=N,n=await I(y),e=(await n.lrange(`cachly:lessons:${a}`,0,-1)).map(g=>{try{return JSON.parse(g)}catch{return null}}).filter(Boolean);if(e.length<2)return[`\u{1F5F3}\uFE0F **MADC: "${a}"**`,"",`Not enough history for deliberation (need \u2265 2 entries, found ${e.length}).`,"","Call `learn_from_attempts` with conflicting outcomes to trigger deliberation."].join(`
2
- `);const l=[{name:"InfraAgent",domains:["infra","k8s","docker","server","wireguard","helm"]},{name:"AuthAgent",domains:["auth","jwt","keycloak","oauth","oidc","token"]},{name:"DeployAgent",domains:["deploy","ci","pipeline","rsync","release"]},{name:"DatabaseAgent",domains:["db","gorm","migration","postgres","clickhouse","redis"]},{name:"DebugAgent",domains:["debug","panic","race","nil","fix","error"]},{name:"APIAgent",domains:["api","http","grpc","rest","fiber","web"]}],u=a.split(":")[0]??"",c=l.filter(g=>g.domains.some(S=>u===S||a.includes(S))),o=c.length>0?c:l,d=new Map;for(const g of o){let S=0;for(const k of g.domains){const x=[],j=n.scanStream({match:`cachly:ckg:node:${k}*`,count:50});await new Promise((R,D)=>{j.on("data",P=>x.push(...P)),j.on("end",R),j.on("error",D)}),S+=x.length}d.set(g.name,S)}const h=e.filter(g=>g.outcome==="success"||g.outcome==="partial"),s=e.filter(g=>g.outcome==="failure");if(s.length===0)return[`\u{1F5F3}\uFE0F **MADC: "${a}"**`,"",`No contradictions found \u2014 all ${h.length} entries have non-failure outcomes.`,"",`Use \`ckg_inspect(concept="${$(a)}")\` to explore the confidence graph.`].join(`
3
- `);const i=[];for(const g of o){const S=d.get(g.name)??0;let k,x;S<2?(k="abstain",x="insufficient domain coverage"):h.length>=s.length*2?(k="success",x=`${h.length}/${e.length} entries confirm success`):s.length>=h.length*2?(k="failure",x=`${s.length}/${e.length} entries confirm failure`):(k="abstain",x=`contested (${h.length} success vs ${s.length} failure)`),i.push({agent:g.name,vote:k,coverage:S,reason:x})}const r=i.filter(g=>g.vote==="success").length,f=i.filter(g=>g.vote==="failure").length,m=i.filter(g=>g.vote==="abstain").length;let p,w;r>0&&f===0?(p="unanimous_success",w=`\u2705 **Unanimous: SUCCESS** \u2014 ${r} agent(s) confirm, ${m} abstain`):f>0&&r===0?(p="unanimous_failure",w=`\u274C **Unanimous: FAILURE** \u2014 ${f} agent(s) confirm, ${m} abstain`):(p="contested",w=`\u26A0\uFE0F **CONTESTED** \u2014 ${r} success votes, ${f} failure votes, ${m} abstain`);const b=$(`resolution:${a}`),O={id:b,domain:"resolution",type:"resolution",count:1,ts:new Date().toISOString(),resolution:p,topic:a,votes:{success:r,failure:f,abstain:m}};if(await n.set(`cachly:ckg:node:${b}`,JSON.stringify(O)),p==="contested")await T(n,$(a),"contradicts",b,!1);else{if(((p==="unanimous_success"?"failure":"success")==="failure"?s:h).length>0){const k=await n.smembers(`cachly:ckg:idx:from:${$(a)}`);for(const x of k){const j=await n.get(x);if(j)try{const R=JSON.parse(j);R.edgeType==="fixes"&&R.confidence>.15&&p==="unanimous_failure"&&(R.confidence=.1,R.last_updated=new Date().toISOString(),await n.set(x,JSON.stringify(R)))}catch{}}}await n.del(`cachly:ckg:conflict:${$(a)}`)}const C=[`\u{1F5F3}\uFE0F **MADC Deliberation: "${a}"**`,"",`\u{1F4CA} Evidence: ${h.length} success/partial vs ${s.length} failure entries (${e.length} total)`,"",`**Voting agents (${o.length}):**`,...i.map(g=>{const S=g.vote==="success"?"\u2705":g.vote==="failure"?"\u274C":"\u2B1C",k="\u2593".repeat(Math.min(g.coverage,5))+"\u2591".repeat(Math.max(0,5-g.coverage));return` ${S} **${g.agent}** [${k}] ${g.coverage} CKG edges \u2014 ${g.reason}`}),"",w,""];return p==="unanimous_success"?C.push(`\u{1F527} Failure entries superseded \u2014 store confirmed lesson: \`learn_from_attempts(topic="${a}", outcome="success", ...)\``):p==="unanimous_failure"?C.push(`\u{1F6AB} Success claims unconfirmed \u2014 re-verify: \`recall_best_solution(topic="${a}")\``):C.push(`\u26A0\uFE0F Contested \u2014 run \`causal_trace\` before acting. Explore: \`ckg_inspect(concept="${$(a)}")\``),C.push("",`\u{1F4DD} Resolution node: \`cachly:ckg:node:${b}\``),C.join(`
4
- `)}case"cls_ingest":{const{instance_id:y,source:a,payload:n}=N,t=await I(y),e=new Date().toISOString(),l="cachly:cls:events";if(a==="git_commit"){const u=String(n.message??""),c=String(n.sha??""),o=Array.isArray(n.files)?n.files:[],d=/^fix/i.test(u)?"fix":/^feat/i.test(u)?"feat":/^refactor/i.test(u)?"refactor":/^test/i.test(u)?"test":"commit",h=`${d}:${$(u.slice(0,60))}`,s=$(h);await J(t,s,d,"commit");for(const f of o.slice(0,10)){const m=f.includes("auth")?"auth":f.includes("api")?"api":f.includes("infra")?"infra":f.includes("web")?"web":"code",p=$(`file:${m}`);await J(t,p,"file",m),await T(t,s,"co-occurs",p,!0)}const i={topic:h,outcome:"success",what_worked:u,what_failed:"",context:`CLS/git: sha=${c}`,severity:"minor",file_paths:o.slice(0,10),commands:c?[`git show ${c}`]:[],tags:["cls","git"],depends_on:[],recall_count:0,ts:e,verified_at:e,confidence:.6,audit_trail:[{ts:e,action:"cls_git_commit"}],version:3};return await t.rpush(`cachly:lessons:${h}`,JSON.stringify(i)),await t.get(`cachly:lesson:best:${h}`)||await t.set(`cachly:lesson:best:${h}`,JSON.stringify(i)),await t.rpush(l,JSON.stringify({source:a,payload:{message:u,sha:c},ts:e})),await t.ltrim(l,-200,-1),["\u{1F4E8} **CLS Ingested: git_commit**","",`Commit \`${c.slice(0,8)||"?"}\`: ${u.slice(0,80)}`,`Concept: \`${s}\` (${d}) \xB7 Files: ${o.length}`,"",`\u{1F578}\uFE0F CKG: \`${s}\` + ${o.length} file edges \xB7 Lesson: \`${h}\``,`\u{1F4A1} Inspect: \`ckg_inspect(concept="${d}")\``].join(`
5
- `)}if(a==="ci_outcome"){const u=String(n.status??""),c=String(n.prev_status??""),o=String(n.job??"unknown"),d=String(n.context??""),h=["failure","red","error"].includes(c)&&["success","green","passed"].includes(u),s=["success","green","passed"].includes(c)&&["failure","red","error"].includes(u),i=`ci:${$(o)}`,r=$(i);if(await J(t,r,"ci","job"),h){const m=$(`problem:${$(o)}`);await J(t,m,"problem","ci-failure"),await T(t,r,"fixes",m,!0);const p={topic:i,outcome:"success",what_worked:`CI job "${o}" went ${c} \u2192 ${u}`,what_failed:`Job "${o}" was failing`,context:`CLS/ci: ${d}`,severity:"major",file_paths:[],commands:[],tags:["cls","ci"],depends_on:[],recall_count:0,ts:e,verified_at:e,confidence:.75,audit_trail:[{ts:e,action:"cls_ci_fixed"}],version:3};await t.rpush(`cachly:lessons:${i}`,JSON.stringify(p)),await t.set(`cachly:lesson:best:${i}`,JSON.stringify(p))}else if(s){const m=$(`cause:${$(o)}`);await J(t,m,"cause","ci-break"),await T(t,r,"causes",m,!1)}return await t.rpush(l,JSON.stringify({source:a,payload:{status:u,prev_status:c,job:o},ts:e})),await t.ltrim(l,-200,-1),["\u{1F4E8} **CLS Ingested: ci_outcome**","",`${h?"\u2705 Fixed":s?"\u{1F534} Broken":"\u{1F4CA} Recorded"}: \`${o}\` \u2014 ${c||"?"} \u2192 ${u}`,h?"\u{1F527} CKG `fixes` edge added (75% confidence)":s?"\u26A1 CKG `causes` edge added":"\u{1F4CA} State recorded",`\u{1F4A1} Lesson: \`${i}\` | Predict: \`brain_predict(context="${o}")\``].join(`
6
- `)}if(a==="ide_diagnostic"){const u=String(n.error??""),c=String(n.fix??""),o=String(n.file??""),d=ae(u)??"unknown-error",h=`debug:${$(d)}`,s=$(h),i=$(`problem:${d}`);await J(t,s,"debug","diagnostic"),await J(t,i,"problem","compiler-error"),await T(t,s,"fixes",i,!0);const r={topic:h,outcome:"success",what_worked:c,what_failed:u,context:`CLS/ide: ${o}`,severity:"minor",file_paths:o?[o]:[],commands:[],tags:["cls","ide-diagnostic"],depends_on:[],recall_count:0,ts:e,verified_at:e,confidence:.65,audit_trail:[{ts:e,action:"cls_ide_diagnostic"}],version:3};return await t.rpush(`cachly:lessons:${h}`,JSON.stringify(r)),await t.get(`cachly:lesson:best:${h}`)||await t.set(`cachly:lesson:best:${h}`,JSON.stringify(r)),await t.rpush(l,JSON.stringify({source:a,payload:{error:u.slice(0,60),fix:c.slice(0,60),file:o},ts:e})),await t.ltrim(l,-200,-1),["\u{1F4E8} **CLS Ingested: ide_diagnostic**","",`Error: \`${u.slice(0,80)}\``,`Fix: ${c.slice(0,100)}`,o?`File: \`${o}\``:"","",`\u{1F578}\uFE0F CKG: \`${s}\` \u2192 fixes \u2192 \`${i}\` | Lesson: \`${h}\``].filter(m=>m!=="").join(`
7
- `)}return`\u274C Unknown CLS source: "${a}". Valid: git_commit, ci_outcome, ide_diagnostic`}case"cls_install_hooks":{const{instance_id:y,repo_path:a=".",hooks:n=["git","ci"]}=N,t=Array.isArray(n)?n:["git","ci"],e=[`\u{1F50C} **CLS Hook Installation Guide**
8
- `];if(t.includes("git")){const l=de(y);e.push("### Git post-commit hook"),e.push("**Quick install (run once per repo):**"),e.push("```sh"),e.push(`cat > ${a}/.git/hooks/post-commit << 'HOOK'`),e.push(l),e.push("HOOK"),e.push(`chmod +x ${a}/.git/hooks/post-commit`),e.push("```"),e.push("After install: every `git commit` automatically updates your brain's CKG."),e.push("")}return t.includes("ci")&&(e.push("### GitHub Actions CI outcome hook"),e.push("**Add at the end of each job** (after build/test steps):"),e.push("```yaml"),e.push("- name: cachly CLS \u2014 record CI outcome"),e.push(" if: always()"),e.push(" run: |"),e.push(' node -e "'),e.push(" const r=require('https');"),e.push(` const d=JSON.stringify({instance_id:'${y}',source:'ci_outcome',payload:{`),e.push(" status:'${{ job.status }}',prev_status:'unknown',job:'${{ github.job }}',"),e.push(" context:'github-actions run ${{ github.run_number }}'}});"),e.push(" r.request({hostname:'api.cachly.dev',path:'/api/v1/cls/ingest',method:'POST',"),e.push(" headers:{'Content-Type':'application/json','Authorization':'Bearer $CACHLY_JWT',"),e.push(" 'Content-Length':d.length}},()=>{}).end(d);"),e.push(' " 2>/dev/null || true'),e.push(" env:"),e.push(" CACHLY_JWT: ${{ secrets.CACHLY_JWT }}"),e.push("```"),e.push("")),e.push('\u{1F4A1} Once installed: `brain_search(query="cls")` to verify events are arriving.'),e.push('\u{1F4CA} Monitor CKG growth: `ckg_inspect(concept="ci")` or `ckg_inspect(concept="fix")`'),e.join(`
9
- `)}case"fedbrain_contribute":{const{instance_id:y,lesson_key:a,visibility:n="public"}=N,t=await I(y),e=await t.get(`cachly:lesson:best:${a}`);if(!e)return`\u274C Lesson \`${a}\` not found. Store it first with \`learn_from_attempts\`.`;const l=A(e,null);if(!l)return`\u274C Lesson \`${a}\` data is corrupted. Re-store with \`learn_from_attempts\`.`;const u=[l.topic.split(":")[0],...l.tags??[]].filter(Boolean),c=[...new Set(u)].sort().join(","),o=`${l.topic}:${l.outcome}:${l.what_worked}`,d=ie("sha256",`cachly-fedbrain:${y}`).update(o).digest("hex").slice(0,16),h={cert_id:d,lesson_key:a,visibility:n,domain_fingerprint:c,contributed_at:new Date().toISOString(),confirm_count:0,trust_score:l.outcome==="success"?.85:.5};await t.set(`cachly:fedbrain:cert:${d}`,JSON.stringify(h)),await t.sadd("cachly:fedbrain:contributed",d);let s;try{await G("/api/v1/syndication/contribute",{method:"POST",body:JSON.stringify({topic:l.topic,outcome:l.outcome,what_worked:l.what_worked,what_failed:l.what_failed??"",severity:l.severity??"major",cert_id:d,domain_fingerprint:c,visibility:n})}),s="\u2705 Contributed to global commons"}catch{s="\u{1F4E6} Stored locally (commons API unavailable \u2014 will sync when online)"}return[`\u{1F310} **FedBrain Contribute: "${a}"**`,"",`\u{1F4DC} Certificate: \`${d}\``,`\u{1F3F7}\uFE0F Domain fingerprint: ${u.slice(0,6).map(i=>`\`${i}\``).join(", ")}`,`\u{1F512} Visibility: ${n}`,"",s,"","\u{1F4A1} At 10 independent confirms \u2192 \u{1F3C6} Gold Standard",`\u{1F50D} Search: \`fedbrain_search(query="${l.topic.split(":").slice(-1)[0]}")\``].join(`
10
- `)}case"fedbrain_search":{const{instance_id:y,query:a,context_hints:n=[],limit:t=10}=N,e=await I(y),l=await e.smembers("cachly:fedbrain:contributed"),u=new Map;for(const i of l.slice(0,30)){const r=await e.get(`cachly:fedbrain:cert:${i}`);if(r)try{const f=JSON.parse(r);for(const m of(f.domain_fingerprint??"").split(",").filter(Boolean))u.set(m,(u.get(m)??0)+1)}catch{}}for(const i of Array.isArray(n)?n:[])u.set(i.toLowerCase(),(u.get(i.toLowerCase())??0)+2);let c=[],o=!1;try{const i=new URLSearchParams({q:a,limit:String(Math.min(t*2,50))});c=(await G(`/api/v1/syndication/search?${i}`)).results??[]}catch{o=!0;const i=[],r=e.scanStream({match:"cachly:lesson:best:*",count:200});await new Promise((f,m)=>{r.on("data",p=>i.push(...p)),r.on("end",f),r.on("error",m)});for(const f of i.slice(0,60)){const m=await e.get(f);if(m)try{const p=JSON.parse(m),w=`${p.topic} ${p.what_worked??""} ${p.what_failed??""}`.toLowerCase();a.toLowerCase().split(/\s+/).some(b=>b.length>2&&w.includes(b))&&c.push({id:f.split(":").pop()??f,topic:p.topic,category:p.topic.split(":")[0],outcome:p.outcome,what_worked:p.what_worked??"",severity:p.severity??"major",confirm_count:0,created_at:p.ts??new Date().toISOString()})}catch{}}}const d=o?" \u2014 \u26A0\uFE0F Commons unreachable, local fallback (this machine only, not confirmed by the network)":"";if(c.length===0)return[`\u{1F310} **FedBrain Search: "${a}"**${d}`,"",'No results. Contribute: `fedbrain_contribute(lesson_key="fix:...")`'].join(`
11
- `);const h=c.map(i=>{const r=(i.domain_fingerprint??i.category??"").split(",").filter(Boolean),f=r.reduce((b,O)=>b+(u.get(O)??0),0),m=u.size>0?f/Math.max(1,u.size+r.length):0,p=Math.min(1,i.confirm_count/10),w=m*.4+p*.4+(i.outcome==="success"?.2:0);return{...i,weightedScore:w,isGoldStandard:!o&&i.confirm_count>=10}}).sort((i,r)=>r.weightedScore-i.weightedScore).slice(0,t),s=[`\u{1F310} **FedBrain Search: "${a}"** \u2014 ${h.length} result${h.length!==1?"s":""} (context-weighted)${d}
12
- `];for(const i of h){const r=i.outcome==="success"?"\u2705":i.outcome==="failure"?"\u274C":"\u26A0\uFE0F",f=i.isGoldStandard?" \u{1F3C6} _Gold Standard_":!o&&i.confirm_count>=3?` \u2713${i.confirm_count}`:"",m=Math.round(i.weightedScore*100);s.push(`${r}${f} **\`${i.topic}\`** [ctx: ${m}%]`),i.what_worked&&s.push(` \u2705 ${i.what_worked.slice(0,150)}`),i.what_failed&&s.push(` \u274C ${i.what_failed.slice(0,80)}`),s.push(` _${i.confirm_count} confirm${i.confirm_count!==1?"s":""} | id: \`${i.id}\`_`,"")}if(u.size>0){const i=[...u.entries()].sort((r,f)=>f[1]-r[1]).slice(0,5).map(([r,f])=>`\`${r}\`(${f})`).join(", ");s.push(`\u{1F3AF} Your context: ${i}`)}return s.push('\u{1F4A1} Confirm a result: `fedbrain_confirm(id="<id>", topic="<topic>", outcome="worked")`'),s.join(`
13
- `)}case"fedbrain_confirm":{const{instance_id:y,id:a,topic:n,outcome:t}=N;if(!a)return["\u274C **FedBrain Confirm** needs the lesson `id` from `fedbrain_search` results.",'Run `fedbrain_search(query="...")`, copy the id shown next to a result,','then: `fedbrain_confirm(id="<id>", topic="<topic>", outcome="worked")`.'].join(`
14
- `);const e=await I(y),l=new Date().toISOString(),u=JSON.stringify({id:a,topic:n,outcome:t,ts:l});await e.rpush("cachly:fedbrain:confirmations",u),await e.ltrim("cachly:fedbrain:confirmations",-200,-1);const c=t==="worked",o=t==="partially_worked";n&&await T(e,$(n),"fixes",$(`syndicated:${n}`),c,o);let d;try{await G(`/api/v1/syndication/${encodeURIComponent(a)}/confirm`,{method:"POST"}),d="\u2705 Confirmation propagated to global commons"}catch{await e.rpush("cachly:fedbrain:pending_confirms",u),await e.ltrim("cachly:fedbrain:pending_confirms",-50,-1),d="\u{1F4E6} Queued locally (API unavailable \u2014 will propagate on next online session)"}return[`${c?"\u2705":o?"\u26A0\uFE0F":"\u274C"} **FedBrain Confirm: "${n??a}"** \u2192 ${t}`,"",d,"",n?`\u{1F578}\uFE0F CKG confidence ${c||o?"boosted":"reduced"} for \`${$(n)}\``:"\u{1F578}\uFE0F Local CKG unchanged (pass `topic` to also update your own confidence graph)","\u{1F4A1} Your confirmation helps other brains worldwide.",'\u{1F4CA} Status: `fedbrain_status(instance_id="...")`'].join(`
15
- `)}case"fedbrain_status":{const{instance_id:y}=N,a=await I(y),n=await a.smembers("cachly:fedbrain:contributed"),t=await a.lrange("cachly:fedbrain:confirmations",-10,-1),e=await a.llen("cachly:fedbrain:pending_confirms"),l=t.map(o=>{try{return JSON.parse(o)}catch{return null}}).filter(Boolean),u=[];for(const o of n.slice(0,15)){const d=await a.get(`cachly:fedbrain:cert:${o}`);if(d)try{const h=JSON.parse(d);u.push({cert_id:h.cert_id,lesson_key:h.lesson_key,confirm_count:h.confirm_count??0,trust_score:h.trust_score??.5,isGold:(h.confirm_count??0)>=10})}catch{}}const c=[`\u{1F310} **FedBrain Status**
1
+ import{createHmac as ie}from"node:crypto";import{ckgSlug as $,extractProblemConcept as ae,ckgUpsertNode as J,ckgUpdateEdge as T,ckgUpsertPersonNode as ce,ckgUpsertFileNode as re,ckgRecordCollaboration as le}from"../ckg.js";import{safeJsonParse as A,normalizeGitPath as ue}from"../utils.js";import{buildClsPostCommitHook as de}from"../cls-hook.js";import{installBrainWatchHook as fe}from"../brain-watch-hook.js";import{keywordSearch as he}from"../search.js";import{buildFirstContactReport as te,suggestRecallQueries as me}from"../first-contact.js";let pe=null,ge=null,W=0;const _e=10,se=[];function ye(){return W<_e?(W++,Promise.resolve()):new Promise(E=>se.push(E))}function we(){const E=se.shift();E?E():W--}const Oe=new Set(["madc_deliberate","cls_ingest","cls_install_hooks","fedbrain_contribute","fedbrain_search","fedbrain_confirm","fedbrain_status","brain_federate","crystal_view","compact_recover","brain_from_git","brain_from_ci","brain_predict_failures","brain_contribute_signal","brain_import_meta","brain_watch"]);async function Ne(E,N,I,G){switch(E){case"madc_deliberate":{const{instance_id:y,topic:i}=N,n=await I(y),e=(await n.lrange(`cachly:lessons:${i}`,0,-1)).map(g=>{try{return JSON.parse(g)}catch{return null}}).filter(Boolean);if(e.length<2)return[`\u{1F5F3}\uFE0F **MADC: "${i}"**`,"",`Not enough history for deliberation (need \u2265 2 entries, found ${e.length}).`,"","Call `learn_from_attempts` with conflicting outcomes to trigger deliberation."].join(`
2
+ `);const l=[{name:"InfraAgent",domains:["infra","k8s","docker","server","wireguard","helm"]},{name:"AuthAgent",domains:["auth","jwt","keycloak","oauth","oidc","token"]},{name:"DeployAgent",domains:["deploy","ci","pipeline","rsync","release"]},{name:"DatabaseAgent",domains:["db","gorm","migration","postgres","clickhouse","redis"]},{name:"DebugAgent",domains:["debug","panic","race","nil","fix","error"]},{name:"APIAgent",domains:["api","http","grpc","rest","fiber","web"]}],u=i.split(":")[0]??"",c=l.filter(g=>g.domains.some(S=>u===S||i.includes(S))),o=c.length>0?c:l,d=new Map;for(const g of o){let S=0;for(const k of g.domains){const x=[],j=n.scanStream({match:`cachly:ckg:node:${k}*`,count:50});await new Promise((R,D)=>{j.on("data",P=>x.push(...P)),j.on("end",R),j.on("error",D)}),S+=x.length}d.set(g.name,S)}const h=e.filter(g=>g.outcome==="success"||g.outcome==="partial"),s=e.filter(g=>g.outcome==="failure");if(s.length===0)return[`\u{1F5F3}\uFE0F **MADC: "${i}"**`,"",`No contradictions found \u2014 all ${h.length} entries have non-failure outcomes.`,"",`Use \`ckg_inspect(concept="${$(i)}")\` to explore the confidence graph.`].join(`
3
+ `);const a=[];for(const g of o){const S=d.get(g.name)??0;let k,x;S<2?(k="abstain",x="insufficient domain coverage"):h.length>=s.length*2?(k="success",x=`${h.length}/${e.length} entries confirm success`):s.length>=h.length*2?(k="failure",x=`${s.length}/${e.length} entries confirm failure`):(k="abstain",x=`contested (${h.length} success vs ${s.length} failure)`),a.push({agent:g.name,vote:k,coverage:S,reason:x})}const r=a.filter(g=>g.vote==="success").length,f=a.filter(g=>g.vote==="failure").length,m=a.filter(g=>g.vote==="abstain").length;let p,w;r>0&&f===0?(p="unanimous_success",w=`\u2705 **Unanimous: SUCCESS** \u2014 ${r} agent(s) confirm, ${m} abstain`):f>0&&r===0?(p="unanimous_failure",w=`\u274C **Unanimous: FAILURE** \u2014 ${f} agent(s) confirm, ${m} abstain`):(p="contested",w=`\u26A0\uFE0F **CONTESTED** \u2014 ${r} success votes, ${f} failure votes, ${m} abstain`);const b=$(`resolution:${i}`),O={id:b,domain:"resolution",type:"resolution",count:1,ts:new Date().toISOString(),resolution:p,topic:i,votes:{success:r,failure:f,abstain:m}};if(await n.set(`cachly:ckg:node:${b}`,JSON.stringify(O)),p==="contested")await T(n,$(i),"contradicts",b,!1);else{if(((p==="unanimous_success"?"failure":"success")==="failure"?s:h).length>0){const k=await n.smembers(`cachly:ckg:idx:from:${$(i)}`);for(const x of k){const j=await n.get(x);if(j)try{const R=JSON.parse(j);R.edgeType==="fixes"&&R.confidence>.15&&p==="unanimous_failure"&&(R.confidence=.1,R.last_updated=new Date().toISOString(),await n.set(x,JSON.stringify(R)))}catch{}}}await n.del(`cachly:ckg:conflict:${$(i)}`)}const C=[`\u{1F5F3}\uFE0F **MADC Deliberation: "${i}"**`,"",`\u{1F4CA} Evidence: ${h.length} success/partial vs ${s.length} failure entries (${e.length} total)`,"",`**Voting agents (${o.length}):**`,...a.map(g=>{const S=g.vote==="success"?"\u2705":g.vote==="failure"?"\u274C":"\u2B1C",k="\u2593".repeat(Math.min(g.coverage,5))+"\u2591".repeat(Math.max(0,5-g.coverage));return` ${S} **${g.agent}** [${k}] ${g.coverage} CKG edges \u2014 ${g.reason}`}),"",w,""];return p==="unanimous_success"?C.push(`\u{1F527} Failure entries superseded \u2014 store confirmed lesson: \`learn_from_attempts(topic="${i}", outcome="success", ...)\``):p==="unanimous_failure"?C.push(`\u{1F6AB} Success claims unconfirmed \u2014 re-verify: \`recall_best_solution(topic="${i}")\``):C.push(`\u26A0\uFE0F Contested \u2014 run \`causal_trace\` before acting. Explore: \`ckg_inspect(concept="${$(i)}")\``),C.push("",`\u{1F4DD} Resolution node: \`cachly:ckg:node:${b}\``),C.join(`
4
+ `)}case"cls_ingest":{const{instance_id:y,source:i,payload:n}=N,t=await I(y),e=new Date().toISOString(),l="cachly:cls:events";if(i==="git_commit"){const u=String(n.message??""),c=String(n.sha??""),o=Array.isArray(n.files)?n.files:[],d=/^fix/i.test(u)?"fix":/^feat/i.test(u)?"feat":/^refactor/i.test(u)?"refactor":/^test/i.test(u)?"test":"commit",h=`${d}:${$(u.slice(0,60))}`,s=$(h);await J(t,s,d,"commit");for(const f of o.slice(0,10)){const m=f.includes("auth")?"auth":f.includes("api")?"api":f.includes("infra")?"infra":f.includes("web")?"web":"code",p=$(`file:${m}`);await J(t,p,"file",m),await T(t,s,"co-occurs",p,!0)}const a={topic:h,outcome:"success",what_worked:u,what_failed:"",context:`CLS/git: sha=${c}`,severity:"minor",file_paths:o.slice(0,10),commands:c?[`git show ${c}`]:[],tags:["cls","git"],depends_on:[],recall_count:0,ts:e,verified_at:e,confidence:.6,audit_trail:[{ts:e,action:"cls_git_commit"}],version:3};return await t.rpush(`cachly:lessons:${h}`,JSON.stringify(a)),await t.get(`cachly:lesson:best:${h}`)||await t.set(`cachly:lesson:best:${h}`,JSON.stringify(a)),await t.rpush(l,JSON.stringify({source:i,payload:{message:u,sha:c},ts:e})),await t.ltrim(l,-200,-1),["\u{1F4E8} **CLS Ingested: git_commit**","",`Commit \`${c.slice(0,8)||"?"}\`: ${u.slice(0,80)}`,`Concept: \`${s}\` (${d}) \xB7 Files: ${o.length}`,"",`\u{1F578}\uFE0F CKG: \`${s}\` + ${o.length} file edges \xB7 Lesson: \`${h}\``,`\u{1F4A1} Inspect: \`ckg_inspect(concept="${d}")\``].join(`
5
+ `)}if(i==="ci_outcome"){const u=String(n.status??""),c=String(n.prev_status??""),o=String(n.job??"unknown"),d=String(n.context??""),h=["failure","red","error"].includes(c)&&["success","green","passed"].includes(u),s=["success","green","passed"].includes(c)&&["failure","red","error"].includes(u),a=`ci:${$(o)}`,r=$(a);if(await J(t,r,"ci","job"),h){const m=$(`problem:${$(o)}`);await J(t,m,"problem","ci-failure"),await T(t,r,"fixes",m,!0);const p={topic:a,outcome:"success",what_worked:`CI job "${o}" went ${c} \u2192 ${u}`,what_failed:`Job "${o}" was failing`,context:`CLS/ci: ${d}`,severity:"major",file_paths:[],commands:[],tags:["cls","ci"],depends_on:[],recall_count:0,ts:e,verified_at:e,confidence:.75,audit_trail:[{ts:e,action:"cls_ci_fixed"}],version:3};await t.rpush(`cachly:lessons:${a}`,JSON.stringify(p)),await t.set(`cachly:lesson:best:${a}`,JSON.stringify(p))}else if(s){const m=$(`cause:${$(o)}`);await J(t,m,"cause","ci-break"),await T(t,r,"causes",m,!1)}return await t.rpush(l,JSON.stringify({source:i,payload:{status:u,prev_status:c,job:o},ts:e})),await t.ltrim(l,-200,-1),["\u{1F4E8} **CLS Ingested: ci_outcome**","",`${h?"\u2705 Fixed":s?"\u{1F534} Broken":"\u{1F4CA} Recorded"}: \`${o}\` \u2014 ${c||"?"} \u2192 ${u}`,h?"\u{1F527} CKG `fixes` edge added (75% confidence)":s?"\u26A1 CKG `causes` edge added":"\u{1F4CA} State recorded",`\u{1F4A1} Lesson: \`${a}\` | Predict: \`brain_predict(context="${o}")\``].join(`
6
+ `)}if(i==="ide_diagnostic"){const u=String(n.error??""),c=String(n.fix??""),o=String(n.file??""),d=ae(u)??"unknown-error",h=`debug:${$(d)}`,s=$(h),a=$(`problem:${d}`);await J(t,s,"debug","diagnostic"),await J(t,a,"problem","compiler-error"),await T(t,s,"fixes",a,!0);const r={topic:h,outcome:"success",what_worked:c,what_failed:u,context:`CLS/ide: ${o}`,severity:"minor",file_paths:o?[o]:[],commands:[],tags:["cls","ide-diagnostic"],depends_on:[],recall_count:0,ts:e,verified_at:e,confidence:.65,audit_trail:[{ts:e,action:"cls_ide_diagnostic"}],version:3};return await t.rpush(`cachly:lessons:${h}`,JSON.stringify(r)),await t.get(`cachly:lesson:best:${h}`)||await t.set(`cachly:lesson:best:${h}`,JSON.stringify(r)),await t.rpush(l,JSON.stringify({source:i,payload:{error:u.slice(0,60),fix:c.slice(0,60),file:o},ts:e})),await t.ltrim(l,-200,-1),["\u{1F4E8} **CLS Ingested: ide_diagnostic**","",`Error: \`${u.slice(0,80)}\``,`Fix: ${c.slice(0,100)}`,o?`File: \`${o}\``:"","",`\u{1F578}\uFE0F CKG: \`${s}\` \u2192 fixes \u2192 \`${a}\` | Lesson: \`${h}\``].filter(m=>m!=="").join(`
7
+ `)}return`\u274C Unknown CLS source: "${i}". Valid: git_commit, ci_outcome, ide_diagnostic`}case"cls_install_hooks":{const{instance_id:y,repo_path:i=".",hooks:n=["git","ci"]}=N,t=Array.isArray(n)?n:["git","ci"],e=[`\u{1F50C} **CLS Hook Installation Guide**
8
+ `];if(t.includes("git")){const l=de(y);e.push("### Git post-commit hook"),e.push("**Quick install (run once per repo):**"),e.push("```sh"),e.push(`touch ${i}/.git/hooks/post-commit`),e.push(`grep -q 'cachly CLS' ${i}/.git/hooks/post-commit || cat >> ${i}/.git/hooks/post-commit << 'HOOK'`),e.push(l),e.push("HOOK"),e.push(`chmod +x ${i}/.git/hooks/post-commit`),e.push("```"),e.push("After install: every `git commit` automatically updates your brain's CKG."),e.push("")}return t.includes("ci")&&(e.push("### GitHub Actions CI outcome hook"),e.push("**Add at the end of each job** (after build/test steps):"),e.push("```yaml"),e.push("- name: cachly CLS \u2014 record CI outcome"),e.push(" if: always()"),e.push(" run: |"),e.push(' node -e "'),e.push(" const r=require('https');"),e.push(` const d=JSON.stringify({instance_id:'${y}',source:'ci_outcome',payload:{`),e.push(" status:'${{ job.status }}',prev_status:'unknown',job:'${{ github.job }}',"),e.push(" context:'github-actions run ${{ github.run_number }}'}});"),e.push(" r.request({hostname:'api.cachly.dev',path:'/api/v1/cls/ingest',method:'POST',"),e.push(" headers:{'Content-Type':'application/json','Authorization':'Bearer $CACHLY_JWT',"),e.push(" 'Content-Length':d.length}},()=>{}).end(d);"),e.push(' " 2>/dev/null || true'),e.push(" env:"),e.push(" CACHLY_JWT: ${{ secrets.CACHLY_JWT }}"),e.push("```"),e.push("")),e.push('\u{1F4A1} Once installed: `brain_search(query="cls")` to verify events are arriving.'),e.push('\u{1F4CA} Monitor CKG growth: `ckg_inspect(concept="ci")` or `ckg_inspect(concept="fix")`'),e.join(`
9
+ `)}case"fedbrain_contribute":{const{instance_id:y,lesson_key:i,visibility:n="public"}=N,t=await I(y),e=await t.get(`cachly:lesson:best:${i}`);if(!e)return`\u274C Lesson \`${i}\` not found. Store it first with \`learn_from_attempts\`.`;const l=A(e,null);if(!l)return`\u274C Lesson \`${i}\` data is corrupted. Re-store with \`learn_from_attempts\`.`;const u=[l.topic.split(":")[0],...l.tags??[]].filter(Boolean),c=[...new Set(u)].sort().join(","),o=`${l.topic}:${l.outcome}:${l.what_worked}`,d=ie("sha256",`cachly-fedbrain:${y}`).update(o).digest("hex").slice(0,16),h={cert_id:d,lesson_key:i,visibility:n,domain_fingerprint:c,contributed_at:new Date().toISOString(),confirm_count:0,trust_score:l.outcome==="success"?.85:.5};await t.set(`cachly:fedbrain:cert:${d}`,JSON.stringify(h)),await t.sadd("cachly:fedbrain:contributed",d);let s;try{await G("/api/v1/syndication/contribute",{method:"POST",body:JSON.stringify({topic:l.topic,outcome:l.outcome,what_worked:l.what_worked,what_failed:l.what_failed??"",severity:l.severity??"major",cert_id:d,domain_fingerprint:c,visibility:n})}),s="\u2705 Contributed to global commons"}catch{s="\u{1F4E6} Stored locally (commons API unavailable \u2014 will sync when online)"}return[`\u{1F310} **FedBrain Contribute: "${i}"**`,"",`\u{1F4DC} Certificate: \`${d}\``,`\u{1F3F7}\uFE0F Domain fingerprint: ${u.slice(0,6).map(a=>`\`${a}\``).join(", ")}`,`\u{1F512} Visibility: ${n}`,"",s,"","\u{1F4A1} At 10 independent confirms \u2192 \u{1F3C6} Gold Standard",`\u{1F50D} Search: \`fedbrain_search(query="${l.topic.split(":").slice(-1)[0]}")\``].join(`
10
+ `)}case"fedbrain_search":{const{instance_id:y,query:i,context_hints:n=[],limit:t=10}=N,e=await I(y),l=await e.smembers("cachly:fedbrain:contributed"),u=new Map;for(const a of l.slice(0,30)){const r=await e.get(`cachly:fedbrain:cert:${a}`);if(r)try{const f=JSON.parse(r);for(const m of(f.domain_fingerprint??"").split(",").filter(Boolean))u.set(m,(u.get(m)??0)+1)}catch{}}for(const a of Array.isArray(n)?n:[])u.set(a.toLowerCase(),(u.get(a.toLowerCase())??0)+2);let c=[],o=!1;try{const a=new URLSearchParams({q:i,limit:String(Math.min(t*2,50))});c=(await G(`/api/v1/syndication/search?${a}`)).results??[]}catch{o=!0;const a=[],r=e.scanStream({match:"cachly:lesson:best:*",count:200});await new Promise((f,m)=>{r.on("data",p=>a.push(...p)),r.on("end",f),r.on("error",m)});for(const f of a.slice(0,60)){const m=await e.get(f);if(m)try{const p=JSON.parse(m),w=`${p.topic} ${p.what_worked??""} ${p.what_failed??""}`.toLowerCase();i.toLowerCase().split(/\s+/).some(b=>b.length>2&&w.includes(b))&&c.push({id:f.split(":").pop()??f,topic:p.topic,category:p.topic.split(":")[0],outcome:p.outcome,what_worked:p.what_worked??"",severity:p.severity??"major",confirm_count:0,created_at:p.ts??new Date().toISOString()})}catch{}}}const d=o?" \u2014 \u26A0\uFE0F Commons unreachable, local fallback (this machine only, not confirmed by the network)":"";if(c.length===0)return[`\u{1F310} **FedBrain Search: "${i}"**${d}`,"",'No results. Contribute: `fedbrain_contribute(lesson_key="fix:...")`'].join(`
11
+ `);const h=c.map(a=>{const r=(a.domain_fingerprint??a.category??"").split(",").filter(Boolean),f=r.reduce((b,O)=>b+(u.get(O)??0),0),m=u.size>0?f/Math.max(1,u.size+r.length):0,p=Math.min(1,a.confirm_count/10),w=m*.4+p*.4+(a.outcome==="success"?.2:0);return{...a,weightedScore:w,isGoldStandard:!o&&a.confirm_count>=10}}).sort((a,r)=>r.weightedScore-a.weightedScore).slice(0,t),s=[`\u{1F310} **FedBrain Search: "${i}"** \u2014 ${h.length} result${h.length!==1?"s":""} (context-weighted)${d}
12
+ `];for(const a of h){const r=a.outcome==="success"?"\u2705":a.outcome==="failure"?"\u274C":"\u26A0\uFE0F",f=a.isGoldStandard?" \u{1F3C6} _Gold Standard_":!o&&a.confirm_count>=3?` \u2713${a.confirm_count}`:"",m=Math.round(a.weightedScore*100);s.push(`${r}${f} **\`${a.topic}\`** [ctx: ${m}%]`),a.what_worked&&s.push(` \u2705 ${a.what_worked.slice(0,150)}`),a.what_failed&&s.push(` \u274C ${a.what_failed.slice(0,80)}`),s.push(` _${a.confirm_count} confirm${a.confirm_count!==1?"s":""} | id: \`${a.id}\`_`,"")}if(u.size>0){const a=[...u.entries()].sort((r,f)=>f[1]-r[1]).slice(0,5).map(([r,f])=>`\`${r}\`(${f})`).join(", ");s.push(`\u{1F3AF} Your context: ${a}`)}return s.push('\u{1F4A1} Confirm a result: `fedbrain_confirm(id="<id>", topic="<topic>", outcome="worked")`'),s.join(`
13
+ `)}case"fedbrain_confirm":{const{instance_id:y,id:i,topic:n,outcome:t}=N;if(!i)return["\u274C **FedBrain Confirm** needs the lesson `id` from `fedbrain_search` results.",'Run `fedbrain_search(query="...")`, copy the id shown next to a result,','then: `fedbrain_confirm(id="<id>", topic="<topic>", outcome="worked")`.'].join(`
14
+ `);const e=await I(y),l=new Date().toISOString(),u=JSON.stringify({id:i,topic:n,outcome:t,ts:l});await e.rpush("cachly:fedbrain:confirmations",u),await e.ltrim("cachly:fedbrain:confirmations",-200,-1);const c=t==="worked",o=t==="partially_worked";n&&await T(e,$(n),"fixes",$(`syndicated:${n}`),c,o);let d;try{await G(`/api/v1/syndication/${encodeURIComponent(i)}/confirm`,{method:"POST"}),d="\u2705 Confirmation propagated to global commons"}catch{await e.rpush("cachly:fedbrain:pending_confirms",u),await e.ltrim("cachly:fedbrain:pending_confirms",-50,-1),d="\u{1F4E6} Queued locally (API unavailable \u2014 will propagate on next online session)"}return[`${c?"\u2705":o?"\u26A0\uFE0F":"\u274C"} **FedBrain Confirm: "${n??i}"** \u2192 ${t}`,"",d,"",n?`\u{1F578}\uFE0F CKG confidence ${c||o?"boosted":"reduced"} for \`${$(n)}\``:"\u{1F578}\uFE0F Local CKG unchanged (pass `topic` to also update your own confidence graph)","\u{1F4A1} Your confirmation helps other brains worldwide.",'\u{1F4CA} Status: `fedbrain_status(instance_id="...")`'].join(`
15
+ `)}case"fedbrain_status":{const{instance_id:y}=N,i=await I(y),n=await i.smembers("cachly:fedbrain:contributed"),t=await i.lrange("cachly:fedbrain:confirmations",-10,-1),e=await i.llen("cachly:fedbrain:pending_confirms"),l=t.map(o=>{try{return JSON.parse(o)}catch{return null}}).filter(Boolean),u=[];for(const o of n.slice(0,15)){const d=await i.get(`cachly:fedbrain:cert:${o}`);if(d)try{const h=JSON.parse(d);u.push({cert_id:h.cert_id,lesson_key:h.lesson_key,confirm_count:h.confirm_count??0,trust_score:h.trust_score??.5,isGold:(h.confirm_count??0)>=10})}catch{}}const c=[`\u{1F310} **FedBrain Status**
16
16
  `,`### \u{1F4E4} Contributed Lessons: ${n.length}`];if(u.length>0)for(const o of u){const d=o.isGold?" \u{1F3C6} Gold Standard":"",h="\u2588".repeat(Math.min(10,o.confirm_count))+"\u2591".repeat(Math.max(0,10-o.confirm_count));c.push(` \`${o.lesson_key}\` [${h}] \xD7${o.confirm_count}${d}`)}else c.push(' _None yet. Contribute with `fedbrain_contribute(lesson_key="fix:...")`_');if(c.push("",`### \u{1F4E5} Recent Confirmations: ${l.length}`),l.length>0)for(const o of l.slice(-5)){const d=o.outcome==="worked"?"\u2705":o.outcome==="partially_worked"?"\u26A0\uFE0F":"\u274C";c.push(` ${d} \`${o.topic}\` \u2014 ${o.outcome} (${new Date(o.ts).toLocaleDateString("de-DE")})`)}else c.push(" _None yet. Confirm syndicated lessons with `fedbrain_confirm`_");return e>0&&c.push("",`\u26A0\uFE0F ${e} confirmation${e!==1?"s":""} pending propagation`),c.push("","---",'**Contribute:** `fedbrain_contribute(lesson_key="fix:...")`','**Search:** `fedbrain_search(query="...")`','**Confirm:** `fedbrain_confirm(id="...", topic="...", outcome="worked")`'),c.join(`
17
- `)}case"brain_federate":{const{instance_id:y,source:a,domain:n,min_confidence:t=.6,dry_run:e=!1}=N;if(y===a)return"\u274C Source and destination cannot be the same brain.";const l=await I(y),u=await I(a),c=n==="*"?"cachly:ckg:node:*":`cachly:ckg:node:${n}*`,o=[],d=u.scanStream({match:c,count:100});if(await new Promise((w,b)=>{d.on("data",O=>o.push(...O)),d.on("end",w),d.on("error",b)}),o.length===0)return[`\u{1F9E0} **brain_federate: "${n}"**`,"",`No CKG nodes found in source brain for domain \`${n}\`.`,"The source brain may not have knowledge in this area yet.",`Try: \`fedbrain_search(query="${n}")\` to find global commons knowledge instead.`].join(`
18
- `);let h=0,s=0,i=0,r=0;const f=[];for(const w of o){const b=await u.get(w);if(!b)continue;let O;try{O=JSON.parse(b)}catch{continue}e||await l.set(w,b),h++;const C=await u.smembers(`cachly:ckg:idx:from:${O.id}`);for(const k of C){const x=await u.get(k);if(!x)continue;let j;try{j=JSON.parse(x)}catch{continue}if(j.confidence<t){r++;continue}e||(await l.set(k,x),await l.sadd(`cachly:ckg:idx:from:${j.from}`,k),await l.sadd(`cachly:ckg:idx:to:${j.to}`,k)),s++}const g=`cachly:lesson:best:${O.id}`,S=await u.get(g);if(S&&(e||await l.set(g,S),i++,f.length<8))try{const k=JSON.parse(S),x=k.outcome==="success"?"\u2705":k.outcome==="failure"?"\u274C":"\u26A0\uFE0F";f.push(` ${x} \`${k.topic}\` \u2014 ${(k.what_worked??"").slice(0,80)}`)}catch{}}if(!e){const w=JSON.stringify({source:a,domain:n,transferred_at:new Date().toISOString(),nodes:h,edges:s,lessons:i});await l.rpush("cachly:fedbrain:federations",w),await l.ltrim("cachly:fedbrain:federations",-50,-1)}const p=[`\u{1F9E0} **brain_federate: "${n}"**${e?" (DRY RUN \u2014 no writes)":""}`,"",`\u{1F4E4} Source: \`${a}\``,`\u{1F4E5} Destination: \`${y}\``,`\u{1F50D} Domain filter: \`${n}\` | min_confidence: ${t}`,"","### Transfer Summary",` \u{1F578}\uFE0F CKG nodes: ${h}`,` \u{1F517} CKG edges: ${s} (${r} skipped, confidence < ${t})`,` \u{1F4DA} Lessons: ${i}`,""];return f.length>0&&(p.push("### Sample lessons transferred:",...f),i>f.length&&p.push(` _... and ${i-f.length} more_`),p.push("")),e?p.push("\u{1F4A1} Run without `dry_run: true` to apply the transfer."):(p.push(`\u2705 Transfer complete. Your brain now has the \`${n}\` knowledge from \`${a}\`.`),p.push(`\u{1F50D} Explore: \`ckg_inspect(concept="${n}")\` | \`recall_best_solution(topic="${n}:...")\``)),p.join(`
19
- `)}case"crystal_view":{const{instance_id:y,show_raw:a=!1}=N,n=await I(y),t=await n.get("cachly:crystal:latest");if(!t)return["\u{1F48E} **Memory Crystal: not yet created**","","No crystal found. Create one with `memory_crystalize()` to compress your accumulated wisdom.","","\u{1F4A1} Tip: run `memory_crystalize` monthly for best results."].join(`
20
- `);const e=A(t,null);if(!e)return"\u274C Memory Crystal data is corrupted. Re-create with `memory_crystalize()`.";const l=Math.floor((Date.now()-new Date(e.ts).getTime())/864e5),u=l<=7?"\u{1F7E2}":l<=30?"\u{1F7E1}":"\u{1F534}",c=[`\u{1F48E} **Memory Crystal: ${e.label}**`,"",`\u{1F4C5} Created: ${new Date(e.ts).toLocaleDateString("de-DE")} (${l}d ago ${u})`,`\u{1F4CA} Compressed from: ${e.created_from}`,`\u{1F5C2}\uFE0F Categories: ${e.categories.slice(0,10).map(d=>`\`${d}\``).join(", ")}${e.categories.length>10?` +${e.categories.length-10} more`:""}`,"",`**\u{1F511} Top patterns (${e.top_patterns.length}):**`];for(const d of e.top_patterns)c.push(` \u2022 **${d.category}** (${d.count}\xD7): ${d.insight.slice(0,110)}`);l>30&&c.push("",`\u26A0\uFE0F Crystal is ${l}d old \u2014 run \`memory_crystalize()\` to refresh it.`),a&&c.push("","```json",JSON.stringify(e,null,2),"```");const o=await n.get("cachly:crystal:team:latest").catch(()=>null);if(o){const d=A(o,null);if(d&&d.patterns?.length){const h=Math.floor((Date.now()-new Date(d.ts).getTime())/864e5);c.push("","---",`\u{1F4A0} **Team Crystal: ${d.label}** _(${h}d ago \xB7 ${d.contributors} contributors)_`,"_Fixes multiple teammates independently converged on \u2014 the team-wide layer:_");for(const s of d.patterns.slice(0,5))c.push(` \u2022 \u{1F9E9} **${s.concept}** \u2014 ${s.author_count} people (${s.authors.map(i=>`@${i}`).join(", ")}): ${s.convergent_fix.slice(0,90)}`)}}return c.push("",'\u{1F4A1} Refresh: `memory_crystalize()` \xB7 `team_crystallize()` | Recover: `compact_recover(instance_id="...")`'),c.join(`
21
- `)}case"compact_recover":{const{instance_id:y,focus:a=""}=N,n=await I(y),t=[`\u{1F501} **Compact Recovery Briefing**
17
+ `)}case"brain_federate":{const{instance_id:y,source:i,domain:n,min_confidence:t=.6,dry_run:e=!1}=N;if(y===i)return"\u274C Source and destination cannot be the same brain.";const l=await I(y),u=await I(i),c=n==="*"?"cachly:ckg:node:*":`cachly:ckg:node:${n}*`,o=[],d=u.scanStream({match:c,count:100});if(await new Promise((w,b)=>{d.on("data",O=>o.push(...O)),d.on("end",w),d.on("error",b)}),o.length===0)return[`\u{1F9E0} **brain_federate: "${n}"**`,"",`No CKG nodes found in source brain for domain \`${n}\`.`,"The source brain may not have knowledge in this area yet.",`Try: \`fedbrain_search(query="${n}")\` to find global commons knowledge instead.`].join(`
18
+ `);let h=0,s=0,a=0,r=0;const f=[];for(const w of o){const b=await u.get(w);if(!b)continue;let O;try{O=JSON.parse(b)}catch{continue}e||await l.set(w,b),h++;const C=await u.smembers(`cachly:ckg:idx:from:${O.id}`);for(const k of C){const x=await u.get(k);if(!x)continue;let j;try{j=JSON.parse(x)}catch{continue}if(j.confidence<t){r++;continue}e||(await l.set(k,x),await l.sadd(`cachly:ckg:idx:from:${j.from}`,k),await l.sadd(`cachly:ckg:idx:to:${j.to}`,k)),s++}const g=`cachly:lesson:best:${O.id}`,S=await u.get(g);if(S&&(e||await l.set(g,S),a++,f.length<8))try{const k=JSON.parse(S),x=k.outcome==="success"?"\u2705":k.outcome==="failure"?"\u274C":"\u26A0\uFE0F";f.push(` ${x} \`${k.topic}\` \u2014 ${(k.what_worked??"").slice(0,80)}`)}catch{}}if(!e){const w=JSON.stringify({source:i,domain:n,transferred_at:new Date().toISOString(),nodes:h,edges:s,lessons:a});await l.rpush("cachly:fedbrain:federations",w),await l.ltrim("cachly:fedbrain:federations",-50,-1)}const p=[`\u{1F9E0} **brain_federate: "${n}"**${e?" (DRY RUN \u2014 no writes)":""}`,"",`\u{1F4E4} Source: \`${i}\``,`\u{1F4E5} Destination: \`${y}\``,`\u{1F50D} Domain filter: \`${n}\` | min_confidence: ${t}`,"","### Transfer Summary",` \u{1F578}\uFE0F CKG nodes: ${h}`,` \u{1F517} CKG edges: ${s} (${r} skipped, confidence < ${t})`,` \u{1F4DA} Lessons: ${a}`,""];return f.length>0&&(p.push("### Sample lessons transferred:",...f),a>f.length&&p.push(` _... and ${a-f.length} more_`),p.push("")),e?p.push("\u{1F4A1} Run without `dry_run: true` to apply the transfer."):(p.push(`\u2705 Transfer complete. Your brain now has the \`${n}\` knowledge from \`${i}\`.`),p.push(`\u{1F50D} Explore: \`ckg_inspect(concept="${n}")\` | \`recall_best_solution(topic="${n}:...")\``)),p.join(`
19
+ `)}case"crystal_view":{const{instance_id:y,show_raw:i=!1}=N,n=await I(y),t=await n.get("cachly:crystal:latest");if(!t)return["\u{1F48E} **Memory Crystal: not yet created**","","No crystal found. Create one with `memory_crystalize()` to compress your accumulated wisdom.","","\u{1F4A1} Tip: run `memory_crystalize` monthly for best results."].join(`
20
+ `);const e=A(t,null);if(!e)return"\u274C Memory Crystal data is corrupted. Re-create with `memory_crystalize()`.";const l=Math.floor((Date.now()-new Date(e.ts).getTime())/864e5),u=l<=7?"\u{1F7E2}":l<=30?"\u{1F7E1}":"\u{1F534}",c=[`\u{1F48E} **Memory Crystal: ${e.label}**`,"",`\u{1F4C5} Created: ${new Date(e.ts).toLocaleDateString("de-DE")} (${l}d ago ${u})`,`\u{1F4CA} Compressed from: ${e.created_from}`,`\u{1F5C2}\uFE0F Categories: ${e.categories.slice(0,10).map(d=>`\`${d}\``).join(", ")}${e.categories.length>10?` +${e.categories.length-10} more`:""}`,"",`**\u{1F511} Top patterns (${e.top_patterns.length}):**`];for(const d of e.top_patterns)c.push(` \u2022 **${d.category}** (${d.count}\xD7): ${d.insight.slice(0,110)}`);l>30&&c.push("",`\u26A0\uFE0F Crystal is ${l}d old \u2014 run \`memory_crystalize()\` to refresh it.`),i&&c.push("","```json",JSON.stringify(e,null,2),"```");const o=await n.get("cachly:crystal:team:latest").catch(()=>null);if(o){const d=A(o,null);if(d&&d.patterns?.length){const h=Math.floor((Date.now()-new Date(d.ts).getTime())/864e5);c.push("","---",`\u{1F4A0} **Team Crystal: ${d.label}** _(${h}d ago \xB7 ${d.contributors} contributors)_`,"_Fixes multiple teammates independently converged on \u2014 the team-wide layer:_");for(const s of d.patterns.slice(0,5))c.push(` \u2022 \u{1F9E9} **${s.concept}** \u2014 ${s.author_count} people (${s.authors.map(a=>`@${a}`).join(", ")}): ${s.convergent_fix.slice(0,90)}`)}}return c.push("",'\u{1F4A1} Refresh: `memory_crystalize()` \xB7 `team_crystallize()` | Recover: `compact_recover(instance_id="...")`'),c.join(`
21
+ `)}case"compact_recover":{const{instance_id:y,focus:i=""}=N,n=await I(y),t=[`\u{1F501} **Compact Recovery Briefing**
22
22
  `];t.push(`> *Call this first after any context limit hit. Reconstructs where you left off.*
23
- `);const e=await n.get("cachly:crystal:latest");if(e){const s=A(e,null);if(s){t.push(`### \u{1F48E} Memory Crystal: ${s.label}`),t.push(`Compressed from ${s.session_count} sessions, ${s.lesson_count} lessons.`);const i=a?s.top_patterns.filter(r=>r.category.toLowerCase().includes(a.toLowerCase())||r.insight.toLowerCase().includes(a.toLowerCase())).slice(0,4):s.top_patterns.slice(0,4);for(const r of i)t.push(` \u2022 **${r.category}**: ${r.insight.slice(0,100)}`);t.push("")}}const l=await n.get("cachly:session:last");if(l){const s=A(l,null);s&&(t.push("### \u{1F550} Last Session"),s.focus&&t.push(`Focus: _${s.focus}_`),s.summary&&t.push(`Summary: ${s.summary.slice(0,300)}`),t.push(""))}const u=await n.get("cachly:session:handoff");if(u){const s=A(u,null);if(s){if(t.push("### \u{1F4CB} Handoff (from last window)"),s.context_summary&&t.push(`Context: ${s.context_summary.slice(0,200)}`),s.remaining_tasks?.length){t.push("Remaining tasks:");for(const i of s.remaining_tasks.slice(0,5))t.push(` \u2022 ${i}`)}s.instructions&&t.push(`\u26A0\uFE0F Instructions: ${s.instructions.slice(0,200)}`),s.blocked_on&&t.push(`\u{1F6A7} Blocked on: ${s.blocked_on}`),t.push("")}}const c=await n.get("cachly:ctx:wip-registry");if(c){const s=A(c,null);s?.content&&(t.push("### \u{1F527} WIP Registry"),t.push(s.content.slice(0,400)),t.push(""))}const o=[],d=n.scanStream({match:"cachly:roadmap:*",count:100});await new Promise((s,i)=>{d.on("data",r=>o.push(...r)),d.on("end",s),d.on("error",i)});const h=[];for(const s of o.slice(0,30)){const i=await n.get(s);if(i)try{const r=JSON.parse(i);(r.status==="in_progress"||r.status==="blocked")&&h.push({title:r.title??s,status:r.status,priority:r.priority})}catch{}}if(h.length>0){t.push("### \u{1F6A7} Open Items");for(const s of h.slice(0,5))t.push(` \u2022 [${s.status}] ${s.title}`);t.push("")}if(a){const s=[],i=n.scanStream({match:"cachly:lesson:best:*",count:200});await new Promise((f,m)=>{i.on("data",p=>s.push(...p)),i.on("end",f),i.on("error",m)});const r=[];for(const f of s){const m=await n.get(f);if(m)try{const p=JSON.parse(m);p.topic.toLowerCase().includes(a.toLowerCase())&&p.what_worked&&r.push({topic:p.topic,what_worked:p.what_worked})}catch{}}if(r.length>0){t.push(`### \u{1F4A1} Relevant Lessons for "${a}"`);for(const f of r.slice(0,4))t.push(` \u2022 **${f.topic}**: ${f.what_worked.slice(0,100)}`);t.push("")}}return t.length<=3&&t.push("_No brain data found. Start accumulating knowledge with `learn_from_attempts` and `session_start`._"),t.push("---","\u{1F9E0} Brain is ready. Continue your work \u2014 full context restored."),t.join(`
24
- `)}case"brain_from_git":{const y=Date.now(),{instance_id:a,repo_path:n=".",limit:t=100,branch:e="HEAD",since:l="",incremental:u=!0}=N,c=await I(a),{execSync:o}=await import("node:child_process"),{resolve:d}=await import("node:path"),h=d(n),s=Math.min(Number(t)||100,500);await ye();try{try{o("git rev-parse --git-dir",{cwd:h,stdio:"pipe"})}catch{return`\u274C Not a git repository: \`${h}\`. Pass \`repo_path\` pointing to a git checkout.`}const i=`cachly:brain_from_git:last_sha:${Buffer.from(h).toString("base64").slice(0,32)}`;let r="",f=!1;u!==!1&&!l&&(r=await c.get(i)??"",f=!!r);const m=l?`--since="${l}"`:"",w=(f?`${r}..HEAD`:"")||e,b=`git log ${w} ${m} --pretty=format:"COMMIT|||%H|||%s|||%ad|||%an" --date=short --no-merges --name-only -n ${s}`;let O="";try{O=o(b,{cwd:h,encoding:"utf-8",stdio:"pipe"})}catch(v){return`\u274C git log failed: ${v.message}. Check \`repo_path\` and \`branch\`.`}const C=[];let g=null;for(const v of O.split(`
25
- `)){const _=v.trim();if(_.startsWith("COMMIT|||")){g&&C.push(g);const[,L,B,F,U]=_.split("|||");g={sha:(L??"").trim(),subject:(B??"").trim(),date:(F??"").trim(),author:(U??"").trim(),files:[]}}else if(_&&g){const L=ue(_);L&&g.files.push(L)}}if(g&&C.push(g),C.length===0)return f?`\u2705 brain_from_git: Brain is up to date \u2014 no new commits since last run (last SHA: \`${r.slice(0,8)}\`).`:te({repoDir:h,revRange:w,processed:0,ingested:0,skipped:0,durationMs:Date.now()-y,isIncremental:!1,instanceId:a,categories:[],suggestedQueries:[],emptyReason:`No commits found in \`${h}\` on branch \`${e}\`${l?` since ${l}`:""}.`});const S=v=>{const _=v.toLowerCase();return/\b(fix|fixed|fixes|bug|hotfix|patch|revert|resolve|closes? #\d+)\b/.test(_)?{category:"fix",outcome:"success",severity:/\b(critical|crash|security|auth|data loss|outage|prod|production)\b/.test(_)?"critical":/\b(major|breaking|regression|hotfix)\b/.test(_)?"major":"minor"}:/\b(feat|feature|add|added|implement|new|introduce)\b/.test(_)?{category:"feat",outcome:"success",severity:"minor"}:/\b(refactor|clean|cleanup|improve|simplify|extract|rename)\b/.test(_)?{category:"refactor",outcome:"success",severity:"minor"}:/\b(perf|optimize|speed|cache|latency|memory|performance)\b/.test(_)?{category:"perf",outcome:"success",severity:"major"}:/\b(security|cve|auth|csrf|xss|sql|injection|sanitize|escape|encrypt)\b/.test(_)?{category:"security",outcome:"success",severity:"critical"}:/\b(deploy|ci|cd|build|docker|k8s|helm|infra|devops)\b/.test(_)?{category:"deploy",outcome:"success",severity:"major"}:/\b(test|spec|coverage|assert|mock|unit|integration)\b/.test(_)?{category:"test",outcome:"success",severity:"minor"}:{category:"chore",outcome:"success",severity:"minor"}},k=v=>v.toLowerCase().replace(/[^a-z0-9\s\-_]/g," ").split(/\s+/).filter(B=>B.length>3&&!["that","this","with","from","when","into","also","some","were"].includes(B)).slice(0,3).join("-")||"general",x=new Date().toISOString();let j=0,R=0;const D=new Map,P=new Map,z=[];let K=null;const q=C.length,oe=Math.max(1,Math.floor(q/10));let Y=0;process.stderr.write(`
23
+ `);const e=await n.get("cachly:crystal:latest");if(e){const s=A(e,null);if(s){t.push(`### \u{1F48E} Memory Crystal: ${s.label}`),t.push(`Compressed from ${s.session_count} sessions, ${s.lesson_count} lessons.`);const a=i?s.top_patterns.filter(r=>r.category.toLowerCase().includes(i.toLowerCase())||r.insight.toLowerCase().includes(i.toLowerCase())).slice(0,4):s.top_patterns.slice(0,4);for(const r of a)t.push(` \u2022 **${r.category}**: ${r.insight.slice(0,100)}`);t.push("")}}const l=await n.get("cachly:session:last");if(l){const s=A(l,null);s&&(t.push("### \u{1F550} Last Session"),s.focus&&t.push(`Focus: _${s.focus}_`),s.summary&&t.push(`Summary: ${s.summary.slice(0,300)}`),t.push(""))}const u=await n.get("cachly:session:handoff");if(u){const s=A(u,null);if(s){if(t.push("### \u{1F4CB} Handoff (from last window)"),s.context_summary&&t.push(`Context: ${s.context_summary.slice(0,200)}`),s.remaining_tasks?.length){t.push("Remaining tasks:");for(const a of s.remaining_tasks.slice(0,5))t.push(` \u2022 ${a}`)}s.instructions&&t.push(`\u26A0\uFE0F Instructions: ${s.instructions.slice(0,200)}`),s.blocked_on&&t.push(`\u{1F6A7} Blocked on: ${s.blocked_on}`),t.push("")}}const c=await n.get("cachly:ctx:wip-registry");if(c){const s=A(c,null);s?.content&&(t.push("### \u{1F527} WIP Registry"),t.push(s.content.slice(0,400)),t.push(""))}const o=[],d=n.scanStream({match:"cachly:roadmap:*",count:100});await new Promise((s,a)=>{d.on("data",r=>o.push(...r)),d.on("end",s),d.on("error",a)});const h=[];for(const s of o.slice(0,30)){const a=await n.get(s);if(a)try{const r=JSON.parse(a);(r.status==="in_progress"||r.status==="blocked")&&h.push({title:r.title??s,status:r.status,priority:r.priority})}catch{}}if(h.length>0){t.push("### \u{1F6A7} Open Items");for(const s of h.slice(0,5))t.push(` \u2022 [${s.status}] ${s.title}`);t.push("")}if(i){const s=[],a=n.scanStream({match:"cachly:lesson:best:*",count:200});await new Promise((f,m)=>{a.on("data",p=>s.push(...p)),a.on("end",f),a.on("error",m)});const r=[];for(const f of s){const m=await n.get(f);if(m)try{const p=JSON.parse(m);p.topic.toLowerCase().includes(i.toLowerCase())&&p.what_worked&&r.push({topic:p.topic,what_worked:p.what_worked})}catch{}}if(r.length>0){t.push(`### \u{1F4A1} Relevant Lessons for "${i}"`);for(const f of r.slice(0,4))t.push(` \u2022 **${f.topic}**: ${f.what_worked.slice(0,100)}`);t.push("")}}return t.length<=3&&t.push("_No brain data found. Start accumulating knowledge with `learn_from_attempts` and `session_start`._"),t.push("---","\u{1F9E0} Brain is ready. Continue your work \u2014 full context restored."),t.join(`
24
+ `)}case"brain_from_git":{const y=Date.now(),{instance_id:i,repo_path:n=".",limit:t=100,branch:e="HEAD",since:l="",incremental:u=!0}=N,c=await I(i),{execSync:o}=await import("node:child_process"),{resolve:d}=await import("node:path"),h=d(n),s=Math.min(Number(t)||100,500);await ye();try{try{o("git rev-parse --git-dir",{cwd:h,stdio:"pipe"})}catch{return`\u274C Not a git repository: \`${h}\`. Pass \`repo_path\` pointing to a git checkout.`}const a=`cachly:brain_from_git:last_sha:${Buffer.from(h).toString("base64").slice(0,32)}`;let r="",f=!1;u!==!1&&!l&&(r=await c.get(a)??"",f=!!r);const m=l?`--since="${l}"`:"",w=(f?`${r}..HEAD`:"")||e,b=`git log ${w} ${m} --pretty=format:"COMMIT|||%H|||%s|||%ad|||%an" --date=short --no-merges --name-only -n ${s}`;let O="";try{O=o(b,{cwd:h,encoding:"utf-8",stdio:"pipe"})}catch(v){return`\u274C git log failed: ${v.message}. Check \`repo_path\` and \`branch\`.`}const C=[];let g=null;for(const v of O.split(`
25
+ `)){const _=v.trim();if(_.startsWith("COMMIT|||")){g&&C.push(g);const[,L,B,F,U]=_.split("|||");g={sha:(L??"").trim(),subject:(B??"").trim(),date:(F??"").trim(),author:(U??"").trim(),files:[]}}else if(_&&g){const L=ue(_);L&&g.files.push(L)}}if(g&&C.push(g),C.length===0)return f?`\u2705 brain_from_git: Brain is up to date \u2014 no new commits since last run (last SHA: \`${r.slice(0,8)}\`).`:te({repoDir:h,revRange:w,processed:0,ingested:0,skipped:0,durationMs:Date.now()-y,isIncremental:!1,instanceId:i,categories:[],suggestedQueries:[],emptyReason:`No commits found in \`${h}\` on branch \`${e}\`${l?` since ${l}`:""}.`});const S=v=>{const _=v.toLowerCase();return/\b(fix|fixed|fixes|bug|hotfix|patch|revert|resolve|closes? #\d+)\b/.test(_)?{category:"fix",outcome:"success",severity:/\b(critical|crash|security|auth|data loss|outage|prod|production)\b/.test(_)?"critical":/\b(major|breaking|regression|hotfix)\b/.test(_)?"major":"minor"}:/\b(feat|feature|add|added|implement|new|introduce)\b/.test(_)?{category:"feat",outcome:"success",severity:"minor"}:/\b(refactor|clean|cleanup|improve|simplify|extract|rename)\b/.test(_)?{category:"refactor",outcome:"success",severity:"minor"}:/\b(perf|optimize|speed|cache|latency|memory|performance)\b/.test(_)?{category:"perf",outcome:"success",severity:"major"}:/\b(security|cve|auth|csrf|xss|sql|injection|sanitize|escape|encrypt)\b/.test(_)?{category:"security",outcome:"success",severity:"critical"}:/\b(deploy|ci|cd|build|docker|k8s|helm|infra|devops)\b/.test(_)?{category:"deploy",outcome:"success",severity:"major"}:/\b(test|spec|coverage|assert|mock|unit|integration)\b/.test(_)?{category:"test",outcome:"success",severity:"minor"}:{category:"chore",outcome:"success",severity:"minor"}},k=v=>v.toLowerCase().replace(/[^a-z0-9\s\-_]/g," ").split(/\s+/).filter(B=>B.length>3&&!["that","this","with","from","when","into","also","some","were"].includes(B)).slice(0,3).join("-")||"general",x=new Date().toISOString();let j=0,R=0;const D=new Map,P=new Map,z=[];let K=null;const q=C.length,oe=Math.max(1,Math.floor(q/10));let Y=0;process.stderr.write(`
26
26
  \u{1F9E0} brain_from_git: processing ${q} commits from ${h}...
27
27
  `);for(let v=0;v<C.length;v++){const _=C[v];if(v-Y>=oe&&(process.stderr.write(` \u23F3 Processing ${v}/${q} commits (${j} lessons so far)...
28
28
  `),Y=v),!_.subject){R++;continue}const{category:L,outcome:B,severity:F}=S(_.subject),U=k(_.subject),M=`${L}:${U}`;D.set(L,(D.get(L)??0)+1),P.set(F,(P.get(F)??0)+1),z.push(M),(!K||L==="fix"&&!K.topic.startsWith("fix:"))&&(K={topic:M,subject:_.subject});const Q=_.files.filter(H=>H.length>0).slice(0,12),X={topic:M,outcome:B,severity:F,what_worked:_.subject.slice(0,200),what_failed:"",context:`git:${_.sha.slice(0,8)} by ${_.author} on ${_.date}`,author:_.author||void 0,file_paths:Q,commands:[`git show ${_.sha.slice(0,8)}`],tags:["brain_from_git",L,"git-history"],visibility:"team",depends_on:[],recall_count:0,ts:x,verified_at:x,confidence:.55,audit_trail:[{ts:x,action:"brain_from_git",sha:_.sha.slice(0,8)}],version:3};await c.get(`cachly:lesson:best:${M}`)||(await c.set(`cachly:lesson:best:${M}`,JSON.stringify(X),"EX",90*86400),await c.rpush(`cachly:lessons:${M}`,JSON.stringify(X)),await c.ltrim(`cachly:lessons:${M}`,-100,-1),await c.expire(`cachly:lessons:${M}`,90*86400)),await c.rpush("cachly:lessons:brain_from_git:all",JSON.stringify({topic:M,sha:_.sha.slice(0,8),subject:_.subject.slice(0,60)})),await c.ltrim("cachly:lessons:brain_from_git:all",-500,-1),await c.expire("cachly:lessons:brain_from_git:all",90*86400);const Z=$(M);if(await J(c,Z,L,"git-derived"),_.author)try{const H=await ce(c,_.author,L);await T(c,H,"authored",Z,B==="success",B==="partial");for(const ne of Q.slice(0,8)){const ee=await re(c,ne);await T(c,H,"touched",ee,!0),await le(c,ee,H)}}catch{}j++}process.stderr.write(` \u2705 brain_from_git complete: ${j}/${q} commits ingested
29
29
 
30
- `),C.length>0&&C[0]?.sha&&await c.set(i,C[0].sha,"EX",2160*3600),pe={fixes:D.get("fix")??0,features:D.get("feat")??0,refactors:D.get("refactor")??0,total:j};let V=null;if(K&&j>0)try{const v=await he(c,["cachly:lesson:best:*"],K.subject,1);if(v.length>0){const _=A(v[0].content,{});V={query:K.subject.slice(0,80),topic:_.topic??v[0].key.replace("cachly:lesson:best:",""),snippet:(_.what_worked??"").slice(0,120)||K.subject.slice(0,120)}}}catch{}return te({repoDir:h,revRange:w,processed:C.length,ingested:j,skipped:R,durationMs:Date.now()-y,isIncremental:f,lastSha:r,instanceId:a,categories:[...D.entries()].sort((v,_)=>_[1]-v[1]),severities:[...P.entries()].sort((v,_)=>_[1]-v[1]),proof:V,suggestedQueries:me(z,a)})}finally{we()}}case"brain_from_ci":{const{instance_id:y,outcomes:a}=N,n=await I(y),t=Date.now();let e=0,l=0,u=0;const c=a.length;for(const o of a){const d=String(o.status??""),h=String(o.prev_status??""),s=String(o.job??"unknown"),i=String(o.context??""),r=["failure","red","error"].includes(h)&&["success","green","passed"].includes(d),f=["success","green","passed"].includes(h)&&["failure","red","error"].includes(d),m=`ci:${$(s)}`,p=$(m);if(await J(n,p,"ci","job"),r){const b=$(`problem:${$(s)}`);await J(n,b,"problem","ci-failure"),await T(n,p,"fixes",b,!0);const O={topic:m,outcome:"success",what_worked:`CI job "${s}" went ${h} \u2192 ${d}`,what_failed:`Job "${s}" was failing`,context:`brain_from_ci: ${i}`,severity:"major",file_paths:[],commands:[],tags:["brain_from_ci","ci"],depends_on:[],recall_count:0,ts:t,verified_at:t,confidence:.65,audit_trail:[{ts:t,action:"brain_from_ci_fixed"}],version:3};await n.rpush(`cachly:lessons:${m}`,JSON.stringify(O)),await n.ltrim(`cachly:lessons:${m}`,-100,-1),await n.set(`cachly:lesson:best:${m}`,JSON.stringify(O)),e++}else if(f){const b=$(`cause:${$(s)}`);await J(n,b,"cause","ci-break"),await T(n,p,"causes",b,!1),l++}else u++;const w=`cachly:cls:${y}`;await n.rpush(w,JSON.stringify({source:"ci_outcome",payload:{status:d,prev_status:h,job:s},ts:t})),await n.ltrim(w,-200,-1)}return ge={fixes:e,breaks:l,stable:u,total:c},[`\u{1F4E5} **brain_from_ci**: Ingested ${c} outcomes \u2014 ${e} fixes learned, ${l} breaks noted, ${u} stable`,"",e>0?`\u2705 ${e} fix lesson${e!==1?"s":""} written (confidence 0.65) \u2014 CKG \`fixes\` edges added`:"",l>0?`\u{1F534} ${l} break${l!==1?"s":""} noted \u2014 CKG \`causes\` edges added`:"",u>0?`\u{1F4CA} ${u} stable outcome${u!==1?"s":""} recorded`:"","",'\u{1F4A1} Explore: `brain_search(query="ci")` | `brain_predict(context="<job-name>")`'].filter(Boolean).join(`
31
- `)}case"brain_predict_failures":{const{instance_id:y,context:a,top_k:n=5,format:t="detailed"}=N,e=await I(y),l=a.toLowerCase().replace(/[^a-z0-9\s\-_:.]/g," ").split(/\s+/).filter(r=>r.length>2),u=[];for(const r of l.slice(0,8)){const f=[],m=e.scanStream({match:`cachly:ckg:node:*${r}*`,count:50});await new Promise((p,w)=>{m.on("data",b=>f.push(...b)),m.on("end",p),m.on("error",w)});for(const p of f.slice(0,5)){const w=await e.get(p);if(!w)continue;const b=A(w,null);if(!b)continue;const O=await e.smembers(`cachly:ckg:idx:from:${b.id}`);for(const C of O.slice(0,20)){const g=await e.get(C);if(!g)continue;const S=A(g,null);if(!S||S.edgeType!=="causes"&&S.edgeType!=="degrades_under")continue;const k=await e.smembers(`cachly:ckg:idx:from:${S.to}`);let x;for(const j of k.slice(0,10)){const R=await e.get(j);if(!R)continue;const D=A(R,null);if(D&&D.edgeType==="fixes"){const P=await e.get(`cachly:lesson:best:${D.from}`);if(P){x=A(P,null)?.what_worked?.slice(0,120);break}}}u.push({concept:b.id,failure:S.to.replace(/-/g," "),probability:S.confidence,fix:x,source:"ckg"})}}}const c=[],o=e.scanStream({match:"cachly:lesson:best:*",count:300});await new Promise((r,f)=>{o.on("data",m=>c.push(...m)),o.on("end",r),o.on("error",f)});for(const r of c.slice(0,100)){const f=await e.get(r);if(f)try{const m=JSON.parse(f);if(m.outcome!=="failure"&&m.outcome!=="partial"||!m.what_failed)continue;const p=`${m.topic} ${m.what_failed}`.toLowerCase(),w=l.filter(O=>p.includes(O)).length/Math.max(1,l.length);if(w<.15)continue;const b=m.severity==="critical"?.15:m.severity==="major"?.05:0;u.push({concept:m.topic,failure:m.what_failed.slice(0,80),probability:Math.min(.97,(m.confidence??.5)*w*1.5+b),fix:m.what_worked?.slice(0,120),topic:m.topic,source:"lesson"})}catch{}}if(u.length===0)return[`\u{1F52E} **Failure Prediction: "${a}"**`,"","No known failure patterns found for this context.",'\u{1F4A1} The brain learns from every `learn_from_attempts(outcome="failure")` call.',`\u{1F50D} Try: \`brain_predict(context="${a}")\` for broader predictions.`].join(`
32
- `);const d=new Set,h=u.filter(r=>{const f=r.failure.slice(0,40);return d.has(f)?!1:(d.add(f),!0)}).sort((r,f)=>f.probability-r.probability).slice(0,Number(n)),s=[`\u{1F52E} **Failure Prediction for: "${a}"**
30
+ `),C.length>0&&C[0]?.sha&&await c.set(a,C[0].sha,"EX",2160*3600),pe={fixes:D.get("fix")??0,features:D.get("feat")??0,refactors:D.get("refactor")??0,total:j};let V=null;if(K&&j>0)try{const v=await he(c,["cachly:lesson:best:*"],K.subject,1);if(v.length>0){const _=A(v[0].content,{});V={query:K.subject.slice(0,80),topic:_.topic??v[0].key.replace("cachly:lesson:best:",""),snippet:(_.what_worked??"").slice(0,120)||K.subject.slice(0,120)}}}catch{}return te({repoDir:h,revRange:w,processed:C.length,ingested:j,skipped:R,durationMs:Date.now()-y,isIncremental:f,lastSha:r,instanceId:i,categories:[...D.entries()].sort((v,_)=>_[1]-v[1]),severities:[...P.entries()].sort((v,_)=>_[1]-v[1]),proof:V,suggestedQueries:me(z,i)})}finally{we()}}case"brain_from_ci":{const{instance_id:y,outcomes:i}=N,n=await I(y),t=Date.now();let e=0,l=0,u=0;const c=i.length;for(const o of i){const d=String(o.status??""),h=String(o.prev_status??""),s=String(o.job??"unknown"),a=String(o.context??""),r=["failure","red","error"].includes(h)&&["success","green","passed"].includes(d),f=["success","green","passed"].includes(h)&&["failure","red","error"].includes(d),m=`ci:${$(s)}`,p=$(m);if(await J(n,p,"ci","job"),r){const b=$(`problem:${$(s)}`);await J(n,b,"problem","ci-failure"),await T(n,p,"fixes",b,!0);const O={topic:m,outcome:"success",what_worked:`CI job "${s}" went ${h} \u2192 ${d}`,what_failed:`Job "${s}" was failing`,context:`brain_from_ci: ${a}`,severity:"major",file_paths:[],commands:[],tags:["brain_from_ci","ci"],depends_on:[],recall_count:0,ts:t,verified_at:t,confidence:.65,audit_trail:[{ts:t,action:"brain_from_ci_fixed"}],version:3};await n.rpush(`cachly:lessons:${m}`,JSON.stringify(O)),await n.ltrim(`cachly:lessons:${m}`,-100,-1),await n.set(`cachly:lesson:best:${m}`,JSON.stringify(O)),e++}else if(f){const b=$(`cause:${$(s)}`);await J(n,b,"cause","ci-break"),await T(n,p,"causes",b,!1),l++}else u++;const w=`cachly:cls:${y}`;await n.rpush(w,JSON.stringify({source:"ci_outcome",payload:{status:d,prev_status:h,job:s},ts:t})),await n.ltrim(w,-200,-1)}return ge={fixes:e,breaks:l,stable:u,total:c},[`\u{1F4E5} **brain_from_ci**: Ingested ${c} outcomes \u2014 ${e} fixes learned, ${l} breaks noted, ${u} stable`,"",e>0?`\u2705 ${e} fix lesson${e!==1?"s":""} written (confidence 0.65) \u2014 CKG \`fixes\` edges added`:"",l>0?`\u{1F534} ${l} break${l!==1?"s":""} noted \u2014 CKG \`causes\` edges added`:"",u>0?`\u{1F4CA} ${u} stable outcome${u!==1?"s":""} recorded`:"","",'\u{1F4A1} Explore: `brain_search(query="ci")` | `brain_predict(context="<job-name>")`'].filter(Boolean).join(`
31
+ `)}case"brain_predict_failures":{const{instance_id:y,context:i,top_k:n=5,format:t="detailed"}=N,e=await I(y),l=i.toLowerCase().replace(/[^a-z0-9\s\-_:.]/g," ").split(/\s+/).filter(r=>r.length>2),u=[];for(const r of l.slice(0,8)){const f=[],m=e.scanStream({match:`cachly:ckg:node:*${r}*`,count:50});await new Promise((p,w)=>{m.on("data",b=>f.push(...b)),m.on("end",p),m.on("error",w)});for(const p of f.slice(0,5)){const w=await e.get(p);if(!w)continue;const b=A(w,null);if(!b)continue;const O=await e.smembers(`cachly:ckg:idx:from:${b.id}`);for(const C of O.slice(0,20)){const g=await e.get(C);if(!g)continue;const S=A(g,null);if(!S||S.edgeType!=="causes"&&S.edgeType!=="degrades_under")continue;const k=await e.smembers(`cachly:ckg:idx:from:${S.to}`);let x;for(const j of k.slice(0,10)){const R=await e.get(j);if(!R)continue;const D=A(R,null);if(D&&D.edgeType==="fixes"){const P=await e.get(`cachly:lesson:best:${D.from}`);if(P){x=A(P,null)?.what_worked?.slice(0,120);break}}}u.push({concept:b.id,failure:S.to.replace(/-/g," "),probability:S.confidence,fix:x,source:"ckg"})}}}const c=[],o=e.scanStream({match:"cachly:lesson:best:*",count:300});await new Promise((r,f)=>{o.on("data",m=>c.push(...m)),o.on("end",r),o.on("error",f)});for(const r of c.slice(0,100)){const f=await e.get(r);if(f)try{const m=JSON.parse(f);if(m.outcome!=="failure"&&m.outcome!=="partial"||!m.what_failed)continue;const p=`${m.topic} ${m.what_failed}`.toLowerCase(),w=l.filter(O=>p.includes(O)).length/Math.max(1,l.length);if(w<.15)continue;const b=m.severity==="critical"?.15:m.severity==="major"?.05:0;u.push({concept:m.topic,failure:m.what_failed.slice(0,80),probability:Math.min(.97,(m.confidence??.5)*w*1.5+b),fix:m.what_worked?.slice(0,120),topic:m.topic,source:"lesson"})}catch{}}if(u.length===0)return[`\u{1F52E} **Failure Prediction: "${i}"**`,"","No known failure patterns found for this context.",'\u{1F4A1} The brain learns from every `learn_from_attempts(outcome="failure")` call.',`\u{1F50D} Try: \`brain_predict(context="${i}")\` for broader predictions.`].join(`
32
+ `);const d=new Set,h=u.filter(r=>{const f=r.failure.slice(0,40);return d.has(f)?!1:(d.add(f),!0)}).sort((r,f)=>f.probability-r.probability).slice(0,Number(n)),s=[`\u{1F52E} **Failure Prediction for: "${i}"**
33
33
  `];s.push(`> Pre-deploy failure analysis based on ${u.length} patterns. Ranked by probability.
34
- `);for(let r=0;r<h.length;r++){const f=h[r],m=Math.round(f.probability*100),p="\u2588".repeat(Math.round(m/10))+"\u2591".repeat(10-Math.round(m/10)),w=m>=70?"\u{1F534}":m>=40?"\u{1F7E1}":"\u{1F7E2}";s.push(`${w} **${r+1}. ${f.failure}**`),s.push(` Probability: ${p} **${m}%** (${f.source==="ckg"?"CKG causal edge":"lesson history"})`),t==="detailed"&&f.fix&&s.push(` \u2705 Pre-loaded fix: _${f.fix}_`),t==="detailed"&&f.topic&&s.push(` \u{1F4DA} Lesson: \`${f.topic}\``),s.push("")}const i=h.filter(r=>r.probability>=.6);return i.length>0?s.push(`\u26A0\uFE0F **${i.length} high-risk failure${i.length>1?"s":""} detected** (\u226560% probability). Review fixes before proceeding.`):s.push("\u2705 No high-risk failures detected. Proceed with caution and monitor closely."),s.push("",'\u{1F4A1} After deploy: `learn_from_attempts(topic="deploy:...", outcome="success|failure")` to improve future predictions.'),s.join(`
35
- `)}case"brain_contribute_signal":{const{instance_id:y,topic_category:a,outcome:n,confidence:t=.5}=N;if(!a?.trim())throw new Error("topic_category is required");if(!["success","failure","partial"].includes(n))throw new Error("outcome must be success, failure, or partial");const e=t>=.75?"high":t>=.5?"medium":"low";let l="\u{1F4E6} Signal stored locally (commons API unavailable)";try{await G("/api/v1/federation/signals",{method:"POST",body:JSON.stringify({topic_category:a.trim().toLowerCase(),outcome:n,confidence:t})}),l="\u2705 Signal contributed to the global commons (no raw data shared)"}catch{const u=await I(y),c=`cachly:fed:outbox:${Date.now()}`;await u.set(c,JSON.stringify({topic_category:a,outcome:n,bucket:e,ts:new Date().toISOString()}),"EX",3600*24*7).catch(()=>{})}return[`\u{1F512} **Brain Contribute Signal: \`${a}\`**`,"",`\u{1F4CA} Outcome: **${n}** \xB7 Confidence bucket: **${e}**`,"\u{1F6E1}\uFE0F Privacy: topic category only \u2014 no lesson text, no org identity","",l,"","\u{1F4A1} When \u2265 k orgs contribute the same pattern, a meta-lesson appears in `brain_import_meta`."].join(`
36
- `)}case"brain_import_meta":{const{instance_id:y,category:a,limit:n=20}=N;let t=[],e=3;try{const o=new URLSearchParams;a&&o.set("category",a),o.set("limit",String(Math.min(n,200)));const d=await G(`/api/v1/federation/meta?${o.toString()}`);t=d.meta_lessons??[],e=d.k_threshold??3}catch{return"\u274C Could not reach the global commons API. Try again later."}if(t.length===0)return["\u{1F310} **Brain Import Meta-Lessons**","",`No meta-lessons available yet (k-threshold: ${e} signals required).`,"","\u{1F4A1} Contribute signals with `brain_contribute_signal` to help build the commons."].join(`
34
+ `);for(let r=0;r<h.length;r++){const f=h[r],m=Math.round(f.probability*100),p="\u2588".repeat(Math.round(m/10))+"\u2591".repeat(10-Math.round(m/10)),w=m>=70?"\u{1F534}":m>=40?"\u{1F7E1}":"\u{1F7E2}";s.push(`${w} **${r+1}. ${f.failure}**`),s.push(` Probability: ${p} **${m}%** (${f.source==="ckg"?"CKG causal edge":"lesson history"})`),t==="detailed"&&f.fix&&s.push(` \u2705 Pre-loaded fix: _${f.fix}_`),t==="detailed"&&f.topic&&s.push(` \u{1F4DA} Lesson: \`${f.topic}\``),s.push("")}const a=h.filter(r=>r.probability>=.6);return a.length>0?s.push(`\u26A0\uFE0F **${a.length} high-risk failure${a.length>1?"s":""} detected** (\u226560% probability). Review fixes before proceeding.`):s.push("\u2705 No high-risk failures detected. Proceed with caution and monitor closely."),s.push("",'\u{1F4A1} After deploy: `learn_from_attempts(topic="deploy:...", outcome="success|failure")` to improve future predictions.'),s.join(`
35
+ `)}case"brain_contribute_signal":{const{instance_id:y,topic_category:i,outcome:n,confidence:t=.5}=N;if(!i?.trim())throw new Error("topic_category is required");if(!["success","failure","partial"].includes(n))throw new Error("outcome must be success, failure, or partial");const e=t>=.75?"high":t>=.5?"medium":"low";let l="\u{1F4E6} Signal stored locally (commons API unavailable)";try{await G("/api/v1/federation/signals",{method:"POST",body:JSON.stringify({topic_category:i.trim().toLowerCase(),outcome:n,confidence:t})}),l="\u2705 Signal contributed to the global commons (no raw data shared)"}catch{const u=await I(y),c=`cachly:fed:outbox:${Date.now()}`;await u.set(c,JSON.stringify({topic_category:i,outcome:n,bucket:e,ts:new Date().toISOString()}),"EX",3600*24*7).catch(()=>{})}return[`\u{1F512} **Brain Contribute Signal: \`${i}\`**`,"",`\u{1F4CA} Outcome: **${n}** \xB7 Confidence bucket: **${e}**`,"\u{1F6E1}\uFE0F Privacy: topic category only \u2014 no lesson text, no org identity","",l,"","\u{1F4A1} When \u2265 k orgs contribute the same pattern, a meta-lesson appears in `brain_import_meta`."].join(`
36
+ `)}case"brain_import_meta":{const{instance_id:y,category:i,limit:n=20}=N;let t=[],e=3;try{const o=new URLSearchParams;i&&o.set("category",i),o.set("limit",String(Math.min(n,200)));const d=await G(`/api/v1/federation/meta?${o.toString()}`);t=d.meta_lessons??[],e=d.k_threshold??3}catch{return"\u274C Could not reach the global commons API. Try again later."}if(t.length===0)return["\u{1F310} **Brain Import Meta-Lessons**","",`No meta-lessons available yet (k-threshold: ${e} signals required).`,"","\u{1F4A1} Contribute signals with `brain_contribute_signal` to help build the commons."].join(`
37
37
  `);const l=await I(y);let u=0;for(const o of t){const d=`cachly:lesson:best:meta:${o.topic_category}`;await l.get(d)||(await l.set(d,JSON.stringify({topic:`meta:${o.topic_category}`,outcome:o.dominant_outcome,what_worked:o.contributor_count!=null?`Meta-pattern from ${o.contributor_count} independent orgs`:`Meta-pattern from ${o.signal_count} signals`,what_failed:"",recall_count:0,ts:o.derived_at,state:"meta",avg_confidence:o.avg_confidence,signal_count:o.signal_count,audit_trail:[{ts:new Date().toISOString(),action:"imported_meta"}]})),u++)}const c=[`\u{1F310} **Brain Import Meta-Lessons** (k \u2265 ${e})`,"","| Topic Category | Outcome | Confidence | Signals |","|---|---|---|---|"];for(const o of t.slice(0,15)){const d=(o.avg_confidence*100).toFixed(0)+"%";c.push(`| \`${o.topic_category}\` | ${o.dominant_outcome} | ${d} | ${o.signal_count} |`)}return t.length>15&&c.push(`| _\u2026${t.length-15} more_ | | | |`),c.push("",`\u2705 **${u}** new meta-lessons imported into local Brain.`),u<t.length&&c.push(`_(${t.length-u} already present \u2014 not overwritten)_`),c.join(`
38
- `)}case"brain_watch":{const{instance_id:y="",project_dir:a=".",api_key:n}=N,{resolve:t}=await import("node:path"),e=t(a),{result:l,hookPath:u}=await fe(e,y,n);return l==="skipped-no-git"?["\u26A0\uFE0F **brain_watch: no git repository found**","",`No \`.git\` directory in \`${e}\`.`,"Pass `project_dir` pointing to a git checkout."].join(`
38
+ `)}case"brain_watch":{const{instance_id:y="",project_dir:i=".",api_key:n}=N,{resolve:t}=await import("node:path"),e=t(i),{result:l,hookPath:u}=await fe(e,y,n);return l==="skipped-no-git"?["\u26A0\uFE0F **brain_watch: no git repository found**","",`No \`.git\` directory in \`${e}\`.`,"Pass `project_dir` pointing to a git checkout."].join(`
39
39
  `):[`\u{1F9E0} **brain_watch ${{written:"\u2705 Hook installed (new)",upgraded:"\u{1F504} Hook upgraded to latest version",appended:"\u{1F4CE} Hook appended to existing post-commit script",unchanged:"\u2713 Hook already up to date \u2014 nothing changed"}[l]??l}**`,"",`Hook path: \`${u}\``,`Instance: \`${y||"(none \u2014 set CACHLY_BRAIN_INSTANCE_ID or pass instance_id)"}\``,"","Every future commit will automatically teach your Brain.","No manual `brain_from_git` needed \u2014 the hook runs silently in the background.","",'\u{1F4A1} Verify: `git commit --allow-empty -m "test brain_watch"` then `smart_recall(query="test")`'].join(`
40
40
  `)}default:return null}}export{Oe as FEDBRAIN_TOOL_NAMES,ge as _lastBrainFromCiCounts,pe as _lastBrainFromGitCounts,Ne as handleFedbrainTool};
@@ -1,2 +1,2 @@
1
- const s=["session_start","session_end","smart_recall","recall_best_solution","learn_from_attempts","remember_context","recall_context","forget_context","list_remembered","causal_trace","brain_predict","semantic_search","brain_search","autopilot","brain_doctor","brain_from_git","index_project","team_recall","team_learn","cache_get","cache_set","roadmap_add","roadmap_list","roadmap_next","roadmap_update","session_handoff"],u="cachly_tool";function l(e){return["Run any of cachly's specialist tools by name.","","The most-used tools are listed separately above. This one reaches the",`other ${e.length} without their schemas taking up room in every request.`,"","Unsure about a tool's arguments? Call it with describe:true first \u2014 that","returns its input schema instead of running it.","",`Available: ${e.join(", ")}`].join(`
2
- `)}function m(e){return{name:u,description:l(e),inputSchema:{type:"object",properties:{tool:{type:"string",description:'Name of the tool to run, e.g. "team_roster".'},arguments:{type:"object",description:"Arguments for that tool. Use describe:true if unsure."},describe:{type:"boolean",description:"Return the tool's input schema instead of running it."}},required:["tool"]}}}function p(e,i=process.env){const c=new Set(e.map(t=>t.name)),n=s.filter(t=>!c.has(t));if(i.CACHLY_ALLE_WERKZEUGE==="1")return{katalog:[...e],uebrige:[],unbekannteKernnamen:n};const o=new Set(s),a=e.filter(t=>o.has(t.name)),r=e.filter(t=>!o.has(t.name)).map(t=>t.name);return r.length>0&&a.push(m(r)),{katalog:a,uebrige:r,unbekannteKernnamen:n}}export{s as KERNWERKZEUGE,u as VERTEILER,p as sichtbareWerkzeuge,l as verteilerBeschreibung,m as verteilerWerkzeug};
1
+ const i=["session_start","session_end","smart_recall","recall_best_solution","learn_from_attempts","remember_context","recall_context","forget_context","list_remembered","causal_trace","brain_predict","semantic_search","brain_search","autopilot","brain_doctor","brain_from_git","index_project","team_recall","team_learn","cache_get","cache_set","roadmap_add","roadmap_list","roadmap_next","roadmap_update","session_handoff"],_=["session_start","session_end","smart_recall","recall_best_solution","learn_from_attempts","remember_context","causal_trace","brain_doctor"],u="cachly_tool";function m(e){return["Run any of cachly's specialist tools by name.","","The most-used tools are listed separately above. This one reaches the",`other ${e.length} without their schemas taking up room in every request.`,"","Unsure about a tool's arguments? Call it with describe:true first \u2014 that","returns its input schema instead of running it.","",`Available: ${e.join(", ")}`].join(`
2
+ `)}function p(e){return{name:u,description:m(e),inputSchema:{type:"object",properties:{tool:{type:"string",description:'Name of the tool to run, e.g. "team_roster".'},arguments:{type:"object",description:"Arguments for that tool. Use describe:true if unsure."},describe:{type:"boolean",description:"Return the tool's input schema instead of running it."}},required:["tool"]}}}function h(e,n=process.env){const c=new Set(e.map(t=>t.name)),o=i.filter(t=>!c.has(t));if(n.CACHLY_ALLE_WERKZEUGE==="1")return{katalog:[...e],uebrige:[],unbekannteKernnamen:o};const l=n.CACHLY_PROFILE==="lean"?_:i,a=new Set(l),s=e.filter(t=>a.has(t.name)),r=e.filter(t=>!a.has(t.name)).map(t=>t.name);return r.length>0&&s.push(p(r)),{katalog:s,uebrige:r,unbekannteKernnamen:o}}export{i as KERNWERKZEUGE,_ as SCHLANK_WERKZEUGE,u as VERTEILER,h as sichtbareWerkzeuge,m as verteilerBeschreibung,p as verteilerWerkzeug};
package/glama.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://glama.ai/mcp/schemas/server.json",
3
- "version": "0.10.151",
3
+ "version": "0.10.152",
4
4
  "maintainers": [
5
5
  "HeinrichNebula"
6
6
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cachly-dev/mcp-server",
3
- "version": "0.10.151",
3
+ "version": "0.10.152",
4
4
  "mcpName": "io.github.cachly-dev/mcp-server",
5
5
  "description": "Your AI forgets everything between sessions. cachly fixes that permanently: 123 MCP tools for Claude Code, Cursor, Copilot & Windsurf. Learns from every bug fix, commit and CI run. Arrives pre-briefed. Free tier forever, EU servers, GDPR.",
6
6
  "type": "module",
package/server.json CHANGED
@@ -6,13 +6,13 @@
6
6
  "url": "https://github.com/cachly-dev/cachly-mcp",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.10.151",
9
+ "version": "0.10.152",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "name": "@cachly-dev/mcp-server",
14
14
  "identifier": "@cachly-dev/mcp-server",
15
- "version": "0.10.151",
15
+ "version": "0.10.152",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }