@cachly-dev/mcp-server 0.10.77 → 0.10.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/handlers/brain.js +10 -1
- package/dist/src/handlers/brain.js.map +1 -1
- package/dist/src/handlers/share.d.ts +6 -0
- package/dist/src/handlers/share.js +256 -0
- package/dist/src/handlers/share.js.map +1 -0
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/tools.d.ts +74 -0
- package/dist/src/tools.js +42 -0
- package/dist/src/tools.js.map +1 -1
- package/package.json +1 -1
- package/server.json +3 -3
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { safeJsonParse } from '../utils.js';
|
|
2
|
+
export const SHARE_TOOL_NAMES = new Set([
|
|
3
|
+
'brain_share', 'brain_import',
|
|
4
|
+
]);
|
|
5
|
+
async function scanAllLessons(redis, topicFilter) {
|
|
6
|
+
const keys = [];
|
|
7
|
+
const stream = redis.scanStream({ match: 'cachly:lesson:best:*', count: 200 });
|
|
8
|
+
await new Promise((res, rej) => {
|
|
9
|
+
stream.on('data', (batch) => keys.push(...batch));
|
|
10
|
+
stream.on('end', res);
|
|
11
|
+
stream.on('error', rej);
|
|
12
|
+
});
|
|
13
|
+
const lessons = [];
|
|
14
|
+
for (const key of keys.slice(0, 500)) {
|
|
15
|
+
const raw = await redis.get(key);
|
|
16
|
+
if (!raw)
|
|
17
|
+
continue;
|
|
18
|
+
const lesson = safeJsonParse(raw, null);
|
|
19
|
+
if (!lesson || !lesson.topic)
|
|
20
|
+
continue;
|
|
21
|
+
if (topicFilter && topicFilter.length > 0) {
|
|
22
|
+
const matches = topicFilter.some(f => lesson.topic.includes(f));
|
|
23
|
+
if (!matches)
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
// Strip fields that should not be shared (internal audit trails, etc.)
|
|
27
|
+
lessons.push({
|
|
28
|
+
topic: lesson.topic,
|
|
29
|
+
outcome: lesson.outcome,
|
|
30
|
+
...(lesson.what_worked ? { what_worked: lesson.what_worked } : {}),
|
|
31
|
+
...(lesson.what_failed ? { what_failed: lesson.what_failed } : {}),
|
|
32
|
+
...(lesson.ctx ? { ctx: lesson.ctx } : {}),
|
|
33
|
+
...(lesson.tags?.length ? { tags: lesson.tags } : {}),
|
|
34
|
+
...(lesson.author ? { author: lesson.author } : {}),
|
|
35
|
+
...(lesson.service ? { service: lesson.service } : {}),
|
|
36
|
+
confidence: lesson.confidence ?? 1.0,
|
|
37
|
+
ts: lesson.ts,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return lessons;
|
|
41
|
+
}
|
|
42
|
+
export async function handleShareTool(name, args, getConnection, apiFetch) {
|
|
43
|
+
switch (name) {
|
|
44
|
+
// ── brain_share ────────────────────────────────────────────────────────────
|
|
45
|
+
case 'brain_share': {
|
|
46
|
+
const { instance_id, title = 'My Brain Snapshot', description = '', topic_filter, visibility = 'unlisted', max_lessons = 100, dry_run = false, } = args;
|
|
47
|
+
if (!instance_id)
|
|
48
|
+
return '⚠️ `brain_share` requires `instance_id`.';
|
|
49
|
+
const redis = await getConnection(instance_id);
|
|
50
|
+
const topicFilter = Array.isArray(topic_filter) && topic_filter.length > 0 ? topic_filter : undefined;
|
|
51
|
+
const allLessons = await scanAllLessons(redis, topicFilter);
|
|
52
|
+
const lessons = allLessons.slice(0, max_lessons);
|
|
53
|
+
if (lessons.length === 0) {
|
|
54
|
+
return [
|
|
55
|
+
`📤 **brain_share** — nothing to share yet`,
|
|
56
|
+
``,
|
|
57
|
+
`No lessons found in Brain \`${instance_id}\`${topicFilter ? ` matching topics: ${topicFilter.join(', ')}` : ''}.`,
|
|
58
|
+
``,
|
|
59
|
+
`Store lessons first with \`learn_from_attempts(topic="...", what_worked="...")\`.`,
|
|
60
|
+
].join('\n');
|
|
61
|
+
}
|
|
62
|
+
if (dry_run) {
|
|
63
|
+
const sample = lessons.slice(0, 5).map(l => {
|
|
64
|
+
const icon = l.outcome === 'success' ? '✅' : l.outcome === 'failure' ? '❌' : '⚠️';
|
|
65
|
+
return ` ${icon} \`${l.topic}\` — ${(l.what_worked ?? l.what_failed ?? '').slice(0, 80)}`;
|
|
66
|
+
});
|
|
67
|
+
return [
|
|
68
|
+
`📤 **brain_share (DRY RUN)** — would share ${lessons.length} lesson${lessons.length !== 1 ? 's' : ''}`,
|
|
69
|
+
``,
|
|
70
|
+
`**Title:** ${title}`,
|
|
71
|
+
`**Visibility:** ${visibility}`,
|
|
72
|
+
topicFilter ? `**Topic filter:** ${topicFilter.join(', ')}` : '',
|
|
73
|
+
``,
|
|
74
|
+
`**Sample lessons (first 5):**`,
|
|
75
|
+
...sample,
|
|
76
|
+
lessons.length > 5 ? ` _...and ${lessons.length - 5} more_` : '',
|
|
77
|
+
``,
|
|
78
|
+
`_Remove \`dry_run=true\` to create the public share._`,
|
|
79
|
+
].filter(l => l !== '').join('\n');
|
|
80
|
+
}
|
|
81
|
+
// POST to API
|
|
82
|
+
let shareId = null;
|
|
83
|
+
let shareUrl = null;
|
|
84
|
+
try {
|
|
85
|
+
const result = await apiFetch('/api/v1/brains/share', {
|
|
86
|
+
method: 'POST',
|
|
87
|
+
headers: { 'Content-Type': 'application/json' },
|
|
88
|
+
body: JSON.stringify({ title, description, visibility, lessons }),
|
|
89
|
+
});
|
|
90
|
+
shareId = result.share_id ?? null;
|
|
91
|
+
if (shareId)
|
|
92
|
+
shareUrl = `https://cachly.dev/brain/share/${shareId}`;
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
// API endpoint may not be live yet — store locally and return JSON
|
|
96
|
+
const err = e.message ?? '';
|
|
97
|
+
if (err.includes('404') || err.includes('not found') || err.includes('ECONNREFUSED')) {
|
|
98
|
+
const exportJson = JSON.stringify({ title, description, visibility, lessons, exported_at: new Date().toISOString() }, null, 2);
|
|
99
|
+
return [
|
|
100
|
+
`📤 **brain_share** — exported ${lessons.length} lesson${lessons.length !== 1 ? 's' : ''}`,
|
|
101
|
+
``,
|
|
102
|
+
`⚠️ The public share API is not yet available. Here is your portable snapshot:`,
|
|
103
|
+
``,
|
|
104
|
+
`\`\`\`json`,
|
|
105
|
+
exportJson.slice(0, 3000) + (exportJson.length > 3000 ? '\n... (truncated)' : ''),
|
|
106
|
+
`\`\`\``,
|
|
107
|
+
``,
|
|
108
|
+
`_To import this on another Brain, use \`brain_import\` with the JSON payload._`,
|
|
109
|
+
].join('\n');
|
|
110
|
+
}
|
|
111
|
+
return `❌ brain_share failed: ${e.message}`;
|
|
112
|
+
}
|
|
113
|
+
const sample = lessons.slice(0, 5).map(l => {
|
|
114
|
+
const icon = l.outcome === 'success' ? '✅' : l.outcome === 'failure' ? '❌' : '⚠️';
|
|
115
|
+
return ` ${icon} \`${l.topic}\``;
|
|
116
|
+
});
|
|
117
|
+
// Record provenance
|
|
118
|
+
try {
|
|
119
|
+
const prov = JSON.stringify({ share_id: shareId, title, visibility, lesson_count: lessons.length, created_at: new Date().toISOString() });
|
|
120
|
+
await redis.rpush('cachly:brain:shares', prov);
|
|
121
|
+
await redis.ltrim('cachly:brain:shares', -20, -1);
|
|
122
|
+
}
|
|
123
|
+
catch { /* non-critical */ }
|
|
124
|
+
return [
|
|
125
|
+
`📤 **brain_share** — ${lessons.length} lesson${lessons.length !== 1 ? 's' : ''} shared`,
|
|
126
|
+
``,
|
|
127
|
+
`**Share ID:** \`${shareId}\``,
|
|
128
|
+
`**URL:** ${shareUrl}`,
|
|
129
|
+
`**Title:** ${title}`,
|
|
130
|
+
`**Visible:** ${visibility}`,
|
|
131
|
+
``,
|
|
132
|
+
`**Sample lessons:**`,
|
|
133
|
+
...sample,
|
|
134
|
+
lessons.length > 5 ? ` _...and ${lessons.length - 5} more_` : '',
|
|
135
|
+
``,
|
|
136
|
+
`**Anyone can import this Brain with:**`,
|
|
137
|
+
`\`brain_import(instance_id="<their-id>", share_id="${shareId}")\``,
|
|
138
|
+
``,
|
|
139
|
+
`_To list all your shares, run \`brain_share_list\` (coming soon)._`,
|
|
140
|
+
].filter(l => l !== '').join('\n');
|
|
141
|
+
}
|
|
142
|
+
// ── brain_import ───────────────────────────────────────────────────────────
|
|
143
|
+
case 'brain_import': {
|
|
144
|
+
const { instance_id, share_id, topic_prefix = '', min_confidence = 0.0, dry_run = false, overwrite = false, } = args;
|
|
145
|
+
if (!instance_id)
|
|
146
|
+
return '⚠️ `brain_import` requires `instance_id`.';
|
|
147
|
+
if (!share_id)
|
|
148
|
+
return '⚠️ `brain_import` requires `share_id`. Get one from `brain_share`.';
|
|
149
|
+
// Extract share ID from URL if passed as URL
|
|
150
|
+
const cleanShareId = share_id.replace(/^.*\/brain\/share\//, '').trim();
|
|
151
|
+
// Fetch the public share
|
|
152
|
+
let payload;
|
|
153
|
+
try {
|
|
154
|
+
payload = await apiFetch(`/api/v1/brains/share/${cleanShareId}`);
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
const err = e.message ?? '';
|
|
158
|
+
if (err.includes('404') || err.includes('not found')) {
|
|
159
|
+
return [
|
|
160
|
+
`❌ **brain_import** — share not found`,
|
|
161
|
+
``,
|
|
162
|
+
`Share ID \`${cleanShareId}\` does not exist or has been removed.`,
|
|
163
|
+
``,
|
|
164
|
+
`Ask the Brain owner to re-run \`brain_share\` and share the new ID with you.`,
|
|
165
|
+
].join('\n');
|
|
166
|
+
}
|
|
167
|
+
return `❌ brain_import failed: ${e.message}`;
|
|
168
|
+
}
|
|
169
|
+
const lessons = payload.lessons ?? [];
|
|
170
|
+
if (lessons.length === 0) {
|
|
171
|
+
return `⚠️ Share \`${cleanShareId}\` exists but contains no lessons.`;
|
|
172
|
+
}
|
|
173
|
+
const redis = await getConnection(instance_id);
|
|
174
|
+
let imported = 0;
|
|
175
|
+
let skipped = 0;
|
|
176
|
+
let conflicts = 0;
|
|
177
|
+
const importLog = [];
|
|
178
|
+
for (const lesson of lessons) {
|
|
179
|
+
if ((lesson.confidence ?? 1.0) < min_confidence) {
|
|
180
|
+
skipped++;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
const topic = topic_prefix ? `${topic_prefix}:${lesson.topic}` : lesson.topic;
|
|
184
|
+
const bestKey = `cachly:lesson:best:${topic}`;
|
|
185
|
+
// Check for existing lesson
|
|
186
|
+
if (!overwrite) {
|
|
187
|
+
const existing = await redis.get(bestKey);
|
|
188
|
+
if (existing) {
|
|
189
|
+
conflicts++;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const lessonToStore = JSON.stringify({
|
|
194
|
+
...lesson,
|
|
195
|
+
topic,
|
|
196
|
+
imported_from: cleanShareId,
|
|
197
|
+
imported_at: new Date().toISOString(),
|
|
198
|
+
});
|
|
199
|
+
if (!dry_run) {
|
|
200
|
+
await redis.set(bestKey, lessonToStore);
|
|
201
|
+
const listKey = `cachly:lessons:${topic}`;
|
|
202
|
+
await redis.rpush(listKey, lessonToStore);
|
|
203
|
+
await redis.ltrim(listKey, -100, -1);
|
|
204
|
+
await redis.expire(listKey, 90 * 86400);
|
|
205
|
+
}
|
|
206
|
+
imported++;
|
|
207
|
+
if (importLog.length < 6) {
|
|
208
|
+
const icon = lesson.outcome === 'success' ? '✅' : lesson.outcome === 'failure' ? '❌' : '⚠️';
|
|
209
|
+
importLog.push(` ${icon} \`${topic}\` — ${(lesson.what_worked ?? lesson.what_failed ?? '').slice(0, 80)}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Record import provenance
|
|
213
|
+
if (!dry_run && imported > 0) {
|
|
214
|
+
try {
|
|
215
|
+
const prov = JSON.stringify({
|
|
216
|
+
share_id: cleanShareId, title: payload.title,
|
|
217
|
+
imported: imported, skipped, conflicts,
|
|
218
|
+
topic_prefix, imported_at: new Date().toISOString(),
|
|
219
|
+
});
|
|
220
|
+
await redis.rpush('cachly:brain:imports', prov);
|
|
221
|
+
await redis.ltrim('cachly:brain:imports', -20, -1);
|
|
222
|
+
}
|
|
223
|
+
catch { /* non-critical */ }
|
|
224
|
+
}
|
|
225
|
+
const dryTag = dry_run ? ' (DRY RUN — no writes)' : '';
|
|
226
|
+
const shareTitle = payload.title ?? cleanShareId;
|
|
227
|
+
const lines = [
|
|
228
|
+
`📥 **brain_import${dryTag}** — from "${shareTitle}"`,
|
|
229
|
+
``,
|
|
230
|
+
`**Share ID:** \`${cleanShareId}\``,
|
|
231
|
+
`**Lessons imported:** ${imported}`,
|
|
232
|
+
...(skipped > 0 ? [`**Skipped (low confidence):** ${skipped}`] : []),
|
|
233
|
+
...(conflicts > 0 ? [`**Skipped (already exist):** ${conflicts} _(pass \`overwrite=true\` to replace)_`] : []),
|
|
234
|
+
``,
|
|
235
|
+
];
|
|
236
|
+
if (importLog.length > 0) {
|
|
237
|
+
lines.push(`**Sample lessons imported:**`, ...importLog);
|
|
238
|
+
if (imported > 6)
|
|
239
|
+
lines.push(` _...and ${imported - 6} more_`);
|
|
240
|
+
}
|
|
241
|
+
if (imported > 0 && !dry_run) {
|
|
242
|
+
lines.push(``, `✅ Brain updated — use \`smart_recall(query="...")\` to query the new knowledge.`);
|
|
243
|
+
}
|
|
244
|
+
else if (dry_run) {
|
|
245
|
+
lines.push(``, `_Remove \`dry_run=true\` to actually import these lessons._`);
|
|
246
|
+
}
|
|
247
|
+
else if (imported === 0 && conflicts > 0) {
|
|
248
|
+
lines.push(``, `ℹ️ All lessons already exist in your Brain. Pass \`overwrite=true\` to update them.`);
|
|
249
|
+
}
|
|
250
|
+
return lines.join('\n');
|
|
251
|
+
}
|
|
252
|
+
default:
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../../../src/handlers/share.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -65,7 +65,7 @@ import { Redis } from 'ioredis';
|
|
|
65
65
|
let API_URL = process.env.CACHLY_API_URL ?? 'https://api.cachly.dev';
|
|
66
66
|
let JWT = process.env.CACHLY_JWT ?? '';
|
|
67
67
|
const _EMBED_MODEL = process.env.CACHLY_EMBED_MODEL ?? '';
|
|
68
|
-
const CURRENT_VERSION = '0.10.
|
|
68
|
+
const CURRENT_VERSION = '0.10.78';
|
|
69
69
|
// Max time to wait for a freshly-provisioned instance to become "running" before
|
|
70
70
|
// giving up. Free-tier provisioning in high-latency regions can take 45–90s, so the
|
|
71
71
|
// old hard-coded 25s caused spurious "instance_not_reachable" on first run.
|
|
@@ -609,6 +609,7 @@ import { handleRoadmapTool } from './handlers/roadmap.js';
|
|
|
609
609
|
import { handleAdvancedTool } from './handlers/advanced.js';
|
|
610
610
|
import { handleSyndicateTool } from './handlers/syndicate.js';
|
|
611
611
|
import { handleFedbrainTool, _lastBrainFromGitCounts } from './handlers/fedbrain.js';
|
|
612
|
+
import { handleShareTool } from './handlers/share.js';
|
|
612
613
|
// ── Tools (imported from tools.ts) ─────────────────────────────────────────
|
|
613
614
|
import { TOOLS } from './tools.js';
|
|
614
615
|
// ── Handlers ──────────────────────────────────────────────────────────────────
|
|
@@ -839,6 +840,9 @@ async function handleTool(name, args) {
|
|
|
839
840
|
}
|
|
840
841
|
return syndicateResult;
|
|
841
842
|
}
|
|
843
|
+
const shareResult = await handleShareTool(name, args, getConnection, apiFetch);
|
|
844
|
+
if (shareResult !== null)
|
|
845
|
+
return shareResult;
|
|
842
846
|
const fedbrainResult = await handleFedbrainTool(name, args, getConnection, apiFetch);
|
|
843
847
|
if (fedbrainResult !== null) {
|
|
844
848
|
// brain_from_git and brain_predict_failures are in fedbrain handler.
|