@cachly-dev/mcp-server 0.10.77 → 0.10.79
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 +19 -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 +427 -0
- package/dist/src/handlers/share.js.map +1 -0
- package/dist/src/index.js +72 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/tools.d.ts +125 -0
- package/dist/src/tools.js +88 -0
- package/dist/src/tools.js.map +1 -1
- package/package.json +1 -1
- package/server.json +3 -3
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { safeJsonParse } from '../utils.js';
|
|
2
|
+
export const SHARE_TOOL_NAMES = new Set([
|
|
3
|
+
'brain_share', 'brain_import', 'brain_share_list', 'brain_unshare', 'brain_discover',
|
|
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
|
+
// ── brain_share_list ───────────────────────────────────────────────────────
|
|
253
|
+
case 'brain_share_list': {
|
|
254
|
+
const { instance_id } = args;
|
|
255
|
+
if (!instance_id)
|
|
256
|
+
return '⚠️ `brain_share_list` requires `instance_id`.';
|
|
257
|
+
const redis = await getConnection(instance_id);
|
|
258
|
+
// Load from local provenance log
|
|
259
|
+
let localShares = [];
|
|
260
|
+
try {
|
|
261
|
+
const raw = await redis.lrange('cachly:brain:shares', 0, -1);
|
|
262
|
+
localShares = raw.map(r => {
|
|
263
|
+
try {
|
|
264
|
+
return JSON.parse(r);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
}).filter(Boolean);
|
|
270
|
+
}
|
|
271
|
+
catch { /* non-critical */ }
|
|
272
|
+
// Also try API for authoritative list
|
|
273
|
+
let apiShares = [];
|
|
274
|
+
try {
|
|
275
|
+
const result = await apiFetch('/api/v1/brains/share');
|
|
276
|
+
apiShares = result.shares ?? [];
|
|
277
|
+
}
|
|
278
|
+
catch { /* API may not be live yet */ }
|
|
279
|
+
// Merge: API is authoritative; local fills gaps
|
|
280
|
+
const merged = apiShares.length > 0 ? apiShares : localShares;
|
|
281
|
+
if (merged.length === 0) {
|
|
282
|
+
return [
|
|
283
|
+
`📤 **brain_share_list** — no shares yet`,
|
|
284
|
+
``,
|
|
285
|
+
`You haven't shared any Brain snapshots from this instance.`,
|
|
286
|
+
``,
|
|
287
|
+
`Create one with: \`brain_share(instance_id="${instance_id}", title="My Patterns")\``,
|
|
288
|
+
].join('\n');
|
|
289
|
+
}
|
|
290
|
+
const lines = [
|
|
291
|
+
`📤 **Your Brain Shares** (${merged.length})`,
|
|
292
|
+
``,
|
|
293
|
+
`| # | Title | Lessons | Visibility | Created |`,
|
|
294
|
+
`|---|-------|---------|------------|---------|`,
|
|
295
|
+
];
|
|
296
|
+
for (const [i, s] of merged.entries()) {
|
|
297
|
+
const d = new Date(s.created_at);
|
|
298
|
+
const created = isNaN(d.getTime()) ? s.created_at : d.toISOString().slice(0, 10);
|
|
299
|
+
const vis = s.visibility === 'public' ? '🌐 public' : '🔗 unlisted';
|
|
300
|
+
lines.push(`| ${i + 1} | ${s.title ?? '—'} | ${s.lesson_count ?? '?'} | ${vis} | ${created} |`);
|
|
301
|
+
}
|
|
302
|
+
const newest = merged[merged.length - 1];
|
|
303
|
+
lines.push(``, `**Import command:** \`brain_import(instance_id="<their-id>", share_id="${newest?.share_id ?? '...'}")\``, `**Revoke:** \`brain_unshare(instance_id="${instance_id}", share_id="<id>")\``);
|
|
304
|
+
return lines.join('\n');
|
|
305
|
+
}
|
|
306
|
+
// ── brain_unshare ──────────────────────────────────────────────────────────
|
|
307
|
+
case 'brain_unshare': {
|
|
308
|
+
const { instance_id, share_id } = args;
|
|
309
|
+
if (!instance_id)
|
|
310
|
+
return '⚠️ `brain_unshare` requires `instance_id`.';
|
|
311
|
+
if (!share_id)
|
|
312
|
+
return '⚠️ `brain_unshare` requires `share_id`.';
|
|
313
|
+
// Call API to delete
|
|
314
|
+
try {
|
|
315
|
+
await apiFetch(`/api/v1/brains/share/${share_id}`, { method: 'DELETE' });
|
|
316
|
+
}
|
|
317
|
+
catch (e) {
|
|
318
|
+
const msg = e.message ?? '';
|
|
319
|
+
if (msg.includes('404') || msg.includes('not found')) {
|
|
320
|
+
return `❌ Share \`${share_id}\` not found — it may have already been removed.`;
|
|
321
|
+
}
|
|
322
|
+
// If API is down, just remove from local log and warn
|
|
323
|
+
if (msg.includes('ECONNREFUSED') || msg.includes('fetch failed')) {
|
|
324
|
+
const redis = await getConnection(instance_id);
|
|
325
|
+
try {
|
|
326
|
+
const raw = await redis.lrange('cachly:brain:shares', 0, -1);
|
|
327
|
+
const kept = raw.filter(r => { try {
|
|
328
|
+
return JSON.parse(r).share_id !== share_id;
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return true;
|
|
332
|
+
} });
|
|
333
|
+
await redis.del('cachly:brain:shares');
|
|
334
|
+
for (const entry of kept)
|
|
335
|
+
await redis.rpush('cachly:brain:shares', entry);
|
|
336
|
+
}
|
|
337
|
+
catch { /* non-critical */ }
|
|
338
|
+
return [
|
|
339
|
+
`⚠️ **brain_unshare** — removed from local log`,
|
|
340
|
+
``,
|
|
341
|
+
`API unreachable — removed \`${share_id}\` from your local share registry.`,
|
|
342
|
+
`The public link may still be accessible until the API confirms deletion.`,
|
|
343
|
+
].join('\n');
|
|
344
|
+
}
|
|
345
|
+
return `❌ brain_unshare failed: ${msg}`;
|
|
346
|
+
}
|
|
347
|
+
// Remove from local log
|
|
348
|
+
const redis = await getConnection(instance_id);
|
|
349
|
+
try {
|
|
350
|
+
const raw = await redis.lrange('cachly:brain:shares', 0, -1);
|
|
351
|
+
const kept = raw.filter(r => { try {
|
|
352
|
+
return JSON.parse(r).share_id !== share_id;
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
return true;
|
|
356
|
+
} });
|
|
357
|
+
await redis.del('cachly:brain:shares');
|
|
358
|
+
for (const entry of kept)
|
|
359
|
+
await redis.rpush('cachly:brain:shares', entry);
|
|
360
|
+
}
|
|
361
|
+
catch { /* non-critical */ }
|
|
362
|
+
return [
|
|
363
|
+
`🗑️ **brain_unshare** — share revoked`,
|
|
364
|
+
``,
|
|
365
|
+
`Share \`${share_id}\` has been deleted. The public link is no longer accessible.`,
|
|
366
|
+
``,
|
|
367
|
+
`_Anyone who already imported this Brain keeps their local copy._`,
|
|
368
|
+
].join('\n');
|
|
369
|
+
}
|
|
370
|
+
// ── brain_discover ─────────────────────────────────────────────────────────
|
|
371
|
+
case 'brain_discover': {
|
|
372
|
+
const { query = '', topic = '', limit = 10, } = args;
|
|
373
|
+
// Search public Brain marketplace
|
|
374
|
+
let results = [];
|
|
375
|
+
try {
|
|
376
|
+
const params = new URLSearchParams();
|
|
377
|
+
if (query)
|
|
378
|
+
params.set('q', query);
|
|
379
|
+
if (topic)
|
|
380
|
+
params.set('topic', topic);
|
|
381
|
+
params.set('limit', String(limit));
|
|
382
|
+
results = await apiFetch(`/api/v1/brains/discover?${params.toString()}`);
|
|
383
|
+
}
|
|
384
|
+
catch (e) {
|
|
385
|
+
const msg = e.message ?? '';
|
|
386
|
+
if (msg.includes('404') || msg.includes('ECONNREFUSED') || msg.includes('fetch failed')) {
|
|
387
|
+
return [
|
|
388
|
+
`🔍 **brain_discover** — marketplace not yet live`,
|
|
389
|
+
``,
|
|
390
|
+
`The public Brain marketplace is coming soon.`,
|
|
391
|
+
``,
|
|
392
|
+
`**In the meantime:**`,
|
|
393
|
+
` • Share your Brain: \`brain_share(instance_id="...", visibility="public")\``,
|
|
394
|
+
` • Import by ID: \`brain_import(instance_id="...", share_id="<id>")\``,
|
|
395
|
+
` • Community index: https://cachly.dev/brains`,
|
|
396
|
+
].join('\n');
|
|
397
|
+
}
|
|
398
|
+
return `❌ brain_discover failed: ${msg}`;
|
|
399
|
+
}
|
|
400
|
+
if (results.length === 0) {
|
|
401
|
+
const hint = query ? `matching "${query}"` : topic ? `in topic "${topic}"` : '';
|
|
402
|
+
return [
|
|
403
|
+
`🔍 **brain_discover** — no public Brains found ${hint}`.trim(),
|
|
404
|
+
``,
|
|
405
|
+
`Be the first! \`brain_share(instance_id="...", visibility="public")\``,
|
|
406
|
+
].join('\n');
|
|
407
|
+
}
|
|
408
|
+
const lines = [
|
|
409
|
+
`🔍 **brain_discover**${query ? ` — "${query}"` : ''}${topic ? ` · topic: ${topic}` : ''} (${results.length} result${results.length !== 1 ? 's' : ''})`,
|
|
410
|
+
``,
|
|
411
|
+
];
|
|
412
|
+
for (const [i, r] of results.entries()) {
|
|
413
|
+
const d = new Date(r.created_at);
|
|
414
|
+
const created = isNaN(d.getTime()) ? '' : ` · ${d.toISOString().slice(0, 10)}`;
|
|
415
|
+
const importCount = r.imports != null ? ` · ${r.imports} imports` : '';
|
|
416
|
+
const topicStr = r.topics?.length ? ` · topics: ${r.topics.slice(0, 4).join(', ')}` : '';
|
|
417
|
+
const by = r.author ? ` by **${r.author}**` : '';
|
|
418
|
+
lines.push(`**${i + 1}. ${r.title}**${by}`, ` 📚 ${r.lesson_count} lessons${topicStr}${importCount}${created}`, r.description ? ` _${r.description.slice(0, 120)}_` : '', ` \`brain_import(instance_id="...", share_id="${r.share_id}")\``, ``);
|
|
419
|
+
}
|
|
420
|
+
lines.push(`_Browse more at https://cachly.dev/brains_`);
|
|
421
|
+
return lines.filter(l => l !== ' ').join('\n');
|
|
422
|
+
}
|
|
423
|
+
default:
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
//# 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.79';
|
|
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.
|
|
@@ -1864,6 +1868,72 @@ if (process.argv[2] === 'share') {
|
|
|
1864
1868
|
}
|
|
1865
1869
|
process.exit(0);
|
|
1866
1870
|
}
|
|
1871
|
+
// ── CLI: cachly publish ───────────────────────────────────────────────────────
|
|
1872
|
+
// Creates a publicly importable Brain snapshot and prints the share URL + card.
|
|
1873
|
+
// Usage: npx @cachly-dev/mcp-server@latest publish [--public] [--title "My Patterns"]
|
|
1874
|
+
if (process.argv[2] === 'publish') {
|
|
1875
|
+
const apiKey = process.env.CACHLY_JWT ?? '';
|
|
1876
|
+
const instanceId = process.env.CACHLY_BRAIN_INSTANCE_ID ?? '';
|
|
1877
|
+
if (!apiKey || !instanceId) {
|
|
1878
|
+
console.log('\n⚠️ CACHLY_JWT and CACHLY_BRAIN_INSTANCE_ID must be set.');
|
|
1879
|
+
console.log(' Run: npx @cachly-dev/mcp-server@latest setup\n');
|
|
1880
|
+
process.exit(1);
|
|
1881
|
+
}
|
|
1882
|
+
const titleIdx = process.argv.indexOf('--title');
|
|
1883
|
+
const publishTitle = titleIdx !== -1 ? (process.argv[titleIdx + 1] ?? 'My Brain Snapshot') : 'My Brain Snapshot';
|
|
1884
|
+
const isPublic = process.argv.includes('--public');
|
|
1885
|
+
process.stdout.write('\n🧠 Publishing Brain snapshot...\n');
|
|
1886
|
+
try {
|
|
1887
|
+
// Fetch stats for the card
|
|
1888
|
+
const statsRes = await fetch(`${API_URL}/api/v1/instances/${instanceId}/brain/stats`, {
|
|
1889
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
1890
|
+
signal: AbortSignal.timeout(8000),
|
|
1891
|
+
});
|
|
1892
|
+
let lessons = 0, recalls = 0;
|
|
1893
|
+
if (statsRes.ok) {
|
|
1894
|
+
const stats = await statsRes.json();
|
|
1895
|
+
lessons = stats.lesson_count ?? 0;
|
|
1896
|
+
recalls = stats.total_recall_count ?? 0;
|
|
1897
|
+
}
|
|
1898
|
+
// Create the public share via API
|
|
1899
|
+
const shareRes = await fetch(`${API_URL}/api/v1/brains/share`, {
|
|
1900
|
+
method: 'POST',
|
|
1901
|
+
headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
|
|
1902
|
+
body: JSON.stringify({ title: publishTitle, visibility: isPublic ? 'public' : 'unlisted', instance_id: instanceId }),
|
|
1903
|
+
signal: AbortSignal.timeout(15000),
|
|
1904
|
+
});
|
|
1905
|
+
if (!shareRes.ok)
|
|
1906
|
+
throw new Error(`HTTP ${shareRes.status}`);
|
|
1907
|
+
const share = await shareRes.json();
|
|
1908
|
+
const shareId = share.share_id ?? 'unavailable';
|
|
1909
|
+
const shareUrl = `https://cachly.dev/brain/share/${shareId}`;
|
|
1910
|
+
console.log('');
|
|
1911
|
+
console.log('┌─────────────────────────────────────────────────────────────┐');
|
|
1912
|
+
console.log('│ 📤 Brain Published · powered by \x1b[35mcachly.dev\x1b[0m │');
|
|
1913
|
+
console.log('├─────────────────────────────────────────────────────────────┤');
|
|
1914
|
+
console.log(`│ Title : \x1b[33m${publishTitle.slice(0, 44).padEnd(44)}\x1b[0m│`);
|
|
1915
|
+
console.log(`│ Lessons : \x1b[32m${String(lessons).padEnd(10)}\x1b[0m Recalls: \x1b[36m${String(recalls).padEnd(26)}\x1b[0m│`);
|
|
1916
|
+
console.log(`│ Visibility: \x1b[${isPublic ? '32' : '33'}m${(isPublic ? 'public (discoverable)' : 'unlisted (link only)').padEnd(44)}\x1b[0m│`);
|
|
1917
|
+
console.log('├─────────────────────────────────────────────────────────────┤');
|
|
1918
|
+
console.log(`│ \x1b[1mShare URL:\x1b[0m \x1b[36m${shareUrl.padEnd(51)}\x1b[0m│`);
|
|
1919
|
+
console.log('├─────────────────────────────────────────────────────────────┤');
|
|
1920
|
+
console.log('│ \x1b[2mAnyone can import with:\x1b[0m │');
|
|
1921
|
+
console.log(`│ \x1b[90m brain_import(instance_id="...", share_id="${shareId.slice(0, 17)}")\x1b[0m│`);
|
|
1922
|
+
console.log('└─────────────────────────────────────────────────────────────┘');
|
|
1923
|
+
console.log('');
|
|
1924
|
+
console.log(` \x1b[1m📋 Share this with your team:\x1b[0m`);
|
|
1925
|
+
console.log(` ${shareUrl}`);
|
|
1926
|
+
console.log('');
|
|
1927
|
+
console.log(` \x1b[2mTo list all your shares:\x1b[0m brain_share_list(instance_id="${instanceId.slice(0, 24)}...")`);
|
|
1928
|
+
console.log(` \x1b[2mTo revoke this share:\x1b[0m brain_unshare(share_id="${shareId.slice(0, 24)}...")`);
|
|
1929
|
+
console.log('');
|
|
1930
|
+
}
|
|
1931
|
+
catch (e) {
|
|
1932
|
+
console.log(`\n❌ Could not publish Brain: ${e.message}\n`);
|
|
1933
|
+
process.exit(1);
|
|
1934
|
+
}
|
|
1935
|
+
process.exit(0);
|
|
1936
|
+
}
|
|
1867
1937
|
// ── CLI: cachly badge ─────────────────────────────────────────────────────────
|
|
1868
1938
|
// Outputs the Markdown + HTML snippet for embedding a live Brain lesson-count
|
|
1869
1939
|
// badge in any README or website. Badge SVG served by cachly API (public, no auth).
|
|
@@ -2997,7 +3067,7 @@ if (process.argv[2] === 'learn-git') {
|
|
|
2997
3067
|
// • Editor as an MCP stdio server (non-TTY) → ONE stderr hint, then KEEP RUNNING
|
|
2998
3068
|
// so tools/list works and the first tool call starts the browser sign-in.
|
|
2999
3069
|
// Skip entirely for CLI subcommands that intentionally run without credentials.
|
|
3000
|
-
const _cliNoAuthCommands = ['demo', 'share', 'health', 'setup', 'init', 'digest', 'invite', 'badge', 'join', 'upgrade'];
|
|
3070
|
+
const _cliNoAuthCommands = ['demo', 'share', 'publish', 'health', 'setup', 'init', 'digest', 'invite', 'badge', 'join', 'upgrade'];
|
|
3001
3071
|
if (!JWT && !_cliNoAuthCommands.includes(process.argv[2] ?? '')) {
|
|
3002
3072
|
const runningInTerminal = !process.argv[2] && process.stdout.isTTY === true && _isMain;
|
|
3003
3073
|
if (runningInTerminal) {
|