@cachly-dev/mcp-server 0.10.129 → 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.
- package/README.md +2 -2
- package/dist/index.js +1 -7
- package/dist/packages/telegram-notify/client.js +2 -75
- package/dist/src/ambient-cli.js +7 -253
- package/dist/src/ambient-deps.js +1 -55
- package/dist/src/ambient-hooks.js +5 -278
- package/dist/src/ambient-ledger.js +6 -95
- package/dist/src/ambient-memory.js +1 -67
- package/dist/src/ambient-recall.js +1 -221
- package/dist/src/aussetzer.js +1 -225
- package/dist/src/auth.js +9 -140
- package/dist/src/autor-abzeichen.js +1 -56
- package/dist/src/autor.js +1 -136
- package/dist/src/bauabdruck.js +1 -93
- package/dist/src/bedeutung.js +2 -323
- package/dist/src/bench/cachly-bench.js +4 -249
- package/dist/src/bench/external-corpus.js +4 -135
- package/dist/src/bench/fixtures.js +1 -225
- package/dist/src/brain-export.js +16 -119
- package/dist/src/brain-watch-hook.js +8 -86
- package/dist/src/cachly-url.js +1 -21
- package/dist/src/ckg.js +1 -108
- package/dist/src/cls-hook.js +8 -94
- package/dist/src/confidence.js +1 -50
- package/dist/src/credentials.js +1 -85
- package/dist/src/deutsch.js +1 -223
- package/dist/src/doctor.js +2 -248
- package/dist/src/editor.js +1 -63
- package/dist/src/eingaenge-nachruesten.js +1 -290
- package/dist/src/eingaenge.js +2 -260
- package/dist/src/embeddings.js +13 -223
- package/dist/src/feldreparatur.js +3 -113
- package/dist/src/first-contact.js +4 -108
- package/dist/src/first-recall-proof.js +4 -41
- package/dist/src/funnel-milestones.js +2 -48
- package/dist/src/geliefert.js +1 -114
- package/dist/src/handlers/advanced.js +38 -537
- package/dist/src/handlers/brain.js +69 -4397
- package/dist/src/handlers/cache.js +59 -638
- package/dist/src/handlers/context.js +17 -182
- package/dist/src/handlers/fedbrain.js +40 -1436
- package/dist/src/handlers/instances.js +16 -201
- package/dist/src/handlers/roadmap.js +13 -175
- package/dist/src/handlers/share.js +19 -530
- package/dist/src/handlers/syndicate.js +38 -904
- package/dist/src/handlers/team.js +89 -1865
- package/dist/src/handlers/viz.js +3 -148
- package/dist/src/index.js +321 -4281
- package/dist/src/interferenz.js +1 -141
- package/dist/src/kostprobe.js +7 -125
- package/dist/src/lesson-preview.js +2 -133
- package/dist/src/namespace.js +1 -128
- package/dist/src/notifier.js +1 -6
- package/dist/src/rangfolge-stellschrauben.js +1 -0
- package/dist/src/rangfolge.js +1 -249
- package/dist/src/raumkorrektur.js +1 -197
- package/dist/src/recall-tiefe.js +1 -42
- package/dist/src/rerank.js +1 -154
- package/dist/src/resonanz.js +1 -140
- package/dist/src/search.js +1 -2104
- package/dist/src/seltenheitsbestand.js +1 -92
- package/dist/src/speicherlage.js +1 -84
- package/dist/src/spuren.js +1 -150
- package/dist/src/starter-corpus.js +1 -165
- package/dist/src/telemetry-types.js +0 -13
- package/dist/src/tools.js +10 -2465
- package/dist/src/toolspecs.js +1 -121
- package/dist/src/upgrade-nudge.js +1 -29
- package/dist/src/utils.js +1 -89
- package/dist/src/versuch.js +1 -264
- package/dist/src/vorspann.js +1 -146
- package/dist/src/wartung/vektoren-verdichten.js +1 -200
- package/dist/src/werkzeug-nutzung.js +1 -72
- package/dist/src/wertbeitrag.js +1 -203
- package/dist/src/wirkungsspur.js +1 -0
- package/glama.json +1 -1
- package/package.json +8 -7
- package/server.json +3 -3
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
- package/dist/packages/telegram-notify/client.d.ts +0 -19
- package/dist/packages/telegram-notify/client.js.map +0 -1
- package/dist/src/ambient-cli.d.ts +0 -101
- package/dist/src/ambient-cli.js.map +0 -1
- package/dist/src/ambient-deps.d.ts +0 -26
- package/dist/src/ambient-deps.js.map +0 -1
- package/dist/src/ambient-hooks.d.ts +0 -137
- package/dist/src/ambient-hooks.js.map +0 -1
- package/dist/src/ambient-ledger.d.ts +0 -19
- package/dist/src/ambient-ledger.js.map +0 -1
- package/dist/src/ambient-memory.d.ts +0 -12
- package/dist/src/ambient-memory.js.map +0 -1
- package/dist/src/ambient-recall.d.ts +0 -127
- package/dist/src/ambient-recall.js.map +0 -1
- package/dist/src/aussetzer.d.ts +0 -156
- package/dist/src/aussetzer.js.map +0 -1
- package/dist/src/auth.d.ts +0 -43
- package/dist/src/auth.js.map +0 -1
- package/dist/src/autor-abzeichen.d.ts +0 -41
- package/dist/src/autor-abzeichen.js.map +0 -1
- package/dist/src/autor.d.ts +0 -101
- package/dist/src/autor.js.map +0 -1
- package/dist/src/bauabdruck-daten.generiert.json +0 -5
- package/dist/src/bauabdruck.d.ts +0 -38
- package/dist/src/bauabdruck.js.map +0 -1
- package/dist/src/bedeutung.d.ts +0 -168
- package/dist/src/bedeutung.js.map +0 -1
- package/dist/src/bench/cachly-bench.d.ts +0 -61
- package/dist/src/bench/cachly-bench.js.map +0 -1
- package/dist/src/bench/external-corpus.d.ts +0 -44
- package/dist/src/bench/external-corpus.js.map +0 -1
- package/dist/src/bench/fixtures.d.ts +0 -37
- package/dist/src/bench/fixtures.js.map +0 -1
- package/dist/src/brain-export.d.ts +0 -64
- package/dist/src/brain-export.js.map +0 -1
- package/dist/src/brain-watch-hook.d.ts +0 -21
- package/dist/src/brain-watch-hook.js.map +0 -1
- package/dist/src/cachly-url.d.ts +0 -68
- package/dist/src/cachly-url.js.map +0 -1
- package/dist/src/ckg.d.ts +0 -54
- package/dist/src/ckg.js.map +0 -1
- package/dist/src/cls-hook.d.ts +0 -15
- package/dist/src/cls-hook.js.map +0 -1
- package/dist/src/confidence.d.ts +0 -19
- package/dist/src/confidence.js.map +0 -1
- package/dist/src/credentials.d.ts +0 -37
- package/dist/src/credentials.js.map +0 -1
- package/dist/src/deutsch.d.ts +0 -98
- package/dist/src/deutsch.js.map +0 -1
- package/dist/src/doctor.d.ts +0 -47
- package/dist/src/doctor.js.map +0 -1
- package/dist/src/editor.d.ts +0 -9
- package/dist/src/editor.js.map +0 -1
- package/dist/src/eingaenge-nachruesten.d.ts +0 -41
- package/dist/src/eingaenge-nachruesten.js.map +0 -1
- package/dist/src/eingaenge.d.ts +0 -159
- package/dist/src/eingaenge.js.map +0 -1
- package/dist/src/embeddings.d.ts +0 -48
- package/dist/src/embeddings.js.map +0 -1
- package/dist/src/feldreparatur.d.ts +0 -58
- package/dist/src/feldreparatur.js.map +0 -1
- package/dist/src/first-contact.d.ts +0 -56
- package/dist/src/first-contact.js.map +0 -1
- package/dist/src/first-recall-proof.d.ts +0 -19
- package/dist/src/first-recall-proof.js.map +0 -1
- package/dist/src/funnel-milestones.d.ts +0 -5
- package/dist/src/funnel-milestones.js.map +0 -1
- package/dist/src/geliefert.d.ts +0 -63
- package/dist/src/geliefert.js.map +0 -1
- package/dist/src/handlers/advanced.d.ts +0 -6
- package/dist/src/handlers/advanced.js.map +0 -1
- package/dist/src/handlers/brain.d.ts +0 -41
- package/dist/src/handlers/brain.js.map +0 -1
- package/dist/src/handlers/cache.d.ts +0 -6
- package/dist/src/handlers/cache.js.map +0 -1
- package/dist/src/handlers/context.d.ts +0 -6
- package/dist/src/handlers/context.js.map +0 -1
- package/dist/src/handlers/fedbrain.d.ts +0 -18
- package/dist/src/handlers/fedbrain.js.map +0 -1
- package/dist/src/handlers/instances.d.ts +0 -33
- package/dist/src/handlers/instances.js.map +0 -1
- package/dist/src/handlers/roadmap.d.ts +0 -6
- package/dist/src/handlers/roadmap.js.map +0 -1
- package/dist/src/handlers/share.d.ts +0 -8
- package/dist/src/handlers/share.js.map +0 -1
- package/dist/src/handlers/syndicate.d.ts +0 -6
- package/dist/src/handlers/syndicate.js.map +0 -1
- package/dist/src/handlers/team.d.ts +0 -45
- package/dist/src/handlers/team.js.map +0 -1
- package/dist/src/handlers/viz.d.ts +0 -6
- package/dist/src/handlers/viz.js.map +0 -1
- package/dist/src/index.d.ts +0 -93
- package/dist/src/index.js.map +0 -1
- package/dist/src/interferenz.d.ts +0 -111
- package/dist/src/interferenz.js.map +0 -1
- package/dist/src/kostprobe.d.ts +0 -25
- package/dist/src/kostprobe.js.map +0 -1
- package/dist/src/lesson-preview.d.ts +0 -81
- package/dist/src/lesson-preview.js.map +0 -1
- package/dist/src/namespace.d.ts +0 -20
- package/dist/src/namespace.js.map +0 -1
- package/dist/src/notifier.d.ts +0 -5
- package/dist/src/notifier.js.map +0 -1
- package/dist/src/rangfolge.d.ts +0 -205
- package/dist/src/rangfolge.js.map +0 -1
- package/dist/src/raumkorrektur.d.ts +0 -100
- package/dist/src/raumkorrektur.js.map +0 -1
- package/dist/src/recall-tiefe.d.ts +0 -48
- package/dist/src/recall-tiefe.js.map +0 -1
- package/dist/src/rerank.d.ts +0 -48
- package/dist/src/rerank.js.map +0 -1
- package/dist/src/resonanz.d.ts +0 -85
- package/dist/src/resonanz.js.map +0 -1
- package/dist/src/search.d.ts +0 -153
- package/dist/src/search.js.map +0 -1
- package/dist/src/seltenheitsbestand.d.ts +0 -53
- package/dist/src/seltenheitsbestand.js.map +0 -1
- package/dist/src/speicherlage.d.ts +0 -51
- package/dist/src/speicherlage.js.map +0 -1
- package/dist/src/spuren.d.ts +0 -97
- package/dist/src/spuren.js.map +0 -1
- package/dist/src/starter-corpus.d.ts +0 -28
- package/dist/src/starter-corpus.js.map +0 -1
- package/dist/src/telemetry-types.d.ts +0 -87
- package/dist/src/telemetry-types.js.map +0 -1
- package/dist/src/tools.d.ts +0 -2933
- package/dist/src/tools.js.map +0 -1
- package/dist/src/toolspecs.d.ts +0 -43
- package/dist/src/toolspecs.js.map +0 -1
- package/dist/src/upgrade-nudge.d.ts +0 -15
- package/dist/src/upgrade-nudge.js.map +0 -1
- package/dist/src/utils.d.ts +0 -34
- package/dist/src/utils.js.map +0 -1
- package/dist/src/versuch.d.ts +0 -187
- package/dist/src/versuch.js.map +0 -1
- package/dist/src/vorspann.d.ts +0 -73
- package/dist/src/vorspann.js.map +0 -1
- package/dist/src/wartung/vektoren-verdichten.d.ts +0 -50
- package/dist/src/wartung/vektoren-verdichten.js.map +0 -1
- package/dist/src/werkzeug-nutzung.d.ts +0 -62
- package/dist/src/werkzeug-nutzung.js.map +0 -1
- package/dist/src/wertbeitrag.d.ts +0 -148
- package/dist/src/wertbeitrag.js.map +0 -1
|
@@ -1,182 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
]);
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
await redis.set(cacheKey, content, 'EX', ttl);
|
|
19
|
-
await redis.set(`${cacheKey}:meta`, meta, 'EX', ttl);
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
await redis.set(cacheKey, content);
|
|
23
|
-
await redis.set(`${cacheKey}:meta`, meta);
|
|
24
|
-
}
|
|
25
|
-
// Also index semantically for smart_recall (if vector available)
|
|
26
|
-
const inst = await apiFetch(`/api/v1/instances/${instance_id}`);
|
|
27
|
-
if (inst.vector_token) {
|
|
28
|
-
try {
|
|
29
|
-
const embedding = await computeEmbedding(`${key}: ${content.slice(0, 500)}`);
|
|
30
|
-
const vectorUrl = `https://api.cachly.dev/v1/sem/${inst.vector_token}`;
|
|
31
|
-
const body = {
|
|
32
|
-
id: `ctx:${category}:${key}`,
|
|
33
|
-
prompt: key,
|
|
34
|
-
namespace: 'cachly:ctx',
|
|
35
|
-
embedding,
|
|
36
|
-
};
|
|
37
|
-
if (ttl && ttl > 0) {
|
|
38
|
-
body['expires_at'] = new Date(Date.now() + ttl * 1000).toISOString();
|
|
39
|
-
}
|
|
40
|
-
const res = await fetch(`${vectorUrl}/entries`, {
|
|
41
|
-
method: 'POST',
|
|
42
|
-
headers: { 'Content-Type': 'application/json' },
|
|
43
|
-
body: JSON.stringify(body),
|
|
44
|
-
signal: AbortSignal.timeout(8000),
|
|
45
|
-
});
|
|
46
|
-
if (!res.ok) {
|
|
47
|
-
process.stderr.write(`[cachly] semantic index skipped (HTTP ${res.status}) — smart_recall on this context will be keyword-only\n`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
catch (e) {
|
|
51
|
-
// Embedding is optional — keyword recall still works. Log so it's debuggable.
|
|
52
|
-
process.stderr.write(`[cachly] semantic index failed: ${e instanceof Error ? e.message : String(e)} — smart_recall on this context will be keyword-only\n`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return [
|
|
56
|
-
`🧠 **Context Saved**`,
|
|
57
|
-
``,
|
|
58
|
-
` Key: \`${key}\``,
|
|
59
|
-
` Category: ${category}`,
|
|
60
|
-
` Size: ${content.length} chars`,
|
|
61
|
-
` TTL: ${ttl > 0 ? `${ttl}s (${Math.round(ttl / 3600)}h)` : 'no expiry'}`,
|
|
62
|
-
``,
|
|
63
|
-
`💡 Use \`recall_context("${key}")\` to retrieve this later.`,
|
|
64
|
-
` Or \`smart_recall("${key.split('_').join(' ')}")\` for semantic search.`,
|
|
65
|
-
].join('\n');
|
|
66
|
-
}
|
|
67
|
-
case 'recall_context': {
|
|
68
|
-
const { instance_id, key } = args;
|
|
69
|
-
const redis = await getConnection(instance_id);
|
|
70
|
-
// Check if key is a glob pattern
|
|
71
|
-
if (key.includes('*')) {
|
|
72
|
-
const keys = [];
|
|
73
|
-
const stream = redis.scanStream({ match: `cachly:ctx:*:${key}`, count: 100 });
|
|
74
|
-
await new Promise((resolve, reject) => {
|
|
75
|
-
stream.on('data', (batch) => {
|
|
76
|
-
keys.push(...batch.filter((k) => !k.endsWith(':meta')));
|
|
77
|
-
if (keys.length >= 20) {
|
|
78
|
-
stream.destroy();
|
|
79
|
-
resolve();
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
stream.on('end', resolve);
|
|
83
|
-
stream.on('error', reject);
|
|
84
|
-
});
|
|
85
|
-
if (keys.length === 0)
|
|
86
|
-
return `⚠️ No cached context found matching pattern \`${key}\`.`;
|
|
87
|
-
const results = [`🧠 **Recalled ${keys.length} context entries matching \`${key}\`:**\n`];
|
|
88
|
-
for (const k of keys.slice(0, 10)) {
|
|
89
|
-
const content = await redis.get(k);
|
|
90
|
-
const shortKey = k.replace('cachly:ctx:', '');
|
|
91
|
-
results.push(`### ${shortKey}\n\`\`\`\n${content?.slice(0, 500)}${(content?.length ?? 0) > 500 ? '…' : ''}\n\`\`\`\n`);
|
|
92
|
-
}
|
|
93
|
-
if (keys.length > 10)
|
|
94
|
-
results.push(`_(+${keys.length - 10} more matches)_`);
|
|
95
|
-
return results.join('\n');
|
|
96
|
-
}
|
|
97
|
-
// Try exact match across categories
|
|
98
|
-
const categories = ['overview', 'architecture', 'file_summary', 'dependency', 'thinking', 'custom'];
|
|
99
|
-
for (const cat of categories) {
|
|
100
|
-
const content = await redis.get(`cachly:ctx:${cat}:${key}`);
|
|
101
|
-
if (content) {
|
|
102
|
-
const ttl = await redis.ttl(`cachly:ctx:${cat}:${key}`);
|
|
103
|
-
return [
|
|
104
|
-
`🧠 **Recalled Context: \`${key}\`**`,
|
|
105
|
-
``,
|
|
106
|
-
` Category: ${cat}`,
|
|
107
|
-
` Size: ${content.length} chars`,
|
|
108
|
-
` TTL: ${ttl === -1 ? 'no expiry' : ttl === -2 ? 'expired' : `${ttl}s remaining`}`,
|
|
109
|
-
``,
|
|
110
|
-
`---`,
|
|
111
|
-
``,
|
|
112
|
-
content,
|
|
113
|
-
].join('\n');
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return `⚠️ No cached context found for key \`${key}\`.\n\nUse \`list_remembered\` to see available cached context.`;
|
|
117
|
-
}
|
|
118
|
-
case 'list_remembered': {
|
|
119
|
-
const { instance_id, category = 'all', limit = 50, } = args;
|
|
120
|
-
const redis = await getConnection(instance_id);
|
|
121
|
-
const pattern = category === 'all' ? 'cachly:ctx:*' : `cachly:ctx:${category}:*`;
|
|
122
|
-
const keys = [];
|
|
123
|
-
const stream = redis.scanStream({ match: pattern, count: 100 });
|
|
124
|
-
await new Promise((resolve, reject) => {
|
|
125
|
-
stream.on('data', (batch) => {
|
|
126
|
-
keys.push(...batch.filter((k) => !k.endsWith(':meta')));
|
|
127
|
-
if (keys.length >= limit) {
|
|
128
|
-
stream.destroy();
|
|
129
|
-
resolve();
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
stream.on('end', resolve);
|
|
133
|
-
stream.on('error', reject);
|
|
134
|
-
});
|
|
135
|
-
if (keys.length === 0) {
|
|
136
|
-
return `📭 No cached context found.\n\nUse \`remember_context\` to cache context for faster future access.`;
|
|
137
|
-
}
|
|
138
|
-
const lines = [`🧠 **Cached Context** (${keys.length} entries):\n`];
|
|
139
|
-
for (const k of keys.slice(0, limit)) {
|
|
140
|
-
const ttl = await redis.ttl(k);
|
|
141
|
-
const content = await redis.get(k);
|
|
142
|
-
const parts = k.replace('cachly:ctx:', '').split(':');
|
|
143
|
-
const cat = parts[0];
|
|
144
|
-
const key = parts.slice(1).join(':');
|
|
145
|
-
const preview = content?.slice(0, 80).replace(/\n/g, ' ') ?? '';
|
|
146
|
-
lines.push(` • **${key}** (${cat})`, ` Size: ${content?.length ?? 0} chars · TTL: ${ttl === -1 ? '∞' : `${Math.round(ttl / 60)}m`}`, ` _"${preview}${(content?.length ?? 0) > 80 ? '…' : ''}"_`, ``);
|
|
147
|
-
}
|
|
148
|
-
return lines.join('\n');
|
|
149
|
-
}
|
|
150
|
-
case 'forget_context': {
|
|
151
|
-
const { instance_id, keys } = args;
|
|
152
|
-
const redis = await getConnection(instance_id);
|
|
153
|
-
let deleted = 0;
|
|
154
|
-
for (const key of keys) {
|
|
155
|
-
if (key.includes('*')) {
|
|
156
|
-
// Glob delete
|
|
157
|
-
const toDelete = [];
|
|
158
|
-
const stream = redis.scanStream({ match: `cachly:ctx:*:${key}*`, count: 100 });
|
|
159
|
-
await new Promise((resolve, reject) => {
|
|
160
|
-
stream.on('data', (batch) => toDelete.push(...batch));
|
|
161
|
-
stream.on('end', resolve);
|
|
162
|
-
stream.on('error', reject);
|
|
163
|
-
});
|
|
164
|
-
if (toDelete.length > 0) {
|
|
165
|
-
deleted += await redis.del(...toDelete);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
// Try all categories
|
|
170
|
-
const categories = ['overview', 'architecture', 'file_summary', 'dependency', 'thinking', 'custom'];
|
|
171
|
-
for (const cat of categories) {
|
|
172
|
-
deleted += await redis.del(`cachly:ctx:${cat}:${key}`, `cachly:ctx:${cat}:${key}:meta`);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
return `🗑️ **Forgot ${deleted} context entries.**\n\nKeys: ${keys.map(k => `\`${k}\``).join(', ')}`;
|
|
177
|
-
}
|
|
178
|
-
default:
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
//# sourceMappingURL=context.js.map
|
|
1
|
+
import{computeEmbedding as w}from"../embeddings.js";const _=new Set(["remember_context","recall_context","list_remembered","forget_context"]);async function k(f,m,$,x){switch(f){case"remember_context":{const{instance_id:h,key:c,content:a,category:r="custom",ttl:t=86400}=m,e=await $(h),n=`cachly:ctx:${r}:${c}`,i=JSON.stringify({key:c,category:r,size:a.length,created:new Date().toISOString()});t&&t>0?(await e.set(n,a,"EX",t),await e.set(`${n}:meta`,i,"EX",t)):(await e.set(n,a),await e.set(`${n}:meta`,i));const o=await x(`/api/v1/instances/${h}`);if(o.vector_token)try{const s=await w(`${c}: ${a.slice(0,500)}`),l=`https://api.cachly.dev/v1/sem/${o.vector_token}`,d={id:`ctx:${r}:${c}`,prompt:c,namespace:"cachly:ctx",embedding:s};t&&t>0&&(d.expires_at=new Date(Date.now()+t*1e3).toISOString());const y=await fetch(`${l}/entries`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(d),signal:AbortSignal.timeout(8e3)});y.ok||process.stderr.write(`[cachly] semantic index skipped (HTTP ${y.status}) \u2014 smart_recall on this context will be keyword-only
|
|
2
|
+
`)}catch(s){process.stderr.write(`[cachly] semantic index failed: ${s instanceof Error?s.message:String(s)} \u2014 smart_recall on this context will be keyword-only
|
|
3
|
+
`)}return["\u{1F9E0} **Context Saved**","",` Key: \`${c}\``,` Category: ${r}`,` Size: ${a.length} chars`,` TTL: ${t>0?`${t}s (${Math.round(t/3600)}h)`:"no expiry"}`,"",`\u{1F4A1} Use \`recall_context("${c}")\` to retrieve this later.`,` Or \`smart_recall("${c.split("_").join(" ")}")\` for semantic search.`].join(`
|
|
4
|
+
`)}case"recall_context":{const{instance_id:h,key:c}=m,a=await $(h);if(c.includes("*")){const t=[],e=a.scanStream({match:`cachly:ctx:*:${c}`,count:100});if(await new Promise((i,o)=>{e.on("data",s=>{t.push(...s.filter(l=>!l.endsWith(":meta"))),t.length>=20&&(e.destroy(),i())}),e.on("end",i),e.on("error",o)}),t.length===0)return`\u26A0\uFE0F No cached context found matching pattern \`${c}\`.`;const n=[`\u{1F9E0} **Recalled ${t.length} context entries matching \`${c}\`:**
|
|
5
|
+
`];for(const i of t.slice(0,10)){const o=await a.get(i),s=i.replace("cachly:ctx:","");n.push(`### ${s}
|
|
6
|
+
\`\`\`
|
|
7
|
+
${o?.slice(0,500)}${(o?.length??0)>500?"\u2026":""}
|
|
8
|
+
\`\`\`
|
|
9
|
+
`)}return t.length>10&&n.push(`_(+${t.length-10} more matches)_`),n.join(`
|
|
10
|
+
`)}const r=["overview","architecture","file_summary","dependency","thinking","custom"];for(const t of r){const e=await a.get(`cachly:ctx:${t}:${c}`);if(e){const n=await a.ttl(`cachly:ctx:${t}:${c}`);return[`\u{1F9E0} **Recalled Context: \`${c}\`**`,"",` Category: ${t}`,` Size: ${e.length} chars`,` TTL: ${n===-1?"no expiry":n===-2?"expired":`${n}s remaining`}`,"","---","",e].join(`
|
|
11
|
+
`)}}return`\u26A0\uFE0F No cached context found for key \`${c}\`.
|
|
12
|
+
|
|
13
|
+
Use \`list_remembered\` to see available cached context.`}case"list_remembered":{const{instance_id:h,category:c="all",limit:a=50}=m,r=await $(h),t=c==="all"?"cachly:ctx:*":`cachly:ctx:${c}:*`,e=[],n=r.scanStream({match:t,count:100});if(await new Promise((o,s)=>{n.on("data",l=>{e.push(...l.filter(d=>!d.endsWith(":meta"))),e.length>=a&&(n.destroy(),o())}),n.on("end",o),n.on("error",s)}),e.length===0)return"\u{1F4ED} No cached context found.\n\nUse `remember_context` to cache context for faster future access.";const i=[`\u{1F9E0} **Cached Context** (${e.length} entries):
|
|
14
|
+
`];for(const o of e.slice(0,a)){const s=await r.ttl(o),l=await r.get(o),d=o.replace("cachly:ctx:","").split(":"),y=d[0],u=d.slice(1).join(":"),p=l?.slice(0,80).replace(/\n/g," ")??"";i.push(` \u2022 **${u}** (${y})`,` Size: ${l?.length??0} chars \xB7 TTL: ${s===-1?"\u221E":`${Math.round(s/60)}m`}`,` _"${p}${(l?.length??0)>80?"\u2026":""}"_`,"")}return i.join(`
|
|
15
|
+
`)}case"forget_context":{const{instance_id:h,keys:c}=m,a=await $(h);let r=0;for(const t of c)if(t.includes("*")){const e=[],n=a.scanStream({match:`cachly:ctx:*:${t}*`,count:100});await new Promise((i,o)=>{n.on("data",s=>e.push(...s)),n.on("end",i),n.on("error",o)}),e.length>0&&(r+=await a.del(...e))}else{const e=["overview","architecture","file_summary","dependency","thinking","custom"];for(const n of e)r+=await a.del(`cachly:ctx:${n}:${t}`,`cachly:ctx:${n}:${t}:meta`)}return`\u{1F5D1}\uFE0F **Forgot ${r} context entries.**
|
|
16
|
+
|
|
17
|
+
Keys: ${c.map(t=>`\`${t}\``).join(", ")}`}default:return null}}export{_ as CONTEXT_TOOL_NAMES,k as handleContextTool};
|