@cachly-dev/mcp-server 0.10.129 → 0.10.131
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
package/dist/src/handlers/viz.js
CHANGED
|
@@ -1,148 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const NODE_GROUP = {
|
|
5
|
-
concept: 1, person: 2, file: 3, service: 4,
|
|
6
|
-
};
|
|
7
|
-
function nodeKind(id) {
|
|
8
|
-
if (id.startsWith('person:'))
|
|
9
|
-
return 'person';
|
|
10
|
-
if (id.startsWith('file:'))
|
|
11
|
-
return 'file';
|
|
12
|
-
if (id.startsWith('service:'))
|
|
13
|
-
return 'service';
|
|
14
|
-
return 'concept';
|
|
15
|
-
}
|
|
16
|
-
function nodeLabel(n, kind) {
|
|
17
|
-
if (kind === 'person')
|
|
18
|
-
return n.handle ?? n.id.replace(/^person:/, '');
|
|
19
|
-
if (kind === 'file')
|
|
20
|
-
return (n.path ?? n.id.replace(/^file:/, '')).split('/').slice(-1)[0] ?? n.id;
|
|
21
|
-
if (kind === 'service')
|
|
22
|
-
return n.name ?? n.id.replace(/^service:/, '');
|
|
23
|
-
return n.id;
|
|
24
|
-
}
|
|
25
|
-
async function scanAll(redis, match, limit) {
|
|
26
|
-
const keys = [];
|
|
27
|
-
const stream = redis.scanStream({ match, count: 200 });
|
|
28
|
-
await new Promise((resolve, reject) => {
|
|
29
|
-
stream.on('data', (batch) => {
|
|
30
|
-
for (const k of batch) {
|
|
31
|
-
if (keys.length < limit)
|
|
32
|
-
keys.push(k);
|
|
33
|
-
}
|
|
34
|
-
if (keys.length >= limit)
|
|
35
|
-
stream.destroy();
|
|
36
|
-
});
|
|
37
|
-
stream.on('end', resolve);
|
|
38
|
-
stream.on('close', resolve);
|
|
39
|
-
stream.on('error', reject);
|
|
40
|
-
});
|
|
41
|
-
return keys;
|
|
42
|
-
}
|
|
43
|
-
export async function handleVizTool(name, args, getConnection, _apiFetch) {
|
|
44
|
-
if (name !== 'brain_graph')
|
|
45
|
-
return null;
|
|
46
|
-
const { instance_id, max_nodes = 400, domain = '', min_confidence = 0, format = 'json', } = args;
|
|
47
|
-
const redis = await getConnection(instance_id);
|
|
48
|
-
const nodeCap = Math.max(1, Math.min(2000, Number(max_nodes) || 400));
|
|
49
|
-
const minConf = Math.max(0, Math.min(1, Number(min_confidence) || 0));
|
|
50
|
-
const domainFilter = String(domain || '').toLowerCase().trim();
|
|
51
|
-
// ── Nodes ────────────────────────────────────────────────────────────────
|
|
52
|
-
const nodeKeys = await scanAll(redis, 'cachly:ckg:node:*', nodeCap);
|
|
53
|
-
const nodes = [];
|
|
54
|
-
const present = new Set();
|
|
55
|
-
for (const key of nodeKeys) {
|
|
56
|
-
const raw = await redis.get(key);
|
|
57
|
-
const stored = safeJsonParse(raw, null);
|
|
58
|
-
if (!stored || !stored.id)
|
|
59
|
-
continue;
|
|
60
|
-
const kind = nodeKind(stored.id);
|
|
61
|
-
const ndomain = String(stored.domain ?? '').toLowerCase();
|
|
62
|
-
if (domainFilter && !ndomain.includes(domainFilter) && !stored.id.toLowerCase().includes(domainFilter))
|
|
63
|
-
continue;
|
|
64
|
-
const count = Number(stored.count ?? 1) || 1;
|
|
65
|
-
nodes.push({
|
|
66
|
-
id: stored.id,
|
|
67
|
-
name: nodeLabel(stored, kind),
|
|
68
|
-
type: kind,
|
|
69
|
-
group: NODE_GROUP[kind] ?? 0,
|
|
70
|
-
domain: stored.domain ?? '',
|
|
71
|
-
val: Math.max(1, Math.round(Math.sqrt(count) * 3)),
|
|
72
|
-
count,
|
|
73
|
-
});
|
|
74
|
-
present.add(stored.id);
|
|
75
|
-
}
|
|
76
|
-
// ── Edges ──────────────────────────────────────────────────────────────────
|
|
77
|
-
// Edge keys: cachly:ckg:edge:{from}:{edgeType}:{to}. We read the stored CKGEdge
|
|
78
|
-
// (not the key) so from/to/confidence come straight from the value — robust to
|
|
79
|
-
// ids that themselves contain ':' (e.g. "docker:layer-cache").
|
|
80
|
-
const edgeKeys = await scanAll(redis, 'cachly:ckg:edge:*', nodeCap * 8);
|
|
81
|
-
const links = [];
|
|
82
|
-
let edgesSkippedConf = 0;
|
|
83
|
-
let edgesSkippedDangling = 0;
|
|
84
|
-
for (const key of edgeKeys) {
|
|
85
|
-
const raw = await redis.get(key);
|
|
86
|
-
const edge = safeJsonParse(raw, null);
|
|
87
|
-
if (!edge || !edge.from || !edge.to)
|
|
88
|
-
continue;
|
|
89
|
-
if ((edge.confidence ?? 0) < minConf) {
|
|
90
|
-
edgesSkippedConf++;
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
// Drop dangling edges (endpoint filtered out) so the 3D graph stays consistent.
|
|
94
|
-
if (!present.has(edge.from) || !present.has(edge.to)) {
|
|
95
|
-
edgesSkippedDangling++;
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
links.push({
|
|
99
|
-
source: edge.from,
|
|
100
|
-
target: edge.to,
|
|
101
|
-
type: edge.edgeType ?? 'related',
|
|
102
|
-
value: Number((edge.confidence ?? 0).toFixed(3)),
|
|
103
|
-
trials: edge.trials ?? 0,
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
const byType = {};
|
|
107
|
-
for (const n of nodes)
|
|
108
|
-
byType[n.type] = (byType[n.type] ?? 0) + 1;
|
|
109
|
-
const graph = {
|
|
110
|
-
schema: 'cachly.brain_graph/v1',
|
|
111
|
-
nodes,
|
|
112
|
-
links,
|
|
113
|
-
meta: {
|
|
114
|
-
instance_id,
|
|
115
|
-
generated_at: new Date().toISOString(),
|
|
116
|
-
node_count: nodes.length,
|
|
117
|
-
link_count: links.length,
|
|
118
|
-
node_types: byType,
|
|
119
|
-
truncated: nodeKeys.length >= nodeCap,
|
|
120
|
-
filters: { domain: domainFilter || null, min_confidence: minConf, max_nodes: nodeCap },
|
|
121
|
-
},
|
|
122
|
-
};
|
|
123
|
-
if (format === 'summary') {
|
|
124
|
-
const lines = [
|
|
125
|
-
`## 🧠 Brain Graph — 3D Viz Export`,
|
|
126
|
-
'',
|
|
127
|
-
`**${nodes.length}** nodes · **${links.length}** links`,
|
|
128
|
-
...Object.entries(byType).map(([t, c]) => ` • ${t}: ${c}`),
|
|
129
|
-
edgesSkippedConf ? ` • ${edgesSkippedConf} edges below confidence ${minConf}` : '',
|
|
130
|
-
edgesSkippedDangling ? ` • ${edgesSkippedDangling} dangling edges dropped` : '',
|
|
131
|
-
'',
|
|
132
|
-
graph.meta.truncated ? `⚠️ Truncated at ${nodeCap} nodes — raise \`max_nodes\` for the full graph.` : '',
|
|
133
|
-
'',
|
|
134
|
-
`Call \`brain_graph(instance_id="${instance_id}", format="json")\` for the full payload the 3D frontend renders.`,
|
|
135
|
-
].filter(Boolean);
|
|
136
|
-
return lines.join('\n');
|
|
137
|
-
}
|
|
138
|
-
// Default: emit the renderable payload in a fenced block so the frontend /
|
|
139
|
-
// API can lift it verbatim into react-force-graph-3d.
|
|
140
|
-
return [
|
|
141
|
-
`🧠 **Brain Graph** — ${nodes.length} nodes, ${links.length} links (schema \`cachly.brain_graph/v1\`)`,
|
|
142
|
-
'',
|
|
143
|
-
'```json',
|
|
144
|
-
JSON.stringify(graph, null, 2),
|
|
145
|
-
'```',
|
|
146
|
-
].join('\n');
|
|
147
|
-
}
|
|
148
|
-
//# sourceMappingURL=viz.js.map
|
|
1
|
+
import{safeJsonParse as M}from"../utils.js";const B=new Set(["brain_graph"]),j={concept:1,person:2,file:3,service:4};function D(n){return n.startsWith("person:")?"person":n.startsWith("file:")?"file":n.startsWith("service:")?"service":"concept"}function L(n,o){return o==="person"?n.handle??n.id.replace(/^person:/,""):o==="file"?(n.path??n.id.replace(/^file:/,"")).split("/").slice(-1)[0]??n.id:o==="service"?n.name??n.id.replace(/^service:/,""):n.id}async function C(n,o,l){const i=[],t=n.scanStream({match:o,count:200});return await new Promise((f,m)=>{t.on("data",g=>{for(const y of g)i.length<l&&i.push(y);i.length>=l&&t.destroy()}),t.on("end",f),t.on("close",f),t.on("error",m)}),i}async function E(n,o,l,i){if(n!=="brain_graph")return null;const{instance_id:t,max_nodes:f=400,domain:m="",min_confidence:g=0,format:y="json"}=o,u=await l(t),s=Math.max(1,Math.min(2e3,Number(f)||400)),_=Math.max(0,Math.min(1,Number(g)||0)),p=String(m||"").toLowerCase().trim(),$=await C(u,"cachly:ckg:node:*",s),a=[],w=new Set;for(const r of $){const d=await u.get(r),e=M(d,null);if(!e||!e.id)continue;const S=D(e.id),O=String(e.domain??"").toLowerCase();if(p&&!O.includes(p)&&!e.id.toLowerCase().includes(p))continue;const v=Number(e.count??1)||1;a.push({id:e.id,name:L(e,S),type:S,group:j[S]??0,domain:e.domain??"",val:Math.max(1,Math.round(Math.sqrt(v)*3)),count:v}),w.add(e.id)}const N=await C(u,"cachly:ckg:edge:*",s*8),c=[];let b=0,k=0;for(const r of N){const d=await u.get(r),e=M(d,null);if(!(!e||!e.from||!e.to)){if((e.confidence??0)<_){b++;continue}if(!w.has(e.from)||!w.has(e.to)){k++;continue}c.push({source:e.from,target:e.to,type:e.edgeType??"related",value:Number((e.confidence??0).toFixed(3)),trials:e.trials??0})}}const h={};for(const r of a)h[r.type]=(h[r.type]??0)+1;const x={schema:"cachly.brain_graph/v1",nodes:a,links:c,meta:{instance_id:t,generated_at:new Date().toISOString(),node_count:a.length,link_count:c.length,node_types:h,truncated:$.length>=s,filters:{domain:p||null,min_confidence:_,max_nodes:s}}};return y==="summary"?["## \u{1F9E0} Brain Graph \u2014 3D Viz Export","",`**${a.length}** nodes \xB7 **${c.length}** links`,...Object.entries(h).map(([d,e])=>` \u2022 ${d}: ${e}`),b?` \u2022 ${b} edges below confidence ${_}`:"",k?` \u2022 ${k} dangling edges dropped`:"","",x.meta.truncated?`\u26A0\uFE0F Truncated at ${s} nodes \u2014 raise \`max_nodes\` for the full graph.`:"","",`Call \`brain_graph(instance_id="${t}", format="json")\` for the full payload the 3D frontend renders.`].filter(Boolean).join(`
|
|
2
|
+
`):[`\u{1F9E0} **Brain Graph** \u2014 ${a.length} nodes, ${c.length} links (schema \`cachly.brain_graph/v1\`)`,"","```json",JSON.stringify(x,null,2),"```"].join(`
|
|
3
|
+
`)}export{B as VIZ_TOOL_NAMES,E as handleVizTool};
|