@barivia/barsom-mcp 0.6.1 → 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.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shared.d.ts +90 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +439 -0
- package/dist/shared.js.map +1 -0
- package/dist/tools/account.d.ts +3 -0
- package/dist/tools/account.d.ts.map +1 -0
- package/dist/tools/account.js +139 -0
- package/dist/tools/account.js.map +1 -0
- package/dist/tools/datasets.d.ts +11 -0
- package/dist/tools/datasets.d.ts.map +1 -0
- package/dist/tools/datasets.js +323 -0
- package/dist/tools/datasets.js.map +1 -0
- package/dist/tools/explore_map.d.ts +4 -0
- package/dist/tools/explore_map.d.ts.map +1 -0
- package/dist/tools/explore_map.js +39 -0
- package/dist/tools/explore_map.js.map +1 -0
- package/dist/tools/feedback.d.ts +3 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +30 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/guide_barsom.d.ts +3 -0
- package/dist/tools/guide_barsom.d.ts.map +1 -0
- package/dist/tools/guide_barsom.js +46 -0
- package/dist/tools/guide_barsom.js.map +1 -0
- package/dist/tools/inference.d.ts +3 -0
- package/dist/tools/inference.d.ts.map +1 -0
- package/dist/tools/inference.js +177 -0
- package/dist/tools/inference.js.map +1 -0
- package/dist/tools/jobs.d.ts +4 -0
- package/dist/tools/jobs.d.ts.map +1 -0
- package/dist/tools/jobs.js +270 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/results.d.ts +11 -0
- package/dist/tools/results.d.ts.map +1 -0
- package/dist/tools/results.js +455 -0
- package/dist/tools/results.js.map +1 -0
- package/dist/tools/training_guidance.d.ts +3 -0
- package/dist/tools/training_guidance.d.ts.map +1 -0
- package/dist/tools/training_guidance.js +8 -0
- package/dist/tools/training_guidance.js.map +1 -0
- package/package.json +2 -2
package/dist/shared.js
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared configuration, helpers, types, and state for the MCP proxy.
|
|
3
|
+
*/
|
|
4
|
+
import fs from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Config
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export const API_URL = process.env.BARIVIA_API_URL ??
|
|
11
|
+
process.env.BARSOM_API_URL ??
|
|
12
|
+
"https://api.barivia.se";
|
|
13
|
+
export const API_KEY = process.env.BARIVIA_API_KEY ?? process.env.BARSOM_API_KEY ?? "";
|
|
14
|
+
export const FETCH_TIMEOUT_MS = parseInt(process.env.BARIVIA_FETCH_TIMEOUT_MS ?? "30000", 10);
|
|
15
|
+
export const MAX_RETRIES = 2;
|
|
16
|
+
export const RETRYABLE_STATUS = new Set([502, 503, 504]);
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Shared state (mutable)
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
let _vizPort = 0;
|
|
21
|
+
let _clientSupportsMcpApps = false;
|
|
22
|
+
export function getVizPort() {
|
|
23
|
+
return _vizPort;
|
|
24
|
+
}
|
|
25
|
+
export function setVizPort(port) {
|
|
26
|
+
_vizPort = port;
|
|
27
|
+
}
|
|
28
|
+
export function getClientSupportsMcpApps() {
|
|
29
|
+
return _clientSupportsMcpApps;
|
|
30
|
+
}
|
|
31
|
+
export function setClientSupportsMcpApps(value) {
|
|
32
|
+
_clientSupportsMcpApps = value;
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Fetch helpers
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
export function isTransientError(err, status) {
|
|
38
|
+
if (status !== undefined && RETRYABLE_STATUS.has(status))
|
|
39
|
+
return true;
|
|
40
|
+
if (err instanceof DOMException && err.name === "AbortError")
|
|
41
|
+
return true;
|
|
42
|
+
if (err instanceof TypeError)
|
|
43
|
+
return true; // network-level fetch failure
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
export async function fetchWithTimeout(url, init, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
47
|
+
const controller = new AbortController();
|
|
48
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
49
|
+
try {
|
|
50
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Path / sandbox helpers
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
/** Sandbox root for file_path and save_to_disk. Set BARIVIA_WORKSPACE_ROOT (or BARSOM_WORKSPACE_ROOT) to your project directory if paths are rejected (e.g. in Cursor MCP env). */
|
|
60
|
+
export function getSandboxRoot() {
|
|
61
|
+
const raw = process.env.BARIVIA_WORKSPACE_ROOT ?? process.env.BARSOM_WORKSPACE_ROOT;
|
|
62
|
+
if (raw)
|
|
63
|
+
return path.resolve(process.cwd(), raw);
|
|
64
|
+
const workspaceFolder = process.env.CURSOR_WORKSPACE_FOLDER ?? process.env.WORKSPACE_FOLDER;
|
|
65
|
+
if (workspaceFolder)
|
|
66
|
+
return path.resolve(workspaceFolder);
|
|
67
|
+
const pwd = process.env.PWD;
|
|
68
|
+
if (pwd && path.isAbsolute(pwd))
|
|
69
|
+
return pwd;
|
|
70
|
+
return process.cwd();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Gets workspace root from MCP client (roots/list) when supported, else falls back to env/cwd.
|
|
74
|
+
* Option B: Server reads file with explicit workspace root from client.
|
|
75
|
+
*/
|
|
76
|
+
export async function getWorkspaceRootAsync(mcpServer) {
|
|
77
|
+
try {
|
|
78
|
+
const result = await mcpServer.server.listRoots();
|
|
79
|
+
const roots = result?.roots ?? [];
|
|
80
|
+
const fileRoot = roots.find((r) => r.uri.startsWith("file://"));
|
|
81
|
+
if (fileRoot)
|
|
82
|
+
return fileURLToPath(fileRoot.uri);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
/* Client may not support roots/list; fall through */
|
|
86
|
+
}
|
|
87
|
+
return getSandboxRoot();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Resolves user path against the sandbox root and ensures it stays within it.
|
|
91
|
+
* Prevents path traversal and arbitrary file read/write outside workspace.
|
|
92
|
+
*/
|
|
93
|
+
export function sandboxPath(userPath, root) {
|
|
94
|
+
const resolved = path.resolve(root, userPath);
|
|
95
|
+
if (resolved !== root && !resolved.startsWith(root + path.sep)) {
|
|
96
|
+
throw new Error("Path must be within the workspace directory. " +
|
|
97
|
+
"Set BARIVIA_WORKSPACE_ROOT to your project path if needed. Absolute or parent-traversal paths are not allowed.");
|
|
98
|
+
}
|
|
99
|
+
return resolved;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Resolves file_path for dataset upload. Security: auth before read, generic errors, reject "..".
|
|
103
|
+
* Accepts: absolute paths, file:// URIs, relative paths (resolved against workspace root).
|
|
104
|
+
* Pre-security-patch behavior: absolute paths worked without BARIVIA_WORKSPACE_ROOT.
|
|
105
|
+
*/
|
|
106
|
+
export async function resolveFilePathForUpload(filePath, mcpServer) {
|
|
107
|
+
const trimmed = filePath.trim();
|
|
108
|
+
if (trimmed.includes("..")) {
|
|
109
|
+
throw new Error("Path traversal ('..') is not allowed.");
|
|
110
|
+
}
|
|
111
|
+
if (trimmed.startsWith("file://")) {
|
|
112
|
+
try {
|
|
113
|
+
const url = new URL(trimmed);
|
|
114
|
+
if (url.protocol !== "file:" || (url.hostname && url.hostname !== "localhost")) {
|
|
115
|
+
throw new Error("Only local file:// URIs are allowed (no remote hosts).");
|
|
116
|
+
}
|
|
117
|
+
return fileURLToPath(trimmed);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
if (err instanceof Error && err.message.includes("remote hosts"))
|
|
121
|
+
throw err;
|
|
122
|
+
throw new Error("Invalid file:// URI. Use a path like file:///path/to/your/file.csv");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (path.isAbsolute(trimmed)) {
|
|
126
|
+
return trimmed;
|
|
127
|
+
}
|
|
128
|
+
const root = await getWorkspaceRootAsync(mcpServer);
|
|
129
|
+
const resolved = path.resolve(root, trimmed);
|
|
130
|
+
if (resolved !== root && !resolved.startsWith(root + path.sep)) {
|
|
131
|
+
throw new Error("Path must be within the workspace directory.");
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const real = await fs.realpath(resolved);
|
|
135
|
+
const realRoot = await fs.realpath(root);
|
|
136
|
+
if (real !== realRoot && !real.startsWith(realRoot + path.sep)) {
|
|
137
|
+
throw new Error("Resolved path escapes workspace (e.g. symlink).");
|
|
138
|
+
}
|
|
139
|
+
const stat = await fs.stat(real);
|
|
140
|
+
if (!stat.isFile()) {
|
|
141
|
+
throw new Error("Path must be a regular file, not a directory.");
|
|
142
|
+
}
|
|
143
|
+
return real;
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
if (err instanceof Error && (err.message.includes("escapes") || err.message.includes("regular file"))) {
|
|
147
|
+
throw err;
|
|
148
|
+
}
|
|
149
|
+
throw new Error(`File not accessible. For relative paths, set BARIVIA_WORKSPACE_ROOT in your MCP config. Or use an absolute path or file:// URI.`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
// API helpers
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
export async function apiCall(method, path, body, extraHeaders) {
|
|
156
|
+
const url = `${API_URL}${path}`;
|
|
157
|
+
const contentType = extraHeaders?.["Content-Type"] ?? "application/json";
|
|
158
|
+
const requestId = Math.random().toString(36).slice(2, 10);
|
|
159
|
+
const headers = {
|
|
160
|
+
Authorization: `Bearer ${API_KEY}`,
|
|
161
|
+
"Content-Type": contentType,
|
|
162
|
+
"X-Request-ID": requestId,
|
|
163
|
+
...extraHeaders,
|
|
164
|
+
};
|
|
165
|
+
let serializedBody;
|
|
166
|
+
if (body !== undefined) {
|
|
167
|
+
serializedBody =
|
|
168
|
+
contentType === "application/json" ? JSON.stringify(body) : String(body);
|
|
169
|
+
}
|
|
170
|
+
let lastError;
|
|
171
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
172
|
+
try {
|
|
173
|
+
const resp = await fetchWithTimeout(url, {
|
|
174
|
+
method,
|
|
175
|
+
headers,
|
|
176
|
+
body: serializedBody,
|
|
177
|
+
});
|
|
178
|
+
const text = await resp.text();
|
|
179
|
+
if (!resp.ok) {
|
|
180
|
+
if (attempt < MAX_RETRIES && isTransientError(null, resp.status)) {
|
|
181
|
+
await new Promise((r) => setTimeout(r, 1000 * 2 ** attempt));
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const errBody = (() => { try {
|
|
185
|
+
return JSON.parse(text);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return null;
|
|
189
|
+
} })();
|
|
190
|
+
const detail = errBody?.error ?? text;
|
|
191
|
+
const hint = resp.status === 400 ? " Check parameter types and required fields."
|
|
192
|
+
: resp.status === 401 ? " Check BARIVIA_API_KEY in your environment or regenerate at https://barivia.com/dashboard."
|
|
193
|
+
: resp.status === 404 ? " The resource may not exist or may have been deleted."
|
|
194
|
+
: resp.status === 409 ? " The job may not be in the expected state."
|
|
195
|
+
: resp.status === 429 ? " Rate limit exceeded — wait a moment and retry."
|
|
196
|
+
: "";
|
|
197
|
+
const code = errBody?.error_code ? ` (error_code: ${errBody.error_code})` : "";
|
|
198
|
+
const err = new Error(`${detail}${code}${hint}`);
|
|
199
|
+
err.httpStatus = resp.status;
|
|
200
|
+
throw err;
|
|
201
|
+
}
|
|
202
|
+
return JSON.parse(text);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
lastError = err;
|
|
206
|
+
if (attempt < MAX_RETRIES && isTransientError(err)) {
|
|
207
|
+
await new Promise((r) => setTimeout(r, 1000 * 2 ** attempt));
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
throw err;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
throw lastError;
|
|
214
|
+
}
|
|
215
|
+
/** Fetch raw bytes from the API (for image downloads). */
|
|
216
|
+
export async function apiRawCall(path) {
|
|
217
|
+
const url = `${API_URL}${path}`;
|
|
218
|
+
let lastError;
|
|
219
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
220
|
+
try {
|
|
221
|
+
const resp = await fetchWithTimeout(url, {
|
|
222
|
+
method: "GET",
|
|
223
|
+
headers: { Authorization: `Bearer ${API_KEY}` },
|
|
224
|
+
});
|
|
225
|
+
if (!resp.ok) {
|
|
226
|
+
if (attempt < MAX_RETRIES && isTransientError(null, resp.status)) {
|
|
227
|
+
await new Promise((r) => setTimeout(r, 1000 * 2 ** attempt));
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
throw new Error(`Request failed with status ${resp.status}`);
|
|
231
|
+
}
|
|
232
|
+
const arrayBuf = await resp.arrayBuffer();
|
|
233
|
+
return {
|
|
234
|
+
data: Buffer.from(arrayBuf),
|
|
235
|
+
contentType: resp.headers.get("content-type") ?? "application/octet-stream",
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
lastError = err;
|
|
240
|
+
if (attempt < MAX_RETRIES && isTransientError(err)) {
|
|
241
|
+
await new Promise((r) => setTimeout(r, 1000 * 2 ** attempt));
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
throw err;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
throw lastError;
|
|
248
|
+
}
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
// Result helpers
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
export function textResult(data) {
|
|
253
|
+
return {
|
|
254
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export async function pollUntilComplete(jobId, maxWaitMs = 30_000, intervalMs = 1000) {
|
|
258
|
+
const start = Date.now();
|
|
259
|
+
while (Date.now() - start < maxWaitMs) {
|
|
260
|
+
const data = (await apiCall("GET", `/v1/jobs/${jobId}`));
|
|
261
|
+
const status = data.status;
|
|
262
|
+
if (status === "completed" || status === "failed" || status === "cancelled") {
|
|
263
|
+
return {
|
|
264
|
+
status,
|
|
265
|
+
result_ref: data.result_ref,
|
|
266
|
+
error: data.error,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
270
|
+
}
|
|
271
|
+
return { status: "timeout" };
|
|
272
|
+
}
|
|
273
|
+
/** Fetch training guidance from API (used by training_guidance tool). Domain knowledge returned when asked; valid license required. */
|
|
274
|
+
export async function fetchTrainingGuidanceFromApi() {
|
|
275
|
+
try {
|
|
276
|
+
const config = (await apiCall("GET", "/v1/training/config"));
|
|
277
|
+
const presetDesc = config?.preset_descriptions;
|
|
278
|
+
const presetBlock = Array.isArray(presetDesc) && presetDesc.length > 0
|
|
279
|
+
? "Presets: " + presetDesc.join(" | ") + "\n\n"
|
|
280
|
+
: "";
|
|
281
|
+
const hints = config?.training_hints;
|
|
282
|
+
if (Array.isArray(hints) && hints.length > 0) {
|
|
283
|
+
return presetBlock + "Parameter guidance (from API):\n- " + hints.join("\n- ");
|
|
284
|
+
}
|
|
285
|
+
const pg = config?.parameter_guidance;
|
|
286
|
+
if (pg && typeof pg === "object") {
|
|
287
|
+
const lines = Object.entries(pg).map(([k, v]) => `${k}: ${v}`);
|
|
288
|
+
return presetBlock + "Parameter guidance (from API):\n- " + lines.join("\n- ");
|
|
289
|
+
}
|
|
290
|
+
if (presetBlock)
|
|
291
|
+
return presetBlock + "No additional parameter guidance in config.";
|
|
292
|
+
}
|
|
293
|
+
catch (e) {
|
|
294
|
+
if (e?.httpStatus === 401 || e?.httpStatus === 403)
|
|
295
|
+
throw e;
|
|
296
|
+
return "Could not fetch parameter guidance. Check API key and connectivity.";
|
|
297
|
+
}
|
|
298
|
+
return "No parameter guidance available.";
|
|
299
|
+
}
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
// Image helpers
|
|
302
|
+
// ---------------------------------------------------------------------------
|
|
303
|
+
export function mimeForFilename(fname) {
|
|
304
|
+
if (fname.endsWith(".pdf"))
|
|
305
|
+
return "application/pdf";
|
|
306
|
+
if (fname.endsWith(".svg"))
|
|
307
|
+
return "image/svg+xml";
|
|
308
|
+
return "image/png";
|
|
309
|
+
}
|
|
310
|
+
/** Per-image caption for multimodal LLM context (what the image shows, what to look for). */
|
|
311
|
+
export function getCaptionForImage(filename) {
|
|
312
|
+
const base = filename.replace(/\.(png|pdf|svg)$/i, "");
|
|
313
|
+
if (base.startsWith("combined"))
|
|
314
|
+
return "Combined view — U-matrix (top-left), hit histogram (top-right), component planes below. Dark U-matrix = cluster cores; bright = boundaries.";
|
|
315
|
+
if (base.startsWith("umatrix"))
|
|
316
|
+
return "U-matrix — weight distance between neighbors. Dark = similar (cluster interior), bright = dissimilar (boundary).";
|
|
317
|
+
if (base.startsWith("hit_histogram"))
|
|
318
|
+
return "Hit histogram — sample count per node. Hot = dense clusters; empty = sparse or oversized grid.";
|
|
319
|
+
if (base.startsWith("clusters"))
|
|
320
|
+
return "Cluster analysis — boundary detection. Colors = cluster assignments.";
|
|
321
|
+
if (base.startsWith("transition_flow"))
|
|
322
|
+
return "Transition flow — arrows show net temporal drift. Length/color = strength. Background = U-matrix.";
|
|
323
|
+
if (base.startsWith("component_"))
|
|
324
|
+
return `Component plane — spatial distribution of feature across the map.`;
|
|
325
|
+
if (base.startsWith("correlation"))
|
|
326
|
+
return "SOM weight correlation — feature correlation across nodes.";
|
|
327
|
+
if (base.startsWith("learning_curve"))
|
|
328
|
+
return "Learning curve — quantization error by epoch (ordering then convergence).";
|
|
329
|
+
if (base.startsWith("projected_"))
|
|
330
|
+
return "Projected variable — per-node aggregation on the map.";
|
|
331
|
+
return "";
|
|
332
|
+
}
|
|
333
|
+
export async function tryAttachImage(content, jobId, filename) {
|
|
334
|
+
// MCP image content only supports raster MIME types (png/jpeg/gif/webp).
|
|
335
|
+
// PDF and SVG must be retrieved out-of-band via get_result_image.
|
|
336
|
+
if (filename.endsWith(".pdf") || filename.endsWith(".svg")) {
|
|
337
|
+
content.push({
|
|
338
|
+
type: "text",
|
|
339
|
+
text: `${filename} is ready (vector format — not inlineable). ` +
|
|
340
|
+
`Use get_result_image(job_id="${jobId}", filename="${filename}") to download it.`,
|
|
341
|
+
});
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
try {
|
|
345
|
+
const { data: imgBuf } = await apiRawCall(`/v1/results/${jobId}/image/${filename}`);
|
|
346
|
+
content.push({
|
|
347
|
+
type: "image",
|
|
348
|
+
data: imgBuf.toString("base64"),
|
|
349
|
+
mimeType: mimeForFilename(filename),
|
|
350
|
+
annotations: { audience: ["user"], priority: 0.8 },
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
content.push({
|
|
355
|
+
type: "text",
|
|
356
|
+
text: `(${filename} not available for inline display)`,
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
/** Resolve get_results figures param to list of image filenames to fetch. */
|
|
361
|
+
export function getResultsImagesToFetch(jobType, summary, figures, includeIndividual) {
|
|
362
|
+
const ext = summary.output_format ?? "pdf";
|
|
363
|
+
if (jobType === "transition_flow") {
|
|
364
|
+
const lag = summary.lag ?? 1;
|
|
365
|
+
return [`transition_flow_lag${lag}.${ext}`];
|
|
366
|
+
}
|
|
367
|
+
if (jobType === "project_variable") {
|
|
368
|
+
const varName = summary.variable_name ?? "variable";
|
|
369
|
+
const safe = String(varName).replace(/[^a-zA-Z0-9_]/g, "_");
|
|
370
|
+
return [`projected_${safe}.${ext}`];
|
|
371
|
+
}
|
|
372
|
+
if (jobType === "derive_variable") {
|
|
373
|
+
const varName = summary.variable_name ?? "variable";
|
|
374
|
+
const safe = String(varName).replace(/[^a-zA-Z0-9_]/g, "_");
|
|
375
|
+
return [`projected_${safe}.${ext}`];
|
|
376
|
+
}
|
|
377
|
+
if (jobType === "project_columns") {
|
|
378
|
+
const files = summary.files ?? [];
|
|
379
|
+
return files.filter((f) => /\.(png|pdf|svg)$/i.test(f));
|
|
380
|
+
}
|
|
381
|
+
// train_som
|
|
382
|
+
const features = summary.features ?? [];
|
|
383
|
+
const combinedName = `combined.${ext}`;
|
|
384
|
+
const umatrixName = `umatrix.${ext}`;
|
|
385
|
+
const hitHistName = `hit_histogram.${ext}`;
|
|
386
|
+
const correlationName = `correlation.${ext}`;
|
|
387
|
+
const componentNames = features.map((f, i) => `component_${i + 1}_${f.replace(/[^a-zA-Z0-9_]/g, "_")}.${ext}`);
|
|
388
|
+
const allList = [combinedName, umatrixName, hitHistName, correlationName, ...componentNames];
|
|
389
|
+
if (figures === undefined || figures === "default") {
|
|
390
|
+
return includeIndividual ? allList : [combinedName];
|
|
391
|
+
}
|
|
392
|
+
if (figures === "combined_only")
|
|
393
|
+
return [combinedName];
|
|
394
|
+
if (figures === "all")
|
|
395
|
+
return allList;
|
|
396
|
+
if (Array.isArray(figures)) {
|
|
397
|
+
const nameToFile = {
|
|
398
|
+
combined: combinedName,
|
|
399
|
+
umatrix: umatrixName,
|
|
400
|
+
hit_histogram: hitHistName,
|
|
401
|
+
correlation: correlationName,
|
|
402
|
+
};
|
|
403
|
+
features.forEach((_, i) => {
|
|
404
|
+
nameToFile[`component_${i + 1}`] = componentNames[i];
|
|
405
|
+
});
|
|
406
|
+
return figures
|
|
407
|
+
.map((key) => {
|
|
408
|
+
const k = key.trim().toLowerCase();
|
|
409
|
+
if (nameToFile[k])
|
|
410
|
+
return nameToFile[k];
|
|
411
|
+
if (key.includes("."))
|
|
412
|
+
return key;
|
|
413
|
+
return null;
|
|
414
|
+
})
|
|
415
|
+
.filter((f) => f != null);
|
|
416
|
+
}
|
|
417
|
+
return [combinedName];
|
|
418
|
+
}
|
|
419
|
+
// ---------------------------------------------------------------------------
|
|
420
|
+
// View loading
|
|
421
|
+
// ---------------------------------------------------------------------------
|
|
422
|
+
const BASE_DIR = import.meta.dirname ?? path.dirname(new URL(import.meta.url).pathname);
|
|
423
|
+
export async function loadViewHtml(viewName) {
|
|
424
|
+
const candidates = [
|
|
425
|
+
path.join(BASE_DIR, "views", "src", "views", viewName, "index.html"),
|
|
426
|
+
path.join(BASE_DIR, "views", viewName, "index.html"),
|
|
427
|
+
path.join(BASE_DIR, "..", "dist", "views", "src", "views", viewName, "index.html"),
|
|
428
|
+
];
|
|
429
|
+
for (const p of candidates) {
|
|
430
|
+
try {
|
|
431
|
+
return await fs.readFile(p, "utf-8");
|
|
432
|
+
}
|
|
433
|
+
catch {
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/tools/account.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgJ3D"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { apiCall } from "../shared.js";
|
|
3
|
+
export function registerAccountTool(server) {
|
|
4
|
+
server.tool("account", `Manage your Barivia account — check plan/license info, request cloud burst compute, view billing history.
|
|
5
|
+
|
|
6
|
+
| Action | Use when |
|
|
7
|
+
|--------|----------|
|
|
8
|
+
| status | Before large jobs — see plan tier, GPU availability, queue depth, training time estimates, credit balance |
|
|
9
|
+
| request_compute | Upgrading to cloud burst (required for large grids or GPU). Leave tier blank to list options. |
|
|
10
|
+
| compute_status | Checking if a burst lease is active and how much time remains |
|
|
11
|
+
| release_compute | Manually terminating an active lease to stop billing |
|
|
12
|
+
| history | Viewing recent compute leases and credit spend |
|
|
13
|
+
| add_funds | Getting instructions to add credits |
|
|
14
|
+
|
|
15
|
+
action=status: Returns plan tier, compute class (CPU/GPU), usage limits, live queue state, training time estimates, and credit balance.
|
|
16
|
+
Use BEFORE large jobs to check GPU availability and estimate wait time.
|
|
17
|
+
action=request_compute: Provisions an ephemeral cloud burst EC2 instance. Data is in shared R2 — no re-upload needed. Wait ~3 min after requesting before submitting jobs.
|
|
18
|
+
NOT FOR: Training itself — use jobs(action=train_map). This tool only manages the account and compute lease.`, {
|
|
19
|
+
action: z
|
|
20
|
+
.enum(["status", "request_compute", "compute_status", "release_compute", "history", "add_funds"])
|
|
21
|
+
.describe("status: plan/license/queue info; request_compute: provision burst; compute_status: check active lease; release_compute: stop lease; history: recent compute usage; add_funds: instructions"),
|
|
22
|
+
tier: z.string().optional().describe("action=request_compute: tier ID (e.g. cpu-8, gpu-t4). Omit to list options."),
|
|
23
|
+
duration_minutes: z.number().optional().describe("action=request_compute: lease duration in minutes (default: 60)"),
|
|
24
|
+
limit: z.number().optional().describe("action=history: number of records to return (default: 10)"),
|
|
25
|
+
}, async ({ action, tier, duration_minutes, limit }) => {
|
|
26
|
+
if (action === "status") {
|
|
27
|
+
const data = (await apiCall("GET", "/v1/system/info"));
|
|
28
|
+
const plan = data.plan ?? {};
|
|
29
|
+
const backend = data.backend ?? {};
|
|
30
|
+
const status = data.status ?? {};
|
|
31
|
+
const estimates = data.training_time_estimates_seconds ?? {};
|
|
32
|
+
const topo = data.worker_topology ?? {};
|
|
33
|
+
const gpuEnabled = plan.gpu_enabled ?? data.gpu_available ?? false;
|
|
34
|
+
const computeDesc = gpuEnabled ? (backend.gpu_model ? `GPU (${backend.gpu_model}${backend.gpu_vram_gb ? `, ${backend.gpu_vram_gb}GB` : ""})` : "GPU") : "CPU only";
|
|
35
|
+
const fmtLimit = (v) => v === -1 || v === "-1" ? "unlimited" : String(v ?? "?");
|
|
36
|
+
const historyData = await apiCall("GET", "/v1/compute/history?limit=5").catch(() => null);
|
|
37
|
+
const leaseData = await apiCall("GET", "/v1/compute/lease").catch(() => null);
|
|
38
|
+
const lines = [
|
|
39
|
+
`Plan: ${String(plan.tier ?? "unknown").charAt(0).toUpperCase()}${String(plan.tier ?? "unknown").slice(1)} | Compute: ${computeDesc}`,
|
|
40
|
+
` Concurrency: ${plan.max_concurrent_jobs ?? "?"} jobs | Datasets: ${fmtLimit(plan.max_datasets)} (${fmtLimit(plan.max_dataset_rows)} rows each)`,
|
|
41
|
+
` Monthly Jobs: ${fmtLimit(plan.max_monthly_jobs)} | Grid Size: ${fmtLimit(plan.max_grid_size)} | Features: ${fmtLimit(plan.max_features)}`,
|
|
42
|
+
];
|
|
43
|
+
if (historyData)
|
|
44
|
+
lines.push(` Credits: $${(historyData.credit_balance_cents / 100).toFixed(2)} remaining`);
|
|
45
|
+
if (backend.memory_gb)
|
|
46
|
+
lines.push(` Backend Memory: ${backend.memory_gb} GB`);
|
|
47
|
+
if (leaseData && leaseData.lease_id) {
|
|
48
|
+
lines.push(``, `Active Burst Lease: ${leaseData.tier} | ${Math.round(leaseData.time_remaining_ms / 60000)} min left`);
|
|
49
|
+
}
|
|
50
|
+
const running = Number(status.running_jobs ?? data.running_jobs ?? 0);
|
|
51
|
+
const pending = Number(status.pending_jobs ?? data.pending_jobs ?? 0);
|
|
52
|
+
const compute_eta = Number(estimates?.total || 0);
|
|
53
|
+
lines.push(``, `Live Queue: ${running} running | ${pending} pending | ~${Math.round(((pending + 1) * compute_eta) / 60)} min wait`);
|
|
54
|
+
if (topo.num_workers !== undefined)
|
|
55
|
+
lines.push(`Workers: ${topo.num_workers}×${topo.threads_per_worker} threads`);
|
|
56
|
+
if (Object.keys(estimates).length > 0) {
|
|
57
|
+
lines.push(``, `Training Time Estimates:`);
|
|
58
|
+
for (const [k, v] of Object.entries(estimates)) {
|
|
59
|
+
if (k !== "formula")
|
|
60
|
+
lines.push(` ${k}: ~${v}s`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
64
|
+
}
|
|
65
|
+
if (action === "request_compute") {
|
|
66
|
+
if (!tier) {
|
|
67
|
+
try {
|
|
68
|
+
const tiersData = await apiCall("GET", "/v1/compute/tiers");
|
|
69
|
+
const lines = ["Available Compute Tiers:"];
|
|
70
|
+
for (const [tId, tData] of Object.entries(tiersData.tiers)) {
|
|
71
|
+
lines.push(` ${tId}: ${tData.desc}`);
|
|
72
|
+
}
|
|
73
|
+
return { content: [{ type: "text", text: lines.join("\n") }] };
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return { content: [{ type: "text", text: "Failed to fetch compute tiers. Ensure you have burst access enabled." }] };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const data = await apiCall("POST", "/v1/compute/lease", { tier, duration_minutes });
|
|
80
|
+
const billingLine = data.billing_mode === "postpaid"
|
|
81
|
+
? `Billing: Postpaid (usage logged, billed retrospectively)\nAccrued Balance: $${(data.credit_balance_cents / 100).toFixed(2)}`
|
|
82
|
+
: `Credits Remaining After Reserve: $${(data.credit_balance_cents / 100).toFixed(2)}`;
|
|
83
|
+
return {
|
|
84
|
+
content: [{ type: "text", text: `Compute Lease Requested:
|
|
85
|
+
Lease ID: ${data.lease_id}
|
|
86
|
+
Status: ${data.status}
|
|
87
|
+
Estimated Wait: ${data.estimated_wait_minutes} minutes
|
|
88
|
+
Estimated Cost: $${(data.estimated_cost_cents / 100).toFixed(2)}
|
|
89
|
+
${billingLine}
|
|
90
|
+
|
|
91
|
+
IMPORTANT: Cloud burst active. Data is pulled from shared Cloudflare R2, so you do NOT need to re-upload datasets. Just wait ~3 minutes and check status.` }]
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (action === "compute_status") {
|
|
95
|
+
const data = await apiCall("GET", "/v1/compute/lease");
|
|
96
|
+
if (data.status === "none" || !data.lease_id) {
|
|
97
|
+
return { content: [{ type: "text", text: "No active lease -- running on default Primary Server." }] };
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
content: [{ type: "text", text: `Active Compute Lease:
|
|
101
|
+
Lease ID: ${data.lease_id}
|
|
102
|
+
Status: ${data.status}
|
|
103
|
+
Tier: ${data.tier} (${data.instance_type})
|
|
104
|
+
Time Remaining: ${Math.round(data.time_remaining_ms / 60000)} minutes` }]
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
if (action === "release_compute") {
|
|
108
|
+
const data = await apiCall("DELETE", "/v1/compute/lease");
|
|
109
|
+
const costLine = data.billing_mode === "postpaid"
|
|
110
|
+
? `Cost Logged: $${(data.cost_cents / 100).toFixed(2)} (postpaid — billed retrospectively)`
|
|
111
|
+
: `Credits Deducted: $${((data.credits_deducted || data.cost_cents) / 100).toFixed(2)}`;
|
|
112
|
+
return {
|
|
113
|
+
content: [{ type: "text", text: `Compute Released:
|
|
114
|
+
Duration Billed: ${data.duration_minutes} minutes
|
|
115
|
+
${costLine}
|
|
116
|
+
Balance: $${(data.final_balance_cents / 100).toFixed(2)}
|
|
117
|
+
|
|
118
|
+
Routing reverted to default Primary Server.` }]
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
if (action === "history") {
|
|
122
|
+
const data = await apiCall("GET", `/v1/compute/history?limit=${limit || 10}`);
|
|
123
|
+
const history = data.history.map((h) => `- ${h.started_at} | ${h.tier} | ${h.duration_minutes} min | $${(h.credits_charged / 100).toFixed(2)}`).join("\n");
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: "text", text: `Credit Balance: $${(data.credit_balance_cents / 100).toFixed(2)}\n\nRecent Usage:\n${history}` }]
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (action === "add_funds") {
|
|
129
|
+
return {
|
|
130
|
+
content: [{ type: "text", text: `To add funds to your account, please visit the Barivia Billing Portal (integration pending) or ask your administrator to use the CLI tool:
|
|
131
|
+
bash scripts/manage-credits.sh add <org_id> <amount_usd>` }]
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
content: [{ type: "text", text: `Unknown action: ${action}. Valid: status, request_compute, compute_status, release_compute, history, add_funds.` }]
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/tools/account.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export declare function registerDatasetsTool(server: McpServer & {
|
|
3
|
+
server: {
|
|
4
|
+
listRoots: () => Promise<{
|
|
5
|
+
roots: {
|
|
6
|
+
uri: string;
|
|
7
|
+
}[];
|
|
8
|
+
}>;
|
|
9
|
+
};
|
|
10
|
+
}): void;
|
|
11
|
+
//# sourceMappingURL=datasets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../src/tools/datasets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,GAAG;IAAE,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,OAAO,CAAC;YAAE,KAAK,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAA;CAAE,GACzF,IAAI,CAiUN"}
|