@cachly-dev/mcp-server 0.10.195 → 0.10.196
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/einblendung.js +4 -4
- package/dist/src/startwissen-hook.js +1 -1
- package/glama.json +1 -1
- package/hooks/cachly-ambient-einblendung.mjs +24 -24
- package/package.json +1 -1
- package/server.json +2 -2
package/dist/src/einblendung.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{readFileSync as T,existsSync as C,writeFileSync as R,mkdirSync as
|
|
1
|
+
import{readFileSync as T,existsSync as C,writeFileSync as R,mkdirSync as Z,statSync as G,appendFileSync as F}from"node:fs";import{dirname as j,join as _}from"node:path";import{tmpdir as S}from"node:os";import{createHash as W}from"node:crypto";import{spawn as V}from"node:child_process";import{Einblendbestand as $,torWoerter as B}from"./einblendung-kern.js";import{rahmeEin as U}from"./einblendung-rahmen.js";import{istMarkiert as X}from"./verdacht-marke.js";import{leserText as Q}from"./seltenheitsbestand.js";import{mischeMitLeser as z}from"./leser.js";import{LeserSicherung as ee,dateiSpeicher as te,frageLeser as ne}from"./leser-sicherung.js";import{LESER_TIEFE_EINBLENDUNG as re,LESER_ZEITLIMIT_MS as se}from"./rangfolge-stellschrauben.js";import{stufeEinblendungNachVersion as oe}from"./gueltigkeit-version.js";import{ARME as H,BASIS_MIN_BELEGE as ie,MERKMAL_KANDIDATEN as le,OHNE_LERNEN as ae,entscheide as ce,leseArmZaehlung as ue,lernEinstellungen as pe,lernenAuffrischen as fe,merkeEntscheidung as he,neuerSatz as me,sitzungsKennung as de,zugKennung as ge}from"./lernen.js";export*from"./einblendung-kern.js";import{belohnungMelden as lt,lernenAuffrischen as at,lernEinstellungen as ct,ARME as ut}from"./lernen.js";const Ee=600*1e3,_e=300*1e3,Se=10*1e3,Ae=2e3,ye=50,Ne=60*1e3;function be(e,t){return t<_e?{ttlMs:Se,sofort:!0}:e<ye?{ttlMs:Ne,sofort:!1}:{ttlMs:Ee,sofort:!1}}const O=8e3,ke=60*1e3,P=120,D=re,Ie=1500,k=se,we=_(S(),"cachly-ambient-netlog.jsonl");function We(e=process.cwd()){const t={apiUrl:process.env.CACHLY_API_URL||"https://api.cachly.dev",jwt:process.env.CACHLY_JWT||"",instanceId:process.env.CACHLY_BRAIN_INSTANCE_ID||""};if(t.jwt&&t.instanceId)return t;let n=e;for(let s=0;s<8;s++){const r=_(n,".mcp.json");if(C(r))try{const i=JSON.parse(T(r,"utf8"))?.mcpServers?.cachly?.env??{};if(t.apiUrl=t.apiUrl||i.CACHLY_API_URL||"https://api.cachly.dev",t.jwt=t.jwt||i.CACHLY_JWT||"",t.instanceId=t.instanceId||i.CACHLY_BRAIN_INSTANCE_ID||"",t.jwt&&t.instanceId)return t}catch{}const o=j(n);if(o===n)break;n=o}return t}function I(e){return W("sha1").update(e).digest("hex").slice(0,12)}function J(e){return _(S(),`cachly-ambient-bestand-${I(e)}.json`)}function Me(e){return _(S(),`cachly-leser-sicherung-${I(e)}.json`)}function Le(e,t="ambient-auffrischen"){return _(S(),`cachly-${t}-${I(e)}.lock`)}async function w(e,{fetchFn:t=fetch,zeitlimitMs:n=O}={}){try{const s=await t(`${e.apiUrl}/api/v1/instances/${e.instanceId}/export`,{headers:{Authorization:`Bearer ${e.jwt}`},signal:AbortSignal.timeout(n)});if(!s.ok)return null;const r=await s.json();return!Array.isArray(r?.lessons)||r.lessons.length===0&&typeof r.note=="string"&&r.note?null:r.lessons.map(o=>typeof o=="string"?ve(o):o).filter(o=>!!o&&typeof o=="object")}catch{return null}}function ve(e){try{return JSON.parse(e)}catch{return null}}function A(e,t){try{const n=Date.now(),s=y(e)?.seit??n;Z(j(e),{recursive:!0}),R(e,JSON.stringify({at:n,seit:s,lessons:t}),{mode:384})}catch{}}function Ve(e,t){if(!e||t.length===0)return!1;const n=J(e);return(y(n)?.lessons.length??0)>0?!1:(A(n,t),!0)}function y(e){try{const t=JSON.parse(T(e,"utf8"));if(Array.isArray(t?.lessons)){const n=Number(t.at)||0;return{at:n,seit:Number(t.seit)||n,lessons:t.lessons}}}catch{}return null}function xe(e,t,{zweck:n,ordner:s}={}){const r=Le(e.instanceId,n);try{if(C(r)&&Date.now()-G(r).mtimeMs<ke)return!1;R(r,String(Date.now()),{mode:384})}catch{return!1}try{return V(process.execPath,t,{detached:!0,stdio:"ignore",...s?{cwd:s}:{},env:{...process.env,CACHLY_API_URL:e.apiUrl,CACHLY_JWT:e.jwt,CACHLY_BRAIN_INSTANCE_ID:e.instanceId}}).unref(),!0}catch{return!1}}async function Te(e,{force:t=!1,nebenlauf:n,abrufMs:s=O,lernen:r=!1,fetchFn:o}={}){if(!e.jwt||!e.instanceId)return{lessons:[],quelle:"nicht-eingerichtet"};const i=J(e.instanceId);if(t){const[a]=await Promise.all([w(e,{fetchFn:o,zeitlimitMs:s}),r?fe(e,{fetchFn:o}):void 0]);if(a)return A(i,a),{lessons:a,quelle:"server"};const f=y(i);return f?{lessons:f.lessons,quelle:"platte-alt"}:{lessons:[],quelle:"server-nicht-erreichbar"}}const l=y(i);if(l){const a=Date.now(),f=be(l.lessons.length,a-l.seit);if(a-l.at<f.ttlMs)return{lessons:l.lessons,quelle:"platte"};if(f.sofort){const m=await w(e,{fetchFn:o,zeitlimitMs:Math.min(s,Ae)});return m?(A(i,m),{lessons:m,quelle:"server"}):{lessons:l.lessons,quelle:"platte-alt"}}return n&&xe(e,n),{lessons:l.lessons,quelle:"platte-alt"}}const u=await w(e,{fetchFn:o,zeitlimitMs:s});return u?(A(i,u),{lessons:u,quelle:"server"}):{lessons:[],quelle:"server-nicht-erreichbar"}}function M(e){return Math.ceil(String(e).length/4)}function L(e){const t=e.severity?`[${e.severity}] `:"",n=String(e.what_worked??"").replace(/\s+/g," ").trim(),s=n.length>P?`${n.slice(0,P)}\u2026`:n,r=typeof e.versionshinweis=="string"?` [${e.versionshinweis}]`:"";return`- ${t}${e.topic}${r}: ${s}`}const N={lessons:[],tokens:0,topScore:0,belege:0};function v(e,t,n){if(e.length===0)return{...N};const s=[];let r=0;e=oe(e);for(const{lektion:o}of e.slice(0,t)){const i=M(L(o));if(r+i>n)break;s.push(o),r+=i}return{lessons:s,tokens:r,topScore:Math.round(e[0].punkte*100)/100,belege:e[0].belege}}function Xe(e,t,{minBelege:n=2,topK:s=3,tokenBudget:r=600}={}){if(!Array.isArray(t)||t.length===0)return{...N};if(B(e).length===0)return{...N};const o=new $(t).sortiere(e).filter(i=>i.belege>=n);return o.length===0?{...N}:v(o,s,r)}function Ce(e){return Q(e,Ie)}async function K(e,t,n,{zeitlimitMs:s=k,fetchFn:r}={}){if(!e?.jwt||!e?.instanceId||n.length===0)return{art:"ohne"};if(["0","off","aus","false"].includes(String(process.env.CACHLY_LESER||"").toLowerCase()))return{art:"ohne"};const o=new ee(te(Me(e.instanceId)));return ne({url:`${e.apiUrl}/api/v1/rerank`,jwt:e.jwt,frage:t,texte:n,instanceId:e.instanceId,zeitlimitMs:s,fetchFn:r},o)}async function Qe(e,t,n,s={}){const r=await K(e,t,n,s);return r.art==="punkte"?{scores:r.scores,provider:r.provider,ms:r.ms}:null}async function q(e,t,n,{minBelege:s,tiefe:r,zeitlimitMs:o,fetchFn:i}){const l={sortiert:[],leser:"aus",leserMs:0};if(!Array.isArray(t)||t.length===0||B(e).length===0)return l;let u=new $(t).sortiere(e).filter(h=>h.belege>=s);if(u.length===0)return l;let a="aus",f=0;if(u.length>1&&r>0){const h=u.slice(0,r),m=u.slice(r),d=await K(n,e,h.map(E=>Ce(E.lektion)),{zeitlimitMs:o,fetchFn:i});d.art==="punkte"?(u=[...z(h.map(p=>p.punkte),d.scores,1).map(p=>({...h[p],leser:d.scores[p]})),...m],a=d.provider,f=d.ms):d.art==="uebersprungen"&&(a="uebersprungen")}return{sortiert:u,leser:a,leserMs:f}}async function et(e,t,n,{minBelege:s=2,topK:r=3,tokenBudget:o=600,tiefe:i=D,zeitlimitMs:l=k,fetchFn:u}={}){const a=await q(e,t,n,{minBelege:s,tiefe:i,zeitlimitMs:l,fetchFn:u});return{...v(a.sortiert,r,o),leser:a.leser,leserMs:a.leserMs}}function Re(e){if(!e.lessons.length)return"";const t=e.lessons.map(L).join(`
|
|
2
2
|
`);return`\u{1F9E0} Cachly Brain \u2014 relevant lessons for this task (auto-recall, ${e.lessons.length}):
|
|
3
3
|
${U(t)}
|
|
4
|
-
(ambient-recall \xB7 ~${e.tokens} tokens \xB7 match score ${e.topScore})`}const je=5;function
|
|
4
|
+
(ambient-recall \xB7 ~${e.tokens} tokens \xB7 match score ${e.topScore})`}const je=5;function tt(e){const t=e.filter(o=>!X(o));if(!t.length)return"";const n=t.filter(o=>{const i=String(o.topic??"");return!(/^auto:/.test(i)||/^[a-z]+:?$/.test(i))}),r=[...n.length?n:t].sort((o,i)=>(Number(i.recall_count)||0)-(Number(o.recall_count)||0)).slice(0,je).map(L).join(`
|
|
5
5
|
`);return`\u{1F9E0} Cachly Brain \u2014 ambient recall active (${t.length} lessons). Top by proven reuse:
|
|
6
6
|
${U(r)}
|
|
7
|
-
(Relevant lessons for each task are auto-injected per prompt. ~${M(r)} tokens.)`}function
|
|
8
|
-
`)}catch{}return{kontext:
|
|
7
|
+
(Relevant lessons for each task are auto-injected per prompt. ~${M(r)} tokens.)`}function nt(e,t){return t?JSON.stringify({hookSpecificOutput:{hookEventName:e,additionalContext:t}}):""}function $e(e,t){return e.map((n,s)=>({x:n,rang:s,gezeigt:t.includes(n.lektion)})).filter(({rang:n,gezeigt:s})=>n<le||s).map(({x:n,rang:s,gezeigt:r})=>({thema:String(n.lektion.topic??""),rang:s,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:r}))}async function rt(e,t,{nebenlauf:n,abrufMs:s,leser:r=!0,session:o=null,protokoll:i=!0,ereignis:l="UserPromptSubmit",editor:u="",lernen:a=!0,fetchFn:f}={}){const{lessons:h,quelle:m}=await Te(t,{nebenlauf:n,abrufMs:s,fetchFn:f}),d=pe(),E=a&&d.aktiv&&l==="UserPromptSubmit"&&!!t.instanceId,p=E?ce({instanceId:t.instanceId,sitzung:o,prompt:e,zaehlung:ue(t.instanceId),einstellungen:d}):ae,x=H[p.arm]??H[0],g=await q(e,h,t,{minBelege:ie,tiefe:r?D:0,zeitlimitMs:k,fetchFn:f}),c={...v(g.sortiert.filter(Y=>Y.belege>=x.minBelege),x.topK,600),leser:g.leser,leserMs:g.leserMs},b=p.kontrolle?"":Re(c);if(E&&g.sortiert.length>0&&he(t.instanceId,o,me({sitzung:de(o),zug:ge(e),ereignis:l,editor:u,arm:p.arm,kontrolle:p.kontrolle,erkundet:p.erkundet,ausgewaehlt:c.lessons.length,kandidatenZahl:g.sortiert.length,belege:c.belege,topScore:c.topScore,leser:c.leser,leserMs:c.leserMs,quelle:m,bestand:h.length,kandidaten:$e(g.sortiert,c.lessons)})),i)try{F(we,JSON.stringify({at:Date.now(),session:o,prompt_tokens:M(e),injected_tokens:b?c.tokens:0,matches:b?c.lessons.length:0,arm:p.arm,kontrolle:p.kontrolle,ausgewaehlt:c.lessons.length,top_score:c.topScore,belege:c.belege,leser:c.leser,leser_ms:c.leserMs,quelle:m,bestand:h.length})+`
|
|
8
|
+
`)}catch{}return{kontext:b,auswahl:c,quelle:m,bestand:h.length,entscheidung:p}}export{O as ABRUF_TIMEOUT_MS,P as ANZEIGE_ZEICHEN,ut as ARME,Se as BESTAND_TTL_JUNG_MS,Ne as BESTAND_TTL_KLEIN_MS,Ee as BESTAND_TTL_MS,Ae as JUNG_ABRUF_MS,_e as JUNG_FENSTER_MS,ye as KLEIN_LEKTIONEN,k as LESER_HOOK_ZEITLIMIT_MS,Ie as LESER_MAX_ZEICHEN,D as LESER_TIEFE,we as NETZ_PROTOKOLL,je as SITZUNG_TOP_N,lt as belohnungMelden,be as bestandFrist,J as bestandPfad,M as estimateTokens,Te as holeBestand,nt as hookAusgabe,ct as lernEinstellungen,at as lernenAuffrischen,K as leserAnfrageApi,Qe as leserPunkteApi,Ce as leserText,z as mischeMitLeser,rt as promptEinblendung,Re as promptKontext,L as renderLesson,We as resolveConfig,Ve as schreibeVorabBestand,Xe as selectRelevant,et as selectRelevantMitLeser,Me as sicherungsPfad,tt as sitzungsKontext,xe as starteNebenlauf};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolve as u}from"node:path";import{STARTER_CORPUS as p}from"./starter-corpus.js";import{gitLesen as d}from"./git-ohne-shell.js";import{gitLogArgumente as w,leseCommits as _,lektionenJeThema as S}from"./git-lektionen.js";import{STARTWISSEN_COMMITS as A,ausschlussGrund as y,echteGitWurzel as
|
|
1
|
+
import{resolve as u}from"node:path";import{STARTER_CORPUS as p}from"./starter-corpus.js";import{gitLesen as d}from"./git-ohne-shell.js";import{gitLogArgumente as w,leseCommits as _,lektionenJeThema as S}from"./git-lektionen.js";import{STARTWISSEN_COMMITS as A,ausschlussGrund as y,echteGitWurzel as E,startvorratErlaubt as T}from"./startwissen.js";import{startwissenEingeschaltet as R}from"./konto-anlegen.js";import{holeBestand as k,schreibeVorabBestand as v}from"./einblendung.js";const D="startwissen-import",x=9e4,h=1e3,b=3,g=8e3,m=3,l=t=>new Promise(e=>setTimeout(e,t));function I(t){return S(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 L(){return p.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 j(t){return d(t,w("HEAD",A),{timeoutMs:2e4})}const M={brain_from_git:.55,starter:.9};function F(t,e=new Date){const n=e.toISOString();return t.map(r=>({...r,severity:r.severity||"major",recall_count:0,confidence:M[r.source],ts:n,verified_at:n}))}async function z(t){const e=t.fetchFn??fetch,n=t.jetzt??Date.now,r=t.schlafen??l,o=n()+(t.bereitFristMs??x);for(;;){try{const a=await e(`${t.cfg.apiUrl}/api/v1/instances/${t.cfg.instanceId}/export`,{headers:{Authorization:`Bearer ${t.cfg.jwt}`},signal:AbortSignal.timeout(g)});if(a.status===401||a.status===403)return"nicht-bereit";if(a.ok){const s=await a.json();if(Array.isArray(s?.lessons)&&s.lessons.length>0)return"hat-lektionen";if(Array.isArray(s?.lessons)&&!s.note)return"leer"}}catch{}if(n()>=o)return"nicht-bereit";await r(h)}}async function B(t,e){const n=t.fetchFn??fetch,r=t.schlafen??l;let o=0,a=0;const s=async()=>{for(;o<e.length;){const c=e[o++];for(let i=1;i<=m;i++){try{const f=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(c),signal:AbortSignal.timeout(g)});if(f.ok){a++;break}if(f.status!==409&&f.status!==429&&f.status<500)break}catch{}i<m&&await r(h*i)}}};return await Promise.all(Array.from({length:Math.min(b,e.length)},s)),a}async function G(t){try{if(!R(t.env))return{art:"aus"};const e=u(t.projekt||"."),n=await(t.gitWurzel??E)(e);let r,o;if(n){const c=y(n,t.env);if(c)return{art:"ausgeschlossen",grund:c};r="git";let i="";try{i=(t.gitLog??j)(n)}catch{}if(o=I(_(i)),o.length===0)return{art:r,lektionen:0,gesendet:0}}else{if(!T(t.env))return{art:"kein-repo"};r="startvorrat",o=L()}v(t.cfg.instanceId,F(o));const a=await z(t);if(a!=="leer")return{art:a};const s=await B(t,o);return s>0&&await k(t.cfg,{force:!0,fetchFn:t.fetchFn}),{art:r,lektionen:o.length,gesendet:s}}catch(e){return{art:"fehler",grund:e instanceof Error?e.message:String(e)}}}function V(t){if((t.art==="git"||t.art==="startvorrat")&&t.gesendet>0)return{art:t.art,lektionen:t.gesendet}}export{x as BEREIT_FRIST_MS,h as BEREIT_TAKT_MS,g as LERN_FRIST_MS,b as LERN_PARALLEL,m as LERN_VERSUCHE,D as STARTWISSEN_IMPORT,F as alsBestand,I as gitAnfragen,V as hookImportFuerAuftrag,G as importiereStartwissen,L as startvorratAnfragen};
|