@cachly-dev/mcp-server 0.10.128 → 0.10.130

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.
Files changed (217) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +1 -7
  3. package/dist/packages/telegram-notify/client.js +2 -75
  4. package/dist/src/ambient-cli.js +7 -253
  5. package/dist/src/ambient-deps.js +1 -55
  6. package/dist/src/ambient-hooks.js +5 -278
  7. package/dist/src/ambient-ledger.js +6 -95
  8. package/dist/src/ambient-memory.js +1 -67
  9. package/dist/src/ambient-recall.js +1 -221
  10. package/dist/src/aussetzer.js +1 -82
  11. package/dist/src/auth.js +9 -140
  12. package/dist/src/autor-abzeichen.js +1 -56
  13. package/dist/src/autor.js +1 -136
  14. package/dist/src/bauabdruck.js +1 -93
  15. package/dist/src/bedeutung.js +2 -323
  16. package/dist/src/bench/cachly-bench.js +4 -249
  17. package/dist/src/bench/external-corpus.js +4 -135
  18. package/dist/src/bench/fixtures.js +1 -225
  19. package/dist/src/brain-export.js +16 -119
  20. package/dist/src/brain-watch-hook.js +8 -86
  21. package/dist/src/cachly-url.js +1 -21
  22. package/dist/src/ckg.js +1 -108
  23. package/dist/src/cls-hook.js +8 -94
  24. package/dist/src/confidence.js +1 -50
  25. package/dist/src/credentials.js +1 -85
  26. package/dist/src/deutsch.js +1 -223
  27. package/dist/src/doctor.js +2 -248
  28. package/dist/src/editor.js +1 -63
  29. package/dist/src/eingaenge-nachruesten.js +1 -290
  30. package/dist/src/eingaenge.js +2 -228
  31. package/dist/src/embeddings.js +13 -223
  32. package/dist/src/feldreparatur.js +3 -0
  33. package/dist/src/first-contact.js +4 -108
  34. package/dist/src/first-recall-proof.js +4 -41
  35. package/dist/src/funnel-milestones.js +2 -48
  36. package/dist/src/geliefert.js +1 -114
  37. package/dist/src/handlers/advanced.js +38 -537
  38. package/dist/src/handlers/brain.js +69 -4181
  39. package/dist/src/handlers/cache.js +59 -638
  40. package/dist/src/handlers/context.js +17 -182
  41. package/dist/src/handlers/fedbrain.js +40 -1436
  42. package/dist/src/handlers/instances.js +16 -201
  43. package/dist/src/handlers/roadmap.js +13 -175
  44. package/dist/src/handlers/share.js +19 -530
  45. package/dist/src/handlers/syndicate.js +38 -904
  46. package/dist/src/handlers/team.js +89 -1850
  47. package/dist/src/handlers/viz.js +3 -148
  48. package/dist/src/index.js +321 -4281
  49. package/dist/src/interferenz.js +1 -0
  50. package/dist/src/kostprobe.js +7 -125
  51. package/dist/src/lesson-preview.js +2 -133
  52. package/dist/src/namespace.js +1 -128
  53. package/dist/src/notifier.js +1 -6
  54. package/dist/src/rangfolge-stellschrauben.js +1 -0
  55. package/dist/src/rangfolge.js +1 -214
  56. package/dist/src/raumkorrektur.js +1 -197
  57. package/dist/src/recall-tiefe.js +1 -42
  58. package/dist/src/rerank.js +1 -154
  59. package/dist/src/resonanz.js +1 -0
  60. package/dist/src/search.js +1 -2104
  61. package/dist/src/seltenheitsbestand.js +1 -92
  62. package/dist/src/speicherlage.js +1 -84
  63. package/dist/src/spuren.js +1 -150
  64. package/dist/src/starter-corpus.js +1 -165
  65. package/dist/src/telemetry-types.js +0 -13
  66. package/dist/src/tools.js +10 -2465
  67. package/dist/src/toolspecs.js +1 -121
  68. package/dist/src/upgrade-nudge.js +1 -29
  69. package/dist/src/utils.js +1 -89
  70. package/dist/src/versuch.js +1 -250
  71. package/dist/src/vorspann.js +1 -146
  72. package/dist/src/wartung/vektoren-verdichten.js +1 -200
  73. package/dist/src/werkzeug-nutzung.js +1 -72
  74. package/dist/src/wertbeitrag.js +1 -73
  75. package/dist/src/wirkungsspur.js +1 -0
  76. package/glama.json +1 -1
  77. package/package.json +8 -7
  78. package/server.json +3 -3
  79. package/dist/index.d.ts +0 -1
  80. package/dist/index.js.map +0 -1
  81. package/dist/packages/telegram-notify/client.d.ts +0 -19
  82. package/dist/packages/telegram-notify/client.js.map +0 -1
  83. package/dist/src/ambient-cli.d.ts +0 -101
  84. package/dist/src/ambient-cli.js.map +0 -1
  85. package/dist/src/ambient-deps.d.ts +0 -26
  86. package/dist/src/ambient-deps.js.map +0 -1
  87. package/dist/src/ambient-hooks.d.ts +0 -137
  88. package/dist/src/ambient-hooks.js.map +0 -1
  89. package/dist/src/ambient-ledger.d.ts +0 -19
  90. package/dist/src/ambient-ledger.js.map +0 -1
  91. package/dist/src/ambient-memory.d.ts +0 -12
  92. package/dist/src/ambient-memory.js.map +0 -1
  93. package/dist/src/ambient-recall.d.ts +0 -127
  94. package/dist/src/ambient-recall.js.map +0 -1
  95. package/dist/src/aussetzer.d.ts +0 -67
  96. package/dist/src/aussetzer.js.map +0 -1
  97. package/dist/src/auth.d.ts +0 -43
  98. package/dist/src/auth.js.map +0 -1
  99. package/dist/src/autor-abzeichen.d.ts +0 -41
  100. package/dist/src/autor-abzeichen.js.map +0 -1
  101. package/dist/src/autor.d.ts +0 -101
  102. package/dist/src/autor.js.map +0 -1
  103. package/dist/src/bauabdruck-daten.generiert.json +0 -5
  104. package/dist/src/bauabdruck.d.ts +0 -38
  105. package/dist/src/bauabdruck.js.map +0 -1
  106. package/dist/src/bedeutung.d.ts +0 -168
  107. package/dist/src/bedeutung.js.map +0 -1
  108. package/dist/src/bench/cachly-bench.d.ts +0 -61
  109. package/dist/src/bench/cachly-bench.js.map +0 -1
  110. package/dist/src/bench/external-corpus.d.ts +0 -44
  111. package/dist/src/bench/external-corpus.js.map +0 -1
  112. package/dist/src/bench/fixtures.d.ts +0 -37
  113. package/dist/src/bench/fixtures.js.map +0 -1
  114. package/dist/src/brain-export.d.ts +0 -64
  115. package/dist/src/brain-export.js.map +0 -1
  116. package/dist/src/brain-watch-hook.d.ts +0 -21
  117. package/dist/src/brain-watch-hook.js.map +0 -1
  118. package/dist/src/cachly-url.d.ts +0 -68
  119. package/dist/src/cachly-url.js.map +0 -1
  120. package/dist/src/ckg.d.ts +0 -54
  121. package/dist/src/ckg.js.map +0 -1
  122. package/dist/src/cls-hook.d.ts +0 -15
  123. package/dist/src/cls-hook.js.map +0 -1
  124. package/dist/src/confidence.d.ts +0 -19
  125. package/dist/src/confidence.js.map +0 -1
  126. package/dist/src/credentials.d.ts +0 -37
  127. package/dist/src/credentials.js.map +0 -1
  128. package/dist/src/deutsch.d.ts +0 -98
  129. package/dist/src/deutsch.js.map +0 -1
  130. package/dist/src/doctor.d.ts +0 -47
  131. package/dist/src/doctor.js.map +0 -1
  132. package/dist/src/editor.d.ts +0 -9
  133. package/dist/src/editor.js.map +0 -1
  134. package/dist/src/eingaenge-nachruesten.d.ts +0 -41
  135. package/dist/src/eingaenge-nachruesten.js.map +0 -1
  136. package/dist/src/eingaenge.d.ts +0 -135
  137. package/dist/src/eingaenge.js.map +0 -1
  138. package/dist/src/embeddings.d.ts +0 -48
  139. package/dist/src/embeddings.js.map +0 -1
  140. package/dist/src/first-contact.d.ts +0 -56
  141. package/dist/src/first-contact.js.map +0 -1
  142. package/dist/src/first-recall-proof.d.ts +0 -19
  143. package/dist/src/first-recall-proof.js.map +0 -1
  144. package/dist/src/funnel-milestones.d.ts +0 -5
  145. package/dist/src/funnel-milestones.js.map +0 -1
  146. package/dist/src/geliefert.d.ts +0 -63
  147. package/dist/src/geliefert.js.map +0 -1
  148. package/dist/src/handlers/advanced.d.ts +0 -6
  149. package/dist/src/handlers/advanced.js.map +0 -1
  150. package/dist/src/handlers/brain.d.ts +0 -41
  151. package/dist/src/handlers/brain.js.map +0 -1
  152. package/dist/src/handlers/cache.d.ts +0 -6
  153. package/dist/src/handlers/cache.js.map +0 -1
  154. package/dist/src/handlers/context.d.ts +0 -6
  155. package/dist/src/handlers/context.js.map +0 -1
  156. package/dist/src/handlers/fedbrain.d.ts +0 -18
  157. package/dist/src/handlers/fedbrain.js.map +0 -1
  158. package/dist/src/handlers/instances.d.ts +0 -33
  159. package/dist/src/handlers/instances.js.map +0 -1
  160. package/dist/src/handlers/roadmap.d.ts +0 -6
  161. package/dist/src/handlers/roadmap.js.map +0 -1
  162. package/dist/src/handlers/share.d.ts +0 -8
  163. package/dist/src/handlers/share.js.map +0 -1
  164. package/dist/src/handlers/syndicate.d.ts +0 -6
  165. package/dist/src/handlers/syndicate.js.map +0 -1
  166. package/dist/src/handlers/team.d.ts +0 -45
  167. package/dist/src/handlers/team.js.map +0 -1
  168. package/dist/src/handlers/viz.d.ts +0 -6
  169. package/dist/src/handlers/viz.js.map +0 -1
  170. package/dist/src/index.d.ts +0 -93
  171. package/dist/src/index.js.map +0 -1
  172. package/dist/src/kostprobe.d.ts +0 -25
  173. package/dist/src/kostprobe.js.map +0 -1
  174. package/dist/src/lesson-preview.d.ts +0 -81
  175. package/dist/src/lesson-preview.js.map +0 -1
  176. package/dist/src/namespace.d.ts +0 -20
  177. package/dist/src/namespace.js.map +0 -1
  178. package/dist/src/notifier.d.ts +0 -5
  179. package/dist/src/notifier.js.map +0 -1
  180. package/dist/src/rangfolge.d.ts +0 -169
  181. package/dist/src/rangfolge.js.map +0 -1
  182. package/dist/src/raumkorrektur.d.ts +0 -100
  183. package/dist/src/raumkorrektur.js.map +0 -1
  184. package/dist/src/recall-tiefe.d.ts +0 -48
  185. package/dist/src/recall-tiefe.js.map +0 -1
  186. package/dist/src/rerank.d.ts +0 -48
  187. package/dist/src/rerank.js.map +0 -1
  188. package/dist/src/search.d.ts +0 -153
  189. package/dist/src/search.js.map +0 -1
  190. package/dist/src/seltenheitsbestand.d.ts +0 -53
  191. package/dist/src/seltenheitsbestand.js.map +0 -1
  192. package/dist/src/speicherlage.d.ts +0 -51
  193. package/dist/src/speicherlage.js.map +0 -1
  194. package/dist/src/spuren.d.ts +0 -97
  195. package/dist/src/spuren.js.map +0 -1
  196. package/dist/src/starter-corpus.d.ts +0 -28
  197. package/dist/src/starter-corpus.js.map +0 -1
  198. package/dist/src/telemetry-types.d.ts +0 -87
  199. package/dist/src/telemetry-types.js.map +0 -1
  200. package/dist/src/tools.d.ts +0 -2933
  201. package/dist/src/tools.js.map +0 -1
  202. package/dist/src/toolspecs.d.ts +0 -43
  203. package/dist/src/toolspecs.js.map +0 -1
  204. package/dist/src/upgrade-nudge.d.ts +0 -15
  205. package/dist/src/upgrade-nudge.js.map +0 -1
  206. package/dist/src/utils.d.ts +0 -34
  207. package/dist/src/utils.js.map +0 -1
  208. package/dist/src/versuch.d.ts +0 -179
  209. package/dist/src/versuch.js.map +0 -1
  210. package/dist/src/vorspann.d.ts +0 -73
  211. package/dist/src/vorspann.js.map +0 -1
  212. package/dist/src/wartung/vektoren-verdichten.d.ts +0 -50
  213. package/dist/src/wartung/vektoren-verdichten.js.map +0 -1
  214. package/dist/src/werkzeug-nutzung.d.ts +0 -62
  215. package/dist/src/werkzeug-nutzung.js.map +0 -1
  216. package/dist/src/wertbeitrag.d.ts +0 -57
  217. package/dist/src/wertbeitrag.js.map +0 -1
@@ -1,169 +0,0 @@
1
- /**
2
- * Der zusammengesetzte Sortierer.
3
- *
4
- * ── Was hier drinsteckt, und was NICHT ──────────────────────────────────────
5
- *
6
- * Am 19.08.2026 wurden an 499 echten Lektionen mit 100 Fragen ein Dutzend
7
- * Verfahren durchgemessen. Die meisten haben nichts gebracht. Sie stehen hier,
8
- * damit sie niemand ein zweites Mal baut:
9
- *
10
- * Symptom-Sicht (what_failed als eigener Vektor) 17 % statt 40 % — das Feld
11
- * beschreibt bei uns nicht das Symptom, sondern was vergeblich versucht wurde
12
- * Schwerpunkt abziehen 41 % — im Rauschen
13
- * Hauptrichtungen entfernen (1, 3, 6 Stueck) 37–41 % — im Rauschen
14
- * Nabenabzug (CSLS-artig) 41 % — im Rauschen
15
- * Text in Stuecke schneiden nicht gebaut: gemessen deckt
16
- * das beste Stueck genauso viel ab wie der ganze Text (Verhaeltnis 1,00),
17
- * und es liegt bei 86 von 96 Fragen ohnehin am Anfang
18
- *
19
- * Was BLEIBT, sind vier Bestandteile — kreuzweise geprueft, also auf der einen
20
- * Haelfte der Fragen eingestellt und auf der anderen gemessen, in beide
21
- * Richtungen:
22
- *
23
- * P@1 MRR
24
- * nur Bedeutung 40 % 51,3 %
25
- * zusammengesetzt 51 % 57,0 %
26
- *
27
- * ── Die vier Bestandteile ───────────────────────────────────────────────────
28
- *
29
- * 1. NAEHE ZUM GANZEN TEXT (Sicht A). Der Grundstock.
30
- *
31
- * 2. NAEHE ZUM THEMENNAMEN (Sicht C). Der Name ist kurz wie eine Frage — der
32
- * Vergleich ist damit symmetrisch, waehrend eine 60-Zeichen-Frage gegen
33
- * 1376 Zeichen Text es nicht ist. Allein liefert diese Sicht nur 26 %, im
34
- * Verbund traegt sie verlaesslich (Gewicht 0,6 in beiden Richtungen).
35
- *
36
- * 3. RUECKKOPPLUNG. Die ersten drei Treffer sind meistens ungefaehr richtig.
37
- * Ihre Vektoren werden zu einem Viertel unter die Frage gemischt, dann wird
38
- * erneut verglichen. Kostet nichts — keine neue Einbettung, nur eine
39
- * Mittelung vorhandener Zahlen.
40
- *
41
- * 4. SELTENHEITS-UEBERLAPPUNG. Welcher Anteil der SELTENEN Fragewoerter kommt
42
- * im Text vor. Ohne Laengennormierung, ohne unscharfe Treffer, ohne
43
- * Bigramme.
44
- *
45
- * Das ist der unbequeme Befund: dieses eine Verhaeltnis bekam beim Einstellen
46
- * das Gewicht 1,0 bis 1,6 — unser ausgefeiltes BM25 mit Laengennormierung,
47
- * Bigramm-Naehe, unscharfen Treffern und Frischebonus bekam NULL. Nicht weil
48
- * Woerter nichts taugen, sondern weil das ganze Beiwerk beim Sortieren
49
- * daneben misst.
50
- *
51
- * ── Warum innerhalb des Topfes normiert wird ────────────────────────────────
52
- *
53
- * Ueber den ganzen Bestand liegen alle Aehnlichkeiten zwischen 0,42 und 0,61 —
54
- * ein sehr schmales Band, weil alle Vektoren eine gemeinsame Grundrichtung
55
- * teilen (gemessen: 69,8 Prozent). Unter fuenfzig Kandidaten spreizt eine
56
- * Normierung auf 0 bis 1 genau die Unterschiede auf, um die es geht. Das ist
57
- * dasselbe Ziel wie beim Schwerpunkt-Abziehen — nur dort, wo es wirkt.
58
- */
59
- /** Wörter eines Textes, umlautfrei, ohne Kurzwörter. */
60
- export declare function inhaltsWoerter(text: string): Set<string>;
61
- /**
62
- * Es gibt hier KEINE Stammbildung — und das ist gemessen, nicht vergessen.
63
- *
64
- * Naheliegend wäre, `Abhaengigkeiten` und `Abhaengigkeit` auf einen Nenner zu
65
- * bringen. Drei Varianten wurden am 19.08.2026 an 499 Lektionen mit 100 Fragen
66
- * kreuzweise durchgemessen:
67
- *
68
- * ohne Stammbildung P@1 50 % MRR 56,4 %
69
- * erste 6 Zeichen P@1 47 % MRR 54,7 %
70
- * erste 8 Zeichen P@1 47 % MRR 54,7 %
71
- *
72
- * Jede Form von Kürzen kostet drei Punkte. Der Grund liegt daran, was diese
73
- * Suche trägt: seltene Fachwörter. `fail2ban`, `stampede`, `timestamptz`,
74
- * `keycloak` entscheiden eine Frage praktisch allein — und jede Verschmelzung
75
- * verwischt genau sie. `container` und `contains` werden zu demselben Wort,
76
- * und aus zwei seltenen wird ein häufiges.
77
- *
78
- * Beugung einzufangen lohnt sich also nur, wo die häufigen Wörter zählen. Hier
79
- * zählen die seltenen.
80
- *
81
- * (Die Wortform-Behandlung in deutsch.ts bleibt davon unberührt — sie wirkt im
82
- * Wortabgleich, der die Vorauswahl macht, nicht in dieser Bewertung.)
83
- */
84
- export declare function grobStamm(w: string): string;
85
- /**
86
- * Die Seltenheit jedes Wortes im Bestand — einmal berechnet, oft benutzt.
87
- *
88
- * Trifft eine Frage das Wort "nicht", sagt das nichts. Trifft sie "fail2ban",
89
- * ist die Sache praktisch entschieden. Ohne diese Gewichtung sind beide gleich
90
- * viel wert.
91
- */
92
- export declare class Seltenheit {
93
- private df;
94
- private anzahl;
95
- /** @param texte je ein Text pro Datensatz */
96
- constructor(texte: string[]);
97
- wert(wort: string): number;
98
- /**
99
- * Welcher Anteil der seltenen Fragewörter kommt im Text vor.
100
- *
101
- * Der Nenner ist die Summe über ALLE Fragewörter — ein fehlendes seltenes
102
- * Wort zieht damit den Wert herunter. Fehlende Belege zählen also mit, nicht
103
- * nur vorhandene.
104
- */
105
- deckung(frageWoerter: Set<string>, textWoerter: Set<string>): number;
106
- }
107
- /** Auf 0 bis 1 spreizen — innerhalb des Topfes, nicht über den Bestand. */
108
- export declare function spreizeImTopf(werte: number[]): number[];
109
- /**
110
- * Die Frage mit ihren besten Treffern anreichern.
111
- *
112
- * Die Frage benutzt Alltagsworte, die Lektionen Fachworte. Die ersten Treffer
113
- * schlagen diese Brücke: ihre Vektoren zeigen dorthin, wo die Antwort liegt.
114
- *
115
- * Das Risiko ist bekannt und begrenzt: sind die ersten Treffer falsch, zieht
116
- * die Anreicherung in die falsche Richtung. Deshalb bleibt die ursprüngliche
117
- * Frage mit drei Vierteln stehen — gemessen war das besser als jede stärkere
118
- * Beimischung.
119
- */
120
- export declare function reichereAn(frage: number[], besteTreffer: number[][], anteil?: number): number[];
121
- /**
122
- * Die Gewichte.
123
- *
124
- * Kreuzweise ermittelt: auf der einen Hälfte der Fragen eingestellt, auf der
125
- * anderen gemessen, in beide Richtungen. Die drei Werte hier waren in BEIDEN
126
- * Richtungen stabil. Zwei weitere Merkmale — Überlappung mit dem Themennamen
127
- * und Qualitätsmerkmale — schwankten zwischen den Richtungen und sind deshalb
128
- * NICHT dabei: was nur in einer Hälfte hilft, ist eine Eigenschaft dieser
129
- * Hälfte, keine des Verfahrens.
130
- */
131
- export declare const GEWICHTE: {
132
- /** Nähe zum ganzen Text. Der Grundstock, deshalb 1. */
133
- readonly text: 1;
134
- /** Nähe zum Themennamen. In beiden Richtungen 0,6. */
135
- readonly thema: 0.6;
136
- /** Angereicherte Frage gegen den ganzen Text. In beiden Richtungen 0,3. */
137
- readonly rueckkopplung: 0.3;
138
- /** Anteil der seltenen Fragewörter im Text. 1,0 bis 1,6 — Mitte genommen. */
139
- readonly seltenheit: 1.3;
140
- };
141
- export interface Bewertbar {
142
- /** Kosinus zur Sicht über den ganzen Text, oder -2 wenn kein Vektor da ist. */
143
- naeheText: number;
144
- /** Kosinus zur Sicht über den Themennamen. */
145
- naeheThema: number;
146
- /** Kosinus der angereicherten Frage zum ganzen Text. */
147
- naeheRueckkopplung: number;
148
- /** Anteil der seltenen Fragewörter, die im Text vorkommen. */
149
- seltenheitsDeckung: number;
150
- }
151
- /**
152
- * Punktzahl je Kandidat. Höher ist besser.
153
- *
154
- * Erwartet den GANZEN Topf auf einmal, weil die Normierung ihn braucht — eine
155
- * Punktzahl für einen einzelnen Kandidaten gibt es nicht und kann es nicht
156
- * geben.
157
- */
158
- export declare function bewerteTopf(topf: Bewertbar[], gewichte?: {
159
- /** Nähe zum ganzen Text. Der Grundstock, deshalb 1. */
160
- readonly text: 1;
161
- /** Nähe zum Themennamen. In beiden Richtungen 0,6. */
162
- readonly thema: 0.6;
163
- /** Angereicherte Frage gegen den ganzen Text. In beiden Richtungen 0,3. */
164
- readonly rueckkopplung: 0.3;
165
- /** Anteil der seltenen Fragewörter im Text. 1,0 bis 1,6 — Mitte genommen. */
166
- readonly seltenheit: 1.3;
167
- }): number[];
168
- /** Bequemlichkeit: Kosinus mit Lücken-Behandlung. */
169
- export declare function naeheOderLuecke(frage: number[] | null, vektor: number[] | null | undefined): number;
@@ -1 +0,0 @@
1
- {"version":3,"file":"rangfolge.js","sourceRoot":"","sources":["../../src/rangfolge.ts"],"names":[],"mappings":"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"}
@@ -1,100 +0,0 @@
1
- /**
2
- * Raumkorrektur: den Einbettungsraum brauchbar machen, bevor man darin sucht.
3
- *
4
- * ── Drei Übel, drei Gegenmittel ─────────────────────────────────────────────
5
- *
6
- * Ein Einbettungsraum ist nicht neutral. Er hat Eigenschaften, die das Sortieren
7
- * verderben — alle drei am 19.08.2026 an 499 echten Lektionen gemessen:
8
- *
9
- * 1. GEMEINSAME GRUNDRICHTUNG (Anisotropie). Ein durchschnittlicher Vektor
10
- * zeigt zu 69,8 Prozent in Richtung des Schwerpunkts aller Vektoren. Dieser
11
- * Anteil ist in JEDEM Vergleich derselbe und sagt daher nichts — er hebt nur
12
- * alle Werte an und drückt die Unterschiede zusammen. Gemessen liegen alle
13
- * Ähnlichkeiten zwischen 0,42 und 0,61.
14
- *
15
- * 2. RICHTUNGEN, DIE NUR SCHREIBSTIL SIND. Nach dem Schwerpunkt bleiben ein
16
- * paar Hauptrichtungen übrig, die keine Bedeutung tragen, sondern Textsorte:
17
- * "ist eine Fehlermeldung", "enthält Codeschnipsel", "ist auf Deutsch".
18
- * Sie sind stark und lenken die Rangfolge.
19
- *
20
- * 3. NABEN. Manche Vektoren liegen einfach nahe an vielem. Sie erscheinen als
21
- * Treffer für Fragen, mit denen sie nichts zu tun haben. Belegt: die Lektion
22
- * `forge:arbeitskopie-nach-dem-merge-sofort-abraeumen` stand bei "Ich beende
23
- * den Prozess, kurz darauf ist er neu da" UND bei "Wenn der Zwischenspeicher
24
- * abläuft, schlagen alle Anfragen durch" auf Platz 1. Zwei Fragen ohne
25
- * Berührungspunkt, dieselbe falsche Antwort.
26
- *
27
- * ── Die Gegenmittel ─────────────────────────────────────────────────────────
28
- *
29
- * Zu 1 und 2: Schwerpunkt abziehen und die stärksten verbleibenden
30
- * Hauptrichtungen entfernen. Was danach übrig bleibt, ist das, worin sich die
31
- * Texte inhaltlich unterscheiden.
32
- *
33
- * Zu 3: jedem Vektor seine eigene "Geselligkeit" ausrechnen — wie nah liegt er
34
- * im Mittel an seinen nächsten Nachbarn. Wer überall nah dran ist, bekommt
35
- * einen Abzug. Das ist die Idee hinter CSLS aus der Wortübersetzung, hier auf
36
- * den Fall übertragen, dass zur Bauzeit keine Fragen vorliegen: die Nachbarn
37
- * sind die anderen Lektionen.
38
- *
39
- * Entscheidend für den Betrieb: ALLES DAVON WIRD EINMAL AUSGERECHNET. Zur
40
- * Fragezeit bleibt ein Skalarprodukt und eine Subtraktion. Die Rangfolge wird
41
- * besser, ohne dass jemand länger wartet.
42
- */
43
- /** Skalarprodukt. */
44
- export declare function punktprodukt(a: number[], b: number[]): number;
45
- export declare function laenge(v: number[]): number;
46
- /** Auf Länge 1 bringen. Ein Nullvektor bleibt, was er ist. */
47
- export declare function normiere(v: number[]): number[];
48
- /** Der Schwerpunkt — die gemeinsame Grundrichtung aller Vektoren. */
49
- export declare function schwerpunkt(vs: number[][]): number[];
50
- /**
51
- * Die stärksten Hauptrichtungen, über Potenziteration mit Deflation.
52
- *
53
- * Warum von Hand statt einer Bibliothek: es sind rund zwanzig Zeilen, läuft
54
- * einmal, und eine Abhängigkeit für zwanzig Zeilen ist eine Abhängigkeit, die
55
- * jemand pflegen muss.
56
- *
57
- * Die Vektoren müssen bereits zentriert sein — sonst ist die erste
58
- * Hauptrichtung nur der Schwerpunkt, den wir gerade abgezogen haben.
59
- */
60
- export declare function hauptrichtungen(zentriert: number[][], anzahl: number, schritte?: number): number[][];
61
- /** Was von einem Vektor bleibt, wenn Schwerpunkt und Hauptrichtungen weg sind. */
62
- export declare function bereinige(v: number[], mitte: number[], richtungen: number[][]): number[];
63
- /**
64
- * Die "Geselligkeit" jedes Vektors: mittlere Ähnlichkeit zu seinen k nächsten
65
- * Nachbarn im selben Bestand.
66
- *
67
- * Ein hoher Wert heißt: dieser Vektor liegt in einer dichten Gegend und ist
68
- * vielem nah. Solche Naben erscheinen als Treffer für Fragen, mit denen sie
69
- * nichts zu tun haben — nicht weil sie passen, sondern weil sie überall
70
- * passen.
71
- *
72
- * Der Wert wird EINMAL berechnet und beim Suchen abgezogen. Kosten zur
73
- * Fragezeit: eine Subtraktion.
74
- */
75
- export declare function geselligkeit(normierte: number[][], k?: number): number[];
76
- /**
77
- * Ein fertig vorbereiteter Raum: bereinigte Vektoren plus Nabenabzug.
78
- *
79
- * Alles hier ist Bauzeit. Zur Fragezeit ruft man `bewerte` — ein Skalarprodukt
80
- * je Lektion und eine Subtraktion.
81
- */
82
- export interface Raum {
83
- mitte: number[];
84
- richtungen: number[][];
85
- vektoren: number[][];
86
- abzug: number[];
87
- beta: number;
88
- }
89
- export declare function baueRaum(roh: Array<number[] | null>, optionen?: {
90
- richtungen?: number;
91
- nachbarn?: number;
92
- beta?: number;
93
- }): Raum;
94
- /**
95
- * Bewertet eine Frage gegen alle Lektionen des Raums.
96
- *
97
- * `2 * cos - abzug` ist die Form aus CSLS. Der Faktor 2 sorgt dafür, dass der
98
- * Abzug die Ähnlichkeit dämpft und nicht überstimmt.
99
- */
100
- export declare function bewerteImRaum(raum: Raum, frage: number[]): number[];
@@ -1 +0,0 @@
1
- {"version":3,"file":"raumkorrektur.js","sourceRoot":"","sources":["../../src/raumkorrektur.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Wie viele Treffer zeigt `smart_recall` — und wie viele haelt es zurueck?
3
- *
4
- * Eigenes Modul, weil hier ein Versprechen eingeloest wird, das vorher nur im
5
- * Kommentar stand. Der Kommentar am Teaser-Gate sagte seit jeher:
6
- *
7
- * "the magic moment is sacred ... never an access wall: the #1 result is
8
- * always returned"
9
- *
10
- * Der Code sagte `visibleCount = gateActive ? 0 : 8` — also NULL Treffer,
11
- * sobald ein Frei-Konto sein Monatskontingent ueberschritten hat. Der Nutzer
12
- * las die Ueberschrift "Results (23 — hybrid)", darunter keine einzige Zeile
13
- * und dann eine Kaufaufforderung. Das sieht nicht aus wie eine Rechnung,
14
- * sondern wie ein kaputtes Werkzeug — besonders bei Ambient Recall, das bei
15
- * jedem Prompt feuert und das Kontingent in Tagen aufbraucht.
16
- *
17
- * Fehlerklasse: eine Zusage an zwei Orten gepflegt (Kommentar und Zweig).
18
- * Deshalb ist die Regel jetzt eine Funktion mit Tests, nicht ein Satz Prosa.
19
- */
20
- /** Der eine Treffer, den auch ein ueberzogenes Frei-Konto immer sieht. */
21
- export declare const TIEFE_UEBER_LIMIT = 1;
22
- /** Volle Tiefe bei einer einzelnen Frage. */
23
- export declare const TIEFE_VOLL = 8;
24
- /** Volle Tiefe, wenn die Frage in Unterfragen zerfaellt (mehr Themen, mehr Platz). */
25
- export declare const TIEFE_VOLL_MEHRTHEMIG = 12;
26
- export interface RecallTiefeEingabe {
27
- /** Frei-Konto ueber seinem Monatskontingent? */
28
- ueberLimit: boolean;
29
- /** Wie viele Treffer stehen ueberhaupt zur Verfuegung. */
30
- gesamt: number;
31
- /** Tiefe ohne Limit — TIEFE_VOLL oder TIEFE_VOLL_MEHRTHEMIG. */
32
- volleTiefe?: number;
33
- }
34
- export interface RecallTiefe {
35
- /** So viele Treffer werden ausgegeben. */
36
- sichtbar: number;
37
- /** So viele bleiben hinter dem Kontingent — 0, solange niemand ueber dem Limit ist. */
38
- zurueckgehalten: number;
39
- }
40
- /**
41
- * Nie eine Mauer, immer eine Bremse: ueber dem Limit bleibt genau der beste
42
- * Treffer sichtbar, der Rest wird gezaehlt und benannt.
43
- *
44
- * Bei null Treffern gibt es nichts zu zeigen und nichts zurueckzuhalten — ein
45
- * leeres Ergebnis darf nie als "hinter der Bezahlschranke" erscheinen, sonst
46
- * verkauft die Meldung etwas, das gar nicht existiert.
47
- */
48
- export declare function recallTiefe({ ueberLimit, gesamt, volleTiefe }: RecallTiefeEingabe): RecallTiefe;
@@ -1 +0,0 @@
1
- {"version":3,"file":"recall-tiefe.js","sourceRoot":"","sources":["../../src/recall-tiefe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC;AAC5B,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAkBxC;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,EAAsB;IAC7F,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,IAAI,SAAS,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IAEhE,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACjD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9E,CAAC"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Quality-aware reranking for Brain recall.
3
- *
4
- * The raw BM25+ keyword search (src/search.ts) ranks purely by *textual* relevance.
5
- * That is necessary but not sufficient: when an agent asks "how do I fix the flaky
6
- * deploy?", a *failed* attempt with similar words can out-rank the *proven success*
7
- * lesson that actually solves it. Anthropic's flat-file memory has exactly this
8
- * problem — it reads files in order, with no notion of which lesson is trustworthy.
9
- *
10
- * This module is Cachly's structural advantage made concrete: we re-rank text
11
- * matches by the *quality* of the underlying lesson — outcome, confidence,
12
- * proven-ness (recall_count), severity and human review (endorsements) — so the
13
- * lesson most likely to help surfaces first. A flat-file memory has none of these
14
- * signals; a senior-confirmed, ten-times-recalled success reads identically to a
15
- * one-off failed attempt.
16
- *
17
- * It is intentionally pure (no I/O): the lesson JSON already travels inside each
18
- * KeywordMatch.content for `cachly:lesson:best:*` keys, so reranking needs no extra
19
- * Redis round-trips. This keeps it fast and trivially benchmarkable (see
20
- * src/bench/cachly-bench.ts).
21
- */
22
- import type { KeywordMatch } from './search.js';
23
- /** Subset of a stored lesson that influences ranking. */
24
- export interface LessonQuality {
25
- outcome?: string;
26
- confidence?: number;
27
- recall_count?: number;
28
- severity?: string;
29
- ts?: string;
30
- verified_at?: string;
31
- reviewed_by?: string;
32
- review_level?: string;
33
- endorsements?: number;
34
- }
35
- export interface RerankedMatch extends KeywordMatch {
36
- /** Final score after applying the quality multiplier. */
37
- finalScore: number;
38
- /** The multiplier that was applied to the BM25 score (1.0 = neutral). */
39
- qualityBoost: number;
40
- }
41
- /**
42
- * Compute the quality multiplier for a single lesson.
43
- * Returns 1.0 (neutral) for documents that carry no quality signal (e.g. context).
44
- */
45
- export declare function qualityMultiplier(lesson: LessonQuality | null): number;
46
- /** Extract the quality signal from a match, if its content is a stored lesson. */
47
- export declare function extractLessonQuality(match: Pick<KeywordMatch, 'key' | 'content'>): LessonQuality | null;
48
- export declare function rerankByQuality(matches: KeywordMatch[]): RerankedMatch[];
@@ -1 +0,0 @@
1
- {"version":3,"file":"rerank.js","sourceRoot":"","sources":["../../src/rerank.ts"],"names":[],"mappings":"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"}
@@ -1,153 +0,0 @@
1
- import { Redis } from 'ioredis';
2
- /**
3
- * Stopwords — filtered out during tokenization.
4
- * Covers: English, German, French, Spanish, Italian, Portuguese,
5
- * Chinese (Simplified + Traditional), Japanese, Korean.
6
- * Keeps the index small and scores meaningful.
7
- */
8
- declare const STOPWORDS: Set<string>;
9
- /**
10
- * Convert a katakana string to Hepburn romaji.
11
- * Handles digraphs, geminate consonants (ッ), and long vowel marks (ー).
12
- */
13
- declare function katakanaToRomaji(kata: string): string;
14
- /**
15
- * Arabic light stemmer — strips definite article and common prefix particles.
16
- * Handles: ال (al-), و (wa-), ب (bi-), ل (li-), ف (fa-), ك (ka-).
17
- * Runs iteratively (max 3 passes) so compound prefixes like فال- are fully
18
- * resolved: فالخطأ → الخطأ → خطأ.
19
- * Only strips when the result is still ≥ 3 chars to avoid over-stemming.
20
- */
21
- declare function arabicLightStem(word: string): string;
22
- declare const CROSS_LINGUAL_MAP: Map<string, string[]>;
23
- declare function expandCrossLingual(token: string): string[];
24
- /**
25
- * Tokenize text into meaningful keywords.
26
- * Handles accented Latin, RTL (Arabic, Hebrew), and CJK (Chinese, Japanese, Korean).
27
- *
28
- * Features:
29
- * • CJK → character bigrams
30
- * • Katakana → additionally emits Hepburn romaji tokens (enables romaji queries)
31
- * • Arabic → word tokenization + iterative prefix stemming (ال/و/ب/ل/ف/ك)
32
- * • Hebrew → word tokenization + iterative prefix stemming (ה/ו/ב/ל/מ/כ)
33
- * • Farsi → word tokenization + suffix/prefix stemming (ها/های plural, می prefix)
34
- * • Hindi → Devanagari word tokenization + light suffix stemming
35
- * • All scripts → cross-lingual synonym expansion (EN↔JA↔ZH↔KO↔AR↔HE↔FA↔HI↔DE↔FR↔ES↔IT↔PT)
36
- */
37
- /**
38
- * Tokenize text for BM25 indexing or query expansion.
39
- *
40
- * @param text - The text to tokenize
41
- * @param options.crossLingualExpand - When true (default), adds cross-lingual synonym
42
- * tokens for every base token. Set to false when indexing DOCUMENTS so that
43
- * English documents don't get indexed with all Arabic/Japanese/etc. synonyms of
44
- * every word they contain — that inflates BM25 scores catastrophically when a query
45
- * also expands the same term. Query tokenization keeps expansion enabled so a
46
- * Japanese query still finds English documents (query "デプロイ" → expands to "deploy").
47
- */
48
- declare function tokenize(text: string, options?: {
49
- crossLingualExpand?: boolean;
50
- }): string[];
51
- /**
52
- * Split a multi-topic query into sub-queries.
53
- * Detects numbered lists, semicolons, "and also", line breaks, etc.
54
- *
55
- * Example: "deploy API fix routing and also check auth" →
56
- * ["deploy API fix routing", "check auth"]
57
- *
58
- * Example: "1. deploy 2. fix routing 3. auth" →
59
- * ["deploy", "fix routing", "auth"]
60
- */
61
- declare function splitMultiQuery(query: string): string[];
62
- /**
63
- * Zero-results query log — in-memory FIFO ring (max 500 entries).
64
- * Exposed via /health for observability. Never persisted.
65
- */
66
- interface ZeroResultEntry {
67
- query: string;
68
- ts: number;
69
- }
70
- declare const ZERO_RESULTS_LOG: ZeroResultEntry[];
71
- declare let zeroResultsTotal: number;
72
- declare function logZeroResult(query: string): void;
73
- /** Global index vocabulary — rebuilt on each keywordSearch call from the doc set. */
74
- declare let _indexVocab: Set<string>;
75
- interface KeywordMatch {
76
- key: string;
77
- content: string;
78
- score: number;
79
- matchedWords: string[];
80
- subQuery?: string;
81
- }
82
- /**
83
- * Levenshtein distance — edit distance between two strings.
84
- * Used for typo-tolerant fuzzy matching (distance ≤ 2 = match).
85
- * O(n*m) but strings are short (tokens), so this is fast.
86
- */
87
- declare function levenshtein(a: string, b: string): number;
88
- /** Extract a timestamp from JSON content (looks for "ts" or "created" fields). */
89
- declare function extractTimestamp(content: string): number | undefined;
90
- /** Recency multiplier: 1.0 for now, 0.5 after half-life days, exponential decay. */
91
- /**
92
- * Frische als STICHENTSCHEID, nicht als Treiber.
93
- *
94
- * ── Was hier schiefging, und wie lange ──────────────────────────────────────
95
- *
96
- * Bis zum 19.08.2026 lag der Bereich bei [0.5, 1.5]. Eine ganz frische Lektion
97
- * bekam damit das DREIFACHE einer 79 Tage alten — unabhaengig davon, wie gut
98
- * sie zur Frage passt. Bei einem Bestand, in dem viele Datensaetze aehnlich
99
- * mittelmaessig passen, entscheidet ein solcher Faktor die Rangfolge allein.
100
- *
101
- * Gemessen an 498 echten Lektionen mit 20 Fragen. Nur diesen Bereich zu
102
- * verschmaelern, sonst nichts:
103
- *
104
- * Bereich auf Platz 1 Median-Platz
105
- * [0.5, 1.5] 1/20 101
106
- * [0.75, 1.25] 2/20 53
107
- * [0.9, 1.1] 3/20 39
108
- * [0.95, 1.05] 5/20 36
109
- * ohne Frische 6/20 29
110
- *
111
- * ── Warum trotzdem nicht ganz weg ───────────────────────────────────────────
112
- *
113
- * Weil Lektionen einander korrigieren. kanzlei:coach-timeout-root-cause traegt
114
- * woertlich "korrigiert eine frueher falsch gespeicherte Lesson". Ohne jede
115
- * Frische gewinnt bei gleichwertigem Text die falsche alte Fassung, und zwar
116
- * fuer immer.
117
- *
118
- * ±5 Prozent heisst in der Praxis: die Reihenfolge aendert sich nur zwischen
119
- * Datensaetzen, die ohnehin fast gleich gut passen. Genau das soll ein
120
- * Stichentscheid tun.
121
- *
122
- * Ohne Frische mass sich um EINE Frage besser. Bei 20 Fragen ist das kein
123
- * Unterschied, auf den man eine Entscheidung stuetzt.
124
- *
125
- * ── Warum es Monate unentdeckt blieb ────────────────────────────────────────
126
- *
127
- * Der Fixture-Bench hat 17 Lektionen, mit Zeitstempeln und fast derselben
128
- * Altersspanne (2,7x gegen 3,0x). Am fehlenden Zeitstempel lag es also NICHT.
129
- * Es lag an der Menge: bei 16 Mitbewerbern gewinnt der Textabgleich auch gegen
130
- * den Faktor 3, weil ein seltenes Wort rund zehnmal so schwer wiegt wie ein
131
- * haeufiges. Bei 497 Mitbewerbern gibt es genug Datensaetze mit aehnlichem
132
- * Textwert — und dann entscheidet der Faktor.
133
- *
134
- * Ein Fehler, der erst ab einer gewissen Menge auftritt, ist auf einem kleinen
135
- * Pruefstand unsichtbar. Nicht schwer zu finden. Unsichtbar.
136
- */
137
- declare function recencyBoost(timestampMs: number | undefined): number;
138
- /**
139
- * Wirft alle Bestaende weg. Ruft der Schreibpfad auf, wenn eine Lektion neu
140
- * geschrieben wurde — ohne das waere sie bis zu eine Minute unsichtbar.
141
- *
142
- * Absichtlich ALLE und nicht nur die betroffene Verbindung: der Aufrufer
143
- * kennt die Verbindung an dieser Stelle nicht immer, und ein Bestand zu viel
144
- * neu zu bauen kostet eine Sekunde. Einen zu wenig zu entwerten kostet eine
145
- * Minute Unsichtbarkeit.
146
- */
147
- export declare function wortindexEntwerten(): void;
148
- /** Nur fuer Tests: wie viele Bestaende seit dem letzten Entwerten stehen. */
149
- export declare function wortindexStand(): number;
150
- declare function keywordSearch(redis: Redis, patterns: string[], query: string, topK?: number): Promise<KeywordMatch[]>;
151
- export { tokenize, splitMultiQuery, levenshtein, recencyBoost, extractTimestamp, STOPWORDS, katakanaToRomaji, arabicLightStem, expandCrossLingual, CROSS_LINGUAL_MAP };
152
- export type { KeywordMatch };
153
- export { keywordSearch, ZERO_RESULTS_LOG, logZeroResult, _indexVocab as indexVocab, zeroResultsTotal };