@cachly-dev/mcp-server 0.10.206 → 0.10.208

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,16 +1,16 @@
1
- import{existsSync as R,lstatSync as x,readFileSync as Q,readdirSync as j,rmSync as C,rmdirSync as Z,writeFileSync as ee}from"node:fs";import{basename as b,dirname as T,isAbsolute as I,join as g,relative as H,resolve as k,sep as S}from"node:path";import{ANWEISUNGS_DATEIEN as te,CLAUDE_MD_MARKER_END as D,CLAUDE_MD_MARKER_START as N,EDITOR_FILES as ne,blockMuster as re}from"./projektdateien.js";import{PROJEKT_HOOK_MARKE as z,istCachlyEintrag as P}from"./hook-zugang.js";import{CLS_BLOCK_RE as oe}from"./cls-hook.js";import{BRAIN_WATCH_BLOCK_RE as se}from"./brain-watch-hook.js";import{CLAUDE_HOOK_DIR as ie,CLAUDE_SETTINGS_DATEI as ae,CODEX_HOOKS_DATEI as ce,CODEX_HOOK_DIR as le,COPILOT_HOOKS_DATEI as he,COPILOT_HOOK_DIR as ue,CURSOR_HOOKS_DATEI as fe,CURSOR_HOOK_DIR as de,GEMINI_HOOK_DIR as pe,GEMINI_SETTINGS_DATEI as O}from"./ambient-hooks.js";import{CURSOR_ABLAGE_ORDNER as me}from"./cursor-hook.js";import{COPILOT_ABLAGE_ORDNER as ge}from"./copilot-hook.js";import{credentialsPath as B}from"./credentials.js";import{defaultLedgerPath as L,readLedger as ye}from"./ambient-ledger.js";import{defaultMilestonePath as ke}from"./funnel-milestones.js";import{defaultKostprobePath as be}from"./kostprobe.js";import{standPfad as ve}from"./neue-fassung.js";import{AUFTRAG as je,FEHLSCHLAG as we,SPERRE as _e}from"./konto-anlegen.js";import{netBalance as Ee}from"./ambient-recall.js";import{istTestSchluessel as Se}from"./uebernahme.js";const Oe='broken Stop hook from setup_ai_memory ("checkpoint" is not a command)',M="Your lessons stay in your cachly account. uninstall never deletes cloud data. To erase your account and everything in it (GDPR Art. 17), write to privacy@cachly.dev (https://cachly.dev/legal/datenschutz).",$e=[B({home:""}),L(),ke(),be(),ve(""),_e,we,je].map(t=>b(t));function Ae(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}const Re=new RegExp(`^(?:${$e.map(Ae).join("|")})(?:\\.[\\w.-]*(?:tmp|genommen))?$`),xe=/^cachly-(?:ambient|leser-sicherung|lernen-arme|projektversionen|startwissen-import)-[\w.-]+\.(?:json|jsonl|lock|tmp)$/,Ce=["cachly-lernen",b(me),b(ge)];function Te(t,e){return e?Ce.includes(t):xe.test(t)}function p(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function $(t){try{const e=JSON.parse(t);return p(e)?e:null}catch{return null}}function K(t,e){const n=/^([ \t]+)"/m.exec(e)?.[1]??2,r=e.includes(`\r
1
+ import{existsSync as A,lstatSync as R,readFileSync as Z,readdirSync as v,rmSync as x,rmdirSync as ee,writeFileSync as te}from"node:fs";import{basename as b,dirname as C,isAbsolute as T,join as g,relative as I,resolve as k,sep as S}from"node:path";import{ANWEISUNGS_DATEIEN as ne,CLAUDE_MD_MARKER_END as H,CLAUDE_MD_MARKER_START as D,EDITOR_FILES as re,blockMuster as oe}from"./projektdateien.js";import{PROJEKT_HOOK_MARKE as $,istCachlyEintrag as N}from"./hook-zugang.js";import{CLS_BLOCK_RE as se}from"./cls-hook.js";import{BRAIN_WATCH_BLOCK_RE as ie}from"./brain-watch-hook.js";import{CLAUDE_HOOK_DIR as ae,CLAUDE_SETTINGS_DATEI as ce,CODEX_HOOKS_DATEI as le,CODEX_HOOK_DIR as he,COPILOT_HOOKS_DATEI as ue,COPILOT_HOOK_DIR as fe,CURSOR_HOOKS_DATEI as de,CURSOR_HOOK_DIR as pe,GEMINI_HOOK_DIR as me,GEMINI_SETTINGS_DATEI as z}from"./ambient-hooks.js";import{CURSOR_ABLAGE_ORDNER as ge}from"./cursor-hook.js";import{CODEX_CONFIG_DATEI as ye,ohneCodexMcpEintrag as ke}from"./editor-mcp-eintrag.js";import{COPILOT_ABLAGE_ORDNER as be}from"./copilot-hook.js";import{credentialsPath as P}from"./credentials.js";import{defaultLedgerPath as M,readLedger as ve}from"./ambient-ledger.js";import{defaultMilestonePath as je}from"./funnel-milestones.js";import{defaultKostprobePath as we}from"./kostprobe.js";import{standPfad as _e}from"./neue-fassung.js";import{AUFTRAG as Ee,FEHLSCHLAG as Oe,SPERRE as Se}from"./konto-anlegen.js";import{netBalance as $e}from"./ambient-recall.js";import{istTestSchluessel as Ae}from"./uebernahme.js";const Re='broken Stop hook from setup_ai_memory ("checkpoint" is not a command)',B="Your lessons stay in your cachly account. uninstall never deletes cloud data. To erase your account and everything in it (GDPR Art. 17), write to privacy@cachly.dev (https://cachly.dev/legal/datenschutz).",xe=[P({home:""}),M(),je(),we(),_e(""),Se,Oe,Ee].map(t=>b(t));function Ce(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}const Te=new RegExp(`^(?:${xe.map(Ce).join("|")})(?:\\.[\\w.-]*(?:tmp|genommen))?$`),Ie=/^cachly-(?:ambient|leser-sicherung|lernen-arme|projektversionen|startwissen-import)-[\w.-]+\.(?:json|jsonl|lock|tmp)$/,He=["cachly-lernen",b(ge),b(be)];function De(t,e){return e?He.includes(t):Ie.test(t)}function p(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function L(t){try{const e=JSON.parse(t);return p(e)?e:null}catch{return null}}function K(t,e){const n=/^([ \t]+)"/m.exec(e)?.[1]??2,r=e.includes(`\r
2
2
  `);let o=JSON.stringify(t,null,n);return r&&(o=o.replace(/\n/g,`\r
3
3
  `)),/\n$/.test(e)?o+(r?`\r
4
4
  `:`
5
- `):o}function y(t){try{return x(t).isFile()?Q(t,"utf8"):null}catch{return null}}function F(t){try{return x(t).isDirectory()}catch{return!1}}function Ie(t){if(!p(t))return"";const n=(p(t.env)?t.env:p(t.command)&&p(t.command.env)?t.command.env:null)?.CACHLY_BRAIN_INSTANCE_ID;return typeof n=="string"?n:""}function w(t,e,n){const r=t[e];return!p(r)||!("cachly"in r)?!1:(n.push(r.cachly),delete r.cachly,Object.keys(r).length===0&&delete t[e],!0)}function U(t){return p(t)?p(t.env)&&("CACHLY_JWT"in t.env||"CACHLY_BRAIN_INSTANCE_ID"in t.env)?!0:JSON.stringify(t).includes("@cachly-dev/mcp-server"):!1}function A(t,e){const n=$(t);if(!n)return{art:"unlesbar"};const r=[],o=[];if(e==="mcpServers"&&w(n,"mcpServers",r)&&o.push("mcpServers.cachly"),e==="vscode"&&(w(n,"servers",r)&&o.push("servers.cachly"),w(n,"mcpServers",r)&&o.push("mcpServers.cachly")),e==="zed"&&w(n,"context_servers",r)&&o.push("context_servers.cachly"),e==="continue"){const c=n.experimental,a=p(c)?c.modelContextProtocolServers:void 0;if(p(c)&&Array.isArray(a)){const s=a.filter(l=>!U(l));s.length<a.length&&(r.push(...a.filter(U)),o.push(`experimental.modelContextProtocolServers (${a.length-s.length})`),s.length===0?delete c.modelContextProtocolServers:c.modelContextProtocolServers=s,Object.keys(c).length===0&&delete n.experimental)}}if(o.length===0)return{art:"nichts"};const i=r.map(Ie).find(Boolean)??"";return{art:"geaendert",nachher:Object.keys(n).length===0?null:K(n,t),entfernt:o,instanz:i}}function He(t){if(P(t))return"ambient";const e=String(t?.command??"");return e.includes("@cachly-dev/mcp-server")&&e.includes(" checkpoint")?"checkpoint":null}function _(t){return P(t)?"ambient":null}function De(t,e,n=[]){const r=$(t);if(!r)return{art:"unlesbar"};const o=r.hooks;if(!p(o))return{art:"nichts"};const i=[];for(const[a,s]of Object.entries(o)){if(!Array.isArray(s))continue;const l=i.length,h=[];for(const u of s){const d=p(u)&&Array.isArray(u.hooks)?u.hooks:null;if(!d){const f=e(u);f?i.push(f):h.push(u);continue}const m=d.filter(f=>{const E=e(f);return E&&i.push(E),!E});m.length===d.length?h.push(u):m.length>0&&h.push({...u,hooks:m})}i.length!==l&&(h.length===0?delete o[a]:o[a]=h)}return i.length===0?{art:"nichts"}:(Object.keys(o).length===0&&delete r.hooks,{art:"geaendert",nachher:Object.keys(r).filter(a=>!n.includes(a)).length===0?null:K(r,t),entfernt:i,instanz:""})}function Ne(t,e,n){let r=e;t[e-1]===`
5
+ `):o}function y(t){try{return R(t).isFile()?Z(t,"utf8"):null}catch{return null}}function F(t){try{return R(t).isDirectory()}catch{return!1}}function Ne(t){if(!p(t))return"";const n=(p(t.env)?t.env:p(t.command)&&p(t.command.env)?t.command.env:null)?.CACHLY_BRAIN_INSTANCE_ID;return typeof n=="string"?n:""}function j(t,e,n){const r=t[e];return!p(r)||!("cachly"in r)?!1:(n.push(r.cachly),delete r.cachly,Object.keys(r).length===0&&delete t[e],!0)}function G(t){return p(t)?p(t.env)&&("CACHLY_JWT"in t.env||"CACHLY_BRAIN_INSTANCE_ID"in t.env)?!0:JSON.stringify(t).includes("@cachly-dev/mcp-server"):!1}function w(t,e){const n=L(t);if(!n)return{art:"unlesbar"};const r=[],o=[];if(e==="mcpServers"&&j(n,"mcpServers",r)&&o.push("mcpServers.cachly"),e==="vscode"&&(j(n,"servers",r)&&o.push("servers.cachly"),j(n,"mcpServers",r)&&o.push("mcpServers.cachly")),e==="zed"&&j(n,"context_servers",r)&&o.push("context_servers.cachly"),e==="continue"){const a=n.experimental,c=p(a)?a.modelContextProtocolServers:void 0;if(p(a)&&Array.isArray(c)){const s=c.filter(l=>!G(l));s.length<c.length&&(r.push(...c.filter(G)),o.push(`experimental.modelContextProtocolServers (${c.length-s.length})`),s.length===0?delete a.modelContextProtocolServers:a.modelContextProtocolServers=s,Object.keys(a).length===0&&delete n.experimental)}}if(o.length===0)return{art:"nichts"};const i=r.map(Ne).find(Boolean)??"";return{art:"geaendert",nachher:Object.keys(n).length===0?null:K(n,t),entfernt:o,instanz:i}}function ze(t){if(N(t))return"ambient";const e=String(t?.command??"");return e.includes("@cachly-dev/mcp-server")&&e.includes(" checkpoint")?"checkpoint":null}function _(t){return N(t)?"ambient":null}function U(t,e,n=[]){const r=L(t);if(!r)return{art:"unlesbar"};const o=r.hooks;if(!p(o))return{art:"nichts"};const i=[];for(const[c,s]of Object.entries(o)){if(!Array.isArray(s))continue;const l=i.length,h=[];for(const u of s){const d=p(u)&&Array.isArray(u.hooks)?u.hooks:null;if(!d){const f=e(u);f?i.push(f):h.push(u);continue}const m=d.filter(f=>{const O=e(f);return O&&i.push(O),!O});m.length===d.length?h.push(u):m.length>0&&h.push({...u,hooks:m})}i.length!==l&&(h.length===0?delete o[c]:o[c]=h)}return i.length===0?{art:"nichts"}:(Object.keys(o).length===0&&delete r.hooks,{art:"geaendert",nachher:Object.keys(r).filter(c=>!n.includes(c)).length===0?null:K(r,t),entfernt:i,instanz:""})}function Pe(t,e,n){let r=e;t[e-1]===`
6
6
  `&&(r=t[e-2]==="\r"?e-2:e-1);let o=n;return t[n]===`
7
7
  `?o=n+1:t[n]==="\r"&&t[n+1]===`
8
8
  `&&(o=n+2),r<e&&o>n&&r>0&&o<t.length&&t[r-1]!==`
9
9
  `&&t[o]!==`
10
- `&&t[o]!=="\r"&&(o=n),t.slice(0,r)+t.slice(o)}function ze(t){if(!t.includes(N)&&!t.includes(D))return{art:"kein-block"};let e=t,n=0;for(;;){const r=re().exec(e);if(!r)break;e=Ne(e,r.index,r.index+r[0].length),n++}return n===0||e.includes(N)||e.includes(D)?{art:"kaputt"}:{art:"entfernt",rest:e}}function Pe(t){const e=t.trim().split(/\r?\n/);if(e[0]?.trim()!=="---")return!1;const n=e.findIndex((r,o)=>o>0&&r.trim()==="---");return n>0&&e.slice(n+1).every(r=>r.trim()==="")}function Be(t,e){return t.trim()===""||e&&Pe(t)}function Le(t){let e=t;const n=[],r=[["CLS hook",oe],["brain_watch hook",se]];for(const[i,c]of r)for(;;){const a=c.exec(e);if(!a)break;const s=e.slice(0,a.index).replace(/\s+$/,""),l=e.slice(a.index+a[0].length).replace(/^\s*\n/,"");e=s+(s&&l.trim()?`
10
+ `&&t[o]!=="\r"&&(o=n),t.slice(0,r)+t.slice(o)}function Me(t){if(!t.includes(D)&&!t.includes(H))return{art:"kein-block"};let e=t,n=0;for(;;){const r=oe().exec(e);if(!r)break;e=Pe(e,r.index,r.index+r[0].length),n++}return n===0||e.includes(D)||e.includes(H)?{art:"kaputt"}:{art:"entfernt",rest:e}}function Be(t){const e=t.trim().split(/\r?\n/);if(e[0]?.trim()!=="---")return!1;const n=e.findIndex((r,o)=>o>0&&r.trim()==="---");return n>0&&e.slice(n+1).every(r=>r.trim()==="")}function Le(t,e){return t.trim()===""||e&&Be(t)}function Ke(t){let e=t;const n=[],r=[["CLS hook",se],["brain_watch hook",ie]];for(const[i,a]of r)for(;;){const c=a.exec(e);if(!c)break;const s=e.slice(0,c.index).replace(/\s+$/,""),l=e.slice(c.index+c[0].length).replace(/^\s*\n/,"");e=s+(s&&l.trim()?`
11
11
 
12
12
  `:"")+l,n.push(i)}if(n.length===0)return{rest:t,entfernt:n};const o=e.trim();return o===""||o.startsWith("#!")&&!o.includes(`
13
13
  `)?{rest:"",entfernt:n}:{rest:e.replace(/\s+$/,"")+`
14
- `,entfernt:n}}function Me(t,e){const n=H(e,t);return n!==""&&!n.startsWith("..")&&!I(n)}function G(t,e,n,r){const o=new Set(t.filter(a=>a.stufe===e&&(a.aktion==="datei-loeschen"||a.aktion==="ordner-loeschen")).map(a=>a.pfad)),i=new Set;for(const a of o)for(let s=T(a);s!==r&&Me(s,n)&&!s.split(S).includes(".git");s=T(s))i.add(s);const c=[];for(const a of[...i].sort((s,l)=>l.length-s.length)){let s;try{s=j(a)}catch{continue}s.every(l=>o.has(g(a,l)))&&(o.add(a),c.push({stufe:e,aktion:"ordner-entfernen",pfad:a,was:"empty folder"}))}return c}function Ke(t,e){const n=new Map;for(const[r,o]of Object.entries(ne))n.set(o,r==="continue"?"continue":r==="zed"?"zed":o===".vscode/mcp.json"?"vscode":"mcpServers");for(const[r,o]of n){const i=k(t.projekt,r),c=y(i);if(R(`${i}.bak`)&&e.funde.push({stufe:"projekt",aktion:"melden",pfad:`${i}.bak`,was:"your old file is there; uninstall does not restore it"}),c===null)continue;const a=A(c,o);if(a.art==="unlesbar"){c.includes("cachly")&&e.vonHand.push({stufe:"projekt",text:`${r}: cannot be read as plain JSON (comments or another format). Remove the "cachly" entry by hand.`});continue}a.art!=="nichts"&&(e.instanz||=a.instanz,a.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:'MCP server entry "cachly", the only thing in the file',vorher:c}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:'MCP server entry "cachly"; other servers and settings stay',vorher:c,nachher:a.nachher}))}}function Fe(t,e){for(const n of te){const r=k(t.projekt,...n.pfad),o=y(r);if(o===null)continue;const i=n.pfad.join("/"),c=ze(o);if(c.art==="kein-block"){o.startsWith("# cachly AI Brain")&&e.vonHand.push({stufe:"projekt",text:`${i}: looks like the whole file was written by the setup_ai_memory tool (no markers). Check it and remove it by hand if it is not yours.`});continue}if(c.art==="kaputt"){e.vonHand.push({stufe:"projekt",text:`${i}: a cachly marker has no partner. Remove the block by hand.`});continue}Be(c.rest,i.endsWith(".mdc"))?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:"only the cachly block was in it",vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:"cachly block between the markers; your text stays as it is",vorher:o,nachher:c.rest})}}function v(t,e,n,r,o){const i=k(t.projekt,n),c=y(i);if(c===null)return;const a=De(c,r,o);if(a.art==="unlesbar"){(c.includes(z)||c.includes("@cachly-dev/mcp-server"))&&e.vonHand.push({stufe:"projekt",text:`${n}: cannot be read as plain JSON (comments or another format). Remove the cachly hooks by hand.`});return}if(a.art==="nichts")return;const s=a.entfernt.filter(u=>u==="ambient").length,l=a.entfernt.filter(u=>u==="checkpoint").length,h=[...s?[`${s} Ambient Recall hook${s===1?"":"s"}`]:[],...l?[`${l} ${Oe}`]:[]];a.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:`${h.join(" and ")}, the only thing in the file`,vorher:c}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:`${h.join(" and ")}; other hooks and settings stay`,vorher:c,nachher:a.nachher})}function Ue(t,e,n){const r=k(t.projekt,n);let o;try{o=j(r)}catch{return}for(const i of o.sort()){const c=g(r,i);!i.startsWith(z)||y(c)===null||e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:c,was:"Ambient Recall hook script"})}}function Ge(t,e){v(t,e,ae,He,[]),v(t,e,fe,_,["version"]),v(t,e,he,_,["version"]),v(t,e,ce,_,[]),v(t,e,O,_,[]);for(const r of[ie,de,ue,le,pe])Ue(t,e,r);const n=$(y(k(t.projekt,O))??"");n&&p(n.mcpServers)&&"cachly"in n.mcpServers&&e.vonHand.push({stufe:"projekt",text:`${O}: the MCP server "cachly" (added by "gemini mcp add") stays. Remove that entry by hand.`})}function We(t,e){const n=g(t.projekt,".git");if(!R(n))return;if(!F(n)){e.vonHand.push({stufe:"projekt",text:".git is a file here (a Git worktree). cachly never writes a post-commit hook there. If you set one up in the main repository, check its .git/hooks/post-commit."});return}const r=g(n,"hooks","post-commit"),o=y(r);if(o===null)return;const i=Le(o);if(i.entfernt.length===0)return;const c=i.entfernt.join(" and ");i.rest===""?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:`${c}, the only thing in the hook`,vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:`${c}; your own commands stay`,vorher:o,nachher:i.rest})}function Je(t,e){const n=g(t.heim,".claude","mcp.json"),r=y(n);if(r!==null){const s=A(r,"mcpServers");s.art==="unlesbar"&&r.includes("cachly")?e.vonHand.push({stufe:"global",text:'~/.claude/mcp.json: cannot be read as plain JSON. Remove the "cachly" entry by hand.'}):s.art==="geaendert"&&(e.instanz||=s.instanz,s.nachher===null?e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:n,was:'MCP server entry "cachly", the only thing in the file (it holds your key)',vorher:r}):e.funde.push({stufe:"global",aktion:"eintrag-entfernen",pfad:n,was:'MCP server entry "cachly" (it holds your key); other servers stay',vorher:r,nachher:s.nachher}))}for(const s of[g(t.heim,".cursor","mcp.json"),g(t.heim,".codeium","windsurf","mcp_config.json")]){const l=y(s);if(l===null)continue;const h=A(l,"mcpServers");(h.art==="geaendert"||h.art==="unlesbar"&&l.includes("cachly"))&&e.funde.push({stufe:"global",aktion:"melden",pfad:s,was:'has a "cachly" server entry. You set this file up yourself, so uninstall leaves it. Remove the entry by hand.'})}const o=g(t.heim,".cachly");let i=[];try{i=j(o)}catch{}const c=[];for(const s of i.sort()){const l=g(o,s);if(Re.test(s)&&y(l)!==null){const h=s===b(B({home:""}))?"your key and Brain id; other projects on this computer lose their access":"cachly data on this computer";e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:l,was:h})}else c.push(s)}c.length>0&&e.vonHand.push({stufe:"global",text:`~/.cachly also holds ${c.join(", ")}. Not written by this package, so it stays.${c.includes("vscode-mcp.env")?" vscode-mcp.env holds your key (written by the VS Code extension): uninstall the extension, then delete it.":""}`});let a=[];try{a=j(t.tmp)}catch{}for(const s of a.sort()){if(!s.startsWith("cachly-"))continue;const l=g(t.tmp,s),h=F(l);Te(s,h)&&e.funde.push({stufe:"global",aktion:h?"ordner-loeschen":"datei-loeschen",pfad:l,was:"cache in the temp folder"})}}function Ye(t){const e={projekt:k(t.projekt),heim:k(t.heim),tmp:k(t.tmp)},n={funde:[],vonHand:[],instanz:""};return Ke(e,n),Fe(e,n),Ge(e,n),We(e,n),Je(e,n),n.funde.push(...G(n.funde,"projekt",e.projekt,e.tmp)),n.funde.push(...G(n.funde,"global",e.heim,e.tmp)),n}function W(t){return t.split(S).length}function J(t){return[...t].sort((n,r)=>{const o=i=>i.aktion==="ordner-entfernen"?1:0;return o(n)-o(r)||(o(n)?W(r.pfad)-W(n.pfad):0)}).map(n=>{if(n.aktion==="melden")return{fund:n,status:"uebersprungen",grund:"only reported"};try{return n.vorher!==void 0&&y(n.pfad)!==n.vorher?{fund:n,status:"uebersprungen",grund:"the file changed after the plan was made"}:(n.aktion==="datei-loeschen"?C(n.pfad,{force:!0}):n.aktion==="ordner-loeschen"?C(n.pfad,{recursive:!0,force:!0}):n.aktion==="ordner-entfernen"?Z(n.pfad):ee(n.pfad,n.nachher??"","utf8"),{fund:n,status:"entfernt"})}catch(r){const o=r.code==="ENOTEMPTY"?"the folder is not empty":r.message;return{fund:n,status:"uebersprungen",grund:o}}})}async function Ve(t){const e=await ye(g(t.heim,".cachly",b(L()))),n=Ee(e),r={schluessel:t.schluessel?Se(t.schluessel)?"test":"konto":"keiner",turns:e.length,injected:n.injected,prevented:n.prevented,net:n.net,lektionen:null};if(!t.schluessel||!t.instanz)return r.lektionenFehlt="no-instance",r;try{const o=await(t.fetchFn??fetch)(`${t.apiUrl}/api/v1/instances/${t.instanz}/memory`,{headers:{Authorization:`Bearer ${t.schluessel}`},signal:AbortSignal.timeout(5e3)});if(!o.ok)throw new Error(`HTTP ${o.status}`);const i=(await o.json()).lesson_count;if(typeof i!="number")throw new Error("no lesson_count");r.lektionen=i}catch{r.lektionenFehlt="unreachable"}return r}const Xe={"datei-loeschen":"delete file","ordner-loeschen":"delete folder","ordner-entfernen":"remove folder","eintrag-entfernen":"remove entry","block-entfernen":"remove block",melden:"note only"};function Y(t,e){const n=t.stufe==="projekt"?e.projekt:e.heim,r=H(n,t.pfad),o=r!==""&&!r.startsWith("..")&&!I(r),i=(o?r:t.pfad).split(S).join("/");return t.stufe==="global"&&o?`~/${i}`:i}function qe(t,e){const n=e.ausgabe;n(""),n("What you have right now");const r=t.schluessel==="test"?"test key (cky_trial_), the Brain behind it is a test Brain":t.schluessel==="konto"?"account key":"none found";n(` Key: ${r}`);const o=t.lektionen!==null?`${t.lektionen} in your Brain`:t.lektionenFehlt==="no-instance"?"unknown (no key or Brain found here)":"not reachable right now";n(` Lessons: ${o}`),n(t.turns>0?` Ledger: ${t.turns} turns, ${t.injected} tokens injected, ${t.prevented} prevented, net ${t.net>=0?"+":""}${t.net} tokens`:" Ledger: no turns recorded"),n(" To keep your lessons first, write them to disk:"),n(" npx @cachly-dev/mcp-server@latest export")}function V(t,e,n){n.ausgabe(""),n.ausgabe(t);for(const r of e)n.ausgabe(` ${Xe[r.aktion].padEnd(14)} ${Y(r,n)} (${r.was})`)}function X(t,e,n){n.ausgabe(""),n.ausgabe("By hand (uninstall cannot do these):"),n.ausgabe(" - Codex and Gemini CLI keep the cachly MCP server in their own settings (~/.codex/config.toml, .gemini/settings.json). If you registered it there, remove the entry named cachly."),n.ausgabe(' - Uninstall the JetBrains plugin "Cachly Brain" (Settings, Plugins) and the VS Code extension "cachly Brain" (cachly-dev.cachly-brain), if you installed them.');for(const r of t.vonHand)(r.stufe==="projekt"||e)&&n.ausgabe(` - ${r.text}`)}function q(t,e){e.ausgabe("");for(const r of t){if(r.fund.aktion==="melden")continue;const o=r.status==="entfernt"?"removed":"skipped";e.ausgabe(` ${o.padEnd(8)} ${Y(r.fund,e)}${r.grund?` (${r.grund})`:""}`)}const n=t.filter(r=>r.fund.aktion!=="melden");e.ausgabe(`Done: ${n.filter(r=>r.status==="entfernt").length} removed, ${n.filter(r=>r.status==="uebersprungen").length} skipped.`)}function Qe(t){return{dryRun:t.includes("--dry-run"),ja:t.includes("--yes")||t.includes("-y"),global:t.includes("--global")}}async function gt(t,e){const n=Qe(t),r=Ye({projekt:e.projekt,heim:e.heim,tmp:e.tmp}),o=await Ve({heim:e.heim,schluessel:e.schluessel,instanz:e.instanz||r.instanz,apiUrl:e.apiUrl,fetchFn:e.fetchFn});qe(o,e);const i=r.funde.filter(d=>d.stufe==="projekt"),c=r.funde.filter(d=>d.stufe==="global"),a=i.filter(d=>d.aktion!=="melden"),s=c.filter(d=>d.aktion!=="melden");if(i.length===0&&(!n.global||c.length===0))return e.ausgabe(""),e.ausgabe(`Nothing found in ${e.projekt}${n.global?" or your home folder":""}: cachly has not written anything here that uninstall can remove.`),!n.global&&s.length>0&&e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them.`),X(r,n.global,e),e.ausgabe(""),e.ausgabe(M),0;if(i.length>0&&V(`In this project (${e.projekt}):`,i,e),n.global&&c.length>0&&V("In your home folder and temp folder (--global):",c,e),X(r,n.global,e),e.ausgabe(""),e.ausgabe(M),n.dryRun)return e.ausgabe(""),e.ausgabe("Dry run: nothing was changed."),!n.global&&s.length>0&&e.ausgabe(`Your home and temp folders hold ${s.length} more cachly files (key, ledger, caches); add --global to include them.`),0;if(!(a.length>0||n.global&&s.length>0))return e.ausgabe(""),e.ausgabe("Nothing to remove."),0;if(!n.ja&&!e.istTty)return e.ausgabe(""),e.ausgabe('This is not a terminal and --yes is missing: nothing was changed. Run it in a terminal, or add --yes. "--dry-run" only shows the plan.'),1;let h=0,u=0;if(a.length>0)if(n.ja||await e.frage(`
15
- Remove these ${a.length} items from this project? [y/N] `)){const m=J(i);q(m,e),h+=m.filter(f=>f.status==="entfernt").length,u+=m.filter(f=>f.status==="uebersprungen"&&f.fund.aktion!=="melden").length}else e.ausgabe("Project: nothing was changed.");if(n.global&&s.length>0)if(e.ausgabe(""),e.ausgabe("Home folder: this removes your key file. Other projects on this computer lose their access to the Brain."),o.schluessel==="test"&&e.ausgabe('It is a test key. Without it you cannot reach the test Brain again. "npx @cachly-dev/mcp-server@latest claim" keeps it in your own account first.'),n.ja||await e.frage(`
16
- Remove these ${s.length} items from your home and temp folder? [y/N] `)){const m=J(c);q(m,e),h+=m.filter(f=>f.status==="entfernt").length,u+=m.filter(f=>f.status==="uebersprungen"&&f.fund.aktion!=="melden").length}else e.ausgabe("Home folder: nothing was changed.");else!n.global&&s.length>0&&(e.ausgabe(""),e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them, with its own question.`));return h===0&&u===0&&e.ausgabe("Nothing was changed."),u>0?1:0}export{Oe as KAPUTTER_STOP_HOOK,ze as entferneAnweisungsBlock,Le as entferneGitHookBloecke,De as entferneHookEintraege,A as entferneMcpEintrag,J as fuehreAus,Te as istCachlyAblage,Be as istLeerNachRueckbau,_ as klassifiziereAmbientHook,He as klassifiziereClaudeHook,Ye as plane,Ve as sammleBestand,gt as uninstallBefehl};
14
+ `,entfernt:n}}function Fe(t,e){const n=I(e,t);return n!==""&&!n.startsWith("..")&&!T(n)}function W(t,e,n,r){const o=new Set(t.filter(c=>c.stufe===e&&(c.aktion==="datei-loeschen"||c.aktion==="ordner-loeschen")).map(c=>c.pfad)),i=new Set;for(const c of o)for(let s=C(c);s!==r&&Fe(s,n)&&!s.split(S).includes(".git");s=C(s))i.add(s);const a=[];for(const c of[...i].sort((s,l)=>l.length-s.length)){let s;try{s=v(c)}catch{continue}s.every(l=>o.has(g(c,l)))&&(o.add(c),a.push({stufe:e,aktion:"ordner-entfernen",pfad:c,was:"empty folder"}))}return a}function Ge(t,e){const n=new Map;for(const[r,o]of Object.entries(re))n.set(o,r==="continue"?"continue":r==="zed"?"zed":o===".vscode/mcp.json"?"vscode":"mcpServers");for(const[r,o]of n){const i=k(t.projekt,r),a=y(i);if(A(`${i}.bak`)&&e.funde.push({stufe:"projekt",aktion:"melden",pfad:`${i}.bak`,was:"your old file is there; uninstall does not restore it"}),a===null)continue;const c=w(a,o);if(c.art==="unlesbar"){a.includes("cachly")&&e.vonHand.push({stufe:"projekt",text:`${r}: cannot be read as plain JSON (comments or another format). Remove the "cachly" entry by hand.`});continue}c.art!=="nichts"&&(e.instanz||=c.instanz,c.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:'MCP server entry "cachly", the only thing in the file',vorher:a}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:'MCP server entry "cachly"; other servers and settings stay',vorher:a,nachher:c.nachher}))}}function Ue(t,e){for(const n of ne){const r=k(t.projekt,...n.pfad),o=y(r);if(o===null)continue;const i=n.pfad.join("/"),a=Me(o);if(a.art==="kein-block"){o.startsWith("# cachly AI Brain")&&e.vonHand.push({stufe:"projekt",text:`${i}: looks like the whole file was written by the setup_ai_memory tool (no markers). Check it and remove it by hand if it is not yours.`});continue}if(a.art==="kaputt"){e.vonHand.push({stufe:"projekt",text:`${i}: a cachly marker has no partner. Remove the block by hand.`});continue}Le(a.rest,i.endsWith(".mdc"))?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:"only the cachly block was in it",vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:"cachly block between the markers; your text stays as it is",vorher:o,nachher:a.rest})}}function E(t,e,n,r,o){const i=k(t.projekt,n),a=y(i);if(a===null)return;const c=U(a,r,o);if(c.art==="unlesbar"){(a.includes($)||a.includes("@cachly-dev/mcp-server"))&&e.vonHand.push({stufe:"projekt",text:`${n}: cannot be read as plain JSON (comments or another format). Remove the cachly hooks by hand.`});return}if(c.art==="nichts")return;const s=c.entfernt.filter(u=>u==="ambient").length,l=c.entfernt.filter(u=>u==="checkpoint").length,h=[...s?[`${s} Ambient Recall hook${s===1?"":"s"}`]:[],...l?[`${l} ${Re}`]:[]];c.nachher===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:i,was:`${h.join(" and ")}, the only thing in the file`,vorher:a}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:i,was:`${h.join(" and ")}; other hooks and settings stay`,vorher:a,nachher:c.nachher})}function We(t,e,n){const r=k(t.projekt,n);let o;try{o=v(r)}catch{return}for(const i of o.sort()){const a=g(r,i);!i.startsWith($)||y(a)===null||e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:a,was:"Ambient Recall hook script"})}}function Je(t,e){E(t,e,ce,ze,[]),E(t,e,de,_,["version"]),E(t,e,ue,_,["version"]),E(t,e,le,_,[]),Ye(t,e);for(const n of[ae,pe,fe,he,me])We(t,e,n);Ve(t,e)}function Ye(t,e){const n=k(t.projekt,z),r=y(n);if(r===null)return;const o=U(r,_,[]);if(o.art==="unlesbar"){(r.includes($)||r.includes("@cachly-dev/mcp-server"))&&e.vonHand.push({stufe:"projekt",text:`${z}: cannot be read as plain JSON (comments or another format). Remove the cachly hooks and the MCP server "cachly" by hand.`});return}const i=o.art==="geaendert"?o.nachher:r,a=i===null?{art:"nichts"}:w(i,"mcpServers"),c=a.art==="geaendert"?a.nachher:i;if(o.art!=="geaendert"&&a.art!=="geaendert")return;a.art==="geaendert"&&(e.instanz||=a.instanz);const s=o.art==="geaendert"?o.entfernt.length:0,l=[...s?[`${s} Ambient Recall hook${s===1?"":"s"}`]:[],...a.art==="geaendert"?['MCP server entry "cachly"']:[]];c===null?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:n,was:`${l.join(" and ")}, the only thing in the file`,vorher:r}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:n,was:`${l.join(" and ")}; other servers, hooks and settings stay`,vorher:r,nachher:c})}function Ve(t,e){const n=k(t.projekt,ye),r=y(n);if(r===null)return;const o=ke(r);o.entfernt&&(o.rest===""?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:n,was:"MCP server table [mcp_servers.cachly], the only thing in the file",vorher:r}):e.funde.push({stufe:"projekt",aktion:"eintrag-entfernen",pfad:n,was:"MCP server table [mcp_servers.cachly]; other settings stay",vorher:r,nachher:o.rest}))}function Xe(t,e){const n=g(t.projekt,".git");if(!A(n))return;if(!F(n)){e.vonHand.push({stufe:"projekt",text:".git is a file here (a Git worktree). cachly never writes a post-commit hook there. If you set one up in the main repository, check its .git/hooks/post-commit."});return}const r=g(n,"hooks","post-commit"),o=y(r);if(o===null)return;const i=Ke(o);if(i.entfernt.length===0)return;const a=i.entfernt.join(" and ");i.rest===""?e.funde.push({stufe:"projekt",aktion:"datei-loeschen",pfad:r,was:`${a}, the only thing in the hook`,vorher:o}):e.funde.push({stufe:"projekt",aktion:"block-entfernen",pfad:r,was:`${a}; your own commands stay`,vorher:o,nachher:i.rest})}function qe(t,e){const n=g(t.heim,".claude","mcp.json"),r=y(n);if(r!==null){const s=w(r,"mcpServers");s.art==="unlesbar"&&r.includes("cachly")?e.vonHand.push({stufe:"global",text:'~/.claude/mcp.json: cannot be read as plain JSON. Remove the "cachly" entry by hand.'}):s.art==="geaendert"&&(e.instanz||=s.instanz,s.nachher===null?e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:n,was:'MCP server entry "cachly", the only thing in the file (it holds your key)',vorher:r}):e.funde.push({stufe:"global",aktion:"eintrag-entfernen",pfad:n,was:'MCP server entry "cachly" (it holds your key); other servers stay',vorher:r,nachher:s.nachher}))}for(const s of[g(t.heim,".cursor","mcp.json"),g(t.heim,".codeium","windsurf","mcp_config.json")]){const l=y(s);if(l===null)continue;const h=w(l,"mcpServers");(h.art==="geaendert"||h.art==="unlesbar"&&l.includes("cachly"))&&e.funde.push({stufe:"global",aktion:"melden",pfad:s,was:'has a "cachly" server entry. You set this file up yourself, so uninstall leaves it. Remove the entry by hand.'})}const o=g(t.heim,".cachly");let i=[];try{i=v(o)}catch{}const a=[];for(const s of i.sort()){const l=g(o,s);if(Te.test(s)&&y(l)!==null){const h=s===b(P({home:""}))?"your key and Brain id; other projects on this computer lose their access":"cachly data on this computer";e.funde.push({stufe:"global",aktion:"datei-loeschen",pfad:l,was:h})}else a.push(s)}a.length>0&&e.vonHand.push({stufe:"global",text:`~/.cachly also holds ${a.join(", ")}. Not written by this package, so it stays.${a.includes("vscode-mcp.env")?" vscode-mcp.env holds your key (written by the VS Code extension): uninstall the extension, then delete it.":""}`});let c=[];try{c=v(t.tmp)}catch{}for(const s of c.sort()){if(!s.startsWith("cachly-"))continue;const l=g(t.tmp,s),h=F(l);De(s,h)&&e.funde.push({stufe:"global",aktion:h?"ordner-loeschen":"datei-loeschen",pfad:l,was:"cache in the temp folder"})}}function Qe(t){const e={projekt:k(t.projekt),heim:k(t.heim),tmp:k(t.tmp)},n={funde:[],vonHand:[],instanz:""};return Ge(e,n),Ue(e,n),Je(e,n),Xe(e,n),qe(e,n),n.funde.push(...W(n.funde,"projekt",e.projekt,e.tmp)),n.funde.push(...W(n.funde,"global",e.heim,e.tmp)),n}function J(t){return t.split(S).length}function Y(t){return[...t].sort((n,r)=>{const o=i=>i.aktion==="ordner-entfernen"?1:0;return o(n)-o(r)||(o(n)?J(r.pfad)-J(n.pfad):0)}).map(n=>{if(n.aktion==="melden")return{fund:n,status:"uebersprungen",grund:"only reported"};try{return n.vorher!==void 0&&y(n.pfad)!==n.vorher?{fund:n,status:"uebersprungen",grund:"the file changed after the plan was made"}:(n.aktion==="datei-loeschen"?x(n.pfad,{force:!0}):n.aktion==="ordner-loeschen"?x(n.pfad,{recursive:!0,force:!0}):n.aktion==="ordner-entfernen"?ee(n.pfad):te(n.pfad,n.nachher??"","utf8"),{fund:n,status:"entfernt"})}catch(r){const o=r.code==="ENOTEMPTY"?"the folder is not empty":r.message;return{fund:n,status:"uebersprungen",grund:o}}})}async function Ze(t){const e=await ve(g(t.heim,".cachly",b(M()))),n=$e(e),r={schluessel:t.schluessel?Ae(t.schluessel)?"test":"konto":"keiner",turns:e.length,injected:n.injected,prevented:n.prevented,net:n.net,lektionen:null};if(!t.schluessel||!t.instanz)return r.lektionenFehlt="no-instance",r;try{const o=await(t.fetchFn??fetch)(`${t.apiUrl}/api/v1/instances/${t.instanz}/memory`,{headers:{Authorization:`Bearer ${t.schluessel}`},signal:AbortSignal.timeout(5e3)});if(!o.ok)throw new Error(`HTTP ${o.status}`);const i=(await o.json()).lesson_count;if(typeof i!="number")throw new Error("no lesson_count");r.lektionen=i}catch{r.lektionenFehlt="unreachable"}return r}const et={"datei-loeschen":"delete file","ordner-loeschen":"delete folder","ordner-entfernen":"remove folder","eintrag-entfernen":"remove entry","block-entfernen":"remove block",melden:"note only"};function V(t,e){const n=t.stufe==="projekt"?e.projekt:e.heim,r=I(n,t.pfad),o=r!==""&&!r.startsWith("..")&&!T(r),i=(o?r:t.pfad).split(S).join("/");return t.stufe==="global"&&o?`~/${i}`:i}function tt(t,e){const n=e.ausgabe;n(""),n("What you have right now");const r=t.schluessel==="test"?"test key (cky_trial_), the Brain behind it is a test Brain":t.schluessel==="konto"?"account key":"none found";n(` Key: ${r}`);const o=t.lektionen!==null?`${t.lektionen} in your Brain`:t.lektionenFehlt==="no-instance"?"unknown (no key or Brain found here)":"not reachable right now";n(` Lessons: ${o}`),n(t.turns>0?` Ledger: ${t.turns} turns, ${t.injected} tokens injected, ${t.prevented} prevented, net ${t.net>=0?"+":""}${t.net} tokens`:" Ledger: no turns recorded"),n(" To keep your lessons first, write them to disk:"),n(" npx @cachly-dev/mcp-server@latest export")}function X(t,e,n){n.ausgabe(""),n.ausgabe(t);for(const r of e)n.ausgabe(` ${et[r.aktion].padEnd(14)} ${V(r,n)} (${r.was})`)}function q(t,e,n){n.ausgabe(""),n.ausgabe("By hand (uninstall cannot do these):"),n.ausgabe(' - If you registered cachly with "codex mcp add" or "gemini mcp add -s user", it is in ~/.codex/config.toml or ~/.gemini/settings.json. Remove the entry named cachly there (the project files above are handled).'),n.ausgabe(' - Uninstall the JetBrains plugin "Cachly Brain" (Settings, Plugins) and the VS Code extension "cachly Brain" (cachly-dev.cachly-brain), if you installed them.');for(const r of t.vonHand)(r.stufe==="projekt"||e)&&n.ausgabe(` - ${r.text}`)}function Q(t,e){e.ausgabe("");for(const r of t){if(r.fund.aktion==="melden")continue;const o=r.status==="entfernt"?"removed":"skipped";e.ausgabe(` ${o.padEnd(8)} ${V(r.fund,e)}${r.grund?` (${r.grund})`:""}`)}const n=t.filter(r=>r.fund.aktion!=="melden");e.ausgabe(`Done: ${n.filter(r=>r.status==="entfernt").length} removed, ${n.filter(r=>r.status==="uebersprungen").length} skipped.`)}function nt(t){return{dryRun:t.includes("--dry-run"),ja:t.includes("--yes")||t.includes("-y"),global:t.includes("--global")}}async function jt(t,e){const n=nt(t),r=Qe({projekt:e.projekt,heim:e.heim,tmp:e.tmp}),o=await Ze({heim:e.heim,schluessel:e.schluessel,instanz:e.instanz||r.instanz,apiUrl:e.apiUrl,fetchFn:e.fetchFn});tt(o,e);const i=r.funde.filter(d=>d.stufe==="projekt"),a=r.funde.filter(d=>d.stufe==="global"),c=i.filter(d=>d.aktion!=="melden"),s=a.filter(d=>d.aktion!=="melden");if(i.length===0&&(!n.global||a.length===0))return e.ausgabe(""),e.ausgabe(`Nothing found in ${e.projekt}${n.global?" or your home folder":""}: cachly has not written anything here that uninstall can remove.`),!n.global&&s.length>0&&e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them.`),q(r,n.global,e),e.ausgabe(""),e.ausgabe(B),0;if(i.length>0&&X(`In this project (${e.projekt}):`,i,e),n.global&&a.length>0&&X("In your home folder and temp folder (--global):",a,e),q(r,n.global,e),e.ausgabe(""),e.ausgabe(B),n.dryRun)return e.ausgabe(""),e.ausgabe("Dry run: nothing was changed."),!n.global&&s.length>0&&e.ausgabe(`Your home and temp folders hold ${s.length} more cachly files (key, ledger, caches); add --global to include them.`),0;if(!(c.length>0||n.global&&s.length>0))return e.ausgabe(""),e.ausgabe("Nothing to remove."),0;if(!n.ja&&!e.istTty)return e.ausgabe(""),e.ausgabe('This is not a terminal and --yes is missing: nothing was changed. Run it in a terminal, or add --yes. "--dry-run" only shows the plan.'),1;let h=0,u=0;if(c.length>0)if(n.ja||await e.frage(`
15
+ Remove these ${c.length} items from this project? [y/N] `)){const m=Y(i);Q(m,e),h+=m.filter(f=>f.status==="entfernt").length,u+=m.filter(f=>f.status==="uebersprungen"&&f.fund.aktion!=="melden").length}else e.ausgabe("Project: nothing was changed.");if(n.global&&s.length>0)if(e.ausgabe(""),e.ausgabe("Home folder: this removes your key file. Other projects on this computer lose their access to the Brain."),o.schluessel==="test"&&e.ausgabe('It is a test key. Without it you cannot reach the test Brain again. "npx @cachly-dev/mcp-server@latest claim" keeps it in your own account first.'),n.ja||await e.frage(`
16
+ Remove these ${s.length} items from your home and temp folder? [y/N] `)){const m=Y(a);Q(m,e),h+=m.filter(f=>f.status==="entfernt").length,u+=m.filter(f=>f.status==="uebersprungen"&&f.fund.aktion!=="melden").length}else e.ausgabe("Home folder: nothing was changed.");else!n.global&&s.length>0&&(e.ausgabe(""),e.ausgabe(`Your home folder still holds ${s.length} cachly files (key, ledger, caches). "uninstall --global" removes them, with its own question.`));return h===0&&u===0&&e.ausgabe("Nothing was changed."),u>0?1:0}export{Re as KAPUTTER_STOP_HOOK,Me as entferneAnweisungsBlock,Ke as entferneGitHookBloecke,U as entferneHookEintraege,w as entferneMcpEintrag,Y as fuehreAus,De as istCachlyAblage,Le as istLeerNachRueckbau,_ as klassifiziereAmbientHook,ze as klassifiziereClaudeHook,Qe as plane,Ze as sammleBestand,jt as uninstallBefehl};
package/glama.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://glama.ai/mcp/schemas/server.json",
3
- "version": "0.10.206",
3
+ "version": "0.10.208",
4
4
  "maintainers": [
5
5
  "HeinrichNebula"
6
6
  ],
@@ -34,7 +34,7 @@ ${re(s)}
34
34
  (Relevant lessons for each task are auto-injected per prompt. ~${V(s)} tokens.)`}function j(t,e){return e?JSON.stringify({hookSpecificOutput:{hookEventName:t,additionalContext:e}}):""}function ga(t,e){return t.map((n,r)=>({x:n,rang:r,gezeigt:e.includes(n.lektion)})).filter(({rang:n,gezeigt:r})=>n<Yn||r).map(({x:n,rang:r,gezeigt:s})=>({thema:String(n.lektion.topic??""),rang:r,punkte:Math.round(n.punkte*1e3)/1e3,belege:n.belege,leser:typeof n.leser=="number"&&Number.isFinite(n.leser)?Math.round(n.leser*1e3)/1e3:null,gezeigt:s}))}async function pr(t,e,{nebenlauf:n,abrufMs:r,leser:s=!0,session:i=null,protokoll:o=!0,ereignis:a="UserPromptSubmit",editor:u="",lernen:c=!0,fetchFn:l}={}){let{lessons:g,quelle:f}=await L(e,{nebenlauf:n,abrufMs:r,fetchFn:l}),d=M(),p=c&&d.aktiv&&a==="UserPromptSubmit"&&!!e.instanceId,k=p?qn({instanceId:e.instanceId,sitzung:i,prompt:t,zaehlung:or(e.instanceId),einstellungen:d}):tt,O=Z[k.arm]??Z[0],S=await ca(t,g,e,{minBelege:Zn,tiefe:s?Yo:0,zeitlimitMs:gr,fetchFn:l}),w={...ia(S.sortiert.filter(E=>E.belege>=O.minBelege),O.topK,600),leser:S.leser,leserMs:S.leserMs},h=k.kontrolle?"":ua(w);if(p&&S.sortiert.length>0&&rr(e.instanceId,i,nr({sitzung:tr(i),zug:nt(t),ereignis:a,editor:u,arm:k.arm,kontrolle:k.kontrolle,erkundet:k.erkundet,ausgewaehlt:w.lessons.length,kandidatenZahl:S.sortiert.length,belege:w.belege,topScore:w.topScore,leser:w.leser,leserMs:w.leserMs,quelle:f,bestand:g.length,kandidaten:ga(S.sortiert,w.lessons)})),o)try{Uo(Qo,JSON.stringify({at:Date.now(),session:i,prompt_tokens:V(t),injected_tokens:h?w.tokens:0,matches:h?w.lessons.length:0,arm:k.arm,kontrolle:k.kontrolle,ausgewaehlt:w.lessons.length,top_score:w.topScore,belege:w.belege,leser:w.leser,leser_ms:w.leserMs,quelle:f,bestand:g.length})+`
35
35
  `)}catch{}return{kontext:h,auswahl:w,quelle:f,bestand:g.length,entscheidung:k}}function pe(t){let e=(t??"").trim();if(!e)return null;try{let n=JSON.parse(e);return n&&typeof n=="object"?n:null}catch{return null}}var fa=new Set(["Edit","Write","MultiEdit","NotebookEdit"]);function da(t){let e=t.hook_event_name??"UserPromptSubmit";if(e==="SessionStart"||e==="Stop")return null;if(e==="PreToolUse"){if(t.tool_name&&!fa.has(t.tool_name))return null;let r=t.tool_input?.file_path;if(typeof r!="string"||!r.trim())return null;let s=r.trim().replace(/\\/g,"/"),i=(t.cwd??"").replace(/\\/g,"/").replace(/\/+$/,"");return i&&s.toLowerCase().startsWith(i.toLowerCase()+"/")?s.slice(i.length+1):s}return(t.prompt??"").trim()||null}var ha=/\b(fixed|resolved|behoben|gefixt|root cause|the bug was|der fehler (lag|war)|ursache (war|gefunden)|now passes|tests? (are|is|sind) (green|grün)|deployed successfully)\b/i;function mr(t){let e=(t.last_assistant_message??"").trim();return e.length<80||!ha.test(e)?null:{action:(e.split(`
36
36
  `).find(r=>r.trim().length>0)?.trim()??e).slice(0,200),outcome:"success",details:e.slice(0,500),severity:"minor"}}function br(t){let e=t.action.toLowerCase().replace(/[^a-z0-9:\-_\s]/g,"").trim().split(/\s+/).slice(0,4).join("-");return{topic:e?e.includes(":")?e:`auto:${e}`:"auto:stop",outcome:t.outcome,what_worked:t.action,context:t.details,severity:t.severity,source:"ambient-stop",tags:["auto-learned"]}}var pa=5e3;async function yr(t,e){try{let n=pe(t);if(!n)return"";let r=n.hook_event_name??"UserPromptSubmit";if(!e.cfg.jwt||!e.cfg.instanceId)return"";let s="";if(r==="SessionStart"){let{lessons:i}=await L(e.cfg,{force:!0,fetchFn:e.fetchFn});s=hr(i)}else{let i=da(n);if(i===null)return"";s=(await pr(i,e.cfg,{nebenlauf:e.nebenlauf,abrufMs:pa,leser:r!=="PreToolUse",session:n.session_id??null,protokoll:e.protokoll,ereignis:r,editor:e.editor,fetchFn:e.fetchFn})).kontext}if(!s)return"";try{e.onInject?.(V(s),r)}catch{}return j(r,s)}catch{return""}}import{resolve as gc}from"node:path";var ut=[{topic:"docker:layer-cache",outcome:"success",what_worked:"Copy package manifests (package.json/lock, go.mod, requirements.txt) and install deps BEFORE copying the rest of the source. Dependency layers then stay cached across code-only changes.",what_failed:"Build re-downloads all dependencies on every code change because `COPY . .` came before the install step, busting the cache.",ctx:"Slow Docker builds in CI \u2014 every commit reinstalls dependencies even when only app code changed.",tags:["docker","ci","build","cache","performance"],confidence:.9},{topic:"git:force-push-safety",outcome:"success",what_worked:"Use `git push --force-with-lease` instead of `--force`. It refuses to overwrite if the remote moved since your last fetch, protecting teammates' commits.",what_failed:"A plain `git push --force` silently clobbered a colleague's commits that had landed after the last local fetch.",ctx:"Rebasing a shared feature branch and force-pushing the result.",tags:["git","rebase","collaboration","safety"],confidence:.92},{topic:"ci:flaky-tests-timing",outcome:"success",what_worked:"Pin time and randomness: use fake/frozen timers (e.g. vi.useFakeTimers, freezegun) and a fixed RNG seed. Replace arbitrary sleeps with explicit awaits on a condition.",what_failed:"Tests passed locally but failed ~10% of the time in CI due to real wall-clock timing and unseeded random data.",ctx:"Intermittent CI failures that disappear on re-run \u2014 classic flaky test.",tags:["ci","testing","flaky","timers","determinism"],confidence:.85},{topic:"node:esm-cjs-interop",outcome:"success",what_worked:'Set `"type": "module"` in package.json for ESM, use explicit `.js` extensions in relative imports, and `import { createRequire }` if you must load a CJS-only module.',what_failed:'"ReferenceError: exports is not defined" / "Cannot use import statement outside a module" after mixing ESM and CommonJS.',ctx:"Migrating a Node project to ES modules or adding an ESM-only dependency.",tags:["node","esm","commonjs","modules","typescript"],confidence:.85},{topic:"jwt:clock-skew",outcome:"success",what_worked:"Allow a small leeway (30\u201360s) when validating `exp`/`nbf` claims, and keep server clocks synced with NTP. Most JWT libraries accept a `clockTolerance` option.",what_failed:"Valid tokens were rejected as expired because the auth server and API server clocks differed by a few seconds.",ctx:"Intermittent 401s right around token expiry across multiple services.",tags:["jwt","auth","clock","security","tokens"],confidence:.88},{topic:"postgres:migration-lock",outcome:"success",what_worked:"Set a short `lock_timeout` before DDL and add indexes with `CREATE INDEX CONCURRENTLY`. This avoids a migration blocking on a long-held table lock and stalling the whole deploy.",what_failed:"A migration hung indefinitely waiting for an ACCESS EXCLUSIVE lock while a long-running query held the table, blocking the deploy.",ctx:"Production deploy froze during a schema migration under live traffic.",tags:["postgres","database","migration","deploy","locking"],confidence:.87},{topic:"redis:eviction-policy",outcome:"success",what_worked:"Set `maxmemory` and an explicit `maxmemory-policy` (e.g. `allkeys-lru` for a cache, `noeviction` for a datastore). Always set TTLs on cache keys.",what_failed:"Redis silently evicted keys (or OOM-errored on writes) because no maxmemory policy was configured and keys never expired.",ctx:"Cache hit-rate cratered / writes started failing as Redis filled up.",tags:["redis","cache","memory","eviction","ttl"],confidence:.86},{topic:"k8s:oom-limits",outcome:"success",what_worked:"Set both memory `requests` and `limits` on every container. For JVM/Node, also cap the runtime heap below the container limit so the GC reclaims before the kernel OOM-kills.",what_failed:"Pods were OOMKilled (exit 137) and restarted in a loop because no memory limit was set and the node was overcommitted.",ctx:"Pod restarting repeatedly with OOMKilled status in kubectl describe.",tags:["kubernetes","oom","memory","limits","infra"],confidence:.85},{topic:"cors:preflight",outcome:"success",what_worked:"Handle the OPTIONS preflight explicitly and return the right Access-Control-Allow-{Origin,Methods,Headers}. For credentialed requests, echo a specific origin (never `*`) and set Allow-Credentials: true.",what_failed:`Browser blocked requests with "No 'Access-Control-Allow-Origin' header" \u2014 the server never answered the preflight OPTIONS request.`,ctx:"Frontend on a different origin gets CORS errors only in the browser (curl works fine).",tags:["cors","http","api","browser","preflight"],confidence:.84},{topic:"env:dotenv-precedence",outcome:"success",what_worked:"Know the precedence: real environment variables (and Docker `-e`/compose `environment`) override a `.env` file. Most loaders will NOT overwrite an already-set var. Audit with a startup log of effective config.",what_failed:"A value in `.env` was silently ignored in the container because an environment variable of the same name was already set by Docker.",ctx:"Config works locally but the container picks up the wrong value.",tags:["env","dotenv","docker","config"],confidence:.83},{topic:"async:unhandled-rejection",outcome:"success",what_worked:"Await or `.catch()` every promise. Add a process-level `unhandledRejection` handler that logs and exits non-zero, so a dropped rejection is loud, not silent.",what_failed:"A fire-and-forget promise rejected, the error vanished, and the process kept running in a broken state with no log.",ctx:"Mysterious missing data / silent failures with no stack trace in a Node service.",tags:["async","node","promises","error-handling"],confidence:.84},{topic:"sql:n-plus-one",outcome:"success",what_worked:"Eager-load related rows in one query (JOIN or the ORM's include/preload/select_related) instead of looping and querying per row. Verify with query logging or an APM trace.",what_failed:"An endpoint issued one query per item in a list (N+1), making latency scale linearly with result count.",ctx:"List endpoint gets slow as data grows; DB shows a flood of near-identical small queries.",tags:["sql","database","orm","performance","n+1"],confidence:.86},{topic:"http:retry-idempotency",outcome:"success",what_worked:"Only auto-retry idempotent requests (GET/PUT/DELETE) or POSTs guarded by an idempotency key. Use exponential backoff with jitter and a cap on attempts.",what_failed:"A retried POST created duplicate records because the first request actually succeeded but the response was lost.",ctx:"Duplicate charges / duplicate rows after adding naive retry logic to an HTTP client.",tags:["http","retry","idempotency","reliability","backoff"],confidence:.85},{topic:"cache:stampede",outcome:"success",what_worked:"Prevent thundering-herd recomputation on cache expiry with a short lock (single-flight) or early-recompute-with-jitter so only one request rebuilds the value while others serve the stale one.",what_failed:"When a hot cache key expired, hundreds of concurrent requests all missed and hammered the database simultaneously.",ctx:"Periodic DB load spikes that line up exactly with cache TTL expiry.",tags:["cache","stampede","performance","concurrency","redis"],confidence:.83},{topic:"security:no-secrets-in-logs",outcome:"success",what_worked:"Redact tokens, passwords, and full auth headers before logging. Log a token's prefix + length, never the value. Add a log scrubber/filter so it cannot regress.",what_failed:"A bearer token was written to application logs and ended up in the log aggregator, where it was searchable by anyone with log access.",ctx:"Security review found credentials in centralized logs.",tags:["security","logging","secrets","pii","compliance"],confidence:.9},{topic:"tls:cert-expiry",outcome:"success",what_worked:"Automate renewal (ACME/cert-manager) and alert at least 14 days before expiry. Monitor the leaf AND intermediate chain \u2014 clients fail if the chain is incomplete even when the leaf is valid.",what_failed:"A production outage hit when a TLS certificate silently expired over a weekend with no alerting in place.",ctx:'Sudden "certificate has expired" errors from clients; site unreachable over HTTPS.',tags:["tls","ssl","certificates","monitoring","infra"],confidence:.88}],ma=ut.length;import{execFileSync as ba}from"node:child_process";function kr(t,e,n={}){return ba("git",[...e],{cwd:t,encoding:"utf-8",stdio:["ignore","pipe",n.stderr??"ignore"],timeout:n.timeoutMs??5e3,windowsHide:!0})}function wr(t){let e=t.trim();if(!e)return e;e=e.replace(/\{[^}]*=>\s*([^}]*)\}/g,(r,s)=>s.trim());let n=e.split("=>");return n.length===2&&(e=n[1].trim()),e.replace(/\/{2,}/g,"/").replace(/^\/|\/$/g,"")}function Er(t){let e=t.toLowerCase();return/\b(fix|fixed|fixes|bug|hotfix|patch|revert|resolve|closes? #\d+)\b/.test(e)?{category:"fix",outcome:"success",severity:/\b(critical|crash|security|auth|data loss|outage|prod|production)\b/.test(e)?"critical":/\b(major|breaking|regression|hotfix)\b/.test(e)?"major":"minor"}:/\b(feat|feature|add|added|implement|new|introduce)\b/.test(e)?{category:"feat",outcome:"success",severity:"minor"}:/\b(refactor|clean|cleanup|improve|simplify|extract|rename)\b/.test(e)?{category:"refactor",outcome:"success",severity:"minor"}:/\b(perf|optimize|speed|cache|latency|memory|performance)\b/.test(e)?{category:"perf",outcome:"success",severity:"major"}:/\b(security|cve|auth|csrf|xss|sql|injection|sanitize|escape|encrypt)\b/.test(e)?{category:"security",outcome:"success",severity:"critical"}:/\b(deploy|ci|cd|build|docker|k8s|helm|infra|devops)\b/.test(e)?{category:"deploy",outcome:"success",severity:"major"}:/\b(test|spec|coverage|assert|mock|unit|integration)\b/.test(e)?{category:"test",outcome:"success",severity:"minor"}:{category:"chore",outcome:"success",severity:"minor"}}function vr(t){return t.toLowerCase().replace(/[^a-z0-9\s\-_]/g," ").split(/\s+/).filter(r=>r.length>3&&!["that","this","with","from","when","into","also","some","were"].includes(r)).slice(0,3).join("-")||"general"}var me="[GESCHWAERZT]",ya=/x{12,}/i,ka=t=>/\d/.test(t)&&/[A-Za-z]/.test(t),lt=t=>/^[A-Z][A-Z0-9_]{2,}$/.test(t)||/environ|process\.env|secrets\./i.test(t),wa="(?!(?:localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|\\[::1\\])[:/\\s])",Ea=[{name:"privater Schluessel",re:/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g},{name:"AWS-Zugangsschluessel",re:/\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/g},{name:"GitHub-Token",re:/\b(?:gh[pousr]_[A-Za-z0-9]{30,}|github_pat_[A-Za-z0-9_]{40,})\b/g},{name:"GitLab-Token",re:/\bglpat-[A-Za-z0-9_-]{20,}\b/g},{name:"Slack-Token",re:/\bxox[abprs]-[A-Za-z0-9-]{10,}\b/g},{name:"Stripe-Schluessel",re:/\b[rs]k_(?:live|test)_[A-Za-z0-9]{16,}\b/g},{name:"KI-Anbieter-Schluessel",re:/\bsk-(?:ant-|proj-)?[A-Za-z0-9_-]{24,}\b/g},{name:"JWT",re:/\beyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g},{name:"Telegram-Bot-Token",re:/\b\d{8,10}:[A-Za-z0-9_-]{30,}\b/g},{name:"npm-Token",re:/\bnpm_[A-Za-z0-9]{36}\b/g},{name:"Google-API-Schluessel",re:/\bAIza[0-9A-Za-z_-]{35}\b/g},{name:"SendGrid-Schluessel",re:/\bSG\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}\b/g},{name:"Hugging-Face-Token",re:/\bhf_[A-Za-z0-9]{30,}\b/g},{name:"PyPI-Token",re:/\bpypi-[A-Za-z0-9_-]{40,}\b/g},{name:"Docker-Hub-Token",re:/\bdckr_pat_[A-Za-z0-9_-]{20,}\b/g},{name:"Resend-Schluessel",re:/\bre_[A-Za-z0-9_]{20,}\b/g,ausser:t=>!/\d/.test(t)},{name:"Bearer-Token",re:/\b(?:Bearer|Token)\s+((?![$<{])[A-Za-z0-9._~+/-]{20,}=*)/gi,gruppe:1},{name:"Basic-Auth-Kopfzeile",re:/\bauthorization\s*:\s*basic\s+((?![$<{])[A-Za-z0-9+/]{12,}={0,2})/gi,gruppe:1},{name:"Passwort in URL",re:new RegExp(`\\b[a-z][a-z0-9+.-]*:\\/\\/[^\\s:/@]+:((?![$<{])[^\\s/@]{6,})@${wa}`,"gi"),gruppe:1},{name:"Schluessel-Zuweisung",re:/(?:password|passwort|passwd|pwd|secret|client[_-]?secret|api[_-]?key|access[_-]?key|access[_-]?token|auth[_-]?token|private[_-]?key|secret[_-]?key|signing[_-]?key|encryption[_-]?key)["']?\s*[:=]\s*["']?((?![$<{%])[^\s"'`,;)]{8,})/gi,gruppe:1,ausser:lt},{name:"Token-Zuweisung",re:/token["']?\s*[:=]\s*["']?((?![$<{%])[^\s"'`,;)]{12,})/gi,gruppe:1,ausser:t=>lt(t)||!ka(t)},{name:"Passwort in Anfuehrungszeichen",re:/(?:password|passwort|kennwort|passwd)\s+(?:ist\s+|is\s+|lautet\s+)?["„“'‘]((?![$<{%])[^"”“'’\s]{6,})["”“'’]/gi,gruppe:1,ausser:lt},{name:"TOTP-Seed",re:/\b(?:totp|otp|mfa|2fa)[-_ ]?(?:seed|secret|key|schluessel)\s*[:=]?\s*["']?([A-Z2-7]{16,}=*)/gi,gruppe:1,ausser:t=>/^[a-z]+$/.test(t)}];function Sr(t){let e=String(t??""),n=[];for(let r of Ea)e=e.replace(r.re,(s,...i)=>{let o=r.gruppe===void 0?s:i[r.gruppe-1];return typeof o!="string"||!o||o.includes(me)||ya.test(o)||r.ausser?.(o)?s:(n.push(r.name),r.gruppe===void 0?me:s.replace(o,me))});return{text:e,funde:n}}var va=/\banweisung\w*|\binstruction\w*|\bausf(?:ue|ü)hr\w*|\bexecute\b|\bhochlad\w*|\bupload\w*|\bsende\w*|\berw(?:ae|ä)hn\w*|\blade\b[^>]{0,80}\bhoch\b|\b(?:an|to|for|fuer)\s+(?:den\s+|the\s+)?(?:ki-?)?(?:agent\w*|assistant|assistent\w*|llm|model\w*|sprachmodell\w*)\b|\b(?:agent|assistant)\s*:/i,_r=[{art:"injektion",name:"ueberschreiben-englisch",re:/\b(?:ignore|disregard|forget|override|bypass)\b[^.\n]{0,40}?\b(?:previous|prior|above|earlier|preceding|all|any|your)\b[^.\n]{0,30}?\b(?:instructions?|rules?|prompts?|guidelines?|directions?|policies|policy|restrictions?)\b/i},{art:"injektion",name:"ueberschreiben-deutsch",re:/\b(?:ignoriere|ignorier|missachte|vergiss|vergesse|uebergehe)\b[^.\n]{0,60}?\b(?:regeln|anweisungen|vorgaben|richtlinien|sicherheitsrichtlinien|sicherheitsregeln|instruktionen|rolle|systemprompt|einschraenkungen)\b/i},{art:"injektion",name:"fuer-ungueltig-erklaeren",re:/\b(?:vorherigen|bisherigen|frueheren|früheren|vorigen|previous|prior|earlier)\s+(?:anweisungen|regeln|instruktionen|instructions|rules)\s+(?:sind\s+|are\s+|is\s+|gelten\s+|werden\s+)?(?:ungueltig|ungültig|hinfaellig|hinfällig|aufgehoben|nichtig|void|invalid|obsolete|cancelled|revoked)\b/i},{art:"injektion",name:"rollenwechsel",re:/\b(?:du\s+bist\s+(?:jetzt|nun|ab\s+sofort)\s+(?:ein|eine|im|in|der|die|das|frei|ohne)\b|you\s+are\s+now\s+(?:acting\s+as|unrestricted|free\s+from|dan\b|in\s+(?:developer|maintenance|debug|god)\s+mode))/i},{art:"injektion",name:"versteckter-auftrag",re:/\b(?:versteckt\w*|geheim\w*|hidden|secret)\s+(?:auftrag|anweisung\w*|befehl\w*|instruction\w*|task|command)\b[^.\n]{0,30}\b(?:ausf(?:ue|ü)hr\w*|befolg\w*|erledig\w*|execute|follow|carry)|\b(?:ausf(?:ue|ü)hr\w*|befolg\w*|erledig\w*|execute|follow|carry)\w*\s+(?:den\s+|die\s+|the\s+)?(?:folgenden\s+|following\s+)?(?:versteckt\w*|geheim\w*|hidden|secret)\s+(?:auftrag|anweisung\w*|befehl\w*|instruction\w*|task|command)/i},{art:"injektion",name:"anrede-an-das-modell",re:/\b(?:hinweis|notiz|nachricht|anweisung)s?\s+an\s+(?:den\s+|das\s+)?(?:ki-?)?(?:agent\w*|assistent\w*|sprachmodell\w*|modell\w*|llm)\b|\b(?:hinweis|notiz|nachricht|anweisung)s?\s+(?:fuer|für)\s+(?:das\s+|den\s+)?(?:ki-?)?(?:sprachmodell\w*|modell\w*|llm|assistent\w*)\b|\b(?:note|message|instruction)s?\s+to\s+(?:the\s+)?(?:ai\s+)?(?:assistant|model|llm)\b|\b(?:note|message|instruction)s?\s+for\s+(?:the\s+)?(?:ai\s+)?(?:assistant|model|llm)\b/i},{art:"injektion",name:"anrede-an-den-agenten",re:/\ban\s+(?:den|die|das)\s+(?:ki-?)?(?:agent\w*|assistent\w*|sprachmodell\w*)\s*:/i},{art:"injektion",name:"anrede-an-den-leser",re:/\b(?:diese[nr]?|this)\s+(?:lektion|eintrag|notiz|nachricht|lesson|note|entry)\s+(?:liest|siehst|sieht|lesen|reads?|sees?)\b|\b(?:wenn|sobald|if|when)\s+(?:du|ihr|you)\s+(?:diese|dies|this)\b[^.\n]{0,30}\b(?:siehst|liest|findest|see|read|find)\b/i},{art:"injektion",name:"angeblicher-systembefehl",re:/\[\[?\s*(?:AGENT|KI|AI|ASSISTANT|SYSTEM)?[-_ ]?(?:ANWEISUNG|INSTRUCTIONS?|BEFEHL|PROMPT|OVERRIDE|INST)\s*\]\]?|(?:^|[.!?\n]\s*)(?:SYSTEM|ADMIN|ADMINISTRATOR|ASSISTANT|DEVELOPER|ENTWICKLER|OPERATOR)\s*:/},{art:"injektion",name:"neue-anweisung-von-oben",re:/\b(?:neue|new|geaenderte|updated)\s+(?:anweisung\w*|instructions?|regel\w*|rules?)\s+(?:vom|von|from)\s+(?:dem\s+|the\s+)?(?:entwickler|administrator|admin|nutzer|user|operator|system|developer|owner|besitzer)\b|-{2,10}\s*(?:ende|end)\s+(?:der|of)\s+(?:the\s+)?(?:lektion|notiz|anweisung|eingabe|lesson|note|input|prompt|instructions?)\s*-{2,10}/i},{art:"injektion",name:"vorrang-behauptet",re:/\b(?:hat|haben|has|have|takes?|nimmt)\s+(?:absoluten\s+|immer\s+)?(?:vorrang|prioritaet|priorität|precedence|priority)\s+(?:vor|over)\s+(?:dem\s+|der\s+|den\s+|allen?\s+|the\s+)?(?:system\w*|nutzer\w*|user|anweisungen|regeln|rules|instructions|sicherheits\w*|claude\.md)|\b(?:gehen|geht)\s+allem\s+(?:anderen\s+)?vor\b|\b(?:overrides?|supersedes?|ueberstimmt)\s+(?:the\s+|all\s+|alle\s+)?(?:system|user|developer|safety|sicherheits\w*|previous)/i},{art:"injektion",name:"freibrief-ohne-rueckfrage",re:/\b(?:pre-?approved|vorab\s+(?:genehmigt|freigegeben|bestaetigt))\b[^.\n]{0,40}\b(?:tool|werkzeug|befehl\w*|aufruf\w*|calls?|commands?|aktion\w*)|\b(?:bestaetige\w*|bestätige\w*|genehmige\w*|approve|confirm|accept)\s+(?:jede[ns]?|alle[ns]?|every|all)\b[^.\n]{0,40}\b(?:automatisch|automatically|ohne\s+nachfrage)|\b(?:ohne|without)\s+(?:den\s+|die\s+)?(?:nutzer|user|benutzer)\w*\s+(?:zu\s+fragen|zu\s+informieren|asking|informing)|\b(?:disable|deaktiviere\w*|schalte\w*)\b[^.\n]{0,40}\b(?:confirmation|bestaetigung\w*|rueckfrage\w*|sicherheitsabfrage\w*|safety\s+checks?)/i},{art:"injektion",name:"verheimlichen",re:/\berw(?:ae|ä)hne\w*\s+[^.\n]{0,40}\bnicht\b|\b(?:sag|sage)\s+(?:dem\s+|der\s+)?(?:nutzer|user|benutzer)\w*\s+nichts\b|\bohne\s+es\s+(?:zu\s+)?(?:melden|erwaehnen|erwähnen|berichten)\b|\b(?:do\s+not|don't|never)\s+(?:mention|tell|reveal|disclose|report)\b[^.\n]{0,40}\b(?:user|answer|response|note|this)\b/i},{art:"injektion",name:"versteckter-kommentar",re:/<!--[\s\S]{0,1000}?-->/,nur:t=>va.test(t)},{art:"injektion",name:"unsichtbare-zeichen",re:/[\u{E0000}-\u{E007F}\u{202A}-\u{202E}\u{2066}-\u{2069}]/u}],Sa="(?:\\.env\\b|\\benv\\b|\\bprintenv\\b|credentials|\\bsecrets?\\b|id_(?:rsa|ed25519|ecdsa|dsa)|\\.ssh|\\.aws|\\.npmrc|\\.netrc|\\.kube|kubeconfig|shadow|\\.pem\\b|private[_-]?key)",Ar=[{art:"befehl",name:"skript-aus-dem-netz-in-die-shell",re:/\b(?:curl|wget|fetch)\b[^|\n]{0,300}?\b(?:https?|ftp):\/\/[^|\n]{0,300}\|\s*(?:sudo\s+(?:-\w+\s+)?)?(?:(?:ba|z|da|k|a|c)?sh|python[0-9.]*|perl|ruby|node|php)\b|\b(?:ba|z|da)?sh\s+(?:-c\s+)?["']?\$?\(\s*(?:curl|wget)\b[^)\n]{0,300}:\/\/|\beval\s+["']?\$\(\s*(?:curl|wget)\b|\b(?:ba|z)?sh\s+<\(\s*(?:curl|wget)\b/i},{art:"befehl",name:"schluessel-per-pipe-wegschicken",re:new RegExp(`${Sa}[^\\n]{0,160}\\|\\s*(?:sudo\\s+)?(?:(?:curl|wget)\\b[^|\\n]{0,300}?(?:\\s@-|=@-|\\s-T\\s*-|--upload-file\\s+-|--data-binary\\s+@-|--post-file)|(?:nc|ncat|netcat|socat)\\s+\\S+\\s+\\d{2,5}\\b)`,"i")},{art:"befehl",name:"schluesseldatei-hochladen",re:/\bcurl\b[^\n]{0,300}?(?:-F\s*\S*=@|-d\s*@|--data(?:-binary|-raw|-urlencode)?\s*@|-T\s*|--upload-file\s*)\S*(?:\.env\b|id_(?:rsa|ed25519|ecdsa|dsa)|\.pem\b|\.key\b|credentials|\bsecrets?\b|\.npmrc|\.netrc|kubeconfig|shadow|passwd)/i},{art:"befehl",name:"loeschen-ohne-schutz",re:/\brm\s+(?:-{1,2}[A-Za-z-]+\s+)*(?:--no-preserve-root\b|(?:\/\*?|~\/?\*?|\$HOME\/?\*?|\/home\/\*|\/(?:etc|root|usr|var|boot|bin|sbin|lib|opt)\/?\*?)(?:[\s`"')]|$))|\bmkfs(?:\.\w+)?\s+\S*\/dev\/|\bdd\b[^\n]{0,200}\bof=\/dev\/(?:sd|nvme|hd|vd)|:\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;\s*:/},{art:"befehl",name:"rechte-weit-aufreissen",re:/\bchmod\s+(?:-\w+\s+)*0?777\b[^\n]{0,200}?\s(?:\/|\/etc|\/root|\/usr|\/var|\/home|~|\$HOME)(?:[\s`"')]|$)|NOPASSWD:\s*ALL\b|>>\s*\/etc\/sudoers|>>\s*\S*authorized_keys\b/},{art:"befehl",name:"container-mit-host-wurzel",re:/\bdocker\s+run\b[^\n]{0,300}(?:--privileged\b[^\n]{0,300}-v\s+\/:|-v\s+\/:[^\n]{0,300}--privileged\b)|\bchroot\s+\/host\b/},{art:"befehl",name:"netzbefehl-in-git-hook",re:/\b(?:curl|wget|nc)\b[^\n]{0,200}>>?\s*\S*\.git\/hooks\//}],xa=/"[^"\n]{2,400}"|„[^“”"\n]{2,400}[“”]|“[^”\n]{2,400}”|«[^»\n]{2,400}»|`[^`\n]{1,400}`/g;function _a(t){return t.replace(xa," ")}function xr(t,e){let n=[];for(let r of t){if(r.nur){let i=[...e.matchAll(new RegExp(r.re.source,r.re.flags.includes("g")?r.re.flags:r.re.flags+"g"))].find(o=>r.nur?.(o[0]));i&&n.push({art:r.art,regel:r.name,stelle:i[0]});continue}let s=r.re.exec(e);s&&n.push({art:r.art,regel:r.name,stelle:s[0]})}return n}function Aa(t){let e=String(t??"");if(!e)return[];let n=[];for(let r of Ta(e))for(let s of[...xr(_r,_a(r)),...xr(Ar,r)])n.some(i=>i.regel===s.regel)||n.push(s);return n}var gt=5e4;function Ta(t){return t.length<=gt?[t]:[t.slice(0,gt/2),t.slice(t.length-gt/2)]}function Tr(t){return Aa(t).map(({art:e,regel:n})=>({art:e,regel:n}))}function zr(t){let e=Array.isArray(t)?t.filter(n=>typeof n=="string"):[];return e.includes(U)?e:[...e,U]}var Bl=[..._r,...Ar].map(t=>t.name);var Ir=new Set(["instance_id","share_id","id","ts","timestamp","created_at","updated_at","imported_at","imported_from","source","outcome","severity","status","prev_status","level","visibility","scope","version","confidence","cert_id"]),za=new Set(["tags","author"]),Lr=8,Ia=2e3;function Nr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function La(t){let e=[],n=(r,s,i)=>{if(typeof r=="string"){let o=Sr(r);return e.push(...o.funde.map(a=>`${s||"text"}: ${a}`)),o.text}if(i>=Lr)return r;if(Array.isArray(r))return r.map(o=>n(o,s,i+1));if(Nr(r)){let o={};for(let[a,u]of Object.entries(r))o[a]=n(u,s?`${s}.${a}`:a,i+1);return o}return r};return{wert:n(t,"",0),funde:e}}function Na(t,e=Ir){let n=new Set,r=0,s=(i,o,a)=>{if(!(r>=Ia)){if(typeof i=="string"){r++;for(let u of Tr(i))n.add(`${o||"text"}: ${u.art}/${u.regel}`);return}if(!(a>=Lr)){if(Array.isArray(i))for(let u of i)s(u,o,a+1);else if(Nr(i))for(let[u,c]of Object.entries(i))e.has(u)||s(c,o?`${o}.${u}`:u,a+1)}}};return s(t,"",0),[...n]}function Rr(t){let e=La(t);return{felder:e.wert,geschwaerzt:e.funde,verdacht:Na(e.wert,new Set([...Ir,...za]))}}function Or(t,e){let n=Array.isArray(t)?t.filter(r=>typeof r=="string"):[];return e.length?zr(n):n}var Cr=12;function Pr(t,e,n=""){return["log",t,...n?[`--since=${n}`]:[],"--pretty=format:COMMIT|||%H|||%s|||%ad|||%an","--date=short","--no-merges","--name-only","-n",String(e)]}function Mr(t){let e=[],n=null;for(let r of t.split(`
37
- `)){let s=r.trim();if(s.startsWith("COMMIT|||")){n&&e.push(n);let[,i,o,a,u]=s.split("|||");n={sha:(i??"").trim(),subject:(o??"").trim(),date:(a??"").trim(),author:(u??"").trim(),files:[]}}else if(s&&n){let i=wr(s);i&&n.files.push(i)}}return n&&e.push(n),e}function Ra(t){let e=Rr({subject:t.subject,author:t.author,files:t.files.slice(0,Cr)}),n={...t,...e.felder},r={commit:n,geschwaerzt:e.geschwaerzt.length>0,verdacht:e.verdacht.length>0};if(!n.subject)return{...r,lektion:null};let{category:s,outcome:i,severity:o}=Er(n.subject),a=n.sha.slice(0,8);return{...r,lektion:{topic:`${s}:${vr(n.subject)}`,category:s,outcome:i,severity:o,what_worked:n.subject.slice(0,200),what_failed:"",context:`git:${a} by ${n.author} on ${n.date}`,author:n.author||void 0,file_paths:n.files.filter(u=>u.length>0).slice(0,Cr),commands:[`git show ${a}`],tags:Or(["brain_from_git",s,"git-history"],e.verdacht)}}}function jr(t){let e=new Map;for(let n of t){let{lektion:r}=Ra(n);r&&!e.has(r.topic)&&e.set(r.topic,r)}return[...e.values()]}import{execFile as Oa}from"node:child_process";import{homedir as Ca}from"node:os";import{basename as gg,isAbsolute as Pa,relative as Ma,resolve as be}from"node:path";var Hr=30;var pg=90*86400;function $r(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTVORRAT??"").trim())}function ja(t,e){let n=Ma(e,t);return n===""||!n.startsWith("..")&&!Pa(n)}function Ha(t,e){return process.platform==="win32"?t.toLowerCase()===e.toLowerCase():t===e}function Ur(t,e=process.env){let n=be(t),r=(e.CLAUDE_PLUGIN_ROOT??"").trim();if(r&&!r.includes("${")&&ja(n,be(r)))return"plugin-ordner";if(n.split(/[\\/]+/).some(i=>i==="node_modules"||i==="_npx"))return"paketordner";let s=e.HOME||e.USERPROFILE||Ca();return s&&Ha(n,be(s))?"heimordner":""}function Br(t){return new Promise(e=>{try{Oa("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,windowsHide:!0},(n,r)=>{let s=String(r??"").trim();e(n||!s?"":be(s))})}catch{e("")}})}import{closeSync as qa,existsSync as Sg,mkdirSync as pt,openSync as Ya,readFileSync as Xa,renameSync as Qa,statSync as ec,unlinkSync as tc,writeFileSync as Xr,writeSync as nc}from"node:fs";import{dirname as ve,join as Ee}from"node:path";import{existsSync as Wr,mkdirSync as $a,writeFileSync as Ua,renameSync as Ba,chmodSync as Wa,readFileSync as Fr}from"node:fs";import{resolve as Kr,dirname as Fa}from"node:path";function Ka(){return process.env.HOME??process.env.USERPROFILE??process.env.APPDATA??""}function ft(t){return/^\$\{[^}]*\}$/.test(t.trim())}function N(t){if(!(typeof t!="string"||t.length===0))return ft(t)?void 0:t}function ye(t={}){let e=t.home??Ka();return Kr(e,".cachly","credentials.json")}function ke(t,e={}){let n=J(e),r=n?.apiKey===t?N(n.instanceId):void 0;Zr({apiKey:t,...r?{instanceId:r}:{}},e)}function Dr(t,e){let n=J(e);!N(t)||!n?.apiKey||n.apiKey!==e.apiKey||n.instanceId!==t&&Zr({...n,instanceId:t},e)}function we(t={}){return N(J(t)?.instanceId)}function Gr(t={}){return N(J(t)?.apiKey)}function J(t){try{let e=ye(t);if(!Wr(e))return null;let n=JSON.parse(Fr(e,"utf8"));return n&&typeof n=="object"?n:null}catch{return null}}function Zr(t,e){try{let n=ye(e);$a(Fa(n),{recursive:!0});let r=`${n}.${process.pid}-${Date.now()}.tmp`;Ua(r,JSON.stringify(t,null,2),"utf8");try{Wa(r,384)}catch{}Ba(r,n)}catch{}}function Da(t){return N(J(t)?.apiKey)}function Ga(t){try{let e=Kr(t.cwd??process.cwd(),".mcp.json");if(!Wr(e))return;let n=JSON.parse(Fr(e,"utf8"));return N(n.mcpServers?.cachly?.env?.CACHLY_JWT)}catch{return}}function Vr(t={}){let e=t.env??process.env;return N(e.CACHLY_JWT)??N(e.CACHLY_API_KEY)??Da(t)??Ga(t)}function Za(t,e=process.env){let n=e.CACHLY_QUELLE?.trim();return`${n&&/^[a-z0-9-]{1,40}$/.test(n)?`cachly-${n}`:"cachly-mcp"}/${t}`}function Va(t){return`${t.replace(/\/+$/,"")}/auth/instant-trial`}function Ja(t){if(!t||typeof t!="object")return null;let e=t,n=typeof e.api_key=="string"?e.api_key:"",r=typeof e.instance_id=="string"?e.instance_id:"";return!n||!r?null:{apiKey:n,instanzId:r,tarifEndetAm:typeof e.trial_ends_at=="string"?e.trial_ends_at:void 0}}var dt=8e3,Jr=!1;async function qr(t){if(Jr)return null;Jr=!0;let e=t.holen??fetch,n=t.speichern??ke;try{let r=await e(Va(t.apiUrl),{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","User-Agent":Za(t.version,t.env??process.env)},body:"{}",signal:AbortSignal.timeout(t.fristMs??dt)});if(!r.ok)return null;let s=Ja(await r.json());return s?(n(s.apiKey),s):null}catch{return null}}var Qr=15e3,rc=100,es=600*1e3,Tg=1440*60*1e3,ts="anlegen.lock",sc="anlegen.fehler",ic="startwissen-auftrag.json";function Se(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTWISSEN??"").trim())}function mt(t){return ve(ye(t))}var oc=t=>new Promise(e=>setTimeout(e,t));function Yr(t){return{apiKey:Gr(t),instanzId:we(t)}}function ac(t,e){try{pt(ve(t),{recursive:!0})}catch{return"kein-zugriff"}try{let n=Ya(t,"wx",384);try{nc(n,`${process.pid} ${e}`)}finally{qa(n)}return"ja"}catch(n){return n?.code==="EEXIST"?"belegt":"kein-zugriff"}}function bt(t,e){try{return e-ec(t).mtimeMs}catch{return null}}function ht(t){try{tc(t)}catch{}}function cc(t,e=Date.now()){let n=bt(Ee(mt(t),ts),e);return n!==null&&n<Qr}function uc(t,e,n){if(e<=0)return!1;let r=null;try{let i=Number(Xa(t,"utf8").trim());Number.isFinite(i)&&i>0&&(r=i)}catch{}let s=r!==null?n-r:bt(t,n);return s!==null&&s>=0&&s<e}function lc(t,e){try{pt(ve(t),{recursive:!0}),Xr(t,String(e),{mode:384})}catch{}}async function ns(t){let e=t.jetzt??Date.now,n=t.schlafen??oc,r=e()+t.fristMs,s=mt(t),i=Ee(s,ts),o=Ee(s,sc);try{for(;;){let a=Yr(t);if(a.apiKey&&(a.instanzId||!cc(t,e())))return{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId};if(!a.apiKey){let u=ac(i,e());if(u==="kein-zugriff")return{art:"gescheitert",grund:"kein-schreibzugriff"};if(u==="ja")try{let l=Yr(t);if(l.apiKey)return{art:"vorhanden",apiKey:l.apiKey,instanzId:l.instanzId};if(uc(o,t.abkuehlungMs??0,e()))return{art:"gescheitert",grund:"abgekuehlt"};let g=Math.max(500,r-e()),f=await qr({apiUrl:t.apiUrl,version:t.version,holen:t.holen,env:t.env,fristMs:Math.min(g,t.anfrageMs??dt),speichern:d=>ke(d,t)});return f?(Dr(f.instanzId,{...t,apiKey:f.apiKey}),ht(o),{art:"angelegt",test:f}):(lc(o,e()),{art:"gescheitert",grund:"kein-test"})}finally{ht(i)}let c=bt(i,e());c!==null&&c>=Qr&&ht(i)}if(e()>=r)return a.apiKey?{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId}:{art:"gescheitert",grund:"sperre-belegt"};await n(rc)}}catch{return{art:"gescheitert",grund:"kein-test"}}}function yt(t,e={}){try{let n=Ee(mt(e),ic);pt(ve(n),{recursive:!0});let r=`${n}.${process.pid}.tmp`;Xr(r,JSON.stringify({...t,am:new Date().toISOString()}),{mode:384}),Qa(r,n)}catch{}}var q="startwissen-import",fc=9e4,ss=1e3,dc=3,is=8e3,rs=3,os=t=>new Promise(e=>setTimeout(e,t));function hc(t){return jr(t).map(e=>({topic:e.topic,outcome:e.outcome,what_worked:e.what_worked,what_failed:e.what_failed,context:e.context,severity:e.severity,tags:e.tags,commands:e.commands,file_paths:e.file_paths,source:"brain_from_git",...e.author?{author:e.author}:{}}))}function pc(){return ut.map(t=>({topic:t.topic,outcome:t.outcome,what_worked:t.what_worked,what_failed:t.what_failed,context:t.ctx,tags:t.tags,commands:[],file_paths:[],source:"starter"}))}function mc(t){return kr(t,Pr("HEAD",Hr),{timeoutMs:2e4})}var bc={brain_from_git:.55,starter:.9};function yc(t,e=new Date){let n=e.toISOString();return t.map(r=>({...r,severity:r.severity||"major",recall_count:0,confidence:bc[r.source],ts:n,verified_at:n}))}async function kc(t){let e=t.fetchFn??fetch,n=t.jetzt??Date.now,r=t.schlafen??os,s=n()+(t.bereitFristMs??fc);for(;;){try{let i=await e(`${t.cfg.apiUrl}/api/v1/instances/${t.cfg.instanceId}/export`,{headers:{Authorization:`Bearer ${t.cfg.jwt}`},signal:AbortSignal.timeout(is)});if(i.status===401||i.status===403)return"nicht-bereit";if(i.ok){let o=await i.json();if(Array.isArray(o?.lessons)&&o.lessons.length>0)return"hat-lektionen";if(Array.isArray(o?.lessons)&&!o.note)return"leer"}}catch{}if(n()>=s)return"nicht-bereit";await r(ss)}}async function wc(t,e){let n=t.fetchFn??fetch,r=t.schlafen??os,s=0,i=0,o=async()=>{for(;s<e.length;){let a=e[s++];for(let u=1;u<=rs;u++){try{let c=await n(`${t.cfg.apiUrl}/api/v1/instances/${t.cfg.instanceId}/learn`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.cfg.jwt}`},body:JSON.stringify(a),signal:AbortSignal.timeout(is)});if(c.ok){i++;break}if(c.status!==409&&c.status!==429&&c.status<500)break}catch{}u<rs&&await r(ss*u)}}};return await Promise.all(Array.from({length:Math.min(dc,e.length)},o)),i}async function as(t){try{if(!Se(t.env))return{art:"aus"};let e=gc(t.projekt||"."),n=await(t.gitWurzel??Br)(e),r,s;if(n){let a=Ur(n,t.env);if(a)return{art:"ausgeschlossen",grund:a};r="git";let u="";try{u=(t.gitLog??mc)(n)}catch{}if(s=hc(Mr(u)),s.length===0)return{art:r,lektionen:0,gesendet:0}}else{if(!$r(t.env))return{art:"kein-repo"};r="startvorrat",s=pc()}dr(t.cfg.instanceId,yc(s));let i=await kc(t);if(i==="hat-lektionen"&&await L(t.cfg,{force:!0,vorabSchliessen:!0,fetchFn:t.fetchFn}),i!=="leer")return{art:i};let o=await wc(t,s);return o>0&&await L(t.cfg,{force:!0,vorabSchliessen:!0,fetchFn:t.fetchFn}),{art:r,lektionen:s.length,gesendet:o}}catch(e){return{art:"fehler",grund:e instanceof Error?e.message:String(e)}}}function cs(t){if((t.art==="git"||t.art==="startvorrat")&&t.gesendet>0)return{art:t.art,lektionen:t.gesendet}}import{appendFile as Ec,readFile as vc,rename as Sc,writeFile as xc}from"node:fs/promises";import{mkdir as _c}from"node:fs/promises";import{homedir as Ac}from"node:os";import{dirname as Tc,resolve as zc}from"node:path";function Ic(){return zc(Ac(),".cachly","ambient-ledger.jsonl")}function Lc(t){return JSON.stringify({ts:t.ts,event:t.event,injected:Math.max(0,Math.round(t.injected)),prevented:Math.max(0,Math.round(t.prevented)),...t.note?{note:t.note.slice(0,200)}:{}})}var Nc=256*1024,Rc=400;async function us(t,e=Ic()){try{await _c(Tc(e),{recursive:!0}),await Ec(e,Lc(t)+`
37
+ `)){let s=r.trim();if(s.startsWith("COMMIT|||")){n&&e.push(n);let[,i,o,a,u]=s.split("|||");n={sha:(i??"").trim(),subject:(o??"").trim(),date:(a??"").trim(),author:(u??"").trim(),files:[]}}else if(s&&n){let i=wr(s);i&&n.files.push(i)}}return n&&e.push(n),e}function Ra(t){let e=Rr({subject:t.subject,author:t.author,files:t.files.slice(0,Cr)}),n={...t,...e.felder},r={commit:n,geschwaerzt:e.geschwaerzt.length>0,verdacht:e.verdacht.length>0};if(!n.subject)return{...r,lektion:null};let{category:s,outcome:i,severity:o}=Er(n.subject),a=n.sha.slice(0,8);return{...r,lektion:{topic:`${s}:${vr(n.subject)}`,category:s,outcome:i,severity:o,what_worked:n.subject.slice(0,200),what_failed:"",context:`git:${a} by ${n.author} on ${n.date}`,author:n.author||void 0,file_paths:n.files.filter(u=>u.length>0).slice(0,Cr),commands:[`git show ${a}`],tags:Or(["brain_from_git",s,"git-history"],e.verdacht)}}}function jr(t){let e=new Map;for(let n of t){let{lektion:r}=Ra(n);r&&!e.has(r.topic)&&e.set(r.topic,r)}return[...e.values()]}import{execFile as Oa}from"node:child_process";import{homedir as Ca}from"node:os";import{basename as gg,isAbsolute as Pa,relative as Ma,resolve as be}from"node:path";var Hr=30;var pg=90*86400;function $r(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTVORRAT??"").trim())}function ja(t,e){let n=Ma(e,t);return n===""||!n.startsWith("..")&&!Pa(n)}function Ha(t,e){return process.platform==="win32"?t.toLowerCase()===e.toLowerCase():t===e}function Ur(t,e=process.env){let n=be(t),r=(e.CLAUDE_PLUGIN_ROOT??"").trim();if(r&&!r.includes("${")&&ja(n,be(r)))return"plugin-ordner";if(n.split(/[\\/]+/).some(i=>i==="node_modules"||i==="_npx"))return"paketordner";let s=e.HOME||e.USERPROFILE||Ca();return s&&Ha(n,be(s))?"heimordner":""}function Br(t){return new Promise(e=>{try{Oa("git",["rev-parse","--show-toplevel"],{cwd:t,timeout:5e3,windowsHide:!0},(n,r)=>{let s=String(r??"").trim();e(n||!s?"":be(s))})}catch{e("")}})}import{closeSync as qa,existsSync as Sg,mkdirSync as pt,openSync as Ya,readFileSync as Xa,renameSync as Qa,statSync as ec,unlinkSync as tc,writeFileSync as Xr,writeSync as nc}from"node:fs";import{dirname as ve,join as Ee}from"node:path";import{existsSync as Wr,mkdirSync as $a,writeFileSync as Ua,renameSync as Ba,chmodSync as Wa,readFileSync as Fr}from"node:fs";import{resolve as Kr,dirname as Fa}from"node:path";function Ka(){return process.env.HOME??process.env.USERPROFILE??process.env.APPDATA??""}function ft(t){return/^\$\{[^}]*\}$/.test(t.trim())}function N(t){if(!(typeof t!="string"||t.length===0))return ft(t)?void 0:t}function ye(t={}){let e=t.home??Ka();return Kr(e,".cachly","credentials.json")}function ke(t,e={}){let n=J(e),r=n?.apiKey===t?N(n.instanceId):void 0;Zr({apiKey:t,...r?{instanceId:r}:{}},e)}function Dr(t,e){let n=J(e);!N(t)||!n?.apiKey||n.apiKey!==e.apiKey||n.instanceId!==t&&Zr({...n,instanceId:t},e)}function we(t={}){return N(J(t)?.instanceId)}function Gr(t={}){return N(J(t)?.apiKey)}function J(t){try{let e=ye(t);if(!Wr(e))return null;let n=JSON.parse(Fr(e,"utf8"));return n&&typeof n=="object"?n:null}catch{return null}}function Zr(t,e){try{let n=ye(e);$a(Fa(n),{recursive:!0});let r=`${n}.${process.pid}-${Date.now()}.tmp`;Ua(r,JSON.stringify(t,null,2),"utf8");try{Wa(r,384)}catch{}Ba(r,n)}catch{}}function Da(t){return N(J(t)?.apiKey)}function Ga(t){try{let e=Kr(t.cwd??process.cwd(),".mcp.json");if(!Wr(e))return;let n=JSON.parse(Fr(e,"utf8"));return N(n.mcpServers?.cachly?.env?.CACHLY_JWT)}catch{return}}function Vr(t={}){let e=t.env??process.env;return N(e.CACHLY_JWT)??N(e.CACHLY_API_KEY)??Da(t)??Ga(t)}function Za(t,e=process.env){let n=e.CACHLY_QUELLE?.trim();return`${n&&/^[a-z0-9-]{1,40}$/.test(n)?`cachly-${n}`:"cachly-mcp"}/${t}`}function Va(t){return`${t.replace(/\/+$/,"")}/auth/instant-trial`}function Ja(t){if(!t||typeof t!="object")return null;let e=t,n=typeof e.api_key=="string"?e.api_key:"",r=typeof e.instance_id=="string"?e.instance_id:"";return!n||!r?null:{apiKey:n,instanzId:r,tarifEndetAm:typeof e.trial_ends_at=="string"?e.trial_ends_at:void 0}}var dt=8e3,Jr=!1;async function qr(t){if(Jr)return null;Jr=!0;let e=t.holen??fetch,n=t.speichern??ke;try{let r=await e(Va(t.apiUrl),{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","User-Agent":Za(t.version,t.env??process.env)},body:"{}",signal:AbortSignal.timeout(t.fristMs??dt)});if(!r.ok)return null;let s=Ja(await r.json());return s?(n(s.apiKey),s):null}catch{return null}}var Qr=15e3,rc=100,es=600*1e3,Tg=1440*60*1e3,ts="anlegen.lock",sc="anlegen.fehler",ic="startwissen-auftrag.json";function Se(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTWISSEN??"").trim())}function mt(t){return ve(ye(t))}var oc=t=>new Promise(e=>setTimeout(e,t));function Yr(t){return{apiKey:Gr(t),instanzId:we(t)}}function ac(t,e){try{pt(ve(t),{recursive:!0})}catch{return"kein-zugriff"}try{let n=Ya(t,"wx",384);try{nc(n,`${process.pid} ${e}`)}finally{qa(n)}return"ja"}catch(n){return n?.code==="EEXIST"?"belegt":"kein-zugriff"}}function bt(t,e){try{return e-ec(t).mtimeMs}catch{return null}}function ht(t){try{tc(t)}catch{}}function cc(t,e=Date.now()){let n=bt(Ee(mt(t),ts),e);return n!==null&&n<Qr}function uc(t,e,n){if(e<=0)return!1;let r=null;try{let i=Number(Xa(t,"utf8").trim());Number.isFinite(i)&&i>0&&(r=i)}catch{}let s=r!==null?n-r:bt(t,n);return s!==null&&s>=0&&s<e}function lc(t,e){try{pt(ve(t),{recursive:!0}),Xr(t,String(e),{mode:384})}catch{}}async function ns(t){let e=t.jetzt??Date.now,n=t.schlafen??oc,r=e()+t.fristMs,s=mt(t),i=Ee(s,ts),o=Ee(s,sc);try{for(;;){let a=Yr(t);if(a.apiKey&&(a.instanzId||!cc(t,e())))return{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId};if(!a.apiKey){let u=ac(i,e());if(u==="kein-zugriff")return{art:"gescheitert",grund:"kein-schreibzugriff"};if(u==="ja")try{let l=Yr(t);if(l.apiKey)return{art:"vorhanden",apiKey:l.apiKey,instanzId:l.instanzId};if(uc(o,t.abkuehlungMs??0,e()))return{art:"gescheitert",grund:"abgekuehlt"};let g=Math.max(500,r-e()),f=await qr({apiUrl:t.apiUrl,version:t.version,holen:t.holen,env:t.env,fristMs:Math.min(g,t.anfrageMs??dt),speichern:d=>ke(d,t)});return f?(Dr(f.instanzId,{...t,apiKey:f.apiKey}),ht(o),{art:"angelegt",test:f}):(lc(o,e()),{art:"gescheitert",grund:"kein-test"})}finally{ht(i)}let c=bt(i,e());c!==null&&c>=Qr&&ht(i)}if(e()>=r)return a.apiKey?{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId}:{art:"gescheitert",grund:"sperre-belegt"};await n(rc)}}catch{return{art:"gescheitert",grund:"kein-test"}}}function yt(t,e={}){try{let n=Ee(mt(e),ic);pt(ve(n),{recursive:!0});let r=`${n}.${process.pid}.tmp`;Xr(r,JSON.stringify({...t,am:new Date().toISOString()}),{mode:384}),Qa(r,n)}catch{}}var q="startwissen-import",fc=9e4,ss=1e3,dc=3,is=8e3,rs=3,os=t=>new Promise(e=>setTimeout(e,t));function hc(t){return jr(t).map(e=>({topic:e.topic,outcome:e.outcome,what_worked:e.what_worked,what_failed:e.what_failed,context:e.context,severity:e.severity,tags:e.tags,commands:e.commands,file_paths:e.file_paths,source:"brain_from_git",...e.author?{author:e.author}:{}}))}function pc(){return ut.map(t=>({topic:t.topic,outcome:t.outcome,what_worked:t.what_worked,what_failed:t.what_failed,context:t.ctx,tags:t.tags,commands:[],file_paths:[],source:"starter"}))}function mc(t){return kr(t,Pr("HEAD",Hr),{timeoutMs:2e4})}var bc={brain_from_git:.55,starter:.9};function yc(t,e=new Date){let n=e.toISOString();return t.map(r=>({...r,severity:r.severity||"major",recall_count:0,confidence:bc[r.source],ts:n,verified_at:n}))}async function kc(t){let e=t.fetchFn??fetch,n=t.jetzt??Date.now,r=t.schlafen??os,s=n()+(t.bereitFristMs??fc);for(;;){try{let i=await e(`${t.cfg.apiUrl}/api/v1/instances/${t.cfg.instanceId}/export`,{headers:{Authorization:`Bearer ${t.cfg.jwt}`},signal:AbortSignal.timeout(is)});if(i.status===401||i.status===403)return"nicht-bereit";if(i.ok){let o=await i.json();if(Array.isArray(o?.lessons)&&o.lessons.length>0)return"hat-lektionen";if(Array.isArray(o?.lessons)&&!o.note)return"leer"}}catch{}if(n()>=s)return"nicht-bereit";await r(ss)}}async function wc(t,e){let n=t.fetchFn??fetch,r=t.schlafen??os,s=0,i=0,o=async()=>{for(;s<e.length;){let a=e[s++];for(let u=1;u<=rs;u++){try{let c=await n(`${t.cfg.apiUrl}/api/v1/instances/${t.cfg.instanceId}/learn`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.cfg.jwt}`},body:JSON.stringify(a),signal:AbortSignal.timeout(is)});if(c.ok){i++;break}if(c.status!==409&&c.status!==429&&c.status<500)break}catch{}u<rs&&await r(ss*u)}}};return await Promise.all(Array.from({length:Math.min(dc,e.length)},o)),i}async function as(t){try{if(!Se(t.env))return{art:"aus"};let e=gc(t.projekt||"."),n=await(t.gitWurzel??Br)(e),r,s;if(n){let a=Ur(n,t.env);if(a)return{art:"ausgeschlossen",grund:a};r="git";let u="";try{u=(t.gitLog??mc)(n)}catch{}if(s=hc(Mr(u)),s.length===0)return{art:r,lektionen:0,gesendet:0}}else{if(!$r(t.env))return{art:"kein-repo"};r="startvorrat",s=pc()}dr(t.cfg.instanceId,yc(s));let i=await kc(t);if(i==="hat-lektionen"&&await L(t.cfg,{force:!0,vorabSchliessen:!0,fetchFn:t.fetchFn}),i!=="leer")return{art:i};let o=await wc(t,s);return o>0&&await L(t.cfg,{force:!0,vorabSchliessen:!0,fetchFn:t.fetchFn}),{art:r,lektionen:s.length,gesendet:o}}catch(e){return{art:"fehler",grund:e instanceof Error?e.message:String(e)}}}function cs(t){if((t.art==="git"||t.art==="startvorrat")&&t.gesendet>0)return{art:t.art,lektionen:t.gesendet}}import{appendFile as Ec,readFile as vc,rename as Sc,writeFile as xc}from"node:fs/promises";import{mkdir as _c}from"node:fs/promises";import{homedir as Ac}from"node:os";import{dirname as Tc,resolve as zc}from"node:path";function Ic(){return zc(Ac(),".cachly","ambient-ledger.jsonl")}function Lc(t){return JSON.stringify({ts:t.ts,event:t.event,injected:Math.max(0,Math.round(t.injected)),prevented:Math.max(0,Math.round(t.prevented)),...t.note?{note:t.note.slice(0,200)}:{},...t.instanz?{instanz:t.instanz}:{}})}var Nc=256*1024,Rc=400;async function us(t,e=Ic()){try{await _c(Tc(e),{recursive:!0}),await Ec(e,Lc(t)+`
38
38
  `,"utf-8");let n=await vc(e,"utf-8");if(Buffer.byteLength(n,"utf-8")>Nc){let s=n.split(`
39
39
  `).filter(Boolean).slice(-Rc).join(`
40
40
  `)+`
@@ -42,4 +42,4 @@ ${re(s)}
42
42
  `)}function _e(t=process.env){return{env:t,heim:t.HOME||t.USERPROFILE||jc(),projekt:t.CLAUDE_PROJECT_DIR||process.cwd()}}function Y(t){try{return JSON.parse(Mc(t,"utf8"))}catch{return null}}function fs(t){return[v(t.heim,".claude","mcp.json"),v(t.projekt,".mcp.json"),v(t.heim,".cursor","mcp.json"),v(t.heim,".codeium","windsurf","mcp_config.json")].map(e=>{let n=Y(e)?.mcpServers?.cachly?.env;return n&&typeof n=="object"?n:{}})}function ds(...t){for(let e of t){let n=xe(e);if(n)return n}return""}function Ae(t){return ds(t.env.CLAUDE_PLUGIN_OPTION_API_KEY,Vr({env:t.env,home:t.heim,cwd:t.projekt}),...fs(t).map(e=>e.CACHLY_JWT))}function Te(t){return ds(t.env.CLAUDE_PLUGIN_OPTION_INSTANCE_ID,t.env.CACHLY_BRAIN_INSTANCE_ID,we({home:t.heim}),...fs(t).map(e=>e.CACHLY_BRAIN_INSTANCE_ID))}function hs(t){let e=xe(t.env.CLAUDE_PLUGIN_ROOT);if(!e)return"unbekannt";let n=Y(v(e,".claude-plugin","plugin.json"))?.version;return typeof n=="string"&&/^\d[0-9A-Za-z.+-]{0,30}$/.test(n)?n:"unbekannt"}var wt="cachly-ambient-";function ps(t){return[v(t.projekt,".cursor","hooks.json"),v(t.heim,".cursor","hooks.json")].some(e=>{let n=Y(e)?.hooks;return!!n&&typeof n=="object"&&Object.values(n).some(r=>Array.isArray(r)&&r.some(s=>String(s?.command??"").includes(wt)))})}function Hc(t){let e=t;return[e?.command,e?.bash,e?.powershell].some(n=>String(n??"").includes(wt))}function ms(t){let e=t.env.COPILOT_HOME?v(t.env.COPILOT_HOME,"hooks"):v(t.heim,".copilot","hooks");return[v(t.projekt,".github","hooks"),e].some(n=>{let r;try{r=Pc(n).filter(s=>s.endsWith(".json"))}catch{return!1}return r.some(s=>{let i=Y(v(n,s))?.hooks;return!!i&&typeof i=="object"&&Object.values(i).some(o=>Array.isArray(o)&&o.some(Hc))})})}function bs(t,e){return[v(e.projekt,".claude","settings.json"),v(e.projekt,".claude","settings.local.json"),v(e.heim,".claude","settings.json")].some(n=>{let r=Y(n)?.hooks?.[t];return Array.isArray(r)&&r.some(s=>Array.isArray(s?.hooks)&&s.hooks.some(i=>String(i?.command??"").includes(wt)))})}import{createHash as $c}from"node:crypto";import{mkdirSync as Uc,readFileSync as Bc,renameSync as Wc,rmSync as ks,writeFileSync as Fc}from"node:fs";import{tmpdir as Kc}from"node:os";import{join as St}from"node:path";var Q="--cursor";var Et={sessionStart:"sessionStart",SessionStart:"sessionStart",beforeSubmitPrompt:"beforeSubmitPrompt",UserPromptSubmit:"beforeSubmitPrompt",postToolUse:"postToolUse",PostToolUse:"postToolUse"};function xt(t){let e=t?.cursor_version;return typeof e=="string"&&e.trim()!==""}function ze(t,e){let n=t?.hook_event_name??e.find(r=>Object.hasOwn(Et,r));return n&&Object.hasOwn(Et,n)?Et[n]:null}function Dc(t,e){let n=e.conversation_id??e.session_id,r=e.workspace_roots?.[0];return t==="sessionStart"?{hook_event_name:"SessionStart",source:"startup",session_id:n,cwd:r}:{hook_event_name:"UserPromptSubmit",prompt:e.prompt??"",session_id:n,cwd:r}}function R(t){if(!t)return"";try{let e=JSON.parse(t)?.hookSpecificOutput?.additionalContext;return typeof e=="string"?e:""}catch{return""}}function vt(t,e){return t==="beforeSubmitPrompt"?JSON.stringify({continue:!0}):e?JSON.stringify({additional_context:e}):"{}"}function X(t){return t?vt(t,""):""}var Gc=St(Kc(),"cachly-cursor-einblendung");function H(t,e=Gc){return St(e,`${$c("sha256").update(t).digest("hex").slice(0,32)}.json`)}function Ie(t,e,n){if(!n){ks(t,{force:!0});return}Uc(St(t,".."),{recursive:!0});let r={generation_id:e??null,kontext:n,at:Date.now()};Fc(t,JSON.stringify(r),"utf8")}function ys(t){try{let e=JSON.parse(Bc(t,"utf8"));return e&&typeof e.kontext=="string"?e:null}catch{return null}}function _t(t,e){let n=e??null,r=ys(t);if(!r||r.generation_id!==n)return"";let s=`${t}.${process.pid}.${Date.now()}`;try{Wc(t,s)}catch{return""}let i=ys(s);return ks(s,{force:!0}),i&&i.generation_id===n?i.kontext:""}async function ws(t){let e=ze(t.payload,t.args);if(!e)return"";try{let n=t.payload??{};if(e==="postToolUse")return n.conversation_id?vt(e,_t(H(n.conversation_id,t.ablageOrdner),n.generation_id)):X(e);if(e==="beforeSubmitPrompt"&&!n.conversation_id)return X(e);let r=Dc(e,n),s=R(await t.claudeLauf(JSON.stringify(r),r.hook_event_name));return e==="beforeSubmitPrompt"&&Ie(H(n.conversation_id,t.ablageOrdner),n.generation_id,s),vt(e,s)}catch{return X(e)}}import{tmpdir as Zc}from"node:os";import{join as Vc}from"node:path";var Le="--copilot";var At={sessionStart:"sessionStart",SessionStart:"sessionStart",userPromptSubmitted:"userPromptSubmitted",UserPromptSubmit:"userPromptSubmitted",postToolUse:"postToolUse",PostToolUse:"postToolUse"};function Tt(t,e){let n=t?.hook_event_name??e.find(r=>Object.hasOwn(At,r));return n&&Object.hasOwn(At,n)?At[n]:null}function Jc(t){return typeof t?.hook_event_name=="string"&&t.hook_event_name!==""?"vscode":"cli"}function vs(t){let e=t.session_id??t.sessionId;return typeof e=="string"&&e!==""?e:void 0}function qc(t,e){let n=vs(e),r=typeof e.cwd=="string"?e.cwd:void 0;return t==="sessionStart"?{hook_event_name:"SessionStart",source:typeof e.source=="string"?e.source:"startup",session_id:n,cwd:r}:{hook_event_name:"UserPromptSubmit",prompt:typeof e.prompt=="string"?e.prompt:"",session_id:n,cwd:r}}var Yc={sessionStart:"SessionStart",userPromptSubmitted:"UserPromptSubmit",postToolUse:"PostToolUse"};function Es(t,e,n){return n?e==="cli"?t==="userPromptSubmitted"?"{}":JSON.stringify({additionalContext:n}):JSON.stringify({hookSpecificOutput:{hookEventName:Yc[t],additionalContext:n}}):"{}"}function zt(t){let e=t?.timestamp;return typeof e=="string"&&e!==""||typeof e=="number"}var Xc=Vc(Zc(),"cachly-copilot-einblendung");async function Ss(t){let e=Tt(t.payload,t.args);if(!e)return"";try{let n=t.payload??{},r=Jc(n),s=vs(n),i=t.ablageOrdner??Xc;if(e==="postToolUse")return r==="vscode"||!s?"{}":Es(e,r,_t(H(s,i),void 0));let o=e==="userPromptSubmitted"&&r==="cli";if(o){if(!s)return"{}";Ie(H(s,i),void 0,"")}let a=qc(e,n),u=R(await t.claudeLauf(JSON.stringify(a),a.hook_event_name));return o&&Ie(H(s,i),void 0,u),Es(e,r,u)}catch{return"{}"}}var It="--codex",Qc=["SessionStart","UserPromptSubmit"];var xs=new Set(Qc);function eu(t,e){let n=t?.hook_event_name??e.find(r=>xs.has(r));return n&&xs.has(n)?n:null}function tu(t,e){let n=typeof e.session_id=="string"?e.session_id:void 0,r=typeof e.cwd=="string"?e.cwd:void 0;return t==="SessionStart"?{hook_event_name:"SessionStart",source:typeof e.source=="string"?e.source:"startup",session_id:n,cwd:r}:{hook_event_name:"UserPromptSubmit",prompt:typeof e.prompt=="string"?e.prompt:"",session_id:n,cwd:r}}async function _s(t){let e=eu(t.payload,t.args);if(!e)return"";try{let n=tu(e,t.payload??{});return j(e,R(await t.claudeLauf(JSON.stringify(n),e)))}catch{return""}}var Ne="--gemini",nu=["SessionStart","BeforeAgent"],As=new Set(nu);function Lt(t,e){let n=t?.hook_event_name??e.find(r=>As.has(r));return n&&As.has(n)?n:null}function ru(t,e){let n=typeof e.session_id=="string"?e.session_id:void 0,r=typeof e.cwd=="string"?e.cwd:void 0;return t==="SessionStart"?{hook_event_name:"SessionStart",source:typeof e.source=="string"?e.source:"startup",session_id:n,cwd:r}:{hook_event_name:"UserPromptSubmit",prompt:typeof e.prompt=="string"?e.prompt:"",session_id:n,cwd:r}}function su(t,e){return e?JSON.stringify({hookSpecificOutput:{hookEventName:t,additionalContext:e}}):"{}"}async function Ts(t){let e=Lt(t.payload,t.args);if(!e)return"";try{let n=ru(e,t.payload??{});return su(e,R(await t.claudeLauf(JSON.stringify(n),n.hook_event_name)))}catch{return"{}"}}var au="https://api.cachly.dev",zs=5e3,Rt="ambient-auffrischen",Is=new Set(["SessionStart","UserPromptSubmit","PreToolUse","Stop"]);async function cu(t,e){if(!t.args.includes(Q)&&(ze(e,t.args)!=="sessionStart"||ps(t.umfeld)))return"";let r=t.args.filter(s=>s==="--plugin");return ws({payload:e,args:t.args,claudeLauf:(s,i)=>Ot({...t,raw:s,args:[i,...r]}),ablageOrdner:t.cursorAblage})}function uu(t,e){let n=(r,s)=>Ot({...t,raw:r,args:[s]});return t.args.includes(Le)?Ss({payload:e,args:t.args,claudeLauf:n,ablageOrdner:t.copilotAblage}):t.args.includes(It)?_s({payload:e,args:t.args,claudeLauf:n}):t.args.includes(Ne)?Ts({payload:e,args:t.args,claudeLauf:n}):null}function lu(t,e){return t.includes(Q)||xt(e)?"cursor":t.includes(Le)?"copilot":t.includes(It)?"codex":t.includes(Ne)?"gemini":zt(e)?"vscode":"claude"}async function gu(t){let e=await ns({apiUrl:t.apiUrl,version:hs(t.umfeld),home:t.umfeld.heim,env:{...t.umfeld.env,CACHLY_QUELLE:"claude-code-plugin"},fristMs:zs,anfrageMs:zs,abkuehlungMs:es,holen:t.fetchFn});if(e.art==="vorhanden")return{apiKey:e.apiKey,instanzId:e.instanzId,hinweis:""};if(e.art!=="angelegt")return null;if(Se(t.umfeld.env)){let n={apiUrl:t.apiUrl,jwt:e.test.apiKey,instanceId:e.test.instanzId};t.selbst&&(t.nebenlauf??at)(n,[t.selbst,q,t.umfeld.projekt],{zweck:q,ordner:ou()})||yt({instanzId:e.test.instanzId,projekt:t.umfeld.projekt},{home:t.umfeld.heim})}return{apiKey:e.test.apiKey,instanzId:e.test.instanzId,hinweis:gs(e.test)}}function fu(t,e){let n=e.replace(/^\s+/,"");if(!t)return j("SessionStart",n);try{let r=JSON.parse(t),s=r.hookSpecificOutput?.additionalContext;return!r.hookSpecificOutput||typeof s!="string"?t:(r.hookSpecificOutput.additionalContext=`${n}
43
43
 
44
44
  ${s}`,JSON.stringify(r))}catch{return t}}async function Ot(t){try{let e=pe(t.raw),n={...t,editor:t.editor??lu(t.args,e)};if(n.args.includes(Q)||xt(e))return await cu(n,e);let r=uu(n,e);if(r)return await r;let s=e?.hook_event_name??n.args.find(f=>Is.has(f))??n.umfeld.env.CACHLY_HOOK_EVENT??"";if(zt(e)&&(s!=="SessionStart"&&s!=="UserPromptSubmit"||ms(n.umfeld))||n.args.includes("--plugin")&&s&&bs(s,n.umfeld))return"";let i=null;if(s==="Stop"&&e?.transcript_path)try{i=iu(e.transcript_path,"utf-8").split(`
45
- `);let f=$e(i,e.stop_hook_active===!0);if(f)return f}catch{}let o=Ae(n.umfeld),a=Te(n.umfeld),u="";if(!o&&s==="SessionStart"&&n.args.includes("--plugin")&&!kt(a)){let f=await gu(n);f&&(o=f.apiKey,a=f.instanzId??a,u=f.hinweis)}if(!o||!a)return"";let c={apiUrl:n.apiUrl,jwt:o,instanceId:a};if(s==="Stop"){let f=e?mr(e):null,d=f?(n.fetchFn??fetch)(`${c.apiUrl}/api/v1/instances/${c.instanceId}/learn`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.jwt}`},body:JSON.stringify(br(f)),signal:AbortSignal.timeout(8e3)}).catch(()=>{}):void 0,p=rt(c,e?.session_id??null,i,{fetchFn:n.fetchFn});return await Promise.all([d,p]),""}let l,g=await(n.einblenden??yr)(n.raw,{cfg:c,nebenlauf:n.selbst?[n.selbst,Rt]:void 0,editor:n.editor,fetchFn:n.fetchFn,onInject:(f,d)=>{let p={ts:new Date().toISOString(),event:d,injected:f,prevented:0};us(p),l=ls(c,p,n.fetchFn)}});return l&&await Promise.race([l,new Promise(f=>setTimeout(f,500))]),u?fu(g,u):g}catch{return""}}async function du(){if(process.stdin.isTTY)return"";let t=[];for await(let e of process.stdin)t.push(e);return Buffer.concat(t).toString("utf-8")}function Ct(){return process.env.CACHLY_API_URL||au}var Nt={SessionStart:25e3,UserPromptSubmit:8e3,PreToolUse:8e3,Stop:5e4,sessionStart:25e3,beforeSubmitPrompt:8e3,postToolUse:3e3,userPromptSubmitted:8e3,PostToolUse:3e3,BeforeAgent:8e3};function hu(t,e){return t.includes(Q)?X(ze(e,t)):t.includes(Le)?Tt(e,t)?"{}":"":t.includes(Ne)&&Lt(e,t)?"{}":""}async function Ls(t,e){try{let n=await du(),r=pe(n),s=r?.hook_event_name??t.find(u=>Is.has(u)||Object.hasOwn(Nt,u))??"",i=Number(process.env.CACHLY_HOOK_FRIST_MS)||Nt[s]||Nt.UserPromptSubmit,o=hu(t,r),a=await Promise.race([Ot({args:t,raw:n,umfeld:_e(),apiUrl:Ct(),selbst:e}),new Promise(u=>setTimeout(()=>u(o),i))]);a&&await new Promise(u=>process.stdout.write(a,()=>u()))}catch{}process.exit(0)}async function Ns(){try{let t=_e(),e=Ae(t),n=Te(t);e&&n&&await L({apiUrl:Ct(),jwt:e,instanceId:n},{force:!0,lernen:!0})}catch{}process.exit(0)}async function Rs(t){try{let e=_e(),n=Ae(e),r=Te(e);if(n&&kt(r)){let s=await as({cfg:{apiUrl:Ct(),jwt:n,instanceId:r},projekt:t,env:e.env});s.art!=="aus"&&yt({instanzId:r,projekt:t,vomHook:cs(s)},{home:e.heim})}}catch{}process.exit(0)}var Re=process.argv.slice(2);Re[0]===Rt?await Ns():Re[0]===q?await Rs(Re[1]??""):await Ls(Re,pu(import.meta.url));
45
+ `);let f=$e(i,e.stop_hook_active===!0);if(f)return f}catch{}let o=Ae(n.umfeld),a=Te(n.umfeld),u="";if(!o&&s==="SessionStart"&&n.args.includes("--plugin")&&!kt(a)){let f=await gu(n);f&&(o=f.apiKey,a=f.instanzId??a,u=f.hinweis)}if(!o||!a)return"";let c={apiUrl:n.apiUrl,jwt:o,instanceId:a};if(s==="Stop"){let f=e?mr(e):null,d=f?(n.fetchFn??fetch)(`${c.apiUrl}/api/v1/instances/${c.instanceId}/learn`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.jwt}`},body:JSON.stringify(br(f)),signal:AbortSignal.timeout(8e3)}).catch(()=>{}):void 0,p=rt(c,e?.session_id??null,i,{fetchFn:n.fetchFn});return await Promise.all([d,p]),""}let l,g=await(n.einblenden??yr)(n.raw,{cfg:c,nebenlauf:n.selbst?[n.selbst,Rt]:void 0,editor:n.editor,fetchFn:n.fetchFn,onInject:(f,d)=>{let p={ts:new Date().toISOString(),event:d,injected:f,prevented:0,instanz:c.instanceId};us(p),l=ls(c,p,n.fetchFn)}});return l&&await Promise.race([l,new Promise(f=>setTimeout(f,500))]),u?fu(g,u):g}catch{return""}}async function du(){if(process.stdin.isTTY)return"";let t=[];for await(let e of process.stdin)t.push(e);return Buffer.concat(t).toString("utf-8")}function Ct(){return process.env.CACHLY_API_URL||au}var Nt={SessionStart:25e3,UserPromptSubmit:8e3,PreToolUse:8e3,Stop:5e4,sessionStart:25e3,beforeSubmitPrompt:8e3,postToolUse:3e3,userPromptSubmitted:8e3,PostToolUse:3e3,BeforeAgent:8e3};function hu(t,e){return t.includes(Q)?X(ze(e,t)):t.includes(Le)?Tt(e,t)?"{}":"":t.includes(Ne)&&Lt(e,t)?"{}":""}async function Ls(t,e){try{let n=await du(),r=pe(n),s=r?.hook_event_name??t.find(u=>Is.has(u)||Object.hasOwn(Nt,u))??"",i=Number(process.env.CACHLY_HOOK_FRIST_MS)||Nt[s]||Nt.UserPromptSubmit,o=hu(t,r),a=await Promise.race([Ot({args:t,raw:n,umfeld:_e(),apiUrl:Ct(),selbst:e}),new Promise(u=>setTimeout(()=>u(o),i))]);a&&await new Promise(u=>process.stdout.write(a,()=>u()))}catch{}process.exit(0)}async function Ns(){try{let t=_e(),e=Ae(t),n=Te(t);e&&n&&await L({apiUrl:Ct(),jwt:e,instanceId:n},{force:!0,lernen:!0})}catch{}process.exit(0)}async function Rs(t){try{let e=_e(),n=Ae(e),r=Te(e);if(n&&kt(r)){let s=await as({cfg:{apiUrl:Ct(),jwt:n,instanceId:r},projekt:t,env:e.env});s.art!=="aus"&&yt({instanzId:r,projekt:t,vomHook:cs(s)},{home:e.heim})}}catch{}process.exit(0)}var Re=process.argv.slice(2);Re[0]===Rt?await Ns():Re[0]===q?await Rs(Re[1]??""):await Ls(Re,pu(import.meta.url));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cachly-dev/mcp-server",
3
- "version": "0.10.206",
3
+ "version": "0.10.208",
4
4
  "mcpName": "io.github.cachly-dev/mcp-server",
5
5
  "description": "Solve it once. From then on, your AI knows. Experience for coding agents, EU-hosted: an MCP server for Claude Code, Cursor, Copilot & Windsurf. Learns from every bug fix, commit and CI run.",
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.206",
9
+ "version": "0.10.208",
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.206",
15
+ "version": "0.10.208",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }