@barivia/barsom-mcp 0.6.2 → 0.6.3

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.
Files changed (43) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/shared.d.ts +90 -0
  4. package/dist/shared.d.ts.map +1 -0
  5. package/dist/shared.js +439 -0
  6. package/dist/shared.js.map +1 -0
  7. package/dist/tools/account.d.ts +3 -0
  8. package/dist/tools/account.d.ts.map +1 -0
  9. package/dist/tools/account.js +139 -0
  10. package/dist/tools/account.js.map +1 -0
  11. package/dist/tools/datasets.d.ts +11 -0
  12. package/dist/tools/datasets.d.ts.map +1 -0
  13. package/dist/tools/datasets.js +323 -0
  14. package/dist/tools/datasets.js.map +1 -0
  15. package/dist/tools/explore_map.d.ts +4 -0
  16. package/dist/tools/explore_map.d.ts.map +1 -0
  17. package/dist/tools/explore_map.js +39 -0
  18. package/dist/tools/explore_map.js.map +1 -0
  19. package/dist/tools/feedback.d.ts +3 -0
  20. package/dist/tools/feedback.d.ts.map +1 -0
  21. package/dist/tools/feedback.js +30 -0
  22. package/dist/tools/feedback.js.map +1 -0
  23. package/dist/tools/guide_barsom.d.ts +3 -0
  24. package/dist/tools/guide_barsom.d.ts.map +1 -0
  25. package/dist/tools/guide_barsom.js +46 -0
  26. package/dist/tools/guide_barsom.js.map +1 -0
  27. package/dist/tools/inference.d.ts +3 -0
  28. package/dist/tools/inference.d.ts.map +1 -0
  29. package/dist/tools/inference.js +177 -0
  30. package/dist/tools/inference.js.map +1 -0
  31. package/dist/tools/jobs.d.ts +4 -0
  32. package/dist/tools/jobs.d.ts.map +1 -0
  33. package/dist/tools/jobs.js +270 -0
  34. package/dist/tools/jobs.js.map +1 -0
  35. package/dist/tools/results.d.ts +11 -0
  36. package/dist/tools/results.d.ts.map +1 -0
  37. package/dist/tools/results.js +455 -0
  38. package/dist/tools/results.js.map +1 -0
  39. package/dist/tools/training_guidance.d.ts +3 -0
  40. package/dist/tools/training_guidance.d.ts.map +1 -0
  41. package/dist/tools/training_guidance.js +8 -0
  42. package/dist/tools/training_guidance.js.map +1 -0
  43. package/package.json +1 -1
@@ -0,0 +1,455 @@
1
+ import path from "node:path";
2
+ import fs from "node:fs/promises";
3
+ import { z } from "zod";
4
+ import { apiCall, apiRawCall, getWorkspaceRootAsync, sandboxPath, pollUntilComplete, tryAttachImage, getResultsImagesToFetch, getCaptionForImage, mimeForFilename, } from "../shared.js";
5
+ export function registerResultsTool(server) {
6
+ server.tool("results", `Retrieve, recolor, download, export, or run temporal flow on a completed map job.
7
+
8
+ | Action | Use when | Sync/Async |
9
+ |--------|----------|------------|
10
+ | get | First look after training — combined view + quality metrics | instant |
11
+ | export | Learning curve, raw weights, or per-node stats | instant |
12
+ | download | Saving figures to a local folder | instant |
13
+ | recolor | Changing colormap or output format without retraining | async (~10–30s) |
14
+ | transition_flow | Temporal dynamics on time-ordered data | async (~30–60s) |
15
+
16
+ ONLY call this after jobs(action=status) returns "completed".
17
+ ESCALATION: If job not found, verify job_id. If "job not complete", poll with jobs(action=status).
18
+
19
+ action=get: Returns text summary with quality metrics and inline images.
20
+ - figures: omit = combined only. "all" = all plots. Array = specific logical names (combined, umatrix, hit_histogram, learning_curve, correlation, component_1..N).
21
+ - include_individual: if true (and figures omitted), inlines every component plane.
22
+ - After recolor or project, use the job_id returned by that operation to get the new artifacts, not the original training job_id.
23
+ - After showing results, guide the user: QE interpretation, whether to retrain, which features to explore.
24
+ - METRIC INTERPRETATION: QE lower=better (<1.5 good) | TE<0.1 good | Explained variance>0.7 good | Silhouette higher=better | Davies-Bouldin lower=better.
25
+
26
+ action=export: Structured data exports. Use export_type= to choose what to export.
27
+ - export_type=training_log: learning curve sparklines + plot. Diagnose convergence/plateau/divergence.
28
+ - export_type=weights: full weight matrix + normalization stats. For external analysis or custom viz.
29
+ - export_type=nodes: per-node hit count + feature stats. Profile clusters and operating modes.
30
+
31
+ action=download: Save figures to disk. Use so user can open, share, or version files locally.
32
+ - folder: e.g. "." or "./results". Interpreted relative to the client's current working directory (or workspace). If job has a label, a named subfolder may be created.
33
+ - figures: "all" (default) or array of filenames.
34
+ - include_json: also save summary.json.
35
+
36
+ action=recolor: Change colormap or output format — no retraining. Returns a new job_id; auto-polls 60s.
37
+ AFTER: use results(action=get, job_id=NEW_JOB_ID).
38
+ Colormaps: viridis, plasma, inferno, magma, cividis, turbo, coolwarm, balance, RdBu, Spectral.
39
+
40
+ action=transition_flow: Temporal state transition arrows on the map grid. Only use when rows are in chronological order. If your data has no temporal ordering, transition_flow will still run but the arrows are meaningless — use for time-ordered data only.
41
+ - You pass the training job_id; the API returns a new result job_id. Use that new job_id for results(get) or results(download).
42
+ - To persist the figure: results(action=download, job_id=<returned_job_id>).
43
+ - lag=1 (default): immediate next-step | lag=N: N-step horizon (e.g. 24 for daily cycles in hourly data).
44
+ - min_transitions: filter noisy arrows. Increase for large datasets.
45
+ NOT FOR: Jobs that haven't completed. Use jobs(action=status) to check first.`, {
46
+ action: z
47
+ .enum(["get", "recolor", "download", "export", "transition_flow"])
48
+ .describe("get: inline results + metrics; recolor: new colormap/format (async); download: save to disk; export: structured data (training_log/weights/nodes); transition_flow: temporal dynamics (async)"),
49
+ job_id: z.string().describe("Job ID of a completed job"),
50
+ figures: z
51
+ .union([z.enum(["default", "combined_only", "all", "images"]), z.array(z.string())])
52
+ .optional()
53
+ .describe("action=get: omit=combined only; 'all'=all plots; array=specific (combined,umatrix,hit_histogram,correlation,component_1..N). action=download: 'all'=all image files; array=specific filenames."),
54
+ include_individual: z
55
+ .boolean()
56
+ .optional()
57
+ .default(false)
58
+ .describe("action=get only: if true and figures omitted, inline each component plane, umatrix, hit histogram"),
59
+ include_json: z
60
+ .boolean()
61
+ .optional()
62
+ .default(false)
63
+ .describe("action=download only: also save summary.json and JSON artifacts"),
64
+ folder: z
65
+ .string()
66
+ .optional()
67
+ .describe("action=download: directory path to save files (e.g. '.' or './results'). Relative to the client's current working directory (or workspace)."),
68
+ colormap: z
69
+ .string()
70
+ .optional()
71
+ .describe("action=recolor: colormap name (default: coolwarm). action=transition_flow: U-matrix background colormap (default: grays). Examples: viridis, plasma, balance, RdBu."),
72
+ output_format: z
73
+ .enum(["png", "pdf", "svg"])
74
+ .optional()
75
+ .default("png")
76
+ .describe("action=recolor / transition_flow: output image format (default: png)"),
77
+ output_dpi: z
78
+ .enum(["standard", "retina", "print"])
79
+ .optional()
80
+ .default("retina")
81
+ .describe("Resolution: standard (1x), retina (2x, default), print (4x)"),
82
+ recolor_figures: z
83
+ .array(z.string())
84
+ .optional()
85
+ .describe("action=recolor: which figures to re-render (default: [combined]). Options: combined, umatrix, hit_histogram, correlation, component_1..N"),
86
+ export_type: z
87
+ .enum(["training_log", "weights", "nodes"])
88
+ .optional()
89
+ .describe("action=export: training_log=learning curve+sparklines; weights=full weight matrix; nodes=per-node stats"),
90
+ lag: z
91
+ .number().int().min(1)
92
+ .optional().default(1)
93
+ .describe("action=transition_flow: step lag (default 1 = consecutive rows). Use larger for periodic analysis (e.g. 24 for daily in hourly data)."),
94
+ min_transitions: z
95
+ .number().int().min(1)
96
+ .optional()
97
+ .describe("action=transition_flow: minimum transition count to draw an arrow (default: auto). Increase to filter noise."),
98
+ top_k: z
99
+ .number().int().min(1)
100
+ .optional().default(10)
101
+ .describe("action=transition_flow: number of top-flow nodes in statistics (default 10)"),
102
+ }, async ({ action, job_id, figures, include_individual, include_json, folder, colormap, output_format, output_dpi, recolor_figures, export_type: exportType, lag, min_transitions, top_k }) => {
103
+ const dpiMap = { standard: 1, retina: 2, print: 4 };
104
+ if (action === "get") {
105
+ const data = (await apiCall("GET", `/v1/results/${job_id}`));
106
+ const summary = (data.summary ?? {});
107
+ const jobLabel = data.label != null && data.label !== "" ? String(data.label) : null;
108
+ const resultsHeader = jobLabel ? `Results for ${jobLabel} (job_id: ${job_id})` : `Results for job_id: ${job_id}`;
109
+ const content = [];
110
+ const inlinedImages = new Set();
111
+ const jobType = summary.job_type ?? "train_som";
112
+ if (jobType === "transition_flow") {
113
+ const lagVal = summary.lag ?? 1;
114
+ const stats = summary.flow_stats ?? {};
115
+ const topNodes = stats.top_flow_nodes ?? [];
116
+ const topLines = topNodes.length > 0
117
+ ? topNodes.slice(0, 5).map((n) => {
118
+ const dir = n.direction_deg != null ? ` ${Number(n.direction_deg).toFixed(1)}°` : "";
119
+ const coords = Array.isArray(n.coords) ? ` [${n.coords.map((c) => Number(c).toFixed(2)).join(", ")}]` : "";
120
+ return ` Node ${n.node_index}: magnitude ${Number(n.magnitude).toFixed(4)}, count ${n.count}${dir}${coords}`;
121
+ }).join("\n")
122
+ : " (none)";
123
+ content.push({ type: "text", text: [
124
+ `Transition Flow ${resultsHeader}`,
125
+ `Parent map job: ${summary.parent_job_id ?? "N/A"} | Lag: ${lagVal} | Samples: ${summary.n_samples ?? 0}`,
126
+ ``, `Flow Statistics:`,
127
+ ` Mean flow magnitude: ${stats.mean_magnitude !== undefined ? Number(stats.mean_magnitude).toFixed(4) : "N/A"}`,
128
+ ` Max flow magnitude: ${stats.max_magnitude !== undefined ? Number(stats.max_magnitude).toFixed(4) : "N/A"}`,
129
+ ` Nodes with flow: ${stats.n_nodes_with_flow ?? "N/A"}`,
130
+ ` Dead flow nodes: ${stats.dead_flow_nodes ?? "N/A"} (no transitions)`,
131
+ ` Top flow nodes:`,
132
+ topLines,
133
+ ``, `Arrows show net directional drift. Long/bright = frequent transitions. Short = stable states.`,
134
+ `Background = U-matrix. Use results(action=transition_flow, lag=N) with larger N for longer-term structure.`,
135
+ ].join("\n") });
136
+ for (const name of getResultsImagesToFetch(jobType, summary, figures, include_individual)) {
137
+ const cap = getCaptionForImage(name);
138
+ if (cap)
139
+ content.push({ type: "text", text: cap });
140
+ await tryAttachImage(content, job_id, name);
141
+ inlinedImages.add(name);
142
+ }
143
+ }
144
+ else if (jobType === "project_variable") {
145
+ const varName = summary.variable_name ?? "variable";
146
+ const agg = summary.aggregation ?? "mean";
147
+ const stats = summary.variable_stats ?? {};
148
+ content.push({ type: "text", text: [
149
+ `Projected Variable: ${varName} (${agg}) — ${resultsHeader}`,
150
+ `Parent map job: ${summary.parent_job_id ?? "N/A"} | Samples: ${summary.n_samples ?? 0}`,
151
+ ``, `Variable Statistics (per-node ${agg}):`,
152
+ ` Min: ${stats.min !== undefined ? Number(stats.min).toFixed(3) : "N/A"}`,
153
+ ` Max: ${stats.max !== undefined ? Number(stats.max).toFixed(3) : "N/A"}`,
154
+ ` Mean: ${stats.mean !== undefined ? Number(stats.mean).toFixed(3) : "N/A"}`,
155
+ ` Nodes with data: ${stats.n_nodes_with_data ?? "N/A"}`,
156
+ ].join("\n") });
157
+ for (const name of getResultsImagesToFetch(jobType, summary, figures, include_individual)) {
158
+ const cap = getCaptionForImage(name);
159
+ if (cap)
160
+ content.push({ type: "text", text: cap });
161
+ await tryAttachImage(content, job_id, name);
162
+ inlinedImages.add(name);
163
+ }
164
+ }
165
+ else {
166
+ const grid = summary.grid ?? [0, 0];
167
+ const features = summary.features ?? [];
168
+ const epochs = summary.epochs;
169
+ const epochStr = Array.isArray(epochs) ? (epochs[1] === 0 ? `${epochs[0]} ordering only` : `${epochs[0]} ordering + ${epochs[1]} convergence`) : String(epochs ?? "N/A");
170
+ const fmt = (v) => v !== null && v !== undefined ? Number(v).toFixed(4) : "N/A";
171
+ const duration = summary.training_duration_seconds;
172
+ const ordErrors = summary.ordering_errors;
173
+ const nNodes = grid[0] * grid[1];
174
+ const hitStats = summary.hit_stats;
175
+ const hitLine = hitStats
176
+ ? ` Dead nodes: ${hitStats.dead_nodes ?? "N/A"} of ${nNodes} (${nNodes ? ((Number(hitStats.dead_nodes) / nNodes) * 100).toFixed(1) : "0"}%) | Max hits: ${hitStats.max_hits ?? "N/A"} | Median: ${hitStats.median_hits ?? "N/A"}`
177
+ : "";
178
+ const uRange = summary.u_matrix_range;
179
+ const uRangeLine = uRange && uRange.length >= 2 ? ` U-matrix range: ${fmt(uRange[0])} — ${fmt(uRange[1])}` : "";
180
+ const compRanges = summary.component_ranges;
181
+ const compLines = compRanges && Object.keys(compRanges).length > 0
182
+ ? Object.entries(compRanges).map(([f, r]) => ` ${f}: ${fmt(r[0])} — ${fmt(r[1])}`).join("\n")
183
+ : "";
184
+ const clusterSummary = summary.cluster_summary;
185
+ const clusterLines = clusterSummary && clusterSummary.length > 0
186
+ ? clusterSummary.map((c) => {
187
+ const id = c.cluster_id ?? "?";
188
+ const nodes = c.n_nodes ?? "?";
189
+ const hits = c.total_hits ?? "?";
190
+ const top = c.top_features ?? [];
191
+ return ` Cluster ${id} (${nodes} nodes, ${hits} hits): defined by [${top.join(", ")}]`;
192
+ }).join("\n")
193
+ : "";
194
+ const topCorrs = summary.top_correlations;
195
+ const topCorrLine = topCorrs && topCorrs.length > 0
196
+ ? `Strongest feature correlations: ${topCorrs.map((t) => `${t.f1 ?? "?"} & ${t.f2 ?? "?"} (${typeof t.r === "number" ? Number(t.r).toFixed(2) : t.r})`).join(", ")}`
197
+ : "";
198
+ const textSummary = [
199
+ `Map training ${resultsHeader}`,
200
+ `Grid: ${grid[0]}×${grid[1]} | Features: ${summary.n_features ?? 0} | Samples: ${summary.n_samples ?? 0}`,
201
+ `Model: ${summary.model ?? "SOM"} | Epochs: ${epochStr}`,
202
+ `Periodic: ${summary.periodic ?? true} | Normalize: ${summary.normalize ?? "auto"}`,
203
+ summary.sigma_f !== undefined ? `Sigma_f: ${summary.sigma_f}` : "",
204
+ duration !== undefined ? `Training duration: ${duration}s` : "",
205
+ ``, `Quality Metrics:`,
206
+ ` Quantization Error: ${fmt(summary.quantization_error)} (lower is better)`,
207
+ ` Topographic Error: ${fmt(summary.topographic_error)} (<0.1 is good)`,
208
+ ` Explained Variance: ${fmt(summary.explained_variance)} (>0.7 is good)`,
209
+ ` Silhouette Score: ${fmt(summary.silhouette)} (higher is better)`,
210
+ ` Davies-Bouldin: ${fmt(summary.davies_bouldin)} (lower is better)`,
211
+ ` Calinski-Harabasz: ${fmt(summary.calinski_harabasz)} (higher is better)`,
212
+ ordErrors && ordErrors.length > 0 ? ` Final ordering QE: ${ordErrors.at(-1)?.toFixed(4)} (use results(action=export, export_type=training_log) for full curve)` : "",
213
+ ...(hitLine ? ["", "Hit / U-matrix:", hitLine] : []),
214
+ ...(uRangeLine ? [uRangeLine] : []),
215
+ ...(compLines ? [`Component value ranges:\n${compLines}`] : []),
216
+ ...(clusterLines ? ["", "Cluster map (defining features):", clusterLines] : []),
217
+ ...(topCorrLine ? ["", topCorrLine] : []),
218
+ ``, `Features: ${features.join(", ")}`,
219
+ summary.selected_columns ? `Selected columns: ${summary.selected_columns.join(", ")}` : "",
220
+ summary.transforms ? `Transforms: ${Object.entries(summary.transforms).map(([k, v]) => `${k}=${v}`).join(", ")}` : "",
221
+ (() => {
222
+ const selected = summary.selected_columns;
223
+ const original = summary.original_features;
224
+ if (!selected?.length || !original?.length)
225
+ return "";
226
+ const excluded = original.filter((c) => !selected.includes(c));
227
+ if (excluded.length === 0)
228
+ return "";
229
+ return `Columns not used in training: ${excluded.join(", ")}. You can project them onto this map with project(expression=..., project_onto_job=${job_id}) to see how they distribute across the topology. If you ran datasets(action=analyze) before training, any columns it recommended as "project later" are especially good candidates.`;
230
+ })(),
231
+ ``, `Next: results(action=export, export_type=training_log) for learning curve; results(action=download) to save figures; jobs(action=compare, job_ids=[...]) to compare runs; inference(action=predict) to score new data; project(expression/values) to project other variables onto the map.`,
232
+ ].filter((l) => l !== "").join("\n");
233
+ content.push({ type: "text", text: textSummary });
234
+ const imagesToFetch = getResultsImagesToFetch(jobType, summary, figures, include_individual);
235
+ for (const name of imagesToFetch) {
236
+ const cap = getCaptionForImage(name);
237
+ if (cap)
238
+ content.push({ type: "text", text: cap });
239
+ await tryAttachImage(content, job_id, name);
240
+ inlinedImages.add(name);
241
+ }
242
+ }
243
+ const files = summary.files ?? [];
244
+ const isImage = (f) => f.endsWith(".png") || f.endsWith(".svg") || f.endsWith(".pdf");
245
+ for (const fname of files) {
246
+ if (isImage(fname) && !inlinedImages.has(fname)) {
247
+ const cap = getCaptionForImage(fname);
248
+ if (cap)
249
+ content.push({ type: "text", text: cap });
250
+ await tryAttachImage(content, job_id, fname);
251
+ }
252
+ else if (fname.endsWith(".json") && fname !== "summary.json") {
253
+ const hint = fname === "weights.json" ? `Use results(action=export, export_type=weights) for full weight matrix.`
254
+ : fname === "node_stats.json" ? `Use results(action=export, export_type=nodes) for per-node statistics.`
255
+ : `Use results(action=export) for structured data.`;
256
+ content.push({ type: "text", text: `${fname}: ${hint}` });
257
+ }
258
+ }
259
+ const featuresForLog = summary.features ?? [];
260
+ const jobType2 = summary.job_type ?? "train_som";
261
+ if (files.length > 0) {
262
+ const logicalNames = jobType2 === "train_som" || jobType2 === "render_variant"
263
+ ? `Logical names: combined, umatrix, hit_histogram, correlation, ${featuresForLog.map((_, i) => `component_${i + 1}`).join(", ")}. `
264
+ : "";
265
+ content.push({ type: "text", text: `Available: ${files.join(", ")}. ${logicalNames}Use results(action=get, figures=[...]) for specific plots or results(action=get, figures=all) for all plots.` });
266
+ }
267
+ return { content };
268
+ }
269
+ if (action === "export") {
270
+ if (!exportType)
271
+ throw new Error("results(export) requires export_type param: training_log, weights, or nodes");
272
+ if (exportType === "training_log") {
273
+ const data = (await apiCall("GET", `/v1/results/${job_id}/training-log`));
274
+ const ordErrors = data.ordering_errors ?? [];
275
+ const convErrors = data.convergence_errors ?? [];
276
+ const duration = data.training_duration_seconds;
277
+ const epochs = data.epochs;
278
+ const sparkline = (arr) => {
279
+ if (arr.length === 0)
280
+ return "(no data)";
281
+ const blocks = "▁▂▃▄▅▆▇█";
282
+ const min = Math.min(...arr);
283
+ const max = Math.max(...arr);
284
+ const range = max - min || 1;
285
+ return arr.map((v) => blocks[Math.min(7, Math.floor(((v - min) / range) * 7))]).join("");
286
+ };
287
+ const lines = [
288
+ `Training Log — Job ${job_id}`,
289
+ `Grid: ${JSON.stringify(data.grid)} | Model: ${data.model ?? "SOM"}`,
290
+ `Epochs: ${epochs ? `[${epochs[0]} ordering, ${epochs[1]} convergence]` : "N/A"}`,
291
+ `Duration: ${duration !== null && duration !== undefined ? `${duration}s` : "N/A"}`,
292
+ `Features: ${data.n_features ?? "?"} | Samples: ${data.n_samples ?? "?"}`,
293
+ ``, `Ordering Phase (${ordErrors.length} epochs):`,
294
+ ` Start QE: ${ordErrors[0]?.toFixed(4) ?? "—"} → End QE: ${ordErrors.at(-1)?.toFixed(4) ?? "—"}`,
295
+ ` Curve: ${sparkline(ordErrors)}`,
296
+ ];
297
+ if (convErrors.length > 0) {
298
+ lines.push(``, `Convergence Phase (${convErrors.length} epochs):`, ` Start QE: ${convErrors[0]?.toFixed(4) ?? "—"} → End QE: ${convErrors.at(-1)?.toFixed(4) ?? "—"}`, ` Curve: ${sparkline(convErrors)}`);
299
+ }
300
+ else if ((epochs?.[1] ?? 0) === 0) {
301
+ lines.push(``, `Convergence phase: skipped (epochs[1]=0)`);
302
+ }
303
+ const finalQe = data.quantization_error;
304
+ const finalEv = data.explained_variance;
305
+ if (finalQe !== null && finalQe !== undefined) {
306
+ lines.push(``, `Final QE: ${finalQe.toFixed(4)} | Explained Variance: ${(finalEv ?? 0).toFixed(4)}`);
307
+ }
308
+ const content = [{ type: "text", text: lines.join("\n") }];
309
+ let attached = false;
310
+ for (const lcExt of ["png", "svg"]) {
311
+ try {
312
+ const { data: lcBuf } = await apiRawCall(`/v1/results/${job_id}/image/learning_curve.${lcExt}`);
313
+ const mime = mimeForFilename(`learning_curve.${lcExt}`);
314
+ content.push({ type: "image", data: lcBuf.toString("base64"), mimeType: mime, annotations: { audience: ["user"], priority: 0.8 } });
315
+ attached = true;
316
+ break;
317
+ }
318
+ catch {
319
+ continue;
320
+ }
321
+ }
322
+ if (!attached)
323
+ content.push({ type: "text", text: "(learning curve plot not available — use results(action=download, figures=[\"learning_curve\"]) to save as PDF if the job uses output_format=pdf)" });
324
+ return { content };
325
+ }
326
+ if (exportType === "weights") {
327
+ const data = (await apiCall("GET", `/v1/results/${job_id}/weights`));
328
+ const features = data.features ?? [];
329
+ const nNodes = data.n_nodes ?? 0;
330
+ const grid = data.grid ?? [0, 0];
331
+ const lines = [
332
+ `Map weights — Job ${job_id}`,
333
+ `Grid: ${grid[0]}×${grid[1]} | Nodes: ${nNodes} | Features: ${features.length}`,
334
+ `Features: ${features.join(", ")}`,
335
+ ``, `Normalization Stats:`,
336
+ ];
337
+ const normStats = data.normalization_stats ?? {};
338
+ for (const [feat, s] of Object.entries(normStats)) {
339
+ lines.push(` ${feat}: mean=${s.mean?.toFixed(4)}, std=${s.std?.toFixed(4)}`);
340
+ }
341
+ lines.push(``, `Full weight matrix in JSON below. Use denormalized_weights for original-scale values.`);
342
+ return { content: [{ type: "text", text: lines.join("\n") }, { type: "text", text: JSON.stringify(data, null, 2) }] };
343
+ }
344
+ const data = (await apiCall("GET", `/v1/results/${job_id}/nodes`));
345
+ const topNodes = [...data].sort((a, b) => (b.hit_count ?? 0) - (a.hit_count ?? 0)).slice(0, 10);
346
+ const emptyNodes = data.filter((n) => n.hit_count === 0).length;
347
+ const totalHits = data.reduce((sum, n) => sum + (n.hit_count ?? 0), 0);
348
+ const lines = [
349
+ `Node Statistics — Job ${job_id}`,
350
+ `Total nodes: ${data.length} | Active: ${data.length - emptyNodes} | Empty: ${emptyNodes} | Total hits: ${totalHits}`,
351
+ ``, `Top 10 Most Populated Nodes:`,
352
+ `| Node | Coords | Hits | Hit% |`, `|------|--------|------|------|`,
353
+ ];
354
+ for (const n of topNodes) {
355
+ if (n.hit_count === 0)
356
+ break;
357
+ const coords = n.coords;
358
+ const pct = ((n.hit_count / totalHits) * 100).toFixed(1);
359
+ lines.push(`| ${n.node_index} | (${coords?.[0]?.toFixed(1)}, ${coords?.[1]?.toFixed(1)}) | ${n.hit_count} | ${pct}% |`);
360
+ }
361
+ return { content: [{ type: "text", text: lines.join("\n") }, { type: "text", text: `\nFull node statistics JSON:\n${JSON.stringify(data, null, 2)}` }] };
362
+ }
363
+ if (action === "download") {
364
+ if (!folder)
365
+ throw new Error("results(download) requires folder");
366
+ const data = (await apiCall("GET", `/v1/results/${job_id}`));
367
+ const summary = (data.summary ?? {});
368
+ const jobLabel = data.label != null && data.label !== "" ? String(data.label) : null;
369
+ const files = summary.files ?? [];
370
+ const isImage = (f) => f.endsWith(".png") || f.endsWith(".svg") || f.endsWith(".pdf");
371
+ let toDownload;
372
+ if (figures === "all" || figures === "images" || figures === undefined) {
373
+ toDownload = include_json ? files : files.filter(isImage);
374
+ }
375
+ else if (Array.isArray(figures)) {
376
+ toDownload = figures;
377
+ if (include_json && !toDownload.includes("summary.json"))
378
+ toDownload = [...toDownload, "summary.json"];
379
+ }
380
+ else {
381
+ toDownload = files.filter(isImage);
382
+ }
383
+ let resolvedDir = sandboxPath(folder, await getWorkspaceRootAsync(server));
384
+ if (jobLabel && (folder === "." || folder === "./results" || folder === "results")) {
385
+ resolvedDir = path.join(resolvedDir, jobLabel);
386
+ }
387
+ await fs.mkdir(resolvedDir, { recursive: true });
388
+ const saved = [];
389
+ for (const filename of toDownload) {
390
+ try {
391
+ const { data: buf } = await apiRawCall(`/v1/results/${job_id}/image/${filename}`);
392
+ await fs.writeFile(path.join(resolvedDir, filename), buf);
393
+ saved.push(filename);
394
+ }
395
+ catch { /* skip missing files */ }
396
+ }
397
+ return { content: [{ type: "text", text: saved.length > 0 ? `Saved ${saved.length} file(s) to ${folder}: ${saved.join(", ")}` : `No files saved. Check job_id and that the job is completed.` }] };
398
+ }
399
+ if (action === "recolor") {
400
+ if (!colormap)
401
+ throw new Error("results(recolor) requires colormap");
402
+ const body = {
403
+ colormap,
404
+ figures: recolor_figures ?? ["combined"],
405
+ output_format: output_format ?? "png",
406
+ output_dpi: dpiMap[output_dpi ?? "retina"] ?? 2,
407
+ };
408
+ const data = (await apiCall("POST", `/v1/results/${job_id}/render`, body));
409
+ const newJobId = data.id;
410
+ const poll = await pollUntilComplete(newJobId, 60_000);
411
+ if (poll.status === "completed") {
412
+ const content = [{ type: "text", text: `Re-rendered with colormap "${colormap}". New job_id: ${newJobId}.` }];
413
+ for (const fig of recolor_figures ?? ["combined"]) {
414
+ const ext = output_format ?? "png";
415
+ const fname = fig.includes(".") ? fig : `${fig}.${ext}`;
416
+ await tryAttachImage(content, newJobId, fname);
417
+ }
418
+ return { content };
419
+ }
420
+ return { content: [{ type: "text", text: `Recolor job ${newJobId} submitted. Poll with jobs(action=status, job_id="${newJobId}"), then results(action=get, job_id="${newJobId}").` }] };
421
+ }
422
+ if (action === "transition_flow") {
423
+ const body = { lag: lag ?? 1, output_format: output_format ?? "png" };
424
+ if (min_transitions !== undefined)
425
+ body.min_transitions = min_transitions;
426
+ if (top_k !== undefined)
427
+ body.top_k = top_k;
428
+ if (colormap !== undefined)
429
+ body.colormap = colormap;
430
+ if (output_dpi && output_dpi !== "retina")
431
+ body.output_dpi = dpiMap[output_dpi] ?? 2;
432
+ const data = (await apiCall("POST", `/v1/results/${job_id}/transition-flow`, body));
433
+ const flowJobId = data.id;
434
+ const poll = await pollUntilComplete(flowJobId, 120_000);
435
+ if (poll.status === "completed") {
436
+ const res = (await apiCall("GET", `/v1/results/${flowJobId}`));
437
+ const summary = (res.summary ?? {});
438
+ const stats = (summary.flow_stats ?? {});
439
+ const content = [{ type: "text", text: [
440
+ `Transition Flow (job: ${flowJobId}) | Parent map: ${job_id} | Lag: ${lag ?? 1}`,
441
+ `Active flow nodes: ${stats.active_flow_nodes ?? "N/A"} | Total transitions: ${stats.total_transitions ?? "N/A"}`,
442
+ `Mean magnitude: ${stats.mean_magnitude !== undefined ? Number(stats.mean_magnitude).toFixed(4) : "N/A"}`,
443
+ ].join("\n") }];
444
+ await tryAttachImage(content, flowJobId, `transition_flow_lag${lag ?? 1}.${output_format ?? "png"}`);
445
+ return { content };
446
+ }
447
+ if (poll.status === "failed") {
448
+ return { content: [{ type: "text", text: `Transition flow job ${flowJobId} failed: ${poll.error ?? "unknown error"}` }] };
449
+ }
450
+ return { content: [{ type: "text", text: `Transition flow job ${flowJobId} submitted. Poll with jobs(action=status, job_id="${flowJobId}"), retrieve with results(action=get, job_id="${flowJobId}").` }] };
451
+ }
452
+ throw new Error("Invalid action");
453
+ });
454
+ }
455
+ //# sourceMappingURL=results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/tools/results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerTrainingGuidanceTool(server: McpServer): void;
3
+ //# sourceMappingURL=training_guidance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training_guidance.d.ts","sourceRoot":"","sources":["../../src/tools/training_guidance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAUpE"}
@@ -0,0 +1,8 @@
1
+ import { fetchTrainingGuidanceFromApi } from "../shared.js";
2
+ export function registerTrainingGuidanceTool(server) {
3
+ server.tool("training_guidance", "Returns parameter guidance for jobs(action=train_map). Call when you need hints for grid, epochs, batch size, model, or periodic. Domain knowledge is served from the API; requires valid API key. Best for: Before or alongside jobs(action=train_map) when you need hints for grid, epochs, batch, model, or periodic. Not for: Full workflow steps — use guide_barsom_workflow or the prepare_training prompt for that.", {}, async () => {
4
+ const text = await fetchTrainingGuidanceFromApi();
5
+ return { content: [{ type: "text", text }] };
6
+ });
7
+ }
8
+ //# sourceMappingURL=training_guidance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training_guidance.js","sourceRoot":"","sources":["../../src/tools/training_guidance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,4ZAA4Z,EAC5Z,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,4BAA4B,EAAE,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACxD,CAAC,CACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barivia/barsom-mcp",
3
- "version": "0.6.2",
3
+ "version": "0.6.3",
4
4
  "description": "barSOM MCP proxy — connect any MCP client to the barSOM cloud API for Self-Organizing Map analytics",
5
5
  "keywords": [
6
6
  "mcp",