@cachly-dev/mcp-server 0.10.126 → 0.10.128

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,200 @@
1
+ /**
2
+ * Vektoren von float32 auf int8 umschreiben — der Umzug, den `packe` braucht.
3
+ *
4
+ * ── Warum es das gibt ───────────────────────────────────────────────────────
5
+ *
6
+ * Am 20.08.2026 belegte ein Bestand mit 524 Lektionen 23,6 MB von 25 MB
7
+ * Tarifgrenze — 94 %. Davon waren 11,2 MB Vektoren: 6,0 MB Volltext und Namen,
8
+ * 5,2 MB Eingänge. Die nächste Lektion wäre an einem Schreibfehler gescheitert.
9
+ *
10
+ * `packe` schreibt seither int8 statt float32 (Faktor 3,96). Neu geschriebene
11
+ * Lektionen sind damit klein. Die BESTEHENDEN bleiben groß, bis sie einmal neu
12
+ * gelernt werden — und die meisten werden nie neu gelernt. Dieses Werkzeug
13
+ * holt sie ein.
14
+ *
15
+ * ── Was es tut, und in welcher Reihenfolge ─────────────────────────────────
16
+ *
17
+ * 1. Sichern: jeder betroffene Schlüssel wird VORHER in eine Datei geschrieben.
18
+ * 2. Prüfen: die Sicherung wird zurückgelesen und muss vollständig sein.
19
+ * 3. Umschreiben: erst danach wird der Speicher angefasst.
20
+ *
21
+ * Ohne Schritt 2 wäre die Sicherung eine Behauptung. Eine Sicherung, die nie
22
+ * zurückgelesen wurde, ist keine.
23
+ *
24
+ * Aufruf:
25
+ * REDIS_URL=... npx tsx src/wartung/vektoren-verdichten.ts --sicherung <datei>
26
+ * REDIS_URL=... npx tsx src/wartung/vektoren-verdichten.ts --sicherung <datei> --schreiben
27
+ * REDIS_URL=... npx tsx src/wartung/vektoren-verdichten.ts --sicherung <datei> --zurueck
28
+ *
29
+ * Ohne `--schreiben` wird nur gerechnet und gemeldet. Das ist Absicht: der
30
+ * Trockenlauf ist der Normalfall, das Schreiben ist der Sonderfall.
31
+ */
32
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
33
+ import { Redis } from 'ioredis';
34
+ import { packe, entpacke } from '../bedeutung.js';
35
+ /** Alle Schlüssel zu einem Muster, ohne KEYS (das blockiert den Server). */
36
+ export async function alleSchluessel(redis, muster) {
37
+ const aus = [];
38
+ let cursor = '0';
39
+ do {
40
+ const [next, gefunden] = await redis.scan(cursor, 'MATCH', muster, 'COUNT', 500);
41
+ cursor = next;
42
+ aus.push(...gefunden);
43
+ } while (cursor !== '0');
44
+ return aus;
45
+ }
46
+ /**
47
+ * Ist dieser Wert schon im neuen Format?
48
+ *
49
+ * Wird gebraucht, damit ein zweiter Lauf nichts kaputt macht und nichts doppelt
50
+ * zählt. Ein Umzug, der nur einmal laufen darf, ist ein Umzug mit einer Falle.
51
+ */
52
+ export function istInt8(base64) {
53
+ const b = Buffer.from(base64, 'base64');
54
+ return b.byteLength > 7 && b[0] === 0x01 && b.byteLength % 4 === 1;
55
+ }
56
+ /** Rechnet aus, was der Umzug bringt — und schreibt nur, wenn `schreiben` gesetzt ist. */
57
+ export async function verdichte(redis, schreiben) {
58
+ const b = { schluessel: 0, felder: 0, vorher: 0, nachher: 0, uebersprungen: 0 };
59
+ // Einfache Werte: Volltext- und Namensvektoren.
60
+ for (const muster of ['cachly:lesson:vec:*', 'cachly:lesson:vecname:*']) {
61
+ for (const k of await alleSchluessel(redis, muster)) {
62
+ const roh = await redis.get(k);
63
+ if (!roh)
64
+ continue;
65
+ b.schluessel++;
66
+ if (istInt8(roh)) {
67
+ b.uebersprungen++;
68
+ b.vorher += roh.length;
69
+ b.nachher += roh.length;
70
+ continue;
71
+ }
72
+ const v = entpacke(roh);
73
+ if (!v) {
74
+ b.uebersprungen++;
75
+ continue;
76
+ }
77
+ const neu = packe(v);
78
+ b.vorher += roh.length;
79
+ b.nachher += neu.length;
80
+ b.felder++;
81
+ if (schreiben)
82
+ await redis.set(k, neu);
83
+ }
84
+ }
85
+ // Eingänge: ein Hash je Lektion, ein Vektor je Feld.
86
+ for (const k of await alleSchluessel(redis, 'cachly:lesson:eing:*')) {
87
+ const h = await redis.hgetall(k);
88
+ const felder = [];
89
+ b.schluessel++;
90
+ for (const [feld, roh] of Object.entries(h)) {
91
+ if (istInt8(roh)) {
92
+ b.uebersprungen++;
93
+ b.vorher += roh.length;
94
+ b.nachher += roh.length;
95
+ continue;
96
+ }
97
+ const v = entpacke(roh);
98
+ if (!v) {
99
+ b.uebersprungen++;
100
+ continue;
101
+ }
102
+ const neu = packe(v);
103
+ b.vorher += roh.length;
104
+ b.nachher += neu.length;
105
+ b.felder++;
106
+ felder.push(feld, neu);
107
+ }
108
+ if (schreiben && felder.length > 0)
109
+ await redis.hset(k, ...felder);
110
+ }
111
+ return b;
112
+ }
113
+ const mb = (zeichen) => `${(zeichen / 1024 / 1024).toFixed(2)} MB`;
114
+ async function main() {
115
+ const argv = process.argv.slice(2);
116
+ const flag = (n) => {
117
+ const i = argv.indexOf(`--${n}`);
118
+ return i !== -1 ? argv[i + 1] : undefined;
119
+ };
120
+ const url = process.env.CACHLY_REDIS_URL ?? process.env.REDIS_URL;
121
+ if (!url) {
122
+ console.error('NICHT GELAUFEN: REDIS_URL fehlt.');
123
+ process.exit(2);
124
+ }
125
+ const sicherungsPfad = flag('sicherung');
126
+ if (!sicherungsPfad) {
127
+ console.error('NICHT GELAUFEN: --sicherung <datei> fehlt.');
128
+ process.exit(2);
129
+ }
130
+ const schreiben = argv.includes('--schreiben');
131
+ const zurueck = argv.includes('--zurueck');
132
+ const redis = new Redis(url, { maxRetriesPerRequest: 2, connectTimeout: 8000 });
133
+ try {
134
+ if (zurueck) {
135
+ if (!existsSync(sicherungsPfad)) {
136
+ console.error(`NICHT GELAUFEN: Sicherung fehlt (${sicherungsPfad}).`);
137
+ process.exit(2);
138
+ }
139
+ const s = JSON.parse(readFileSync(sicherungsPfad, 'utf8'));
140
+ let n = 0;
141
+ for (const [k, v] of Object.entries(s.werte)) {
142
+ await redis.set(k, v);
143
+ n++;
144
+ }
145
+ for (const [k, h] of Object.entries(s.hashes)) {
146
+ const felder = Object.entries(h).flat();
147
+ if (felder.length === 0)
148
+ continue;
149
+ await redis.del(k);
150
+ await redis.hset(k, ...felder);
151
+ n++;
152
+ }
153
+ console.log(`ZURUECKGESPIELT: ${n} Schluessel aus ${sicherungsPfad}`);
154
+ return;
155
+ }
156
+ // 1. Sichern — immer, auch im Trockenlauf.
157
+ const werte = {};
158
+ const hashes = {};
159
+ for (const muster of ['cachly:lesson:vec:*', 'cachly:lesson:vecname:*']) {
160
+ for (const k of await alleSchluessel(redis, muster)) {
161
+ const roh = await redis.get(k);
162
+ if (roh)
163
+ werte[k] = roh;
164
+ }
165
+ }
166
+ for (const k of await alleSchluessel(redis, 'cachly:lesson:eing:*')) {
167
+ hashes[k] = await redis.hgetall(k);
168
+ }
169
+ writeFileSync(sicherungsPfad, JSON.stringify({ werte, hashes }), { encoding: 'utf8' });
170
+ // 2. Sicherung zurueckLESEN und pruefen. Ungeprueft ist sie keine.
171
+ const probe = JSON.parse(readFileSync(sicherungsPfad, 'utf8'));
172
+ const wSoll = Object.keys(werte).length;
173
+ const wIst = Object.keys(probe.werte).length;
174
+ const hSoll = Object.keys(hashes).length;
175
+ const hIst = Object.keys(probe.hashes).length;
176
+ if (wSoll !== wIst || hSoll !== hIst || wSoll === 0) {
177
+ console.error(`ABBRUCH: Sicherung unvollstaendig (${wIst}/${wSoll} Werte, ${hIst}/${hSoll} Hashes).`);
178
+ process.exit(3);
179
+ }
180
+ console.log(`Sicherung geprueft: ${wIst} Werte + ${hIst} Hashes in ${sicherungsPfad}`);
181
+ // 3. Erst jetzt rechnen bzw. schreiben.
182
+ const b = await verdichte(redis, schreiben);
183
+ console.log('');
184
+ console.log(` Schluessel angesehen : ${b.schluessel}`);
185
+ console.log(` Vektoren umgeschrieben: ${b.felder}`);
186
+ console.log(` uebersprungen : ${b.uebersprungen} (schon int8 oder unlesbar)`);
187
+ console.log(` vorher : ${mb(b.vorher)}`);
188
+ console.log(` nachher : ${mb(b.nachher)}`);
189
+ console.log(` gespart : ${mb(b.vorher - b.nachher)} (Faktor ${(b.vorher / Math.max(1, b.nachher)).toFixed(2)})`);
190
+ console.log('');
191
+ console.log(schreiben ? ' GESCHRIEBEN.' : ' TROCKENLAUF — nichts veraendert. Mit --schreiben ausfuehren.');
192
+ }
193
+ finally {
194
+ redis.disconnect();
195
+ }
196
+ }
197
+ const direktGestartet = process.argv[1]?.replace(/\\/g, '/').endsWith('/vektoren-verdichten.ts');
198
+ if (direktGestartet)
199
+ main().catch((e) => { console.error('FEHLER:', e); process.exit(1); });
200
+ //# sourceMappingURL=vektoren-verdichten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vektoren-verdichten.js","sourceRoot":"","sources":["../../../src/wartung/vektoren-verdichten.ts"],"names":[],"mappings":"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"}
package/glama.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://glama.ai/mcp/schemas/server.json",
3
- "version": "0.10.126",
3
+ "version": "0.10.128",
4
4
  "maintainers": [
5
5
  "HeinrichNebula"
6
6
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cachly-dev/mcp-server",
3
- "version": "0.10.126",
3
+ "version": "0.10.128",
4
4
  "mcpName": "io.github.cachly-dev/mcp-server",
5
5
  "description": "Your AI forgets everything between sessions. cachly fixes that permanently: 122 MCP tools for Claude Code, Cursor, Copilot & Windsurf. Learns from every bug fix, commit and CI run. Arrives pre-briefed. Free tier forever, EU servers, GDPR.",
6
6
  "type": "module",
@@ -38,7 +38,8 @@
38
38
  "start": "node dist/src/index.js",
39
39
  "test": "vitest run",
40
40
  "test:watch": "vitest",
41
- "bench": "tsx src/bench/cachly-bench.ts",
41
+ "bench": "tsx src/bench/echter-korpus.ts",
42
+ "bench:spielzeug": "tsx src/bench/cachly-bench.ts",
42
43
  "bench:external": "tsx src/bench/external-corpus.ts",
43
44
  "bench:onboarding": "tsx src/bench/onboarding-bench.ts",
44
45
  "bench:gate": "tsx src/bench/gate.ts",
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.126",
9
+ "version": "0.10.128",
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.126",
15
+ "version": "0.10.128",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  }