labgate 0.5.10 → 0.5.12

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 (40) hide show
  1. package/README.md +59 -4
  2. package/dist/cli.js +425 -27
  3. package/dist/cli.js.map +1 -1
  4. package/dist/lib/cluster-mcp.d.ts +33 -0
  5. package/dist/lib/cluster-mcp.js +313 -0
  6. package/dist/lib/cluster-mcp.js.map +1 -0
  7. package/dist/lib/config.d.ts +1 -0
  8. package/dist/lib/config.js +11 -4
  9. package/dist/lib/config.js.map +1 -1
  10. package/dist/lib/container.d.ts +10 -0
  11. package/dist/lib/container.js +195 -32
  12. package/dist/lib/container.js.map +1 -1
  13. package/dist/lib/dataset-mcp.d.ts +20 -0
  14. package/dist/lib/dataset-mcp.js +809 -0
  15. package/dist/lib/dataset-mcp.js.map +1 -0
  16. package/dist/lib/feedback.js +15 -3
  17. package/dist/lib/feedback.js.map +1 -1
  18. package/dist/lib/init.js +2 -2
  19. package/dist/lib/results-mcp.d.ts +9 -0
  20. package/dist/lib/results-mcp.js +205 -0
  21. package/dist/lib/results-mcp.js.map +1 -0
  22. package/dist/lib/results-store.d.ts +61 -0
  23. package/dist/lib/results-store.js +319 -0
  24. package/dist/lib/results-store.js.map +1 -0
  25. package/dist/lib/slurm-cli-passthrough.d.ts +25 -0
  26. package/dist/lib/slurm-cli-passthrough.js +330 -0
  27. package/dist/lib/slurm-cli-passthrough.js.map +1 -0
  28. package/dist/lib/slurm-mcp.js +1 -1
  29. package/dist/lib/slurm-mcp.js.map +1 -1
  30. package/dist/lib/test/integration-harness.d.ts +4 -0
  31. package/dist/lib/test/integration-harness.js +14 -2
  32. package/dist/lib/test/integration-harness.js.map +1 -1
  33. package/dist/lib/ui.html +2068 -351
  34. package/dist/lib/ui.js +701 -0
  35. package/dist/lib/ui.js.map +1 -1
  36. package/dist/mcp-bundles/cluster-mcp.bundle.mjs +30235 -0
  37. package/dist/mcp-bundles/dataset-mcp.bundle.mjs +30971 -0
  38. package/dist/mcp-bundles/results-mcp.bundle.mjs +30449 -0
  39. package/dist/mcp-bundles/slurm-mcp.bundle.mjs +30501 -0
  40. package/package.json +4 -2
@@ -0,0 +1,319 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResultsStore = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
7
+ const config_js_1 = require("./config.js");
8
+ function nowIso() {
9
+ return new Date().toISOString();
10
+ }
11
+ function sanitizeString(value, maxLen) {
12
+ if (typeof value !== 'string')
13
+ return '';
14
+ const trimmed = value.trim();
15
+ return trimmed.length > maxLen ? trimmed.slice(0, maxLen) : trimmed;
16
+ }
17
+ function sanitizeNullableString(value, maxLen) {
18
+ if (value === null)
19
+ return null;
20
+ if (value === undefined)
21
+ return null;
22
+ const normalized = sanitizeString(value, maxLen);
23
+ return normalized || null;
24
+ }
25
+ function sanitizeSource(value) {
26
+ const source = sanitizeString(value, 64).toLowerCase();
27
+ if (!source)
28
+ return 'unknown';
29
+ if (!/^[a-z0-9._-]+$/.test(source))
30
+ return 'unknown';
31
+ return source;
32
+ }
33
+ function sanitizeStringArray(value, maxItemLen, maxItems) {
34
+ if (!Array.isArray(value))
35
+ return [];
36
+ const out = [];
37
+ const seen = new Set();
38
+ for (const item of value) {
39
+ const normalized = sanitizeString(item, maxItemLen);
40
+ if (!normalized)
41
+ continue;
42
+ const key = normalized.toLowerCase();
43
+ if (seen.has(key))
44
+ continue;
45
+ seen.add(key);
46
+ out.push(normalized);
47
+ if (out.length >= maxItems)
48
+ break;
49
+ }
50
+ return out;
51
+ }
52
+ function sanitizeMetadata(value) {
53
+ if (value === null || value === undefined)
54
+ return null;
55
+ if (typeof value !== 'object' || Array.isArray(value))
56
+ return null;
57
+ const out = {};
58
+ for (const [k, v] of Object.entries(value)) {
59
+ const key = sanitizeString(k, 128);
60
+ if (!key)
61
+ continue;
62
+ if (v === null ||
63
+ typeof v === 'string' ||
64
+ typeof v === 'number' ||
65
+ typeof v === 'boolean') {
66
+ out[key] = v;
67
+ }
68
+ }
69
+ return Object.keys(out).length > 0 ? out : null;
70
+ }
71
+ function clampInt(value, fallback, min, max) {
72
+ if (!Number.isFinite(value))
73
+ return fallback;
74
+ return Math.min(max, Math.max(min, Math.floor(value)));
75
+ }
76
+ function buildSearchText(result) {
77
+ return [
78
+ result.id,
79
+ result.title,
80
+ result.summary,
81
+ result.details || '',
82
+ result.source,
83
+ result.session_id || '',
84
+ result.workdir || '',
85
+ result.tags.join(' '),
86
+ result.artifacts.join(' '),
87
+ ]
88
+ .join('\n')
89
+ .toLowerCase();
90
+ }
91
+ function sortByUpdatedDesc(items) {
92
+ return [...items].sort((a, b) => b.updated_at.localeCompare(a.updated_at));
93
+ }
94
+ class ResultsStore {
95
+ dbPath;
96
+ constructor(dbPath = (0, config_js_1.getResultsDbPath)()) {
97
+ this.dbPath = dbPath;
98
+ this.ensureFile();
99
+ }
100
+ getPath() {
101
+ return this.dbPath;
102
+ }
103
+ listResults(opts) {
104
+ const safeLimit = clampInt(opts?.limit, 50, 1, 500);
105
+ const safeOffset = clampInt(opts?.offset, 0, 0, 100_000);
106
+ const search = sanitizeString(opts?.search, 256).toLowerCase();
107
+ const source = sanitizeString(opts?.source, 64).toLowerCase();
108
+ const tag = sanitizeString(opts?.tag, 64).toLowerCase();
109
+ let rows = sortByUpdatedDesc(this.readFile().results);
110
+ if (search) {
111
+ rows = rows.filter((r) => buildSearchText(r).includes(search));
112
+ }
113
+ if (source) {
114
+ rows = rows.filter((r) => r.source.toLowerCase() === source);
115
+ }
116
+ if (tag) {
117
+ rows = rows.filter((r) => r.tags.some((t) => t.toLowerCase() === tag));
118
+ }
119
+ const total = rows.length;
120
+ rows = rows.slice(safeOffset, safeOffset + safeLimit);
121
+ return { results: rows, total };
122
+ }
123
+ getResult(id) {
124
+ const normalized = sanitizeString(id, 128);
125
+ if (!normalized)
126
+ return null;
127
+ return this.readFile().results.find((r) => r.id === normalized) || null;
128
+ }
129
+ createResult(input) {
130
+ const title = sanitizeString(input.title, 240);
131
+ if (!title)
132
+ throw new Error('title is required');
133
+ const file = this.readFile();
134
+ const id = sanitizeString(input.id, 128) || (0, crypto_1.randomUUID)();
135
+ if (file.results.some((r) => r.id === id)) {
136
+ throw new Error(`Result id already exists: ${id}`);
137
+ }
138
+ const ts = nowIso();
139
+ const created = {
140
+ id,
141
+ title,
142
+ summary: sanitizeString(input.summary, 1000),
143
+ details: sanitizeNullableString(input.details, 20_000),
144
+ source: sanitizeSource(input.source),
145
+ session_id: sanitizeNullableString(input.session_id, 128),
146
+ workdir: sanitizeNullableString(input.workdir, 4096),
147
+ tags: sanitizeStringArray(input.tags, 64, 50),
148
+ artifacts: sanitizeStringArray(input.artifacts, 4096, 100),
149
+ metadata: sanitizeMetadata(input.metadata),
150
+ created_at: ts,
151
+ updated_at: ts,
152
+ };
153
+ file.results.push(created);
154
+ this.writeFile(file);
155
+ return created;
156
+ }
157
+ updateResult(id, patch) {
158
+ const normalized = sanitizeString(id, 128);
159
+ if (!normalized)
160
+ return null;
161
+ const file = this.readFile();
162
+ const idx = file.results.findIndex((r) => r.id === normalized);
163
+ if (idx < 0)
164
+ return null;
165
+ const current = file.results[idx];
166
+ const next = { ...current };
167
+ let changed = false;
168
+ if (patch.title !== undefined) {
169
+ const title = sanitizeString(patch.title, 240);
170
+ if (!title)
171
+ throw new Error('title cannot be empty');
172
+ if (title !== next.title) {
173
+ next.title = title;
174
+ changed = true;
175
+ }
176
+ }
177
+ if (patch.summary !== undefined) {
178
+ const summary = sanitizeString(patch.summary, 1000);
179
+ if (summary !== next.summary) {
180
+ next.summary = summary;
181
+ changed = true;
182
+ }
183
+ }
184
+ if (patch.details !== undefined) {
185
+ const details = sanitizeNullableString(patch.details, 20_000);
186
+ if (details !== next.details) {
187
+ next.details = details;
188
+ changed = true;
189
+ }
190
+ }
191
+ if (patch.source !== undefined) {
192
+ const source = sanitizeSource(patch.source);
193
+ if (source !== next.source) {
194
+ next.source = source;
195
+ changed = true;
196
+ }
197
+ }
198
+ if (patch.session_id !== undefined) {
199
+ const sessionId = sanitizeNullableString(patch.session_id, 128);
200
+ if (sessionId !== next.session_id) {
201
+ next.session_id = sessionId;
202
+ changed = true;
203
+ }
204
+ }
205
+ if (patch.workdir !== undefined) {
206
+ const workdir = sanitizeNullableString(patch.workdir, 4096);
207
+ if (workdir !== next.workdir) {
208
+ next.workdir = workdir;
209
+ changed = true;
210
+ }
211
+ }
212
+ if (patch.tags !== undefined) {
213
+ const tags = sanitizeStringArray(patch.tags, 64, 50);
214
+ if (JSON.stringify(tags) !== JSON.stringify(next.tags)) {
215
+ next.tags = tags;
216
+ changed = true;
217
+ }
218
+ }
219
+ if (patch.artifacts !== undefined) {
220
+ const artifacts = sanitizeStringArray(patch.artifacts, 4096, 100);
221
+ if (JSON.stringify(artifacts) !== JSON.stringify(next.artifacts)) {
222
+ next.artifacts = artifacts;
223
+ changed = true;
224
+ }
225
+ }
226
+ if (patch.metadata !== undefined) {
227
+ const metadata = sanitizeMetadata(patch.metadata);
228
+ if (JSON.stringify(metadata) !== JSON.stringify(next.metadata)) {
229
+ next.metadata = metadata;
230
+ changed = true;
231
+ }
232
+ }
233
+ if (!changed)
234
+ return current;
235
+ next.updated_at = nowIso();
236
+ file.results[idx] = next;
237
+ this.writeFile(file);
238
+ return next;
239
+ }
240
+ deleteResult(id) {
241
+ const normalized = sanitizeString(id, 128);
242
+ if (!normalized)
243
+ return false;
244
+ const file = this.readFile();
245
+ const before = file.results.length;
246
+ file.results = file.results.filter((r) => r.id !== normalized);
247
+ if (file.results.length === before)
248
+ return false;
249
+ this.writeFile(file);
250
+ return true;
251
+ }
252
+ ensureFile() {
253
+ (0, config_js_1.ensurePrivateDir)((0, path_1.dirname)(this.dbPath));
254
+ if (!(0, fs_1.existsSync)(this.dbPath)) {
255
+ const initial = { version: 1, results: [] };
256
+ (0, fs_1.writeFileSync)(this.dbPath, JSON.stringify(initial, null, 2) + '\n', {
257
+ encoding: 'utf-8',
258
+ mode: config_js_1.PRIVATE_FILE_MODE,
259
+ });
260
+ (0, config_js_1.ensurePrivateFile)(this.dbPath);
261
+ return;
262
+ }
263
+ (0, config_js_1.ensurePrivateFile)(this.dbPath);
264
+ }
265
+ readFile() {
266
+ this.ensureFile();
267
+ try {
268
+ const raw = (0, fs_1.readFileSync)(this.dbPath, 'utf-8');
269
+ const parsed = JSON.parse(raw || '{}');
270
+ if (!parsed || typeof parsed !== 'object') {
271
+ return { version: 1, results: [] };
272
+ }
273
+ const rows = Array.isArray(parsed.results) ? parsed.results : [];
274
+ const normalized = rows
275
+ .filter((r) => r && typeof r === 'object')
276
+ .map((r) => {
277
+ const id = sanitizeString(r.id, 128);
278
+ const title = sanitizeString(r.title, 240);
279
+ if (!id || !title)
280
+ return null;
281
+ const created = sanitizeString(r.created_at, 64) || nowIso();
282
+ const updated = sanitizeString(r.updated_at, 64) || created;
283
+ return {
284
+ id,
285
+ title,
286
+ summary: sanitizeString(r.summary, 1000),
287
+ details: sanitizeNullableString(r.details, 20_000),
288
+ source: sanitizeSource(r.source),
289
+ session_id: sanitizeNullableString(r.session_id, 128),
290
+ workdir: sanitizeNullableString(r.workdir, 4096),
291
+ tags: sanitizeStringArray(r.tags, 64, 50),
292
+ artifacts: sanitizeStringArray(r.artifacts, 4096, 100),
293
+ metadata: sanitizeMetadata(r.metadata),
294
+ created_at: created,
295
+ updated_at: updated,
296
+ };
297
+ })
298
+ .filter((r) => r !== null);
299
+ return {
300
+ version: 1,
301
+ results: normalized,
302
+ };
303
+ }
304
+ catch {
305
+ return { version: 1, results: [] };
306
+ }
307
+ }
308
+ writeFile(next) {
309
+ const tmpPath = (0, path_1.join)((0, path_1.dirname)(this.dbPath), `.${Date.now()}.${process.pid}.results.tmp`);
310
+ (0, fs_1.writeFileSync)(tmpPath, JSON.stringify(next, null, 2) + '\n', {
311
+ encoding: 'utf-8',
312
+ mode: config_js_1.PRIVATE_FILE_MODE,
313
+ });
314
+ (0, fs_1.renameSync)(tmpPath, this.dbPath);
315
+ (0, config_js_1.ensurePrivateFile)(this.dbPath);
316
+ }
317
+ }
318
+ exports.ResultsStore = ResultsStore;
319
+ //# sourceMappingURL=results-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results-store.js","sourceRoot":"","sources":["../../src/lib/results-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface StageSlurmCliOptions {
2
+ /** Host path to the sandbox HOME directory that is mounted at /home/sandbox in the container. */
3
+ sandboxHome: string;
4
+ /** Best-effort host env for PATH lookup (defaults to process.env). */
5
+ env?: NodeJS.ProcessEnv;
6
+ /** Override list of SLURM commands to stage. */
7
+ commands?: string[];
8
+ }
9
+ export interface StageSlurmCliResult {
10
+ ok: boolean;
11
+ staged: string[];
12
+ skipped: string[];
13
+ errors: string[];
14
+ slurmConfPath: string | null;
15
+ stageRoot: string;
16
+ }
17
+ /**
18
+ * Best-effort: stage host SLURM client commands into the sandbox HOME and install wrappers
19
+ * in $HOME/.labgate-bin so they are available inside the container even when the image
20
+ * does not ship with SLURM.
21
+ *
22
+ * This is intentionally simple: copy binaries + ldd libraries + slurm.conf (if found).
23
+ * The host-side session launcher is responsible for bind-mounting /run/munge when present.
24
+ */
25
+ export declare function stageSlurmCliPassthrough(options: StageSlurmCliOptions): StageSlurmCliResult;