@cachly-dev/mcp-server 0.10.230 → 0.10.231
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/embeddings.js +4 -4
- package/dist/src/handlers/brain.js +62 -62
- package/glama.json +1 -1
- package/hooks/cachly-ambient-einblendung.mjs +10 -10
- package/package.json +1 -1
- package/server.json +2 -2
package/glama.json
CHANGED
|
@@ -17,29 +17,29 @@ ${n}
|
|
|
17
17
|
`),a.type==="tool_use"&&(s+=`${a.name??""} ${JSON.stringify(a.input??{})}
|
|
18
18
|
`);return{frage:e?K(e).filter(o=>o.type==="text").map(o=>o.text??"").join(""):"",antwortText:r,werkzeugEingaben:s}}function gi(t){let{zug:e}=mn(t),n=new Set,r="";for(let c of e)if(c.type==="assistant")for(let l of K(c))l.type==="text"&&l.text&&(r+=`${l.text}
|
|
19
19
|
`),l.type==="tool_use"&&l.id&&ei.test(l.name??"")&&n.add(l.id);let s=0,i="";for(let c of e)if(c.type==="user")for(let l of K(c)){if(l.type!=="tool_result")continue;let g=ui(l);i+=`${g}
|
|
20
|
-
`,l.tool_use_id&&n.has(l.tool_use_id)&&!l.is_error&&!ti.test(g)&&s++}let o=new Set([...i.matchAll(fn)].map(c=>c[1].toLowerCase())),a=[...r.matchAll(fn)].map(c=>c[1].toLowerCase()),u=[...new Set(a.filter(c=>!o.has(c)))];return{behauptet:ci(r),schreibaufrufe:n.size,erfolgreich:s,erfundeneBelege:u}}function Ue(t,e){if(e)return"";let n=gi(t),r=[];return n.erfundeneBelege.length&&r.push(`Die Antwort nennt Beleg ${n.erfundeneBelege.join(", ")}, den kein cachly-Werkzeug in diesem Zug ausgegeben hat.`),n.behauptet&&n.erfolgreich===0&&r.push(n.schreibaufrufe>0?"Die Antwort meldet eine Speicherung im Brain, aber der Schreibaufruf wurde abgewiesen oder schlug fehl.":"Die Antwort meldet eine Speicherung im Brain, aber in diesem Zug lief kein Schreibaufruf (learn_from_attempts, remember_context, session_end)."),r.length?JSON.stringify({decision:"block",reason:`cachly Schreibbeleg: ${r.join(" ")} Speichere jetzt wirklich oder korrigiere die Aussage gegenueber dem Nutzer. Bezieht sich die Aussage auf eine fruehere Speicherung, sag das ausdruecklich.`}):""}var mi=75,pi=["topic","outcome","what_worked","what_failed","severity","confidence","recall_count","ts","endorsements"],bn=new Set("the a an and or but for to of in on at is are be do does did we you i it this that with without how what why when where can could would should please just get set use using make made need bitte und oder der die das ein eine f\xFCr mit ohne wie was warum kann soll noch mal auch von den dem ist weil wenn dann doch aber alle jede jeder jedes immer wieder wird werden wurde muss beim sehr nicht".split(/\s+/)),bi=["ierungen","ierung","ieren","iert","ungen","ung","heit","keit","lich","isch","ing","ed","en","er","es","e","n","s"];function yi(t){for(let e of bi)if(t.length-e.length>=4&&t.endsWith(e))return t.slice(0,-e.length);return t}function Be(t){return[...new Set(String(t).toLowerCase().split(/[^a-z0-9]+/).filter(e=>e.length>3&&!bn.has(e)).map(yi).filter(e=>!bn.has(e)))]}function ki(t,e){let n=0;for(let r of t)e.includes(r)&&n++;return n}var ie=class{texte;wortmengen;heuhaufen;statistik;wortbestand;platzVonSchluessel=new Map;topf;lektionen;constructor(e,{topf:n=mi}={}){let r=e.filter(i=>!B(i));this.lektionen=r,this.topf=n,this.texte=r.map(i=>Ht(i)),this.wortmengen=this.texte.map(i=>new Set([...te(i)].map(jt))),this.heuhaufen=this.texte.map(i=>i.toLowerCase()),this.statistik=new $(this.texte);let s=r.map((i,o)=>{let a=`cachly:lesson:best:${String(i.topic??o)}`;this.platzVonSchluessel.set(a,o);let u={};for(let c of pi)i[c]!==void 0&&(u[c]=i[c]);return{key:a,content:JSON.stringify(u)}});this.wortbestand=un(s)}get groesse(){return this.lektionen.length}sortiere(e){if(!this.wortbestand)return[];let n=ln(this.wortbestand,e,this.topf),r=[],s=[];for(let c of n){let l=this.platzVonSchluessel.get(c.key);l!==void 0&&(r.push(l),s.push(c.score))}if(r.length===0)return[];let i=te(e),o=Be(e),a=Oe(s),u=Oe(r.map(c=>this.statistik.besterZeuge(i,this.wortmengen[c])));return r.map((c,l)=>({lektion:this.lektionen[c],punkte:a[l]+.5*this.statistik.deckung(i,this.wortmengen[c])+.5*u[l],belege:ki(o,this.heuhaufen[c])})).sort((c,l)=>l.punkte-c.punkte||Number(l.lektion.recall_count??0)-Number(c.lektion.recall_count??0))}};function yn(t){return/^[a-z]+:?$/.test(t)}var wi={apiUrl:process.env.CACHLY_API_URL??"https://api.cachly.dev",jwt:process.env.CACHLY_JWT??"",model:process.env.CACHLY_EMBED_MODEL??""};var Fu=Number(process.env.CACHLY_EMBED_TIMEOUT_MS??8e3),Du=Number(process.env.CACHLY_EMBED_TIMEOUT_MAX_MS??45e3);function Ei(){return process.env.CACHLY_JWT?"cachly":process.env.OLLAMA_BASE_URL?"ollama":"none"}var Gu=!!process.env.CACHLY_EMBED_PROVIDER,Zu=(process.env.CACHLY_EMBED_PROVIDER??Ei()).toLowerCase();import{readFileSync as vi,writeFileSync as Si,renameSync as xi,mkdirSync as _i,rmSync as Ai}from"node:fs";import{dirname as Ti}from"node:path";var oe=3,We=10*6e4,wn={fehlschlaege:0,offenBis:0};function Ke(){return["0","off","aus","false"].includes(String(process.env.CACHLY_LESER_SICHERUNG??"").toLowerCase())}function zi(t){return t===503?"abgeschaltet":t>=500?"fehlschlag":"neutral"}function Ii(t){return t?.name==="SyntaxError"?"neutral":"fehlschlag"}function kn(t){let e=t??{},n=r=>typeof r=="number"&&Number.isFinite(r)&&r>0?r:0;return{fehlschlaege:Math.floor(n(e.fehlschlaege)),offenBis:n(e.offenBis)}}var F=class{constructor(e,n=()=>Date.now()){this.speicher=e;this.jetzt=n}speicher;jetzt;offen(){if(Ke())return!1;let e=this.speicher.lies();if(e.fehlschlaege<oe)return!1;let n=this.jetzt();return n<e.offenBis&&e.offenBis-n<=We}darfFragen(){if(Ke())return!0;if(this.offen())return!1;let e=this.speicher.lies();return e.fehlschlaege>=oe&&this.speicher.schreib({fehlschlaege:e.fehlschlaege,offenBis:this.jetzt()+We}),!0}melde(e){if(e==="neutral"||Ke())return;let n=this.speicher.lies();if(e==="erfolg"){(n.fehlschlaege!==0||n.offenBis!==0)&&this.speicher.schreib({...wn});return}let r=e==="abgeschaltet"?Math.max(n.fehlschlaege+1,oe):n.fehlschlaege+1;this.speicher.schreib({fehlschlaege:r,offenBis:r>=oe?this.jetzt()+We:0})}},Fe={art:"ohne"};async function De(t,e){if(!e.darfFragen())return{art:"uebersprungen"};let n=t.fetchFn??fetch;try{let r=await n(t.url,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.jwt}`,...t.zusatzKopf??{}},body:JSON.stringify({query:t.frage,texts:t.texte,instance_id:t.instanceId}),signal:AbortSignal.timeout(t.zeitlimitMs)});if(!r.ok)return e.melde(zi(r.status)),Fe;let s=await r.json(),i=Array.isArray(s?.scores)?s.scores:null;return!i||i.length!==t.texte.length||!i.every(o=>typeof o=="number"&&Number.isFinite(o))?Fe:(e.melde("erfolg"),{art:"punkte",scores:i,provider:typeof s.provider=="string"?s.provider:"?",ms:Number(s.ms)||0})}catch(r){return e.melde(Ii(r)),Fe}}function En(t){return{lies:()=>{try{return kn(JSON.parse(vi(t,"utf8")))}catch{return{...wn}}},schreib:e=>{let n=`${t}.${process.pid}.tmp`;try{_i(Ti(t),{recursive:!0}),Si(n,JSON.stringify(kn(e)),{mode:384}),xi(n,t)}catch{try{Ai(n,{force:!0})}catch{}}}}}function Sn(t,e,n=1){let r=o=>{let a=Math.min(...o),u=Math.max(...o);return u>a?o.map(c=>(c-a)/(u-a)):o.map(()=>0)},s=r(t),i=r(e);return t.map((o,a)=>({i:a,p:s[a]+n*i[a]})).sort((o,a)=>a.p-o.p||o.i-a.i).map(o=>o.i)}import{createHash as Li}from"node:crypto";import{existsSync as Ri,readFileSync as zn,renameSync as Ci,statSync as In,writeFileSync as Oi}from"node:fs";import{tmpdir as Pi}from"node:os";import{dirname as Nn,join as Z,resolve as Ge,sep as al}from"node:path";var Ln=120;function Ye(t){let e=/^[vV=\s]*(\d+)(?:\.(\d+))?(?:\.(\d+))?/.exec(String(t??""));return e?[Number(e[1]),Number(e[2]??0),Number(e[3]??0)]:null}function xn(t,e){for(let n=0;n<3;n++)if(t[n]!==e[n])return t[n]<e[n]?-1:1;return 0}function G(t,e){return e<=1?[t[0]+1,0,0]:e===2?[t[0],t[1]+1,0]:[t[0],t[1],t[2]+1]}var Xe="(<=|>=|===|==|!=|~>|~=|<|>|=|~|\\^)",Ve=new RegExp(`^${Xe}?[vV]?(\\d+)(?:\\.(\\d+|[xX*]))?(?:\\.(\\d+|[xX*]))?((?:\\.\\d+)*)((?:[-+_.]?[A-Za-z]|[-+])[0-9A-Za-z.+_-]*)?$`),Mi=new RegExp(`^${Xe}?(\\*|[xX])$`);function Je(t,e,n){let r=u=>u!==void 0&&/^\d+$/.test(u)?Number(u):null,s=Number(t),i=r(e),o=i===null?null:r(n);return{t:[s,i??0,o??0],n:i===null?1:o===null?2:3}}function ji(t){let e=Mi.exec(t);if(e)return e[1]&&e[1]!=="="&&e[1]!=="=="?null:{};let n=Ve.exec(t);if(!n||/[xX*]/.test(`${n[3]??""}${n[4]??""}`)&&(n[5]||n[6]))return null;let r=n[1]??"",{t:s,n:i}=Je(n[2],n[3],n[4]);switch(r){case"":case"=":case"==":case"===":return{von:s,bis:G(s,i)};case"!=":return{von:s,bis:G(s,i),nicht:!0};case"<":return{bis:s};case"<=":return{bis:G(s,i)};case">":return{von:G(s,i)};case">=":return{von:s};case"^":return s[0]>0?{von:s,bis:[s[0]+1,0,0]}:i===1?{von:s,bis:[1,0,0]}:s[1]>0?{von:s,bis:[0,s[1]+1,0]}:i===2?{von:s,bis:[0,1,0]}:{von:s,bis:[0,0,s[2]+1]};case"~":return{von:s,bis:i===1?[s[0]+1,0,0]:[s[0],s[1]+1,0]};case"~>":case"~=":return{von:s,bis:i===3?[s[0],s[1]+1,0]:[s[0]+1,0,0]};default:return null}}function Hi(t){if(!t)return null;let e=/^(\S+)\s+-\s+(\S+)$/.exec(t);if(e){let i=Ve.exec(e[1]),o=Ve.exec(e[2]);if(!i||!o||i[1]||o[1])return null;let a=Je(i[2],i[3],i[4]),u=Je(o[2],o[3],o[4]);return[{von:a.t,bis:G(u.t,u.n)}]}let r=t.replace(/,/g," ").replace(new RegExp(`${Xe}\\s+`,"g"),"$1").trim().split(/\s+/);if(r.length>8)return null;let s=[];for(let i of r){let o=ji(i);if(!o)return null;s.push(o)}return s}function Rn(t){if(typeof t!="string")return null;let e=t.trim();if(!e||e.length>Ln)return null;let n=[];for(let r of e.split("||")){let s=Hi(r.trim());if(!s)return null;n.push(s)}return n}function $i(t,e){let n=!0;return e.von&&xn(t,e.von)<0&&(n=!1),e.bis&&xn(t,e.bis)>=0&&(n=!1),e.nicht?!n:n}function Ui(t,e){let n=Ye(t),r=Rn(e);return!n||!r?null:r.some(s=>s.every(i=>$i(n,i)))}var Bi={npm:"npm",go:"go",python:"python",pypi:"python",pip:"python"};function Wi(t){if(typeof t!="string")return{fehler:"keine Zeichenkette"};let e=t.replace(/\s+/g," ").trim();if(!e)return{fehler:"leer"};if(e.length>Ln+80)return{fehler:"zu lang"};let n=e,r=null,s=/^(npm|go|python|pypi|pip):/i.exec(n);s&&(r=Bi[s[1].toLowerCase()],n=n.slice(s[0].length));let i=n.indexOf("@",1);if(i<0)return{fehler:'es fehlt "@bereich" (Form: paket@bereich)'};let o=n.slice(0,i).trim(),a=n.slice(i+1).trim();return!o||!/^[@A-Za-z0-9._~/+-]+$/.test(o)?{fehler:"Paketname unlesbar"}:Rn(a)?{angabe:{text:e,oekosystem:r,paket:o,bereichText:a}}:{fehler:`Bereich "${a.slice(0,40)}" unlesbar`}}var ae=["package.json","go.mod","pyproject.toml","requirements.txt","package-lock.json"],Ki={"package.json":1<<20,"go.mod":1<<19,"pyproject.toml":1<<19,"requirements.txt":1<<19,"package-lock.json":3<<20},Fi=25,Di=600*1e3,Gi=4e3,_n=new WeakMap;function O(t,e,n,r=!1){if(e==="__proto__")return;let s=Object.hasOwn(t,e);if(!(s&&!r)){if(!s){let i=_n.get(t)??0;if(i>=Gi)return;_n.set(t,i+1)}t[e]=n}}function Ze(t,e){return Object.hasOwn(t,e)?t[e]:null}function Cn(t,e){try{let n=In(t,{throwIfNoEntry:!1});return!n||!n.isFile()||n.size>e?null:zn(t,"utf8").replace(/^\uFEFF/,"")}catch{return null}}function Qe(t){return t.toLowerCase().replace(/[-_.]+/g,"-")}function Zi(t){if(typeof t!="string")return null;let e=t.trim();if(!e||e.includes("||")||/[xX*]$/.test(e))return null;let n=/^(?:===?|=)?\s*v?(\d+(?:\.\d+){0,2})(?:[-+.]?[0-9A-Za-z.+_-]*)?$/.exec(e);if(n)return{version:n[1],ab:!1};let r=/(?:\^|~>|~=|~|>=|>)\s*v?(\d+(?:\.\d+){0,2})/.exec(e);return r?{version:r[1],ab:!0}:null}function qe(t,e,n,r){let s=Zi(n);s&&O(t,e,{version:s.version,quelle:r,...s.ab?{ab:!0}:{}})}function Vi(t,e){let n;try{n=JSON.parse(t)}catch{return}if(!(!n||typeof n!="object"))for(let r of["dependencies","devDependencies","optionalDependencies"]){let s=n[r];if(!(!s||typeof s!="object"))for(let[i,o]of Object.entries(s))qe(e,i.toLowerCase(),o,"package.json")}}function Ji(t,e){let n;try{n=JSON.parse(t)}catch{return}if(!n||typeof n!="object")return;let r=(s,i)=>{typeof i!="string"||!Ye(i)||O(e,s.toLowerCase(),{version:i,quelle:"package-lock.json"},!0)};if(n.packages&&typeof n.packages=="object")for(let[s,i]of Object.entries(n.packages))!s.startsWith("node_modules/")||s.indexOf("node_modules/",13)>=0||r(s.slice(13),i?.version);else if(n.dependencies&&typeof n.dependencies=="object")for(let[s,i]of Object.entries(n.dependencies))r(s,i?.version)}function qi(t,e){let n=!1,r=s=>{let i=/^(\S+)\s+(v\d\S*)/.exec(s);i&&O(e,i[1],{version:i[2].replace(/^v/,""),quelle:"go.mod"})};for(let s of t.split(`
|
|
20
|
+
`,l.tool_use_id&&n.has(l.tool_use_id)&&!l.is_error&&!ti.test(g)&&s++}let o=new Set([...i.matchAll(fn)].map(c=>c[1].toLowerCase())),a=[...r.matchAll(fn)].map(c=>c[1].toLowerCase()),u=[...new Set(a.filter(c=>!o.has(c)))];return{behauptet:ci(r),schreibaufrufe:n.size,erfolgreich:s,erfundeneBelege:u}}function Ue(t,e){if(e)return"";let n=gi(t),r=[];return n.erfundeneBelege.length&&r.push(`Die Antwort nennt Beleg ${n.erfundeneBelege.join(", ")}, den kein cachly-Werkzeug in diesem Zug ausgegeben hat.`),n.behauptet&&n.erfolgreich===0&&r.push(n.schreibaufrufe>0?"Die Antwort meldet eine Speicherung im Brain, aber der Schreibaufruf wurde abgewiesen oder schlug fehl.":"Die Antwort meldet eine Speicherung im Brain, aber in diesem Zug lief kein Schreibaufruf (learn_from_attempts, remember_context, session_end)."),r.length?JSON.stringify({decision:"block",reason:`cachly Schreibbeleg: ${r.join(" ")} Speichere jetzt wirklich oder korrigiere die Aussage gegenueber dem Nutzer. Bezieht sich die Aussage auf eine fruehere Speicherung, sag das ausdruecklich.`}):""}var mi=75,pi=["topic","outcome","what_worked","what_failed","severity","confidence","recall_count","ts","endorsements"],bn=new Set("the a an and or but for to of in on at is are be do does did we you i it this that with without how what why when where can could would should please just get set use using make made need bitte und oder der die das ein eine f\xFCr mit ohne wie was warum kann soll noch mal auch von den dem ist weil wenn dann doch aber alle jede jeder jedes immer wieder wird werden wurde muss beim sehr nicht".split(/\s+/)),bi=["ierungen","ierung","ieren","iert","ungen","ung","heit","keit","lich","isch","ing","ed","en","er","es","e","n","s"];function yi(t){for(let e of bi)if(t.length-e.length>=4&&t.endsWith(e))return t.slice(0,-e.length);return t}function Be(t){return[...new Set(String(t).toLowerCase().split(/[^a-z0-9]+/).filter(e=>e.length>3&&!bn.has(e)).map(yi).filter(e=>!bn.has(e)))]}function ki(t,e){let n=0;for(let r of t)e.includes(r)&&n++;return n}var ie=class{texte;wortmengen;heuhaufen;statistik;wortbestand;platzVonSchluessel=new Map;topf;lektionen;constructor(e,{topf:n=mi}={}){let r=e.filter(i=>!B(i));this.lektionen=r,this.topf=n,this.texte=r.map(i=>Ht(i)),this.wortmengen=this.texte.map(i=>new Set([...te(i)].map(jt))),this.heuhaufen=this.texte.map(i=>i.toLowerCase()),this.statistik=new $(this.texte);let s=r.map((i,o)=>{let a=`cachly:lesson:best:${String(i.topic??o)}`;this.platzVonSchluessel.set(a,o);let u={};for(let c of pi)i[c]!==void 0&&(u[c]=i[c]);return{key:a,content:JSON.stringify(u)}});this.wortbestand=un(s)}get groesse(){return this.lektionen.length}sortiere(e){if(!this.wortbestand)return[];let n=ln(this.wortbestand,e,this.topf),r=[],s=[];for(let c of n){let l=this.platzVonSchluessel.get(c.key);l!==void 0&&(r.push(l),s.push(c.score))}if(r.length===0)return[];let i=te(e),o=Be(e),a=Oe(s),u=Oe(r.map(c=>this.statistik.besterZeuge(i,this.wortmengen[c])));return r.map((c,l)=>({lektion:this.lektionen[c],punkte:a[l]+.5*this.statistik.deckung(i,this.wortmengen[c])+.5*u[l],belege:ki(o,this.heuhaufen[c])})).sort((c,l)=>l.punkte-c.punkte||Number(l.lektion.recall_count??0)-Number(c.lektion.recall_count??0))}};function yn(t){return/^[a-z]+:?$/.test(t)}var wi={apiUrl:process.env.CACHLY_API_URL??"https://api.cachly.dev",jwt:process.env.CACHLY_JWT??"",model:process.env.CACHLY_EMBED_MODEL??""};var Fu=Number(process.env.CACHLY_EMBED_TIMEOUT_MS??8e3),Du=Number(process.env.CACHLY_EMBED_TIMEOUT_MAX_MS??45e3);function Ei(){return process.env.CACHLY_JWT?"cachly":process.env.OLLAMA_BASE_URL?"ollama":"none"}var Gu=!!process.env.CACHLY_EMBED_PROVIDER,Zu=(process.env.CACHLY_EMBED_PROVIDER??Ei()).toLowerCase();var Vu=Math.max(1,Number(process.env.CACHLY_EMBED_SCHREIB_PARALLEL??4)||4);import{readFileSync as vi,writeFileSync as Si,renameSync as xi,mkdirSync as _i,rmSync as Ai}from"node:fs";import{dirname as Ti}from"node:path";var oe=3,We=10*6e4,wn={fehlschlaege:0,offenBis:0};function Ke(){return["0","off","aus","false"].includes(String(process.env.CACHLY_LESER_SICHERUNG??"").toLowerCase())}function zi(t){return t===503?"abgeschaltet":t>=500?"fehlschlag":"neutral"}function Ii(t){return t?.name==="SyntaxError"?"neutral":"fehlschlag"}function kn(t){let e=t??{},n=r=>typeof r=="number"&&Number.isFinite(r)&&r>0?r:0;return{fehlschlaege:Math.floor(n(e.fehlschlaege)),offenBis:n(e.offenBis)}}var F=class{constructor(e,n=()=>Date.now()){this.speicher=e;this.jetzt=n}speicher;jetzt;offen(){if(Ke())return!1;let e=this.speicher.lies();if(e.fehlschlaege<oe)return!1;let n=this.jetzt();return n<e.offenBis&&e.offenBis-n<=We}darfFragen(){if(Ke())return!0;if(this.offen())return!1;let e=this.speicher.lies();return e.fehlschlaege>=oe&&this.speicher.schreib({fehlschlaege:e.fehlschlaege,offenBis:this.jetzt()+We}),!0}melde(e){if(e==="neutral"||Ke())return;let n=this.speicher.lies();if(e==="erfolg"){(n.fehlschlaege!==0||n.offenBis!==0)&&this.speicher.schreib({...wn});return}let r=e==="abgeschaltet"?Math.max(n.fehlschlaege+1,oe):n.fehlschlaege+1;this.speicher.schreib({fehlschlaege:r,offenBis:r>=oe?this.jetzt()+We:0})}},Fe={art:"ohne"};async function De(t,e){if(!e.darfFragen())return{art:"uebersprungen"};let n=t.fetchFn??fetch;try{let r=await n(t.url,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.jwt}`,...t.zusatzKopf??{}},body:JSON.stringify({query:t.frage,texts:t.texte,instance_id:t.instanceId}),signal:AbortSignal.timeout(t.zeitlimitMs)});if(!r.ok)return e.melde(zi(r.status)),Fe;let s=await r.json(),i=Array.isArray(s?.scores)?s.scores:null;return!i||i.length!==t.texte.length||!i.every(o=>typeof o=="number"&&Number.isFinite(o))?Fe:(e.melde("erfolg"),{art:"punkte",scores:i,provider:typeof s.provider=="string"?s.provider:"?",ms:Number(s.ms)||0})}catch(r){return e.melde(Ii(r)),Fe}}function En(t){return{lies:()=>{try{return kn(JSON.parse(vi(t,"utf8")))}catch{return{...wn}}},schreib:e=>{let n=`${t}.${process.pid}.tmp`;try{_i(Ti(t),{recursive:!0}),Si(n,JSON.stringify(kn(e)),{mode:384}),xi(n,t)}catch{try{Ai(n,{force:!0})}catch{}}}}}function Sn(t,e,n=1){let r=o=>{let a=Math.min(...o),u=Math.max(...o);return u>a?o.map(c=>(c-a)/(u-a)):o.map(()=>0)},s=r(t),i=r(e);return t.map((o,a)=>({i:a,p:s[a]+n*i[a]})).sort((o,a)=>a.p-o.p||o.i-a.i).map(o=>o.i)}import{createHash as Ni}from"node:crypto";import{existsSync as Ri,readFileSync as zn,renameSync as Ci,statSync as In,writeFileSync as Oi}from"node:fs";import{tmpdir as Pi}from"node:os";import{dirname as Ln,join as Z,resolve as Ge,sep as cl}from"node:path";var Nn=120;function Ye(t){let e=/^[vV=\s]*(\d+)(?:\.(\d+))?(?:\.(\d+))?/.exec(String(t??""));return e?[Number(e[1]),Number(e[2]??0),Number(e[3]??0)]:null}function xn(t,e){for(let n=0;n<3;n++)if(t[n]!==e[n])return t[n]<e[n]?-1:1;return 0}function G(t,e){return e<=1?[t[0]+1,0,0]:e===2?[t[0],t[1]+1,0]:[t[0],t[1],t[2]+1]}var Xe="(<=|>=|===|==|!=|~>|~=|<|>|=|~|\\^)",Ve=new RegExp(`^${Xe}?[vV]?(\\d+)(?:\\.(\\d+|[xX*]))?(?:\\.(\\d+|[xX*]))?((?:\\.\\d+)*)((?:[-+_.]?[A-Za-z]|[-+])[0-9A-Za-z.+_-]*)?$`),Mi=new RegExp(`^${Xe}?(\\*|[xX])$`);function Je(t,e,n){let r=u=>u!==void 0&&/^\d+$/.test(u)?Number(u):null,s=Number(t),i=r(e),o=i===null?null:r(n);return{t:[s,i??0,o??0],n:i===null?1:o===null?2:3}}function ji(t){let e=Mi.exec(t);if(e)return e[1]&&e[1]!=="="&&e[1]!=="=="?null:{};let n=Ve.exec(t);if(!n||/[xX*]/.test(`${n[3]??""}${n[4]??""}`)&&(n[5]||n[6]))return null;let r=n[1]??"",{t:s,n:i}=Je(n[2],n[3],n[4]);switch(r){case"":case"=":case"==":case"===":return{von:s,bis:G(s,i)};case"!=":return{von:s,bis:G(s,i),nicht:!0};case"<":return{bis:s};case"<=":return{bis:G(s,i)};case">":return{von:G(s,i)};case">=":return{von:s};case"^":return s[0]>0?{von:s,bis:[s[0]+1,0,0]}:i===1?{von:s,bis:[1,0,0]}:s[1]>0?{von:s,bis:[0,s[1]+1,0]}:i===2?{von:s,bis:[0,1,0]}:{von:s,bis:[0,0,s[2]+1]};case"~":return{von:s,bis:i===1?[s[0]+1,0,0]:[s[0],s[1]+1,0]};case"~>":case"~=":return{von:s,bis:i===3?[s[0],s[1]+1,0]:[s[0]+1,0,0]};default:return null}}function Hi(t){if(!t)return null;let e=/^(\S+)\s+-\s+(\S+)$/.exec(t);if(e){let i=Ve.exec(e[1]),o=Ve.exec(e[2]);if(!i||!o||i[1]||o[1])return null;let a=Je(i[2],i[3],i[4]),u=Je(o[2],o[3],o[4]);return[{von:a.t,bis:G(u.t,u.n)}]}let r=t.replace(/,/g," ").replace(new RegExp(`${Xe}\\s+`,"g"),"$1").trim().split(/\s+/);if(r.length>8)return null;let s=[];for(let i of r){let o=ji(i);if(!o)return null;s.push(o)}return s}function Rn(t){if(typeof t!="string")return null;let e=t.trim();if(!e||e.length>Nn)return null;let n=[];for(let r of e.split("||")){let s=Hi(r.trim());if(!s)return null;n.push(s)}return n}function $i(t,e){let n=!0;return e.von&&xn(t,e.von)<0&&(n=!1),e.bis&&xn(t,e.bis)>=0&&(n=!1),e.nicht?!n:n}function Ui(t,e){let n=Ye(t),r=Rn(e);return!n||!r?null:r.some(s=>s.every(i=>$i(n,i)))}var Bi={npm:"npm",go:"go",python:"python",pypi:"python",pip:"python"};function Wi(t){if(typeof t!="string")return{fehler:"keine Zeichenkette"};let e=t.replace(/\s+/g," ").trim();if(!e)return{fehler:"leer"};if(e.length>Nn+80)return{fehler:"zu lang"};let n=e,r=null,s=/^(npm|go|python|pypi|pip):/i.exec(n);s&&(r=Bi[s[1].toLowerCase()],n=n.slice(s[0].length));let i=n.indexOf("@",1);if(i<0)return{fehler:'es fehlt "@bereich" (Form: paket@bereich)'};let o=n.slice(0,i).trim(),a=n.slice(i+1).trim();return!o||!/^[@A-Za-z0-9._~/+-]+$/.test(o)?{fehler:"Paketname unlesbar"}:Rn(a)?{angabe:{text:e,oekosystem:r,paket:o,bereichText:a}}:{fehler:`Bereich "${a.slice(0,40)}" unlesbar`}}var ae=["package.json","go.mod","pyproject.toml","requirements.txt","package-lock.json"],Ki={"package.json":1<<20,"go.mod":1<<19,"pyproject.toml":1<<19,"requirements.txt":1<<19,"package-lock.json":3<<20},Fi=25,Di=600*1e3,Gi=4e3,_n=new WeakMap;function O(t,e,n,r=!1){if(e==="__proto__")return;let s=Object.hasOwn(t,e);if(!(s&&!r)){if(!s){let i=_n.get(t)??0;if(i>=Gi)return;_n.set(t,i+1)}t[e]=n}}function Ze(t,e){return Object.hasOwn(t,e)?t[e]:null}function Cn(t,e){try{let n=In(t,{throwIfNoEntry:!1});return!n||!n.isFile()||n.size>e?null:zn(t,"utf8").replace(/^\uFEFF/,"")}catch{return null}}function Qe(t){return t.toLowerCase().replace(/[-_.]+/g,"-")}function Zi(t){if(typeof t!="string")return null;let e=t.trim();if(!e||e.includes("||")||/[xX*]$/.test(e))return null;let n=/^(?:===?|=)?\s*v?(\d+(?:\.\d+){0,2})(?:[-+.]?[0-9A-Za-z.+_-]*)?$/.exec(e);if(n)return{version:n[1],ab:!1};let r=/(?:\^|~>|~=|~|>=|>)\s*v?(\d+(?:\.\d+){0,2})/.exec(e);return r?{version:r[1],ab:!0}:null}function qe(t,e,n,r){let s=Zi(n);s&&O(t,e,{version:s.version,quelle:r,...s.ab?{ab:!0}:{}})}function Vi(t,e){let n;try{n=JSON.parse(t)}catch{return}if(!(!n||typeof n!="object"))for(let r of["dependencies","devDependencies","optionalDependencies"]){let s=n[r];if(!(!s||typeof s!="object"))for(let[i,o]of Object.entries(s))qe(e,i.toLowerCase(),o,"package.json")}}function Ji(t,e){let n;try{n=JSON.parse(t)}catch{return}if(!n||typeof n!="object")return;let r=(s,i)=>{typeof i!="string"||!Ye(i)||O(e,s.toLowerCase(),{version:i,quelle:"package-lock.json"},!0)};if(n.packages&&typeof n.packages=="object")for(let[s,i]of Object.entries(n.packages))!s.startsWith("node_modules/")||s.indexOf("node_modules/",13)>=0||r(s.slice(13),i?.version);else if(n.dependencies&&typeof n.dependencies=="object")for(let[s,i]of Object.entries(n.dependencies))r(s,i?.version)}function qi(t,e){let n=!1,r=s=>{let i=/^(\S+)\s+(v\d\S*)/.exec(s);i&&O(e,i[1],{version:i[2].replace(/^v/,""),quelle:"go.mod"})};for(let s of t.split(`
|
|
21
21
|
`)){let i=s.replace(/\/\/.*$/,"").trim();if(!i)continue;if(n){i===")"?n=!1:r(i);continue}let o=/^go\s+(\d+(?:\.\d+){0,2})\b/.exec(i);if(o){O(e,"go",{version:o[1],quelle:"go.mod",ab:!0});continue}if(/^require\s*\($/.test(i)){n=!0;continue}let a=/^require\s+(.+)$/.exec(i);a&&r(a[1])}}function On(t,e,n){if(t.includes("://"))return;let r=t.split("#")[0].split(";")[0].trim(),s=/^([A-Za-z0-9][A-Za-z0-9._-]*)\s*(?:\[[^\]]*\])?\s*(.*)$/.exec(r);if(!s||!s[2])return;let i=s[2].replace(/^\(|\)$/g,"").split(",").map(c=>c.trim()),o=Qe(s[1]),a=i.map(c=>/^===?\s*(\d+(?:\.\d+){0,2})(?:\.\*)?$/.exec(c)).find(Boolean),u=i.map(c=>/^(?:>=|~=|>)\s*(\d+(?:\.\d+){0,2})/.exec(c)).find(Boolean);a?O(e,o,{version:a[1],quelle:n}):u&&O(e,o,{version:u[1],quelle:n,ab:!0})}function Yi(t,e){for(let n of t.split(`
|
|
22
22
|
`)){let r=n.trim();!r||r.startsWith("#")||r.startsWith("-")||On(r,e,"requirements.txt")}}function Xi(t,e){let n="",r=!1,s=i=>[...i.matchAll(/"([^"]+)"|'([^']+)'/g)].map(o=>o[1]??o[2]);for(let i of t.split(`
|
|
23
|
-
`)){let o=i.trim();if(!o||o.startsWith("#"))continue;let a=/^\[\[?([^\]]+)\]\]?$/.exec(o);if(a){n=a[1].trim(),r=!1;continue}if((n==="project"?/^dependencies\s*=\s*\[/.test(o):n==="project.optional-dependencies"||n==="dependency-groups"?/^[\w.-]+\s*=\s*\[/.test(o):!1)||r){for(let c of s(o.replace(/^[\w.-]+\s*=\s*\[/,"")))On(c,e,"pyproject.toml");r=!o.includes("]");continue}if(n==="project"){let c=/^requires-python\s*=\s*["']([^"']+)["']/.exec(o);c&&qe(e,"python",c[1],"pyproject.toml");continue}if(/^tool\.poetry(?:\.group\.[^.]+)?\.(?:dev-)?dependencies$/.test(n)){let c=/^([A-Za-z0-9._-]+)\s*=\s*(.+)$/.exec(o);if(!c)continue;let l=c[2].trim(),g=/^["']/.test(l)?s(l)[0]:/version\s*=\s*["']([^"']+)["']/.exec(l)?.[1];qe(e,Qe(c[1]),g,"pyproject.toml")}}}function Pn(){return{npm:{},go:{},python:{}}}var D=new Map;function Qi(t){let e={};for(let n of ae)try{let r=In(Z(t,n),{throwIfNoEntry:!1});e[n]=r?`${Math.round(r.mtimeMs)}:${r.size}`:"-"}catch{e[n]="-"}return e}function eo(t,e){return ae.every(n=>t[n]===e[n])}function An(t,e){return Z(t,`cachly-projektversionen-${
|
|
24
|
-
${t.werkzeugEingaben}`.toLowerCase(),r=0;e.forEach((i,o)=>{Kn(i.thema)&&n.includes(i.thema.trim().toLowerCase())&&(r|=1<<o)});let s=e.map((i,o)=>({k:i,i:o})).filter(({k:i})=>i.gezeigt&&Kn(i.thema));return s.length?{belohnung:s.some(({i})=>r&1<<i)?1:0,benutzt:r}:{belohnung:-1,benutzt:r}}var Yn=5,Io=50,
|
|
23
|
+
`)){let o=i.trim();if(!o||o.startsWith("#"))continue;let a=/^\[\[?([^\]]+)\]\]?$/.exec(o);if(a){n=a[1].trim(),r=!1;continue}if((n==="project"?/^dependencies\s*=\s*\[/.test(o):n==="project.optional-dependencies"||n==="dependency-groups"?/^[\w.-]+\s*=\s*\[/.test(o):!1)||r){for(let c of s(o.replace(/^[\w.-]+\s*=\s*\[/,"")))On(c,e,"pyproject.toml");r=!o.includes("]");continue}if(n==="project"){let c=/^requires-python\s*=\s*["']([^"']+)["']/.exec(o);c&&qe(e,"python",c[1],"pyproject.toml");continue}if(/^tool\.poetry(?:\.group\.[^.]+)?\.(?:dev-)?dependencies$/.test(n)){let c=/^([A-Za-z0-9._-]+)\s*=\s*(.+)$/.exec(o);if(!c)continue;let l=c[2].trim(),g=/^["']/.test(l)?s(l)[0]:/version\s*=\s*["']([^"']+)["']/.exec(l)?.[1];qe(e,Qe(c[1]),g,"pyproject.toml")}}}function Pn(){return{npm:{},go:{},python:{}}}var D=new Map;function Qi(t){let e={};for(let n of ae)try{let r=In(Z(t,n),{throwIfNoEntry:!1});e[n]=r?`${Math.round(r.mtimeMs)}:${r.size}`:"-"}catch{e[n]="-"}return e}function eo(t,e){return ae.every(n=>t[n]===e[n])}function An(t,e){return Z(t,`cachly-projektversionen-${Ni("sha1").update(e).digest("hex").slice(0,12)}.json`)}function to(t,e){try{let n=JSON.parse(zn(t,"utf8"));return n&&n.v===1&&n.ordner===e&&n.stand&&n.stempel?n:null}catch{return null}}function no(t,e){try{let n=`${t}.${process.pid}.tmp`;Oi(n,JSON.stringify(e),{mode:384}),Ci(n,t)}catch{}}function ro(t,e,n){let r=Pn(),s=n(),i=!1,o=!0;for(let a of ae){if(!o&&n()-s>e){i=!0;break}let u=Cn(Z(t,a),Ki[a]);if(u!==null)switch(o=!1,a){case"package.json":Vi(u,r.npm);break;case"package-lock.json":Ji(u,r.npm);break;case"go.mod":qi(u,r.go);break;case"pyproject.toml":Xi(u,r.python);break;case"requirements.txt":Yi(u,r.python);break}}return{stand:r,unvollstaendig:i}}function so(t,e){if(!/^[@a-z0-9._~/-]+$/.test(e)||e.includes(".."))return null;let n=t;for(let r=0;r<4;r++){let s=Cn(Z(n,"node_modules",e,"package.json"),262144);if(s!==null){try{let o=JSON.parse(s).version;if(typeof o=="string"&&Ye(o))return{version:o,quelle:"node_modules"}}catch{}return null}let i=Ln(n);if(i===n)break;n=i}return null}function io(t,e){let n=Ge(t),r=e?Ge(e):null;for(let s=0;r&&s<6;s++){if(ae.some(o=>Ri(Z(n,o))))return n;if(n===r)break;let i=Ln(n);if(i===n)break;n=i}return Ge(t)}function oo(){return process.env.CACHLY_WORKSPACE||process.env.CLAUDE_PROJECT_DIR||process.cwd()}function Mn(t=oo(),e={}){let n=io(t,e.obergrenze),r=e.jetzt??(()=>performance.now()),s=e.ablageOrdner===void 0?Pi():e.ablageOrdner,i="gebaut",o=Pn(),a=!1;try{let l=Qi(n),g=d=>!!d&&eo(d.stempel,l)&&(!d.unvollstaendig||Date.now()-d.at<Di),f=D.get(n);if(g(f))({stand:o,unvollstaendig:a}=f),i="speicher";else{let d=s===null?null:to(An(s,n),n);if(g(d))D.set(n,d),{stand:o,unvollstaendig:a}=d,i="platte";else{({stand:o,unvollstaendig:a}=ro(n,e.budgetMs??Fi,r));let k={v:1,ordner:n,stempel:l,stand:o,unvollstaendig:a,at:Date.now()};D.size>20&&D.clear(),D.set(n,k),s!==null&&no(An(s,n),k)}}}catch{}let u=new Map;return{ordner:n,herkunft:i,unvollstaendig:a,suche:(l,g)=>{let f=`${l??"*"}:${g}`;if(u.has(f))return u.get(f)??null;let d=null;if(l===null||l==="npm"){let m=g.toLowerCase();d=so(n,m)??Ze(o.npm,m)}return!d&&(l===null||l==="python")&&(d=Ze(o.python,Qe(g))),!d&&(l===null||l==="go")&&(d=Ze(o.go,g)),u.set(f,d),d}}}function Tn(t){return t.ab?`ab ${t.version} laut ${t.quelle}`:t.version}function jn(t){return Array.isArray(t)?t:typeof t=="string"&&t.trim()?[t]:[]}function ao(t){return jn(t).length>0}function co(t,e){let n=[],r=[];for(let s of jn(t)){let i=Wi(s);if("fehler"in i)continue;let o=i.angabe,a=e.suche(o.oekosystem,o.paket);if(!a)continue;let u=Ui(a.version,o.bereichText);u!==null&&(u?r.push({angabe:o.text,paket:o.paket,hier:Tn(a)}):n.push({angabe:o.text,hier:Tn(a)}))}return n.length>0?{art:"passtNicht",abweichungen:n,text:n.map(s=>`gilt fuer ${s.angabe}, hier ${s.hier}`).join("; ")}:r.length>0?{art:"passt",geprueft:r}:{art:"unbekannt"}}function uo(t,e){let n=new Map,r=[],s=[],i=null,o=!1;for(let a of t){let u=e.giltFuerVon(a);if(!ao(u)){r.push(a);continue}if(!i&&!o)try{i=(e.leser??(()=>Mn()))()}catch{o=!0}let c=i?co(u,i):{art:"unbekannt"};c.art==="passtNicht"?(n.set(e.schluesselVon(a),c.text),s.push(a)):r.push(a)}return{treffer:s.length>0?[...r,...s]:[...r],hinweise:n}}function Hn(t,e={}){let n=uo(t,{giltFuerVon:r=>r.lektion.gilt_fuer,schluesselVon:r=>String(r.lektion.topic??""),leser:e.leser??(()=>Mn(void 0,e))});return n.hinweise.size===0?t:n.treffer.map(r=>{let s=n.hinweise.get(String(r.lektion.topic??""));return s?{...r,lektion:{...r.lektion,versionshinweis:s}}:r})}import{appendFileSync as lo,mkdirSync as go,readFileSync as Fn,readdirSync as fo,rmSync as et,statSync as ho,writeFileSync as Dn}from"node:fs";import{join as ge}from"node:path";import{tmpdir as Gn}from"node:os";import{createHash as ue,randomUUID as mo}from"node:crypto";var V=[{arm:0,name:"heute",minBelege:2,topK:3},{arm:1,name:"strenger",minBelege:3,topK:3},{arm:2,name:"knapper",minBelege:2,topK:1}],Zn=Math.min(...V.map(t=>t.minBelege)),Vn=[{a:20,b:80},{a:1.8,b:8.2},{a:1.8,b:8.2}],po=1.645,$n=30,bo=.05,yo=.5,ko=.1,Jn=.1;function Un(t,e,n){let r=String(t??"").trim();if(!r)return e;let s=r.endsWith("%"),i=Number(r.replace(/%$/,"").trim().replace(",","."));if(!Number.isFinite(i)||i<0)return e;let o=s||i>=1?i/100:i;return Math.min(o,n)}function M(t=process.env){return{aktiv:!["0","off","aus","false"].includes(String(t.CACHLY_LERNEN??"").trim().toLowerCase())&&t.CACHLY_NO_TELEMETRY!=="1",kontrolleAnteil:Un(t.CACHLY_KONTROLLE_ANTEIL,bo,yo),erkundung:Un(t.CACHLY_ERKUNDUNG,ko,Jn)}}function wo(t,e,n){let r=ue("sha256").update(n).digest("hex"),s=ue("sha256").update(`${t}|${e??""}|${r}`).digest();return{kontrolle:s.readUIntBE(0,6)/2**48,erkundung:s.readUIntBE(6,6)/2**48,saat:s.readUInt32BE(12)}}function Eo(t){let e=t>>>0;return()=>{e=e+1831565813>>>0;let n=e;return n=Math.imul(n^n>>>15,n|1),n^=n+Math.imul(n^n>>>7,n|61),((n^n>>>14)>>>0)/4294967296}}function vo(t){let e=1-t();return Math.sqrt(-2*Math.log(e))*Math.cos(2*Math.PI*t())}function tt(t,e){if(t<1)return tt(t+1,e)*Math.pow(1-e(),1/t);let n=t-1/3,r=1/Math.sqrt(9*n);for(;;){let s,i;do s=vo(e),i=1+r*s;while(i<=0);i=i*i*i;let o=1-e();if(o<1-.0331*s**4||Math.log(o)<.5*s*s+n*(1-i+Math.log(i)))return n*i}}function So(t,e){let n=tt(t.a,e),r=tt(t.b,e);return n/(n+r)}function xo(t){return Vn.map((e,n)=>{let r=t?.find(o=>o?.arm===n),s=Math.max(0,Number(r?.erfolge)||0),i=Math.max(0,Number(r?.misserfolge)||0);return{a:e.a+s,b:e.b+i}})}function ce(t){return t.a/(t.a+t.b)}function Bn(t){let e=t.a+t.b;return t.a*t.b/(e*e*(e+1))}function Wn(t,e){let n=Vn[e]??{a:0,b:0};return t[e].a+t[e].b-n.a-n.b}function _o(t){if(Wn(t,0)<$n)return 0;let e=0;for(let n=1;n<t.length;n++){if(Wn(t,n)<$n)continue;(ce(t[n])-ce(t[0]))/Math.sqrt(Bn(t[n])+Bn(t[0]))>=po&&ce(t[n])>ce(t[e])&&(e=n)}return e}function Ao(t,e,n){let r=_o(t);if(!(e.erkundung<Math.min(n,Jn)))return{arm:r,erkundet:!1};let s=Eo(e.saat),i=r,o=-1;return t.forEach((a,u)=>{let c=So(a,s);c>o&&(o=c,i=u)}),{arm:i,erkundet:i!==r}}function To(t,e){return e>0&&t<e}var nt={aktiv:!1,kontrolle:!1,arm:0,erkundet:!1};function qn(t){let e=t.einstellungen??M();if(!e.aktiv)return nt;let n=wo(t.instanceId,t.sitzung,t.prompt);if(To(n.kontrolle,e.kontrolleAnteil))return{aktiv:!0,kontrolle:!0,arm:0,erkundet:!1};let{arm:r,erkundet:s}=Ao(xo(t.zaehlung),n,e.erkundung);return{aktiv:!0,kontrolle:!1,arm:r,erkundet:s}}function Kn(t){let e=t.trim();return e.length>=6&&/[:/_.-]/.test(e)}function zo(t,e){let n=`${t.antwortText}
|
|
24
|
+
${t.werkzeugEingaben}`.toLowerCase(),r=0;e.forEach((i,o)=>{Kn(i.thema)&&n.includes(i.thema.trim().toLowerCase())&&(r|=1<<o)});let s=e.map((i,o)=>({k:i,i:o})).filter(({k:i})=>i.gezeigt&&Kn(i.thema));return s.length?{belohnung:s.some(({i})=>r&1<<i)?1:0,benutzt:r}:{belohnung:-1,benutzt:r}}var Yn=5,Io=50,Lo=1800*1e3,No=10080*60*1e3,Ro=10080*60*1e3,Xn=3e3;function P(t){return ue("sha1").update(t).digest("hex").slice(0,12)}function rt(t){return ue("sha256").update(t.replace(/\s+/g," ").trim().slice(0,200)).digest("hex").slice(0,16)}function le(){return ge(Gn(),"cachly-lernen")}function Qn(t,e){return ge(le(),`${P(t)}-${P(e??"ohne")}.jsonl`)}function er(t){return ge(Gn(),`cachly-lernen-arme-${P(t)}.json`)}function tr(t){return P(t??"ohne")}function nr(t){return{id:mo(),ts:new Date().toISOString(),belohnung:-1,benutzt:0,...t}}function rr(t,e,n){try{go(le(),{recursive:!0}),lo(Qn(t,e),JSON.stringify(n)+`
|
|
25
25
|
`,{mode:384})}catch{}}function sr(t){try{return Fn(t,"utf8").split(`
|
|
26
26
|
`).filter(e=>e.trim()).map(e=>{try{return JSON.parse(e)}catch{return null}}).filter(e=>!!e&&typeof e.id=="string"&&Array.isArray(e.kandidaten)).slice(-Io)}catch{return[]}}function Co(t,e){return{id:e.id,ts:e.ts,sitzung:e.sitzung,ereignis:e.ereignis,editor:e.editor,arm:e.arm,kontrolle:e.kontrolle,erkundet:e.erkundet,ausgewaehlt:e.ausgewaehlt,kandidaten_zahl:e.kandidatenZahl,belege:e.belege,top_score:e.topScore,leser:e.leser,leser_ms:e.leserMs,quelle:e.quelle,bestand:e.bestand,belohnung:e.belohnung,benutzt:e.benutzt,merkmale:e.kandidaten.map(n=>({t:P(`${t}|${n.thema}`),r:n.rang,p:n.punkte,b:n.belege,l:n.leser,g:n.gezeigt}))}}async function ir(t,e,n,r){if(!e.length)return!0;try{return(await n(`${t.apiUrl}/api/v1/instances/${t.instanceId}/einblendungen`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.jwt}`},body:JSON.stringify({entscheidungen:e.map(i=>Co(t.instanceId,i))}),signal:AbortSignal.timeout(r)})).ok}catch{return!1}}async function st(t,e,n,{fetchFn:r=fetch,zeitlimitMs:s=Xn,einstellungen:i}={}){try{if(!(i??M()).aktiv||!t?.jwt||!t?.instanceId)return null;let a=Qn(t.instanceId,e),u=sr(a);if(!u.length)return null;let c=null;if(n){let l=pn(n),g=rt(l.frage),f=[...u].reverse().find(d=>d.belohnung===-1&&d.zug===g);f&&(c=zo(l,f.kandidaten),f.belohnung=c.belohnung,f.benutzt=c.benutzt)}return await ir(t,u,r,s)?et(a,{force:!0}):Dn(a,u.map(l=>JSON.stringify(l)).join(`
|
|
27
27
|
`)+`
|
|
28
|
-
`,{mode:384}),c}catch{return null}}async function Oo(t,e,n,r){let s;try{s=fo(le())}catch{return}let i=`${P(t.instanceId)}-`,o=[];for(let a of s){let u=ge(le(),a);try{let c=r-ho(u).mtimeMs;c>
|
|
28
|
+
`,{mode:384}),c}catch{return null}}async function Oo(t,e,n,r){let s;try{s=fo(le())}catch{return}let i=`${P(t.instanceId)}-`,o=[];for(let a of s){let u=ge(le(),a);try{let c=r-ho(u).mtimeMs;c>No?et(u,{force:!0}):a.startsWith(i)&&c>=Lo&&o.length<20&&o.push(u)}catch{}}await Promise.all(o.map(async a=>{await ir(t,sr(a),e,n)&&et(a,{force:!0})}))}async function Po(t,e,n){try{let r=await e(`${t.apiUrl}/api/v1/einblendung/arme`,{headers:{Authorization:`Bearer ${t.jwt}`},signal:AbortSignal.timeout(n)});if(!r.ok)return;let s=await r.json();if(!Array.isArray(s?.arme))return;let i=s.arme.filter(o=>o&&Number.isInteger(o.arm)).map(o=>({arm:o.arm,erfolge:Number(o.erfolge)||0,misserfolge:Number(o.misserfolge)||0}));Dn(er(t.instanceId),JSON.stringify({at:Date.now(),arme:i}),{mode:384})}catch{}}function or(t,e=Date.now()){try{let n=JSON.parse(Fn(er(t),"utf8"));return!Array.isArray(n?.arme)||e-Number(n.at)>Ro?null:n.arme}catch{return null}}async function it(t,{fetchFn:e=fetch,zeitlimitMs:n=Xn,einstellungen:r,jetzt:s=Date.now()}={}){try{if(!(r??M()).aktiv||!t?.jwt||!t?.instanceId)return;await Promise.all([Po(t,e,n),Oo(t,e,n,s)])}catch{}}var Do=600*1e3,ur=300*1e3,Go=10*1e3,Zo=2e3,Vo=50,Jo=60*1e3;function qo(t,e){return e<ur?{ttlMs:Go,sofort:!0}:t<Vo?{ttlMs:Jo,sofort:!1}:{ttlMs:Do,sofort:!1}}var lr=8e3,Yo=60*1e3,ar=120,Xo=15,Qo=1500,gr=2500,ea=he(me(),"cachly-ambient-netlog.jsonl");function at(t){return Ko("sha1").update(t).digest("hex").slice(0,12)}function fr(t){return he(me(),`cachly-ambient-bestand-${at(t)}.json`)}function ta(t){return he(me(),`cachly-leser-sicherung-${at(t)}.json`)}function na(t,e="ambient-auffrischen"){return he(me(),`cachly-${e}-${at(t)}.lock`)}async function ot(t,{fetchFn:e=fetch,zeitlimitMs:n=lr}={}){try{let r=await e(`${t.apiUrl}/api/v1/instances/${t.instanceId}/export`,{headers:{Authorization:`Bearer ${t.jwt}`},signal:AbortSignal.timeout(n)});if(!r.ok)return null;let s=await r.json();return!Array.isArray(s?.lessons)||s.lessons.length===0&&typeof s.note=="string"&&s.note?null:s.lessons.map(i=>typeof i=="string"?ra(i):i).filter(i=>!!i&&typeof i=="object")}catch{return null}}function ra(t){try{return JSON.parse(t)}catch{return null}}function fe(t,e,n="server"){let r=Date.now(),s=de(t),i=s?.seit??r,o;n==="vorab"?o=e:n==="server"&&s?.vorab&&r-i<ur&&(o=s.vorab);let a=n==="server"&&o?sa(e,o):e;try{$o(Wo(t),{recursive:!0}),cr(t,JSON.stringify({at:r,seit:i,lessons:a,...o?{vorab:o}:{}}),{mode:384})}catch{}return a}function sa(t,e){let n=new Set(t.map(r=>r.topic));return[...t,...e.filter(r=>!n.has(r.topic))]}function dr(t,e){if(!t||e.length===0)return!1;let n=fr(t);return(de(n)?.lessons.length??0)>0?!1:(fe(n,e,"vorab"),!0)}function de(t){try{let e=JSON.parse(jo(t,"utf8"));if(Array.isArray(e?.lessons)){let n=Number(e.at)||0;return{at:n,seit:Number(e.seit)||n,lessons:e.lessons,...Array.isArray(e.vorab)?{vorab:e.vorab}:{}}}}catch{}return null}function ct(t,e,{zweck:n,ordner:r}={}){let s=na(t.instanceId,n);try{if(Ho(s)&&Date.now()-Uo(s).mtimeMs<Yo)return!1;cr(s,String(Date.now()),{mode:384})}catch{return!1}try{return Fo(process.execPath,e,{detached:!0,stdio:"ignore",...r?{cwd:r}:{},env:{...process.env,CACHLY_API_URL:t.apiUrl,CACHLY_JWT:t.jwt,CACHLY_BRAIN_INSTANCE_ID:t.instanceId}}).unref(),!0}catch{return!1}}async function L(t,{force:e=!1,nebenlauf:n,abrufMs:r=lr,lernen:s=!1,vorabSchliessen:i=!1,fetchFn:o}={}){if(!t.jwt||!t.instanceId)return{lessons:[],quelle:"nicht-eingerichtet"};let a=fr(t.instanceId);if(e){let[l]=await Promise.all([ot(t,{fetchFn:o,zeitlimitMs:r}),s?it(t,{fetchFn:o}):void 0]);if(l)return{lessons:fe(a,l,i?"abschluss":"server"),quelle:"server"};let g=de(a);return g?{lessons:g.lessons,quelle:"platte-alt"}:{lessons:[],quelle:"server-nicht-erreichbar"}}let u=de(a);if(u){let l=Date.now(),g=qo(u.lessons.length,l-u.seit);if(l-u.at<g.ttlMs)return{lessons:u.lessons,quelle:"platte"};if(g.sofort){let d=await ot(t,{fetchFn:o,zeitlimitMs:Math.min(r,Zo)});return d?{lessons:fe(a,d),quelle:"server"}:{lessons:u.lessons,quelle:"platte-alt"}}return n&&ct(t,n),{lessons:u.lessons,quelle:"platte-alt"}}let c=await ot(t,{fetchFn:o,zeitlimitMs:r});return c?{lessons:fe(a,c),quelle:"server"}:{lessons:[],quelle:"server-nicht-erreichbar"}}function J(t){return Math.ceil(String(t).length/4)}function ut(t){let e=t.severity?`[${t.severity}] `:"",n=String(t.what_worked??"").replace(/\s+/g," ").trim(),r=n.length>ar?`${n.slice(0,ar)}\u2026`:n,s=typeof t.versionshinweis=="string"?` [${t.versionshinweis}]`:"";return`- ${e}${t.topic}${s}: ${r}`}var ia={lessons:[],tokens:0,topScore:0,belege:0};function oa(t,e,n){if(t.length===0)return{...ia};let r=[],s=0;t=Hn(t);for(let{lektion:i}of t.slice(0,e)){let o=J(ut(i));if(s+o>n)break;r.push(i),s+=o}return{lessons:r,tokens:s,topScore:Math.round(t[0].punkte*100)/100,belege:t[0].belege}}function aa(t){return $t(t,Qo)}async function ca(t,e,n,{zeitlimitMs:r=gr,fetchFn:s}={}){if(!t?.jwt||!t?.instanceId||n.length===0)return{art:"ohne"};if(["0","off","aus","false"].includes(String(process.env.CACHLY_LESER||"").toLowerCase()))return{art:"ohne"};let i=new F(En(ta(t.instanceId)));return De({url:`${t.apiUrl}/api/v1/rerank`,jwt:t.jwt,frage:e,texte:n,instanceId:t.instanceId,zeitlimitMs:r,fetchFn:s},i)}async function ua(t,e,n,{minBelege:r,tiefe:s,zeitlimitMs:i,fetchFn:o}){let a={sortiert:[],leser:"aus",leserMs:0};if(!Array.isArray(e)||e.length===0||Be(t).length===0)return a;let u=new ie(e).sortiere(t).filter(g=>g.belege>=r);if(u.length===0)return a;let c="aus",l=0;if(u.length>1&&s>0){let g=u.slice(0,s),f=u.slice(s),d=await ca(n,t,g.map(m=>aa(m.lektion)),{zeitlimitMs:i,fetchFn:o});d.art==="punkte"?(u=[...Sn(g.map(k=>k.punkte),d.scores,1).map(k=>({...g[k],leser:d.scores[k]})),...f],c=d.provider,l=d.ms):d.art==="uebersprungen"&&(c="uebersprungen")}return{sortiert:u,leser:c,leserMs:l}}function la(t){if(!t.lessons.length)return"";let e=t.lessons.map(ut).join(`
|
|
29
29
|
`);return`\u{1F9E0} Cachly Brain \u2014 relevant lessons for this task (auto-recall, ${t.lessons.length}):
|
|
30
30
|
${se(e)}
|
|
31
31
|
(ambient-recall \xB7 ~${t.tokens} tokens \xB7 match score ${t.topScore})`}var ga=5;function hr(t){let e=t.filter(u=>!B(u));if(!e.length)return"";let n=e.filter(u=>{let c=String(u.topic??"");return!(/^auto:/.test(c)||yn(c))}),r=[...n.length?n:e].sort((u,c)=>(Number(c.recall_count)||0)-(Number(u.recall_count)||0)).slice(0,ga),s=r.map(ut).join(`
|
|
32
32
|
`),i=r.some(u=>(Number(u.recall_count)||0)>0),o=i?"Top by proven reuse":"Starter tips (not yet from your project)",a=i?W:W.replace("Stored notes from earlier sessions.","General starter notes, not yet from your project.");return`\u{1F9E0} Cachly Brain \u2014 ambient recall active (${e.length} lessons). ${o}:
|
|
33
33
|
${se(s,a)}
|
|
34
|
-
(Relevant lessons for each task are auto-injected per prompt. ~${J(s)} tokens.)`}function j(t,e){return e?JSON.stringify({hookSpecificOutput:{hookEventName:t,additionalContext:e}}):""}function fa(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 mr(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
|
|
34
|
+
(Relevant lessons for each task are auto-injected per prompt. ~${J(s)} tokens.)`}function j(t,e){return e?JSON.stringify({hookSpecificOutput:{hookEventName:t,additionalContext:e}}):""}function fa(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 mr(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(),m=c&&d.aktiv&&a==="UserPromptSubmit"&&!!e.instanceId,k=m?qn({instanceId:e.instanceId,sitzung:i,prompt:t,zaehlung:or(e.instanceId),einstellungen:d}):nt,C=V[k.arm]??V[0],S=await ua(t,g,e,{minBelege:Zn,tiefe:s?Xo:0,zeitlimitMs:gr,fetchFn:l}),w={...oa(S.sortiert.filter(E=>E.belege>=C.minBelege),C.topK,600),leser:S.leser,leserMs:S.leserMs},h=k.kontrolle?"":la(w);if(m&&S.sortiert.length>0&&rr(e.instanceId,i,nr({sitzung:tr(i),zug:rt(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:fa(S.sortiert,w.lessons)})),o)try{Bo(ea,JSON.stringify({at:Date.now(),session:i,prompt_tokens:J(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 da=new Set(["Edit","Write","MultiEdit","NotebookEdit"]);function ha(t){let e=t.hook_event_name??"UserPromptSubmit";if(e==="SessionStart"||e==="Stop")return null;if(e==="PreToolUse"){if(t.tool_name&&!da.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 pr=/\b(fixed|resolved|behoben|gefixt|root cause (was|is|found)|the bug was|der fehler (lag|war)|ursache (war|gefunden)|now passes|tests? (are|is|sind) (green|grün)|deployed successfully)\b/i,ma=/\b(could not|couldn't|cannot|can't|unable to|not (yet )?(fixed|resolved|working)|still (fail|red|broken|not|deadlock)\w*|unknown|unclear|gave up|nicht (behoben|gefixt|gel(ö|oe)st)|konnte (ich )?(\w+ )?nicht|noch nicht|weiterhin|unklar)\b/i;function br(t){let e=(t.last_assistant_message??"").trim();if(e.length<80||!pr.test(e)||ma.test(e))return null;let n=e.split(`
|
|
36
|
-
`).map(s=>s.trim()).filter(s=>s.length>0);return{action:(n.find(s=>pr.test(s))??n[0]??e).slice(0,200),outcome:"success",details:e.slice(0,500),severity:"minor"}}function yr(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 kr(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 N(e.cfg,{force:!0,fetchFn:e.fetchFn});s=hr(i)}else{let i=ha(n);if(i===null)return"";s=(await mr(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?.(J(s),r)}catch{}return j(r,s)}catch{return""}}import{resolve as fc}from"node:path";var lt=[{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}],ba=lt.length;import{execFileSync as ya}from"node:child_process";function wr(t,e,n={}){return ya("git",[...e],{cwd:t,encoding:"utf-8",stdio:["ignore","pipe",n.stderr??"ignore"],timeout:n.timeoutMs??5e3,windowsHide:!0})}function Er(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 vr(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 Sr(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 be="[GESCHWAERZT]",ka=/x{12,}/i,wa=t=>/\d/.test(t)&&/[A-Za-z]/.test(t),gt=t=>/^[A-Z][A-Z0-9_]{2,}$/.test(t)||/environ|process\.env|secrets\./i.test(t),Ea="(?!(?:localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|\\[::1\\])[:/\\s])",va=[{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,})@${Ea}`,"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:gt},{name:"Token-Zuweisung",re:/token["']?\s*[:=]\s*["']?((?![$<{%])[^\s"'`,;)]{12,})/gi,gruppe:1,ausser:t=>gt(t)||!wa(t)},{name:"Passwort in Anfuehrungszeichen",re:/(?:password|passwort|kennwort|passwd)\s+(?:ist\s+|is\s+|lautet\s+)?["„“'‘]((?![$<{%])[^"”“'’\s]{6,})["”“'’]/gi,gruppe:1,ausser:gt},{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 xr(t){let e=String(t??""),n=[];for(let r of va)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(be)||ka.test(o)||r.ausser?.(o)?s:(n.push(r.name),r.gruppe===void 0?be:s.replace(o,be))});return{text:e,funde:n}}var Sa=/\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,Ar=[{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=>Sa.test(t)},{art:"injektion",name:"unsichtbare-zeichen",re:/[\u{E0000}-\u{E007F}\u{202A}-\u{202E}\u{2066}-\u{2069}]/u}],xa="(?:\\.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)",Tr=[{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(`${xa}[^\\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\//}],_a=/"[^"\n]{2,400}"|„[^“”"\n]{2,400}[“”]|“[^”\n]{2,400}”|«[^»\n]{2,400}»|`[^`\n]{1,400}`/g;function Aa(t){return t.replace(_a," ")}function _r(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 Ta(t){let e=String(t??"");if(!e)return[];let n=[];for(let r of za(e))for(let s of[..._r(Ar,Aa(r)),..._r(Tr,r)])n.some(i=>i.regel===s.regel)||n.push(s);return n}var ft=5e4;function za(t){return t.length<=ft?[t]:[t.slice(0,ft/2),t.slice(t.length-ft/2)]}function zr(t){return Ta(t).map(({art:e,regel:n})=>({art:e,regel:n}))}function Ir(t){let e=Array.isArray(t)?t.filter(n=>typeof n=="string"):[];return e.includes(U)?e:[...e,U]}var Wl=[...Ar,...Tr].map(t=>t.name);var Nr=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"]),Ia=new Set(["tags","author"]),Lr=8,Na=2e3;function Rr(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=xr(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(Rr(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 Ra(t,e=Nr){let n=new Set,r=0,s=(i,o,a)=>{if(!(r>=Na)){if(typeof i=="string"){r++;for(let u of zr(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(Rr(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 Cr(t){let e=La(t);return{felder:e.wert,geschwaerzt:e.funde,verdacht:Ra(e.wert,new Set([...Nr,...Ia]))}}function Or(t,e){let n=Array.isArray(t)?t.filter(r=>typeof r=="string"):[];return e.length?Ir(n):n}var Pr=12;function Mr(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 jr(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=Er(s);i&&n.files.push(i)}}return n&&e.push(n),e}function Ca(t){let e=Cr({subject:t.subject,author:t.author,files:t.files.slice(0,Pr)}),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}=vr(n.subject),a=n.sha.slice(0,8);return{...r,lektion:{topic:`${s}:${Sr(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,Pr),commands:[`git show ${a}`],tags:Or(["brain_from_git",s,"git-history"],e.verdacht)}}}function Hr(t){let e=new Map;for(let n of t){let{lektion:r}=Ca(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 Pa}from"node:os";import{basename as fg,isAbsolute as Ma,relative as ja,resolve as ye}from"node:path";var $r=30;var pg=90*86400;function Ur(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTVORRAT??"").trim())}function Ha(t,e){let n=ja(e,t);return n===""||!n.startsWith("..")&&!Ma(n)}function $a(t,e){return process.platform==="win32"?t.toLowerCase()===e.toLowerCase():t===e}function Br(t,e=process.env){let n=ye(t),r=(e.CLAUDE_PLUGIN_ROOT??"").trim();if(r&&!r.includes("${")&&Ha(n,ye(r)))return"plugin-ordner";if(n.split(/[\\/]+/).some(i=>i==="node_modules"||i==="_npx"))return"paketordner";let s=e.HOME||e.USERPROFILE||Pa();return s&&$a(n,ye(s))?"heimordner":""}function Wr(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?"":ye(s))})}catch{e("")}})}import{closeSync as Ya,existsSync as xg,mkdirSync as pt,openSync as Xa,readFileSync as Qa,renameSync as ec,statSync as tc,unlinkSync as nc,writeFileSync as Qr,writeSync as rc}from"node:fs";import{dirname as Se,join as ve}from"node:path";import{existsSync as Kr,mkdirSync as Ua,writeFileSync as Ba,renameSync as Wa,chmodSync as Ka,readFileSync as Fr}from"node:fs";import{resolve as Dr,dirname as Fa}from"node:path";function Da(){return process.env.HOME??process.env.USERPROFILE??process.env.APPDATA??""}function dt(t){return/^\$\{[^}]*\}$/.test(t.trim())}function L(t){if(!(typeof t!="string"||t.length===0))return dt(t)?void 0:t}function ke(t={}){let e=t.home??Da();return Dr(e,".cachly","credentials.json")}function we(t,e={}){let n=q(e),r=n?.apiKey===t?L(n.instanceId):void 0;Vr({apiKey:t,...r?{instanceId:r}:{}},e)}function Gr(t,e){let n=q(e);!L(t)||!n?.apiKey||n.apiKey!==e.apiKey||n.instanceId!==t&&Vr({...n,instanceId:t},e)}function Ee(t={}){return L(q(t)?.instanceId)}function Zr(t={}){return L(q(t)?.apiKey)}function q(t){try{let e=ke(t);if(!Kr(e))return null;let n=JSON.parse(Fr(e,"utf8"));return n&&typeof n=="object"?n:null}catch{return null}}function Vr(t,e){try{let n=ke(e);Ua(Fa(n),{recursive:!0});let r=`${n}.${process.pid}-${Date.now()}.tmp`;Ba(r,JSON.stringify(t,null,2),"utf8");try{Ka(r,384)}catch{}Wa(r,n)}catch{}}function Ga(t){return L(q(t)?.apiKey)}function Za(t){try{let e=Dr(t.cwd??process.cwd(),".mcp.json");if(!Kr(e))return;let n=JSON.parse(Fr(e,"utf8"));return L(n.mcpServers?.cachly?.env?.CACHLY_JWT)}catch{return}}function Jr(t={}){let e=t.env??process.env;return L(e.CACHLY_JWT)??L(e.CACHLY_API_KEY)??Ga(t)??Za(t)}function Va(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 Ja(t){return`${t.replace(/\/+$/,"")}/auth/instant-trial`}function qa(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 ht=8e3,qr=!1;async function Yr(t){if(qr)return null;qr=!0;let e=t.holen??fetch,n=t.speichern??we;try{let r=await e(Ja(t.apiUrl),{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","User-Agent":Va(t.version,t.env??process.env)},body:"{}",signal:AbortSignal.timeout(t.fristMs??ht)});if(!r.ok)return null;let s=qa(await r.json());return s?(n(s.apiKey),s):null}catch{return null}}var es=15e3,sc=100,ts=600*1e3,zg=1440*60*1e3,ns="anlegen.lock",ic="anlegen.fehler",oc="startwissen-auftrag.json";function xe(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTWISSEN??"").trim())}function bt(t){return Se(ke(t))}var ac=t=>new Promise(e=>setTimeout(e,t));function Xr(t){return{apiKey:Zr(t),instanzId:Ee(t)}}function cc(t,e){try{pt(Se(t),{recursive:!0})}catch{return"kein-zugriff"}try{let n=Xa(t,"wx",384);try{rc(n,`${process.pid} ${e}`)}finally{Ya(n)}return"ja"}catch(n){return n?.code==="EEXIST"?"belegt":"kein-zugriff"}}function yt(t,e){try{return e-tc(t).mtimeMs}catch{return null}}function mt(t){try{nc(t)}catch{}}function uc(t,e=Date.now()){let n=yt(ve(bt(t),ns),e);return n!==null&&n<es}function lc(t,e,n){if(e<=0)return!1;let r=null;try{let i=Number(Qa(t,"utf8").trim());Number.isFinite(i)&&i>0&&(r=i)}catch{}let s=r!==null?n-r:yt(t,n);return s!==null&&s>=0&&s<e}function gc(t,e){try{pt(Se(t),{recursive:!0}),Qr(t,String(e),{mode:384})}catch{}}async function rs(t){let e=t.jetzt??Date.now,n=t.schlafen??ac,r=e()+t.fristMs,s=bt(t),i=ve(s,ns),o=ve(s,ic);try{for(;;){let a=Xr(t);if(a.apiKey&&(a.instanzId||!uc(t,e())))return{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId};if(!a.apiKey){let u=cc(i,e());if(u==="kein-zugriff")return{art:"gescheitert",grund:"kein-schreibzugriff"};if(u==="ja")try{let l=Xr(t);if(l.apiKey)return{art:"vorhanden",apiKey:l.apiKey,instanzId:l.instanzId};if(lc(o,t.abkuehlungMs??0,e()))return{art:"gescheitert",grund:"abgekuehlt"};let g=Math.max(500,r-e()),f=await Yr({apiUrl:t.apiUrl,version:t.version,holen:t.holen,env:t.env,fristMs:Math.min(g,t.anfrageMs??ht),speichern:d=>we(d,t)});return f?(Gr(f.instanzId,{...t,apiKey:f.apiKey}),mt(o),{art:"angelegt",test:f}):(gc(o,e()),{art:"gescheitert",grund:"kein-test"})}finally{mt(i)}let c=yt(i,e());c!==null&&c>=es&&mt(i)}if(e()>=r)return a.apiKey?{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId}:{art:"gescheitert",grund:"sperre-belegt"};await n(sc)}}catch{return{art:"gescheitert",grund:"kein-test"}}}function kt(t,e={}){try{let n=ve(bt(e),oc);pt(Se(n),{recursive:!0});let r=`${n}.${process.pid}.tmp`;Qr(r,JSON.stringify({...t,am:new Date().toISOString()}),{mode:384}),ec(r,n)}catch{}}var Y="startwissen-import",dc=9e4,is=1e3,hc=3,os=8e3,ss=3,as=t=>new Promise(e=>setTimeout(e,t));function mc(t){return Hr(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 lt.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 bc(t){return wr(t,Mr("HEAD",$r),{timeoutMs:2e4})}var yc={brain_from_git:.55,starter:.9};function kc(t,e=new Date){let n=e.toISOString();return t.map(r=>({...r,severity:r.severity||"major",recall_count:0,confidence:yc[r.source],ts:n,verified_at:n}))}async function wc(t){let e=t.fetchFn??fetch,n=t.jetzt??Date.now,r=t.schlafen??as,s=n()+(t.bereitFristMs??dc);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(os)});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(is)}}async function Ec(t,e){let n=t.fetchFn??fetch,r=t.schlafen??as,s=0,i=0,o=async()=>{for(;s<e.length;){let a=e[s++];for(let u=1;u<=ss;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(os)});if(c.ok){i++;break}if(c.status!==409&&c.status!==429&&c.status<500)break}catch{}u<ss&&await r(is*u)}}};return await Promise.all(Array.from({length:Math.min(hc,e.length)},o)),i}async function cs(t){try{if(!xe(t.env))return{art:"aus"};let e=fc(t.projekt||"."),n=await(t.gitWurzel??Wr)(e),r,s;if(n){let a=Br(n,t.env);if(a)return{art:"ausgeschlossen",grund:a};r="git";let u="";try{u=(t.gitLog??bc)(n)}catch{}if(s=mc(jr(u)),s.length===0)return{art:r,lektionen:0,gesendet:0}}else{if(!Ur(t.env))return{art:"kein-repo"};r="startvorrat",s=pc()}dr(t.cfg.instanceId,kc(s));let i=await wc(t);if(i==="hat-lektionen"&&await N(t.cfg,{force:!0,vorabSchliessen:!0,fetchFn:t.fetchFn}),i!=="leer")return{art:i};let o=await Ec(t,s);return o>0&&await N(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 us(t){if((t.art==="git"||t.art==="startvorrat")&&t.gesendet>0)return{art:t.art,lektionen:t.gesendet}}import{appendFile as vc,readFile as Sc,rename as xc,writeFile as _c}from"node:fs/promises";import{mkdir as Ac}from"node:fs/promises";import{homedir as Tc}from"node:os";import{dirname as zc,resolve as Ic}from"node:path";function Nc(){return Ic(Tc(),".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 Rc=256*1024,Cc=400;async function ls(t,e=Nc()){try{await Ac(zc(e),{recursive:!0}),await vc(e,Lc(t)+`
|
|
36
|
+
`).map(s=>s.trim()).filter(s=>s.length>0);return{action:(n.find(s=>pr.test(s))??n[0]??e).slice(0,200),outcome:"success",details:e.slice(0,500),severity:"minor"}}function yr(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 kr(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=ha(n);if(i===null)return"";s=(await mr(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?.(J(s),r)}catch{}return j(r,s)}catch{return""}}import{resolve as fc}from"node:path";var lt=[{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}],ba=lt.length;import{execFileSync as ya}from"node:child_process";function wr(t,e,n={}){return ya("git",[...e],{cwd:t,encoding:"utf-8",stdio:["ignore","pipe",n.stderr??"ignore"],timeout:n.timeoutMs??5e3,windowsHide:!0})}function Er(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 vr(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 Sr(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 be="[GESCHWAERZT]",ka=/x{12,}/i,wa=t=>/\d/.test(t)&&/[A-Za-z]/.test(t),gt=t=>/^[A-Z][A-Z0-9_]{2,}$/.test(t)||/environ|process\.env|secrets\./i.test(t),Ea="(?!(?:localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0|\\[::1\\])[:/\\s])",va=[{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,})@${Ea}`,"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:gt},{name:"Token-Zuweisung",re:/token["']?\s*[:=]\s*["']?((?![$<{%])[^\s"'`,;)]{12,})/gi,gruppe:1,ausser:t=>gt(t)||!wa(t)},{name:"Passwort in Anfuehrungszeichen",re:/(?:password|passwort|kennwort|passwd)\s+(?:ist\s+|is\s+|lautet\s+)?["„“'‘]((?![$<{%])[^"”“'’\s]{6,})["”“'’]/gi,gruppe:1,ausser:gt},{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 xr(t){let e=String(t??""),n=[];for(let r of va)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(be)||ka.test(o)||r.ausser?.(o)?s:(n.push(r.name),r.gruppe===void 0?be:s.replace(o,be))});return{text:e,funde:n}}var Sa=/\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,Ar=[{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=>Sa.test(t)},{art:"injektion",name:"unsichtbare-zeichen",re:/[\u{E0000}-\u{E007F}\u{202A}-\u{202E}\u{2066}-\u{2069}]/u}],xa="(?:\\.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)",Tr=[{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(`${xa}[^\\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\//}],_a=/"[^"\n]{2,400}"|„[^“”"\n]{2,400}[“”]|“[^”\n]{2,400}”|«[^»\n]{2,400}»|`[^`\n]{1,400}`/g;function Aa(t){return t.replace(_a," ")}function _r(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 Ta(t){let e=String(t??"");if(!e)return[];let n=[];for(let r of za(e))for(let s of[..._r(Ar,Aa(r)),..._r(Tr,r)])n.some(i=>i.regel===s.regel)||n.push(s);return n}var ft=5e4;function za(t){return t.length<=ft?[t]:[t.slice(0,ft/2),t.slice(t.length-ft/2)]}function zr(t){return Ta(t).map(({art:e,regel:n})=>({art:e,regel:n}))}function Ir(t){let e=Array.isArray(t)?t.filter(n=>typeof n=="string"):[];return e.includes(U)?e:[...e,U]}var Kl=[...Ar,...Tr].map(t=>t.name);var Lr=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"]),Ia=new Set(["tags","author"]),Nr=8,La=2e3;function Rr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Na(t){let e=[],n=(r,s,i)=>{if(typeof r=="string"){let o=xr(r);return e.push(...o.funde.map(a=>`${s||"text"}: ${a}`)),o.text}if(i>=Nr)return r;if(Array.isArray(r))return r.map(o=>n(o,s,i+1));if(Rr(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 Ra(t,e=Lr){let n=new Set,r=0,s=(i,o,a)=>{if(!(r>=La)){if(typeof i=="string"){r++;for(let u of zr(i))n.add(`${o||"text"}: ${u.art}/${u.regel}`);return}if(!(a>=Nr)){if(Array.isArray(i))for(let u of i)s(u,o,a+1);else if(Rr(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 Cr(t){let e=Na(t);return{felder:e.wert,geschwaerzt:e.funde,verdacht:Ra(e.wert,new Set([...Lr,...Ia]))}}function Or(t,e){let n=Array.isArray(t)?t.filter(r=>typeof r=="string"):[];return e.length?Ir(n):n}var Pr=12;function Mr(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 jr(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=Er(s);i&&n.files.push(i)}}return n&&e.push(n),e}function Ca(t){let e=Cr({subject:t.subject,author:t.author,files:t.files.slice(0,Pr)}),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}=vr(n.subject),a=n.sha.slice(0,8);return{...r,lektion:{topic:`${s}:${Sr(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,Pr),commands:[`git show ${a}`],tags:Or(["brain_from_git",s,"git-history"],e.verdacht)}}}function Hr(t){let e=new Map;for(let n of t){let{lektion:r}=Ca(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 Pa}from"node:os";import{basename as dg,isAbsolute as Ma,relative as ja,resolve as ye}from"node:path";var $r=30;var bg=90*86400;function Ur(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTVORRAT??"").trim())}function Ha(t,e){let n=ja(e,t);return n===""||!n.startsWith("..")&&!Ma(n)}function $a(t,e){return process.platform==="win32"?t.toLowerCase()===e.toLowerCase():t===e}function Br(t,e=process.env){let n=ye(t),r=(e.CLAUDE_PLUGIN_ROOT??"").trim();if(r&&!r.includes("${")&&Ha(n,ye(r)))return"plugin-ordner";if(n.split(/[\\/]+/).some(i=>i==="node_modules"||i==="_npx"))return"paketordner";let s=e.HOME||e.USERPROFILE||Pa();return s&&$a(n,ye(s))?"heimordner":""}function Wr(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?"":ye(s))})}catch{e("")}})}import{closeSync as Ya,existsSync as _g,mkdirSync as pt,openSync as Xa,readFileSync as Qa,renameSync as ec,statSync as tc,unlinkSync as nc,writeFileSync as Qr,writeSync as rc}from"node:fs";import{dirname as Se,join as ve}from"node:path";import{existsSync as Kr,mkdirSync as Ua,writeFileSync as Ba,renameSync as Wa,chmodSync as Ka,readFileSync as Fr}from"node:fs";import{resolve as Dr,dirname as Fa}from"node:path";function Da(){return process.env.HOME??process.env.USERPROFILE??process.env.APPDATA??""}function dt(t){return/^\$\{[^}]*\}$/.test(t.trim())}function N(t){if(!(typeof t!="string"||t.length===0))return dt(t)?void 0:t}function ke(t={}){let e=t.home??Da();return Dr(e,".cachly","credentials.json")}function we(t,e={}){let n=q(e),r=n?.apiKey===t?N(n.instanceId):void 0;Vr({apiKey:t,...r?{instanceId:r}:{}},e)}function Gr(t,e){let n=q(e);!N(t)||!n?.apiKey||n.apiKey!==e.apiKey||n.instanceId!==t&&Vr({...n,instanceId:t},e)}function Ee(t={}){return N(q(t)?.instanceId)}function Zr(t={}){return N(q(t)?.apiKey)}function q(t){try{let e=ke(t);if(!Kr(e))return null;let n=JSON.parse(Fr(e,"utf8"));return n&&typeof n=="object"?n:null}catch{return null}}function Vr(t,e){try{let n=ke(e);Ua(Fa(n),{recursive:!0});let r=`${n}.${process.pid}-${Date.now()}.tmp`;Ba(r,JSON.stringify(t,null,2),"utf8");try{Ka(r,384)}catch{}Wa(r,n)}catch{}}function Ga(t){return N(q(t)?.apiKey)}function Za(t){try{let e=Dr(t.cwd??process.cwd(),".mcp.json");if(!Kr(e))return;let n=JSON.parse(Fr(e,"utf8"));return N(n.mcpServers?.cachly?.env?.CACHLY_JWT)}catch{return}}function Jr(t={}){let e=t.env??process.env;return N(e.CACHLY_JWT)??N(e.CACHLY_API_KEY)??Ga(t)??Za(t)}function Va(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 Ja(t){return`${t.replace(/\/+$/,"")}/auth/instant-trial`}function qa(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 ht=8e3,qr=!1;async function Yr(t){if(qr)return null;qr=!0;let e=t.holen??fetch,n=t.speichern??we;try{let r=await e(Ja(t.apiUrl),{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","User-Agent":Va(t.version,t.env??process.env)},body:"{}",signal:AbortSignal.timeout(t.fristMs??ht)});if(!r.ok)return null;let s=qa(await r.json());return s?(n(s.apiKey),s):null}catch{return null}}var es=15e3,sc=100,ts=600*1e3,Ig=1440*60*1e3,ns="anlegen.lock",ic="anlegen.fehler",oc="startwissen-auftrag.json";function xe(t=process.env){return!/^(0|false|off|no|nein)$/i.test((t.CACHLY_STARTWISSEN??"").trim())}function bt(t){return Se(ke(t))}var ac=t=>new Promise(e=>setTimeout(e,t));function Xr(t){return{apiKey:Zr(t),instanzId:Ee(t)}}function cc(t,e){try{pt(Se(t),{recursive:!0})}catch{return"kein-zugriff"}try{let n=Xa(t,"wx",384);try{rc(n,`${process.pid} ${e}`)}finally{Ya(n)}return"ja"}catch(n){return n?.code==="EEXIST"?"belegt":"kein-zugriff"}}function yt(t,e){try{return e-tc(t).mtimeMs}catch{return null}}function mt(t){try{nc(t)}catch{}}function uc(t,e=Date.now()){let n=yt(ve(bt(t),ns),e);return n!==null&&n<es}function lc(t,e,n){if(e<=0)return!1;let r=null;try{let i=Number(Qa(t,"utf8").trim());Number.isFinite(i)&&i>0&&(r=i)}catch{}let s=r!==null?n-r:yt(t,n);return s!==null&&s>=0&&s<e}function gc(t,e){try{pt(Se(t),{recursive:!0}),Qr(t,String(e),{mode:384})}catch{}}async function rs(t){let e=t.jetzt??Date.now,n=t.schlafen??ac,r=e()+t.fristMs,s=bt(t),i=ve(s,ns),o=ve(s,ic);try{for(;;){let a=Xr(t);if(a.apiKey&&(a.instanzId||!uc(t,e())))return{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId};if(!a.apiKey){let u=cc(i,e());if(u==="kein-zugriff")return{art:"gescheitert",grund:"kein-schreibzugriff"};if(u==="ja")try{let l=Xr(t);if(l.apiKey)return{art:"vorhanden",apiKey:l.apiKey,instanzId:l.instanzId};if(lc(o,t.abkuehlungMs??0,e()))return{art:"gescheitert",grund:"abgekuehlt"};let g=Math.max(500,r-e()),f=await Yr({apiUrl:t.apiUrl,version:t.version,holen:t.holen,env:t.env,fristMs:Math.min(g,t.anfrageMs??ht),speichern:d=>we(d,t)});return f?(Gr(f.instanzId,{...t,apiKey:f.apiKey}),mt(o),{art:"angelegt",test:f}):(gc(o,e()),{art:"gescheitert",grund:"kein-test"})}finally{mt(i)}let c=yt(i,e());c!==null&&c>=es&&mt(i)}if(e()>=r)return a.apiKey?{art:"vorhanden",apiKey:a.apiKey,instanzId:a.instanzId}:{art:"gescheitert",grund:"sperre-belegt"};await n(sc)}}catch{return{art:"gescheitert",grund:"kein-test"}}}function kt(t,e={}){try{let n=ve(bt(e),oc);pt(Se(n),{recursive:!0});let r=`${n}.${process.pid}.tmp`;Qr(r,JSON.stringify({...t,am:new Date().toISOString()}),{mode:384}),ec(r,n)}catch{}}var Y="startwissen-import",dc=9e4,is=1e3,hc=3,os=8e3,ss=3,as=t=>new Promise(e=>setTimeout(e,t));function mc(t){return Hr(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 lt.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 bc(t){return wr(t,Mr("HEAD",$r),{timeoutMs:2e4})}var yc={brain_from_git:.55,starter:.9};function kc(t,e=new Date){let n=e.toISOString();return t.map(r=>({...r,severity:r.severity||"major",recall_count:0,confidence:yc[r.source],ts:n,verified_at:n}))}async function wc(t){let e=t.fetchFn??fetch,n=t.jetzt??Date.now,r=t.schlafen??as,s=n()+(t.bereitFristMs??dc);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(os)});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(is)}}async function Ec(t,e){let n=t.fetchFn??fetch,r=t.schlafen??as,s=0,i=0,o=async()=>{for(;s<e.length;){let a=e[s++];for(let u=1;u<=ss;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(os)});if(c.ok){i++;break}if(c.status!==409&&c.status!==429&&c.status<500)break}catch{}u<ss&&await r(is*u)}}};return await Promise.all(Array.from({length:Math.min(hc,e.length)},o)),i}async function cs(t){try{if(!xe(t.env))return{art:"aus"};let e=fc(t.projekt||"."),n=await(t.gitWurzel??Wr)(e),r,s;if(n){let a=Br(n,t.env);if(a)return{art:"ausgeschlossen",grund:a};r="git";let u="";try{u=(t.gitLog??bc)(n)}catch{}if(s=mc(jr(u)),s.length===0)return{art:r,lektionen:0,gesendet:0}}else{if(!Ur(t.env))return{art:"kein-repo"};r="startvorrat",s=pc()}dr(t.cfg.instanceId,kc(s));let i=await wc(t);if(i==="hat-lektionen"&&await L(t.cfg,{force:!0,vorabSchliessen:!0,fetchFn:t.fetchFn}),i!=="leer")return{art:i};let o=await Ec(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 us(t){if((t.art==="git"||t.art==="startvorrat")&&t.gesendet>0)return{art:t.art,lektionen:t.gesendet}}import{appendFile as vc,readFile as Sc,rename as xc,writeFile as _c}from"node:fs/promises";import{mkdir as Ac}from"node:fs/promises";import{homedir as Tc}from"node:os";import{dirname as zc,resolve as Ic}from"node:path";function Lc(){return Ic(Tc(),".cachly","ambient-ledger.jsonl")}function Nc(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 Rc=256*1024,Cc=400;async function ls(t,e=Lc()){try{await Ac(zc(e),{recursive:!0}),await vc(e,Nc(t)+`
|
|
38
38
|
`,"utf-8");let n=await Sc(e,"utf-8");if(Buffer.byteLength(n,"utf-8")>Rc){let s=n.split(`
|
|
39
39
|
`).filter(Boolean).slice(-Cc).join(`
|
|
40
40
|
`)+`
|
|
41
41
|
`,i=e+".tmp";await _c(i,s,"utf-8"),await xc(i,e)}}catch{}}function gs(t,e,n=fetch){return!t.instanceId||!t.jwt||process.env.CACHLY_NO_TELEMETRY==="1"?Promise.resolve():n(`${t.apiUrl}/api/v1/instances/${t.instanceId}/ambient-events`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.jwt}`},body:JSON.stringify({events:[e]}),signal:AbortSignal.timeout(3e3)}).then(()=>{},()=>{})}import{readdirSync as Mc,readFileSync as jc}from"node:fs";import{homedir as Hc}from"node:os";import{join as v}from"node:path";function _e(t){if(typeof t!="string")return"";let e=t.trim();return e&&!dt(e)?e:""}var Oc=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function wt(t){return Oc.test(_e(t))}var Pc="npx @cachly-dev/mcp-server@latest claim";function fs(t){return["","","---",`\u2139\uFE0F **cachly:** no API key was found, so a test Brain was created on EU servers \u2014 no sign-up. Tell the user once: it keeps working without an account (${t.tarifEndetAm&&/^\d{4}-\d{2}-\d{2}/.test(t.tarifEndetAm)?`Solo tier until ${t.tarifEndetAm.slice(0,10)}`:"14 days of Solo tier"}, then the free tier, same key). To keep this Brain and its lessons in their own cachly account, they run \`${Pc}\` in a terminal and sign in \u2014 the Brain moves over and gets a new key.`].join(`
|
|
42
|
-
`)}function Ae(t=process.env){return{env:t,heim:t.HOME||t.USERPROFILE||Hc(),projekt:t.CLAUDE_PROJECT_DIR||process.cwd()}}function X(t){try{return JSON.parse(jc(t,"utf8"))}catch{return null}}function ds(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=X(e)?.mcpServers?.cachly?.env;return n&&typeof n=="object"?n:{}})}function hs(...t){for(let e of t){let n=_e(e);if(n)return n}return""}function Te(t){return hs(t.env.CLAUDE_PLUGIN_OPTION_API_KEY,Jr({env:t.env,home:t.heim,cwd:t.projekt}),...ds(t).map(e=>e.CACHLY_JWT))}function ze(t){return hs(t.env.CLAUDE_PLUGIN_OPTION_INSTANCE_ID,t.env.CACHLY_BRAIN_INSTANCE_ID,Ee({home:t.heim}),...ds(t).map(e=>e.CACHLY_BRAIN_INSTANCE_ID))}function ms(t){let e=_e(t.env.CLAUDE_PLUGIN_ROOT);if(!e)return"unbekannt";let n=X(v(e,".claude-plugin","plugin.json"))?.version;return typeof n=="string"&&/^\d[0-9A-Za-z.+-]{0,30}$/.test(n)?n:"unbekannt"}var Et="cachly-ambient-";function ps(t){return[v(t.projekt,".cursor","hooks.json"),v(t.heim,".cursor","hooks.json")].some(e=>{let n=X(e)?.hooks;return!!n&&typeof n=="object"&&Object.values(n).some(r=>Array.isArray(r)&&r.some(s=>String(s?.command??"").includes(Et)))})}function $c(t){let e=t;return[e?.command,e?.bash,e?.powershell].some(n=>String(n??"").includes(Et))}function bs(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=Mc(n).filter(s=>s.endsWith(".json"))}catch{return!1}return r.some(s=>{let i=X(v(n,s))?.hooks;return!!i&&typeof i=="object"&&Object.values(i).some(o=>Array.isArray(o)&&o.some($c))})})}function ys(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=X(n)?.hooks?.[t];return Array.isArray(r)&&r.some(s=>Array.isArray(s?.hooks)&&s.hooks.some(i=>String(i?.command??"").includes(Et)))})}import{createHash as Uc}from"node:crypto";import{mkdirSync as Bc,readFileSync as Wc,renameSync as Kc,rmSync as ws,writeFileSync as Fc}from"node:fs";import{tmpdir as Dc}from"node:os";import{join as xt}from"node:path";var ee="--cursor";var vt={sessionStart:"sessionStart",SessionStart:"sessionStart",beforeSubmitPrompt:"beforeSubmitPrompt",UserPromptSubmit:"beforeSubmitPrompt",postToolUse:"postToolUse",PostToolUse:"postToolUse"};function _t(t){let e=t?.cursor_version;return typeof e=="string"&&e.trim()!==""}function Ie(t,e){let n=t?.hook_event_name??e.find(r=>Object.hasOwn(vt,r));return n&&Object.hasOwn(vt,n)?vt[n]:null}function Gc(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 St(t,e){return t==="beforeSubmitPrompt"?JSON.stringify({continue:!0}):e?JSON.stringify({additional_context:e}):"{}"}function Q(t){return t?St(t,""):""}var Zc=xt(Dc(),"cachly-cursor-einblendung");function H(t,e=Zc){return xt(e,`${Uc("sha256").update(t).digest("hex").slice(0,32)}.json`)}function
|
|
42
|
+
`)}function Ae(t=process.env){return{env:t,heim:t.HOME||t.USERPROFILE||Hc(),projekt:t.CLAUDE_PROJECT_DIR||process.cwd()}}function X(t){try{return JSON.parse(jc(t,"utf8"))}catch{return null}}function ds(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=X(e)?.mcpServers?.cachly?.env;return n&&typeof n=="object"?n:{}})}function hs(...t){for(let e of t){let n=_e(e);if(n)return n}return""}function Te(t){return hs(t.env.CLAUDE_PLUGIN_OPTION_API_KEY,Jr({env:t.env,home:t.heim,cwd:t.projekt}),...ds(t).map(e=>e.CACHLY_JWT))}function ze(t){return hs(t.env.CLAUDE_PLUGIN_OPTION_INSTANCE_ID,t.env.CACHLY_BRAIN_INSTANCE_ID,Ee({home:t.heim}),...ds(t).map(e=>e.CACHLY_BRAIN_INSTANCE_ID))}function ms(t){let e=_e(t.env.CLAUDE_PLUGIN_ROOT);if(!e)return"unbekannt";let n=X(v(e,".claude-plugin","plugin.json"))?.version;return typeof n=="string"&&/^\d[0-9A-Za-z.+-]{0,30}$/.test(n)?n:"unbekannt"}var Et="cachly-ambient-";function ps(t){return[v(t.projekt,".cursor","hooks.json"),v(t.heim,".cursor","hooks.json")].some(e=>{let n=X(e)?.hooks;return!!n&&typeof n=="object"&&Object.values(n).some(r=>Array.isArray(r)&&r.some(s=>String(s?.command??"").includes(Et)))})}function $c(t){let e=t;return[e?.command,e?.bash,e?.powershell].some(n=>String(n??"").includes(Et))}function bs(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=Mc(n).filter(s=>s.endsWith(".json"))}catch{return!1}return r.some(s=>{let i=X(v(n,s))?.hooks;return!!i&&typeof i=="object"&&Object.values(i).some(o=>Array.isArray(o)&&o.some($c))})})}function ys(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=X(n)?.hooks?.[t];return Array.isArray(r)&&r.some(s=>Array.isArray(s?.hooks)&&s.hooks.some(i=>String(i?.command??"").includes(Et)))})}import{createHash as Uc}from"node:crypto";import{mkdirSync as Bc,readFileSync as Wc,renameSync as Kc,rmSync as ws,writeFileSync as Fc}from"node:fs";import{tmpdir as Dc}from"node:os";import{join as xt}from"node:path";var ee="--cursor";var vt={sessionStart:"sessionStart",SessionStart:"sessionStart",beforeSubmitPrompt:"beforeSubmitPrompt",UserPromptSubmit:"beforeSubmitPrompt",postToolUse:"postToolUse",PostToolUse:"postToolUse"};function _t(t){let e=t?.cursor_version;return typeof e=="string"&&e.trim()!==""}function Ie(t,e){let n=t?.hook_event_name??e.find(r=>Object.hasOwn(vt,r));return n&&Object.hasOwn(vt,n)?vt[n]:null}function Gc(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 St(t,e){return t==="beforeSubmitPrompt"?JSON.stringify({continue:!0}):e?JSON.stringify({additional_context:e}):"{}"}function Q(t){return t?St(t,""):""}var Zc=xt(Dc(),"cachly-cursor-einblendung");function H(t,e=Zc){return xt(e,`${Uc("sha256").update(t).digest("hex").slice(0,32)}.json`)}function Le(t,e,n){if(!n){ws(t,{force:!0});return}Bc(xt(t,".."),{recursive:!0});let r={generation_id:e??null,kontext:n,at:Date.now()};Fc(t,JSON.stringify(r),"utf8")}function ks(t){try{let e=JSON.parse(Wc(t,"utf8"));return e&&typeof e.kontext=="string"?e:null}catch{return null}}function At(t,e){let n=e??null,r=ks(t);if(!r||r.generation_id!==n)return"";let s=`${t}.${process.pid}.${Date.now()}`;try{Kc(t,s)}catch{return""}let i=ks(s);return ws(s,{force:!0}),i&&i.generation_id===n?i.kontext:""}async function Es(t){let e=Ie(t.payload,t.args);if(!e)return"";try{let n=t.payload??{};if(e==="postToolUse")return n.conversation_id?St(e,At(H(n.conversation_id,t.ablageOrdner),n.generation_id)):Q(e);if(e==="beforeSubmitPrompt"&&!n.conversation_id)return Q(e);let r=Gc(e,n),s=R(await t.claudeLauf(JSON.stringify(r),r.hook_event_name));return e==="beforeSubmitPrompt"&&Le(H(n.conversation_id,t.ablageOrdner),n.generation_id,s),St(e,s)}catch{return Q(e)}}import{tmpdir as Vc}from"node:os";import{join as Jc}from"node:path";var Ne="--copilot";var Tt={sessionStart:"sessionStart",SessionStart:"sessionStart",userPromptSubmitted:"userPromptSubmitted",UserPromptSubmit:"userPromptSubmitted",postToolUse:"postToolUse",PostToolUse:"postToolUse"};function zt(t,e){let n=t?.hook_event_name??e.find(r=>Object.hasOwn(Tt,r));return n&&Object.hasOwn(Tt,n)?Tt[n]:null}function qc(t){return typeof t?.hook_event_name=="string"&&t.hook_event_name!==""?"vscode":"cli"}function Ss(t){let e=t.session_id??t.sessionId;return typeof e=="string"&&e!==""?e:void 0}function Yc(t,e){let n=Ss(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 Xc={sessionStart:"SessionStart",userPromptSubmitted:"UserPromptSubmit",postToolUse:"PostToolUse"};function vs(t,e,n){return n?e==="cli"?t==="userPromptSubmitted"?"{}":JSON.stringify({additionalContext:n}):JSON.stringify({hookSpecificOutput:{hookEventName:Xc[t],additionalContext:n}}):"{}"}function It(t){let e=t?.timestamp;return typeof e=="string"&&e!==""||typeof e=="number"}var Qc=Jc(Vc(),"cachly-copilot-einblendung");async function xs(t){let e=zt(t.payload,t.args);if(!e)return"";try{let n=t.payload??{},r=qc(n),s=Ss(n),i=t.ablageOrdner??Qc;if(e==="postToolUse")return r==="vscode"||!s?"{}":vs(e,r,At(H(s,i),void 0));let o=e==="userPromptSubmitted"&&r==="cli";if(o){if(!s)return"{}";Le(H(s,i),void 0,"")}let a=Yc(e,n),u=R(await t.claudeLauf(JSON.stringify(a),a.hook_event_name));return o&&Le(H(s,i),void 0,u),vs(e,r,u)}catch{return"{}"}}var Lt="--codex",eu=["SessionStart","UserPromptSubmit"];var _s=new Set(eu);function tu(t,e){let n=t?.hook_event_name??e.find(r=>_s.has(r));return n&&_s.has(n)?n:null}function nu(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 As(t){let e=tu(t.payload,t.args);if(!e)return"";try{let n=nu(e,t.payload??{});return j(e,R(await t.claudeLauf(JSON.stringify(n),e)))}catch{return""}}var Re="--gemini",ru=["SessionStart","BeforeAgent"],Ts=new Set(ru);function Nt(t,e){let n=t?.hook_event_name??e.find(r=>Ts.has(r));return n&&Ts.has(n)?n:null}function su(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 iu(t,e){return e?JSON.stringify({hookSpecificOutput:{hookEventName:t,additionalContext:e}}):"{}"}async function zs(t){let e=Nt(t.payload,t.args);if(!e)return"";try{let n=su(e,t.payload??{});return iu(e,R(await t.claudeLauf(JSON.stringify(n),n.hook_event_name)))}catch{return"{}"}}var cu="https://api.cachly.dev",Is=5e3,Ct="ambient-auffrischen",Ls=new Set(["SessionStart","UserPromptSubmit","PreToolUse","Stop"]);async function uu(t,e){if(!t.args.includes(ee)&&(Ie(e,t.args)!=="sessionStart"||ps(t.umfeld)))return"";let r=t.args.filter(s=>s==="--plugin");return Es({payload:e,args:t.args,claudeLauf:(s,i)=>Ot({...t,raw:s,args:[i,...r]}),ablageOrdner:t.cursorAblage})}function lu(t,e){let n=(r,s)=>Ot({...t,raw:r,args:[s]});return t.args.includes(Ne)?xs({payload:e,args:t.args,claudeLauf:n,ablageOrdner:t.copilotAblage}):t.args.includes(Lt)?As({payload:e,args:t.args,claudeLauf:n}):t.args.includes(Re)?zs({payload:e,args:t.args,claudeLauf:n}):null}function gu(t,e){return t.includes(ee)||_t(e)?"cursor":t.includes(Ne)?"copilot":t.includes(Lt)?"codex":t.includes(Re)?"gemini":It(e)?"vscode":"claude"}async function fu(t){let e=await rs({apiUrl:t.apiUrl,version:ms(t.umfeld),home:t.umfeld.heim,env:{...t.umfeld.env,CACHLY_QUELLE:"claude-code-plugin"},fristMs:Is,anfrageMs:Is,abkuehlungMs:ts,holen:t.fetchFn});if(e.art==="vorhanden")return{apiKey:e.apiKey,instanzId:e.instanzId,hinweis:""};if(e.art!=="angelegt")return null;if(xe(t.umfeld.env)){let n={apiUrl:t.apiUrl,jwt:e.test.apiKey,instanceId:e.test.instanzId};t.selbst&&(t.nebenlauf??ct)(n,[t.selbst,Y,t.umfeld.projekt],{zweck:Y,ordner:au()})||kt({instanzId:e.test.instanzId,projekt:t.umfeld.projekt},{home:t.umfeld.heim})}return{apiKey:e.test.apiKey,instanzId:e.test.instanzId,hinweis:fs(e.test)}}function du(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
|
-
${s}`,JSON.stringify(r))}catch{return t}}async function Ot(t){try{let e=pe(t.raw),n={...t,editor:t.editor??gu(t.args,e)};if(n.args.includes(ee)||_t(e))return await uu(n,e);let r=lu(n,e);if(r)return await r;let s=e?.hook_event_name??n.args.find(f=>
|
|
45
|
-
`);let f=Ue(i,e.stop_hook_active===!0);if(f)return f}catch{}let o=Te(n.umfeld),a=ze(n.umfeld),u="";if(!o&&s==="SessionStart"&&n.args.includes("--plugin")&&!wt(a)){let f=await fu(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?br(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(yr(f)),signal:AbortSignal.timeout(8e3)}).catch(()=>{}):void 0,m=st(c,e?.session_id??null,i,{fetchFn:n.fetchFn});return await Promise.all([d,m]),""}let l,g=await(n.einblenden??kr)(n.raw,{cfg:c,nebenlauf:n.selbst?[n.selbst,Ct]:void 0,editor:n.editor,fetchFn:n.fetchFn,onInject:(f,d)=>{let m={ts:new Date().toISOString(),event:d,injected:f,prevented:0,instanz:c.instanceId};ls(m),l=gs(c,m,n.fetchFn)}});return l&&await Promise.race([l,new Promise(f=>setTimeout(f,500))]),u?du(g,u):g}catch{return""}}async function hu(){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 Pt(){return process.env.CACHLY_API_URL||cu}var Rt={SessionStart:25e3,UserPromptSubmit:8e3,PreToolUse:8e3,Stop:5e4,sessionStart:25e3,beforeSubmitPrompt:8e3,postToolUse:3e3,userPromptSubmitted:8e3,PostToolUse:3e3,BeforeAgent:8e3};function mu(t,e){return t.includes(ee)?Q(Ie(e,t)):t.includes(
|
|
44
|
+
${s}`,JSON.stringify(r))}catch{return t}}async function Ot(t){try{let e=pe(t.raw),n={...t,editor:t.editor??gu(t.args,e)};if(n.args.includes(ee)||_t(e))return await uu(n,e);let r=lu(n,e);if(r)return await r;let s=e?.hook_event_name??n.args.find(f=>Ls.has(f))??n.umfeld.env.CACHLY_HOOK_EVENT??"";if(It(e)&&(s!=="SessionStart"&&s!=="UserPromptSubmit"||bs(n.umfeld))||n.args.includes("--plugin")&&s&&ys(s,n.umfeld))return"";let i=null;if(s==="Stop"&&e?.transcript_path)try{i=ou(e.transcript_path,"utf-8").split(`
|
|
45
|
+
`);let f=Ue(i,e.stop_hook_active===!0);if(f)return f}catch{}let o=Te(n.umfeld),a=ze(n.umfeld),u="";if(!o&&s==="SessionStart"&&n.args.includes("--plugin")&&!wt(a)){let f=await fu(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?br(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(yr(f)),signal:AbortSignal.timeout(8e3)}).catch(()=>{}):void 0,m=st(c,e?.session_id??null,i,{fetchFn:n.fetchFn});return await Promise.all([d,m]),""}let l,g=await(n.einblenden??kr)(n.raw,{cfg:c,nebenlauf:n.selbst?[n.selbst,Ct]:void 0,editor:n.editor,fetchFn:n.fetchFn,onInject:(f,d)=>{let m={ts:new Date().toISOString(),event:d,injected:f,prevented:0,instanz:c.instanceId};ls(m),l=gs(c,m,n.fetchFn)}});return l&&await Promise.race([l,new Promise(f=>setTimeout(f,500))]),u?du(g,u):g}catch{return""}}async function hu(){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 Pt(){return process.env.CACHLY_API_URL||cu}var Rt={SessionStart:25e3,UserPromptSubmit:8e3,PreToolUse:8e3,Stop:5e4,sessionStart:25e3,beforeSubmitPrompt:8e3,postToolUse:3e3,userPromptSubmitted:8e3,PostToolUse:3e3,BeforeAgent:8e3};function mu(t,e){return t.includes(ee)?Q(Ie(e,t)):t.includes(Ne)?zt(e,t)?"{}":"":t.includes(Re)&&Nt(e,t)?"{}":""}async function Ns(t,e){try{let n=await hu(),r=pe(n),s=r?.hook_event_name??t.find(u=>Ls.has(u)||Object.hasOwn(Rt,u))??"",i=Number(process.env.CACHLY_HOOK_FRIST_MS)||Rt[s]||Rt.UserPromptSubmit,o=mu(t,r),a=await Promise.race([Ot({args:t,raw:n,umfeld:Ae(),apiUrl:Pt(),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 Rs(){try{let t=Ae(),e=Te(t),n=ze(t);e&&n&&await L({apiUrl:Pt(),jwt:e,instanceId:n},{force:!0,lernen:!0})}catch{}process.exit(0)}async function Cs(t){try{let e=Ae(),n=Te(e),r=ze(e);if(n&&wt(r)){let s=await cs({cfg:{apiUrl:Pt(),jwt:n,instanceId:r},projekt:t,env:e.env});s.art!=="aus"&&kt({instanzId:r,projekt:t,vomHook:us(s)},{home:e.heim})}}catch{}process.exit(0)}var Ce=process.argv.slice(2);Ce[0]===Ct?await Rs():Ce[0]===Y?await Cs(Ce[1]??""):await Ns(Ce,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.
|
|
3
|
+
"version": "0.10.231",
|
|
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.
|
|
9
|
+
"version": "0.10.231",
|
|
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.
|
|
15
|
+
"version": "0.10.231",
|
|
16
16
|
"transport": {
|
|
17
17
|
"type": "stdio"
|
|
18
18
|
}
|