@cachly-dev/mcp-server 0.10.128 → 0.10.129

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.
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Varianten-Interferenz — die Frage einmal stellen, viele Wege gehen.
3
+ *
4
+ * ╔══════════════════════════════════════════════════════════════════════════╗
5
+ * ║ GEMESSEN UND NICHT VERDRAHTET (21.08.2026). ║
6
+ * ║ ║
7
+ * ║ Am eingefrorenen Korpus, alle Kombinationen aus K=3/5/9 und Staerke ║
8
+ * ║ 0,3/0,5/0,8 (src/bench/interferenz-vergleich.ts): ║
9
+ * ║ ║
10
+ * ║ Bauform Platz 1 @3 Top 10 Topf ║
11
+ * ║ heute 39,0 51,0 71,0 90,0 ║
12
+ * ║ K=5 staerke=0,5 39,0 51,0 72,0 90,0 ║
13
+ * ║ (alle uebrigen: gleich oder schlechter) ║
14
+ * ║ ║
15
+ * ║ Von den 10 Fragen, die gar nicht in den Topf kamen, wurde KEINE einzige ║
16
+ * ║ gerettet. ║
17
+ * ║ ║
18
+ * ║ Der Grund steht in der Diagnose (src/bench/warum-durchgefallen.ts): ║
19
+ * ║ bge-m3-Vektoren sind DICHT. Bedeutung liegt ueber alle 1024 Dimensionen ║
20
+ * ║ verteilt, nicht in Abschnitten. Einen Abschnitt zu daempfen ist deshalb ║
21
+ * ║ keine "lass ein Wort weg"-Operation, sondern eine Drehung, die alle ║
22
+ * ║ Kandidaten aehnlich trifft — gemessen: Kosinus zur Ausgangsfrage 0,99 ║
23
+ * ║ bei Staerke 0,3 und noch 0,89 bei 0,8. Die Rangfolge bewegt sich nicht. ║
24
+ * ║ ║
25
+ * ║ Die Analogie war falsch, nicht die Umsetzung: Interferenz braucht Wege, ║
26
+ * ║ die sich WIRKLICH unterscheiden. Im Vektorraum eines dichten Modells ║
27
+ * ║ gibt es die nicht zum Nulltarif — echte Textvarianten kosten je einen ║
28
+ * ║ Einbettungsaufruf, und genau den sollte diese Idee sparen. ║
29
+ * ║ ║
30
+ * ║ Was die Messung stattdessen fand, steht in src/bench/topfgroesse.ts: ║
31
+ * ║ der Topf war mit 25 zu klein. 75 hebt die Decke von 90 auf 97 Prozent. ║
32
+ * ║ ║
33
+ * ║ Die Datei bleibt mitsamt Proben, damit der naechste Anlauf die Messung ║
34
+ * ║ vorfindet statt sie zu wiederholen. ║
35
+ * ╚══════════════════════════════════════════════════════════════════════════╝
36
+ *
37
+ * ── Das Vorbild ─────────────────────────────────────────────────────────────
38
+ *
39
+ * Feynmans Pfadintegral: Licht probiert alle Wege gleichzeitig. Die Phasen der
40
+ * falschen Wege loeschen sich gegenseitig aus, uebrig bleibt der richtige.
41
+ * Nicht weil einer ausgewaehlt wurde — weil die anderen einander aufheben.
42
+ *
43
+ * ── Das Problem, gegen das es antritt ───────────────────────────────────────
44
+ *
45
+ * Gemessen am 21.08.2026 am eingefrorenen Korpus: von 100 Fragen kommen 10 gar
46
+ * nicht erst in den Topf. Diese zehn sind fuer JEDE spaetere Stufe verloren —
47
+ * die beste Sortierung der Welt kann nichts sortieren, was nicht da ist.
48
+ *
49
+ * Die Vorauswahl haengt heute an EINER Zahl je Lektion: der Naehe zu EINEM
50
+ * Fragevektor. Eine ungluecklich formulierte Frage zeigt in eine leicht
51
+ * falsche Richtung, und die richtige Lektion faellt aus den Top 25. Es gibt
52
+ * keinen zweiten Versuch.
53
+ *
54
+ * ── Was hier passiert ───────────────────────────────────────────────────────
55
+ *
56
+ * Aus dem einen Fragevektor werden K leicht verschobene Varianten erzeugt.
57
+ * Jede nominiert ihre eigene Top-Liste. Wer in vielen Varianten weit vorne
58
+ * steht, ist stabil gemeint; wer nur in einer auftaucht, war der Zufallstreffer
59
+ * einer bestimmten Formulierung.
60
+ *
61
+ * WICHTIG, und der ganze Grund, warum das billig ist: die Varianten entstehen
62
+ * IM VEKTORRAUM, nicht im Text. Kein einziger zusaetzlicher Einbettungsaufruf,
63
+ * kein Netz, keine Latenz von Belang — nur Arithmetik auf 1024 Zahlen.
64
+ *
65
+ * ── Warum deterministisch und nicht zufaellig ───────────────────────────────
66
+ *
67
+ * Zwei Laeufe auf derselben Frage MUESSEN dieselbe Antwort geben. Ein
68
+ * Suchergebnis, das bei jedem Aufruf leicht anders ist, ist nicht
69
+ * reproduzierbar — und ein Messstand darauf misst sein eigenes Rauschen.
70
+ * Die Streuung kommt deshalb aus einer festen Achsenwahl je Variantenindex,
71
+ * nicht aus einem Zufallsgenerator.
72
+ */
73
+ /**
74
+ * Erzeugt K Varianten eines Fragevektors.
75
+ *
76
+ * Variante 0 ist IMMER die unveraenderte Frage. Damit kann die Interferenz im
77
+ * schlimmsten Fall nur so gut sein wie vorher plus Zusatzstimmen — sie kann
78
+ * die Ausgangslage nicht verlieren.
79
+ *
80
+ * Die uebrigen K-1 daempfen jeweils einen anderen Abschnitt des Vektors. Das
81
+ * ist die Vektorraum-Entsprechung zu "lass ein paar Woerter weg": ein Teil der
82
+ * Bedeutung wird leiser gedreht, der Rest bleibt. Faellt eine Lektion dadurch
83
+ * heraus, hing sie an genau diesem Abschnitt.
84
+ *
85
+ * @param fv der Fragevektor
86
+ * @param k wie viele Varianten insgesamt (inklusive der unveraenderten)
87
+ * @param staerke wie stark gedaempft wird (0 = gar nicht, 1 = Abschnitt aus)
88
+ */
89
+ export function varianten(fv, k = 5, staerke = 0.5) {
90
+ if (k <= 1 || fv.length === 0)
91
+ return [fv];
92
+ const aus = [fv];
93
+ const abschnitte = k - 1;
94
+ const breite = Math.max(1, Math.floor(fv.length / abschnitte));
95
+ for (let i = 0; i < abschnitte; i++) {
96
+ const von = i * breite;
97
+ const bis = i === abschnitte - 1 ? fv.length : von + breite;
98
+ const v = fv.slice();
99
+ for (let j = von; j < bis; j++)
100
+ v[j] *= (1 - staerke);
101
+ aus.push(v);
102
+ }
103
+ return aus;
104
+ }
105
+ /**
106
+ * Ueberlagert die Nominierungen mehrerer Varianten.
107
+ *
108
+ * Das Gewicht einer Stimme faellt mit dem Platz (1/(platz+1)) — wie bei
109
+ * Reciprocal Rank Fusion, aber MIT einem Zusatz, der hier den Unterschied
110
+ * macht: die Naehe geht mit ein. Reine Platz-Fusion kann nicht unterscheiden,
111
+ * ob Platz 1 knapp oder deutlich gewonnen hat; genau daran ist am 20.08. die
112
+ * erste Eingangs-Verdrahtung gescheitert.
113
+ *
114
+ * Variante 0 (die unveraenderte Frage) zaehlt doppelt: sie ist die Frage, die
115
+ * der Nutzer wirklich gestellt hat. Die anderen sind Hypothesen darueber, was
116
+ * er gemeint haben koennte.
117
+ *
118
+ * @param listen je Variante eine nach Naehe absteigend sortierte Kandidatenliste
119
+ * @param wieViele wie viele Themen am Ende nominiert werden
120
+ */
121
+ export function ueberlagere(listen, wieViele) {
122
+ const punkte = new Map();
123
+ for (const [vi, liste] of listen.entries()) {
124
+ const gewicht = vi === 0 ? 2 : 1;
125
+ for (const [platz, kandidat] of liste.entries()) {
126
+ // Negative Naehe heisst "kein Vektor" (-2) oder "zeigt weg" — solche
127
+ // Stimmen werden nicht gezaehlt, statt die Summe nach unten zu ziehen.
128
+ if (kandidat.naehe <= 0)
129
+ continue;
130
+ const stimme = gewicht * (kandidat.naehe / (platz + 1));
131
+ punkte.set(kandidat.topic, (punkte.get(kandidat.topic) ?? 0) + stimme);
132
+ }
133
+ }
134
+ return [...punkte.entries()]
135
+ // Bei Gleichstand entscheidet der Name — zwei Laeufe muessen dieselbe
136
+ // Reihenfolge geben, sonst misst der Messstand sein eigenes Rauschen.
137
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
138
+ .slice(0, wieViele)
139
+ .map(([topic]) => topic);
140
+ }
141
+ //# sourceMappingURL=interferenz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interferenz.js","sourceRoot":"","sources":["../../src/interferenz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AAKH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS,CAAC,EAAY,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG;IAC1D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAe,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,KAAK,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,QAAgB;IAChE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,qEAAqE;YACrE,uEAAuE;YACvE,IAAI,QAAQ,CAAC,KAAK,IAAI,CAAC;gBAAE,SAAS;YAClC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,sEAAsE;QACtE,sEAAsE;SACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACvD,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC"}
@@ -165,5 +165,41 @@ export declare function bewerteTopf(topf: Bewertbar[], gewichte?: {
165
165
  /** Anteil der seltenen Fragewörter im Text. 1,0 bis 1,6 — Mitte genommen. */
166
166
  readonly seltenheit: 1.3;
167
167
  }): number[];
168
+ /**
169
+ * Punktzahl je Kandidat — STRENGE Fassung: Merkmale multiplizieren statt addieren.
170
+ *
171
+ * ── Das Vorbild ─────────────────────────────────────────────────────────────
172
+ *
173
+ * Kinetisches Korrekturlesen (Hopfield 1974, T-Zell-Rezeptoren): Biochemie
174
+ * erreicht Fehlerraten weit unter dem, was ein einzelner Bindungsschritt
175
+ * hergibt, indem sie Kandidaten durch eine KETTE von Pruefschritten schickt.
176
+ * Bei jedem Schritt kann der Kandidat abfallen; die Trennschaerfe der Schritte
177
+ * MULTIPLIZIERT sich, statt sich zu mitteln.
178
+ *
179
+ * ── Der Unterschied zur Addition ────────────────────────────────────────────
180
+ *
181
+ * In der Summe (bewerteTopf) kann ein Kandidat totale Schwaeche in einem
182
+ * Merkmal mit Staerke in einem anderen voll ausgleichen. Im Produkt nicht:
183
+ * eine Null in einem Merkmal drueckt die Gesamtnote, egal wie gut der Rest
184
+ * ist. Das Produkt verlangt STIMMIGKEIT ueber alle Merkmale — die Summe
185
+ * verlangt nur Masse.
186
+ *
187
+ * `basis` stellt die Strenge ein: grosse Basis naehert sich der Summe an,
188
+ * kleine Basis macht eine Null toedlich. Rechnerisch ist das eine gewichtete
189
+ * Summe im Logarithmus — der Unterschied zur Addition ist die begrenzte
190
+ * Ausgleichbarkeit, nicht die Buchhaltung.
191
+ *
192
+ * Ergebnis der Messung vom 21.08.2026 steht in src/bench/fusion-vergleich.ts.
193
+ */
194
+ export declare function bewerteTopfStreng(topf: Bewertbar[], gewichte?: {
195
+ /** Nähe zum ganzen Text. Der Grundstock, deshalb 1. */
196
+ readonly text: 1;
197
+ /** Nähe zum Themennamen. In beiden Richtungen 0,6. */
198
+ readonly thema: 0.6;
199
+ /** Angereicherte Frage gegen den ganzen Text. In beiden Richtungen 0,3. */
200
+ readonly rueckkopplung: 0.3;
201
+ /** Anteil der seltenen Fragewörter im Text. 1,0 bis 1,6 — Mitte genommen. */
202
+ readonly seltenheit: 1.3;
203
+ }, basis?: number): number[];
168
204
  /** Bequemlichkeit: Kosinus mit Lücken-Behandlung. */
169
205
  export declare function naeheOderLuecke(frage: number[] | null, vektor: number[] | null | undefined): number;
@@ -207,6 +207,41 @@ export function bewerteTopf(topf, gewichte = GEWICHTE) {
207
207
  + gewichte.rueckkopplung * r[i]
208
208
  + gewichte.seltenheit * k.seltenheitsDeckung);
209
209
  }
210
+ /**
211
+ * Punktzahl je Kandidat — STRENGE Fassung: Merkmale multiplizieren statt addieren.
212
+ *
213
+ * ── Das Vorbild ─────────────────────────────────────────────────────────────
214
+ *
215
+ * Kinetisches Korrekturlesen (Hopfield 1974, T-Zell-Rezeptoren): Biochemie
216
+ * erreicht Fehlerraten weit unter dem, was ein einzelner Bindungsschritt
217
+ * hergibt, indem sie Kandidaten durch eine KETTE von Pruefschritten schickt.
218
+ * Bei jedem Schritt kann der Kandidat abfallen; die Trennschaerfe der Schritte
219
+ * MULTIPLIZIERT sich, statt sich zu mitteln.
220
+ *
221
+ * ── Der Unterschied zur Addition ────────────────────────────────────────────
222
+ *
223
+ * In der Summe (bewerteTopf) kann ein Kandidat totale Schwaeche in einem
224
+ * Merkmal mit Staerke in einem anderen voll ausgleichen. Im Produkt nicht:
225
+ * eine Null in einem Merkmal drueckt die Gesamtnote, egal wie gut der Rest
226
+ * ist. Das Produkt verlangt STIMMIGKEIT ueber alle Merkmale — die Summe
227
+ * verlangt nur Masse.
228
+ *
229
+ * `basis` stellt die Strenge ein: grosse Basis naehert sich der Summe an,
230
+ * kleine Basis macht eine Null toedlich. Rechnerisch ist das eine gewichtete
231
+ * Summe im Logarithmus — der Unterschied zur Addition ist die begrenzte
232
+ * Ausgleichbarkeit, nicht die Buchhaltung.
233
+ *
234
+ * Ergebnis der Messung vom 21.08.2026 steht in src/bench/fusion-vergleich.ts.
235
+ */
236
+ export function bewerteTopfStreng(topf, gewichte = GEWICHTE, basis = 0.3) {
237
+ const t = spreizeImTopf(topf.map((k) => k.naeheText));
238
+ const th = spreizeImTopf(topf.map((k) => k.naeheThema));
239
+ const r = spreizeImTopf(topf.map((k) => k.naeheRueckkopplung));
240
+ return topf.map((k, i) => gewichte.text * Math.log(basis + t[i])
241
+ + gewichte.thema * Math.log(basis + th[i])
242
+ + gewichte.rueckkopplung * Math.log(basis + r[i])
243
+ + gewichte.seltenheit * Math.log(basis + k.seltenheitsDeckung));
244
+ }
210
245
  /** Bequemlichkeit: Kosinus mit Lücken-Behandlung. */
211
246
  export function naeheOderLuecke(frage, vektor) {
212
247
  return frage && vektor && vektor.length > 0 ? kosinus(frage, vektor) : -2;
@@ -1 +1 @@
1
- {"version":3,"file":"rangfolge.js","sourceRoot":"","sources":["../../src/rangfolge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rangfolge.js","sourceRoot":"","sources":["../../src/rangfolge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Resonanz — eine Lektion wird durch die Fragen adressiert, die zu ihr fuehrten.
3
+ *
4
+ * ── Das Vorbild ─────────────────────────────────────────────────────────────
5
+ *
6
+ * Das Hologramm speichert nicht das Bild, sondern das Interferenzmuster des
7
+ * Lichts, das es beleuchtet hat. Beleuchtet man es spaeter wieder, entsteht
8
+ * das Bild aus dem Muster — und jeder Splitter traegt das Ganze, nur unschaerfer.
9
+ *
10
+ * ── Das Problem, gegen das es antritt ───────────────────────────────────────
11
+ *
12
+ * Jeder Index in diesem Haus beschreibt, was eine Lektion SAGT: ihr Volltext,
13
+ * ihr Themenname. Gesucht wird aber mit dem, was jemand FRAGT — und die beiden
14
+ * Sprachen fallen auseinander. Gemessen am 21.08.2026: von 100 Fragen liegen
15
+ * 11 auf Platz 100+ der Bedeutungsrangfolge. Fuer die ist die richtige Lektion
16
+ * semantisch nicht "in der Naehe" — keine Vektorrechnung ueber ihren Text holt
17
+ * sie naeher heran.
18
+ *
19
+ * Diese Datei fuehrt deshalb eine dritte Sicht: je Lektion die laufende
20
+ * Ueberlagerung aller Fragevektoren, die nachweislich zu ihr gefuehrt haben.
21
+ * Der Vergleich laeuft dann Frage-gegen-Frage statt Frage-gegen-Text.
22
+ *
23
+ * ── Warum wir das koennen und andere nicht ──────────────────────────────────
24
+ *
25
+ * Es braucht die geschlossene Schleife: von der Frage ueber den Treffer bis zu
26
+ * der Bestaetigung, dass der Treffer richtig war. Ein Suchindex, der nur
27
+ * Dokumente kennt, hat diese Daten nicht.
28
+ *
29
+ * ── Die ehrliche Grenze ─────────────────────────────────────────────────────
30
+ *
31
+ * Der Index ist am Anfang leer. Eine Lektion, die noch nie gefunden wurde, hat
32
+ * keine Resonanz — und ausgerechnet die braeuchte sie am dringendsten. Das ist
33
+ * kein Fehler der Idee, sondern ihre Bauart: sie wird mit der Zeit besser und
34
+ * am ersten Tag gar nicht. Deshalb ist sie ein ZUSATZ und ersetzt keine Sicht.
35
+ */
36
+ import type { Redis } from 'ioredis';
37
+ /** Schluessel-Vorsatz der Resonanzvektoren. */
38
+ export declare const RESONANZ_PRAEFIX = "cachly:lesson:res:";
39
+ /**
40
+ * Fuegt einen Fragevektor zur Resonanz einer Lektion.
41
+ *
42
+ * Die Ueberlagerung ist eine gleitende Summe mit Normierung: der neue Vektor
43
+ * zieht die Resonanz um `anteil` in seine Richtung. Ohne Normierung waeren
44
+ * haeufig gefundene Lektionen einfach laenger und wuerden jeden Kosinus
45
+ * gewinnen — die Naehe misst dann Beliebtheit statt Passung.
46
+ *
47
+ * `anteil` bewusst klein: eine einzelne Frage darf die Adresse einer Lektion
48
+ * nicht umschreiben. Zehn aehnliche Fragen sollen sie praegen, eine schraege
49
+ * nicht.
50
+ *
51
+ * @param bisher die bisherige Resonanz oder null
52
+ * @param frage der Fragevektor, der zu einem bestaetigten Treffer fuehrte
53
+ * @param anteil wie stark die neue Frage zieht
54
+ */
55
+ export declare function ueberlagere(bisher: number[] | null, frage: number[], anteil?: number): number[];
56
+ /** Auf Laenge 1. Ein Nullvektor bleibt ein Nullvektor. */
57
+ export declare function normiere(v: number[]): number[];
58
+ /**
59
+ * Der Resonanzbestand — dieselbe Mechanik wie Vektorbestand, andere Sicht.
60
+ *
61
+ * Bewusst eine eigene kleine Klasse statt eines vierten Vektorbestand-Praefix:
62
+ * dieser Bestand wird auch GESCHRIEBEN (im Recall-Pfad, nach einem Treffer),
63
+ * und Schreiben gehoert nicht in eine Klasse, die sonst nur laedt.
64
+ */
65
+ export declare class Resonanzbestand {
66
+ private readonly frischeMs;
67
+ private vektoren;
68
+ private geladen;
69
+ constructor(frischeMs?: number);
70
+ /** Die Naehe einer Frage zur Resonanz EINER Lektion. -2, wenn keine da ist. */
71
+ naehe(frage: number[], topic: string): number;
72
+ get groesse(): number;
73
+ /** Nur fuer Messungen: Resonanz ohne Speicher setzen. */
74
+ setzeDirekt(topic: string, v: number[]): void;
75
+ /** Laedt fehlende Resonanzvektoren nach. */
76
+ aktualisiere(redis: Redis, jetzt?: number): Promise<void>;
77
+ /**
78
+ * Schreibt die neue Resonanz einer Lektion.
79
+ *
80
+ * Faengt jeden Fehler ab: eine Suche darf nie daran scheitern, dass sie sich
81
+ * nicht merken konnte, was sie gefunden hat. Der Aufrufer bekommt `false`
82
+ * und kann es melden.
83
+ */
84
+ schreibe(redis: Redis, topic: string, frage: number[], anteil?: number): Promise<boolean>;
85
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Resonanz — eine Lektion wird durch die Fragen adressiert, die zu ihr fuehrten.
3
+ *
4
+ * ── Das Vorbild ─────────────────────────────────────────────────────────────
5
+ *
6
+ * Das Hologramm speichert nicht das Bild, sondern das Interferenzmuster des
7
+ * Lichts, das es beleuchtet hat. Beleuchtet man es spaeter wieder, entsteht
8
+ * das Bild aus dem Muster — und jeder Splitter traegt das Ganze, nur unschaerfer.
9
+ *
10
+ * ── Das Problem, gegen das es antritt ───────────────────────────────────────
11
+ *
12
+ * Jeder Index in diesem Haus beschreibt, was eine Lektion SAGT: ihr Volltext,
13
+ * ihr Themenname. Gesucht wird aber mit dem, was jemand FRAGT — und die beiden
14
+ * Sprachen fallen auseinander. Gemessen am 21.08.2026: von 100 Fragen liegen
15
+ * 11 auf Platz 100+ der Bedeutungsrangfolge. Fuer die ist die richtige Lektion
16
+ * semantisch nicht "in der Naehe" — keine Vektorrechnung ueber ihren Text holt
17
+ * sie naeher heran.
18
+ *
19
+ * Diese Datei fuehrt deshalb eine dritte Sicht: je Lektion die laufende
20
+ * Ueberlagerung aller Fragevektoren, die nachweislich zu ihr gefuehrt haben.
21
+ * Der Vergleich laeuft dann Frage-gegen-Frage statt Frage-gegen-Text.
22
+ *
23
+ * ── Warum wir das koennen und andere nicht ──────────────────────────────────
24
+ *
25
+ * Es braucht die geschlossene Schleife: von der Frage ueber den Treffer bis zu
26
+ * der Bestaetigung, dass der Treffer richtig war. Ein Suchindex, der nur
27
+ * Dokumente kennt, hat diese Daten nicht.
28
+ *
29
+ * ── Die ehrliche Grenze ─────────────────────────────────────────────────────
30
+ *
31
+ * Der Index ist am Anfang leer. Eine Lektion, die noch nie gefunden wurde, hat
32
+ * keine Resonanz — und ausgerechnet die braeuchte sie am dringendsten. Das ist
33
+ * kein Fehler der Idee, sondern ihre Bauart: sie wird mit der Zeit besser und
34
+ * am ersten Tag gar nicht. Deshalb ist sie ein ZUSATZ und ersetzt keine Sicht.
35
+ */
36
+ import { packe, entpacke, kosinus } from './bedeutung.js';
37
+ /** Schluessel-Vorsatz der Resonanzvektoren. */
38
+ export const RESONANZ_PRAEFIX = 'cachly:lesson:res:';
39
+ /**
40
+ * Fuegt einen Fragevektor zur Resonanz einer Lektion.
41
+ *
42
+ * Die Ueberlagerung ist eine gleitende Summe mit Normierung: der neue Vektor
43
+ * zieht die Resonanz um `anteil` in seine Richtung. Ohne Normierung waeren
44
+ * haeufig gefundene Lektionen einfach laenger und wuerden jeden Kosinus
45
+ * gewinnen — die Naehe misst dann Beliebtheit statt Passung.
46
+ *
47
+ * `anteil` bewusst klein: eine einzelne Frage darf die Adresse einer Lektion
48
+ * nicht umschreiben. Zehn aehnliche Fragen sollen sie praegen, eine schraege
49
+ * nicht.
50
+ *
51
+ * @param bisher die bisherige Resonanz oder null
52
+ * @param frage der Fragevektor, der zu einem bestaetigten Treffer fuehrte
53
+ * @param anteil wie stark die neue Frage zieht
54
+ */
55
+ export function ueberlagere(bisher, frage, anteil = 0.3) {
56
+ if (!bisher || bisher.length !== frage.length)
57
+ return normiere(frage);
58
+ const neu = bisher.map((x, i) => (1 - anteil) * x + anteil * frage[i]);
59
+ return normiere(neu);
60
+ }
61
+ /** Auf Laenge 1. Ein Nullvektor bleibt ein Nullvektor. */
62
+ export function normiere(v) {
63
+ let q = 0;
64
+ for (const x of v)
65
+ q += x * x;
66
+ const l = Math.sqrt(q);
67
+ return l > 0 ? v.map((x) => x / l) : v;
68
+ }
69
+ /**
70
+ * Der Resonanzbestand — dieselbe Mechanik wie Vektorbestand, andere Sicht.
71
+ *
72
+ * Bewusst eine eigene kleine Klasse statt eines vierten Vektorbestand-Praefix:
73
+ * dieser Bestand wird auch GESCHRIEBEN (im Recall-Pfad, nach einem Treffer),
74
+ * und Schreiben gehoert nicht in eine Klasse, die sonst nur laedt.
75
+ */
76
+ export class Resonanzbestand {
77
+ frischeMs;
78
+ vektoren = new Map();
79
+ geladen = 0;
80
+ constructor(frischeMs = 60_000) {
81
+ this.frischeMs = frischeMs;
82
+ }
83
+ /** Die Naehe einer Frage zur Resonanz EINER Lektion. -2, wenn keine da ist. */
84
+ naehe(frage, topic) {
85
+ const v = this.vektoren.get(topic);
86
+ return v ? kosinus(frage, v) : -2;
87
+ }
88
+ get groesse() { return this.vektoren.size; }
89
+ /** Nur fuer Messungen: Resonanz ohne Speicher setzen. */
90
+ setzeDirekt(topic, v) {
91
+ this.vektoren.set(topic, v);
92
+ }
93
+ /** Laedt fehlende Resonanzvektoren nach. */
94
+ async aktualisiere(redis, jetzt = Date.now()) {
95
+ if (this.vektoren.size > 0 && jetzt - this.geladen < this.frischeMs)
96
+ return;
97
+ const schluessel = [];
98
+ let cursor = '0';
99
+ do {
100
+ const [next, gefunden] = await redis.scan(cursor, 'MATCH', `${RESONANZ_PRAEFIX}*`, 'COUNT', 500);
101
+ cursor = next;
102
+ schluessel.push(...gefunden);
103
+ } while (cursor !== '0');
104
+ if (schluessel.length === 0) {
105
+ this.geladen = jetzt;
106
+ return;
107
+ }
108
+ const werte = await redis.mget(...schluessel);
109
+ const frisch = new Map();
110
+ for (const [i, s] of schluessel.entries()) {
111
+ const roh = werte[i];
112
+ if (!roh)
113
+ continue;
114
+ const v = entpacke(roh);
115
+ if (v)
116
+ frisch.set(s.slice(RESONANZ_PRAEFIX.length), v);
117
+ }
118
+ this.vektoren = frisch;
119
+ this.geladen = jetzt;
120
+ }
121
+ /**
122
+ * Schreibt die neue Resonanz einer Lektion.
123
+ *
124
+ * Faengt jeden Fehler ab: eine Suche darf nie daran scheitern, dass sie sich
125
+ * nicht merken konnte, was sie gefunden hat. Der Aufrufer bekommt `false`
126
+ * und kann es melden.
127
+ */
128
+ async schreibe(redis, topic, frage, anteil = 0.3) {
129
+ try {
130
+ const neu = ueberlagere(this.vektoren.get(topic) ?? null, frage, anteil);
131
+ this.vektoren.set(topic, neu);
132
+ await redis.set(`${RESONANZ_PRAEFIX}${topic}`, packe(neu));
133
+ return true;
134
+ }
135
+ catch {
136
+ return false;
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=resonanz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resonanz.js","sourceRoot":"","sources":["../../src/resonanz.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,13 @@
44
44
  * danach aus dem Text entfernt, bevor er den Nutzer erreicht.
45
45
  */
46
46
  import type { Redis } from 'ioredis';
47
+ import { meldeUndVermerke } from './aussetzer.js';
48
+ /**
49
+ * So viel Speicher, wie ein Vermerk braucht. Bewusst strukturell getippt und
50
+ * nicht als Redis-Typ: dieses Modul soll ohne Redis-Abhaengigkeit pruefbar
51
+ * bleiben.
52
+ */
53
+ type VermerkSpeicherArt = Parameters<typeof meldeUndVermerke>[0];
47
54
  export declare const VERSUCH_ENV = "CACHLY_VERSUCH";
48
55
  export declare const VERSUCH_SALZ_ENV = "CACHLY_VERSUCH_SALZ";
49
56
  /** Grund fuer `meldeEinmal`: Versuch eingeschaltet, aber kein Salz gesetzt. */
@@ -57,7 +64,7 @@ export declare const OHNE_SALZ = "versuch-ohne-salz";
57
64
  * `meldeEinmal`) und verhaelt sich danach wie der erste — still weiterlaufen
58
65
  * waere die Fehlerklasse, gegen die `aussetzer.ts` gebaut wurde.
59
66
  */
60
- export declare function versuchStart(): string | null;
67
+ export declare function versuchStart(speicher?: VermerkSpeicherArt | null): string | null;
61
68
  /**
62
69
  * Eine neue, stabile Kennung je Recall-Aufruf.
63
70
  *
@@ -177,3 +184,4 @@ export interface VersuchProtokollTeil {
177
184
  * forget) und gibt den bereinigten Text zurueck — den, den der Nutzer sieht.
178
185
  */
179
186
  export declare function schliesseVersuchAb(redis: Redis, kennung: string, teil: VersuchProtokollTeil, fertigeAntwort: string): string;
187
+ export {};
@@ -44,7 +44,7 @@
44
44
  * danach aus dem Text entfernt, bevor er den Nutzer erreicht.
45
45
  */
46
46
  import { randomBytes, createHash } from 'node:crypto';
47
- import { meldeEinmal } from './aussetzer.js';
47
+ import { meldeEinmal, meldeUndVermerke, VERSUCH_LEER } from './aussetzer.js';
48
48
  // ── Der Schalter ─────────────────────────────────────────────────────────────
49
49
  export const VERSUCH_ENV = 'CACHLY_VERSUCH';
50
50
  export const VERSUCH_SALZ_ENV = 'CACHLY_VERSUCH_SALZ';
@@ -59,12 +59,26 @@ export const OHNE_SALZ = 'versuch-ohne-salz';
59
59
  * `meldeEinmal`) und verhaelt sich danach wie der erste — still weiterlaufen
60
60
  * waere die Fehlerklasse, gegen die `aussetzer.ts` gebaut wurde.
61
61
  */
62
- export function versuchStart() {
62
+ export function versuchStart(speicher) {
63
63
  if (process.env[VERSUCH_ENV] !== 'an')
64
64
  return null;
65
65
  const salz = process.env[VERSUCH_SALZ_ENV];
66
66
  if (!salz) {
67
- meldeEinmal(OHNE_SALZ, `${VERSUCH_ENV}=an, aber ${VERSUCH_SALZ_ENV} fehlt — der Versuch verhaelt sich wie "aus"`);
67
+ const text = `${VERSUCH_ENV}=an, aber ${VERSUCH_SALZ_ENV} fehlt — der Versuch verhaelt sich wie "aus"`;
68
+ if (speicher) {
69
+ // Ohne Speicher stand die Meldung nur im Arbeitsspeicher und war nach
70
+ // jedem Deploy weg (Karte opupbt3l9wcq, gefunden von der Gegenrede,
71
+ // Rolle: Der Betreiber). Der Versuch konnte damit WOCHENLANG leer
72
+ // laufen: "keine Daten" sah genauso aus wie "noch nicht genug Daten".
73
+ //
74
+ // meldeUndVermerke faengt jeden eigenen Fehler ab und gibt eine
75
+ // Zusage zurueck, die niemand einloesen muss — deshalb `void`. Diese
76
+ // Funktion bleibt synchron, weil ihre Aufrufer es sind.
77
+ void meldeUndVermerke(speicher, VERSUCH_LEER, text);
78
+ }
79
+ else {
80
+ meldeEinmal(OHNE_SALZ, text);
81
+ }
68
82
  return null;
69
83
  }
70
84
  return salz;
@@ -1 +1 @@
1
- {"version":3,"file":"versuch.js","sourceRoot":"","sources":["../../src/versuch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"versuch.js","sourceRoot":"","sources":["../../src/versuch.ts"],"names":[],"mappings":"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"}