labgate 0.5.2 → 0.5.4
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 +48 -3
- package/dist/cli.js +322 -19
- package/dist/cli.js.map +1 -1
- package/dist/lib/audit.d.ts +5 -1
- package/dist/lib/audit.js +19 -3
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/config.d.ts +71 -2
- package/dist/lib/config.js +192 -8
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/container.d.ts +54 -0
- package/dist/lib/container.js +650 -178
- package/dist/lib/container.js.map +1 -1
- package/dist/lib/init.js +22 -9
- package/dist/lib/init.js.map +1 -1
- package/dist/lib/license.d.ts +44 -0
- package/dist/lib/license.js +164 -0
- package/dist/lib/license.js.map +1 -0
- package/dist/lib/policy.d.ts +85 -0
- package/dist/lib/policy.js +321 -0
- package/dist/lib/policy.js.map +1 -0
- package/dist/lib/runtime.d.ts +2 -2
- package/dist/lib/runtime.js +19 -36
- package/dist/lib/runtime.js.map +1 -1
- package/dist/lib/slurm-db.d.ts +51 -0
- package/dist/lib/slurm-db.js +179 -0
- package/dist/lib/slurm-db.js.map +1 -0
- package/dist/lib/slurm-mcp.d.ts +12 -0
- package/dist/lib/slurm-mcp.js +347 -0
- package/dist/lib/slurm-mcp.js.map +1 -0
- package/dist/lib/slurm-poller.d.ts +36 -0
- package/dist/lib/slurm-poller.js +423 -0
- package/dist/lib/slurm-poller.js.map +1 -0
- package/dist/lib/test/integration-harness.d.ts +44 -0
- package/dist/lib/test/integration-harness.js +260 -0
- package/dist/lib/test/integration-harness.js.map +1 -0
- package/dist/lib/ui.d.ts +34 -1
- package/dist/lib/ui.html +3081 -356
- package/dist/lib/ui.js +2123 -108
- package/dist/lib/ui.js.map +1 -1
- package/package.json +11 -3
package/README.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Policy-controlled sandboxes for LLM coding agents on HPC systems.
|
|
4
4
|
|
|
5
|
+
## Current Product Focus
|
|
6
|
+
|
|
7
|
+
- Primary workflow: Claude (`labgate claude`)
|
|
8
|
+
- Primary runtime: Apptainer/Singularity on HPC
|
|
9
|
+
- Secondary targets (best-effort): other agents/runtimes
|
|
10
|
+
|
|
5
11
|
## Install
|
|
6
12
|
|
|
7
13
|
```bash
|
|
@@ -10,7 +16,7 @@ npm i -g labgate
|
|
|
10
16
|
|
|
11
17
|
Note: LabGate uses `node-pty` only for the optional sticky footer. On minimal Linux installs, that dependency may fail to build without a compiler toolchain. If it fails, the install still works and LabGate falls back to non-sticky output.
|
|
12
18
|
|
|
13
|
-
LabGate auto-detects your container runtime (Apptainer
|
|
19
|
+
LabGate auto-detects your container runtime (Apptainer or Singularity) and offers to install one if none is found. Docker remains available via explicit `runtime: "docker"` if needed.
|
|
14
20
|
|
|
15
21
|
## Quick start
|
|
16
22
|
|
|
@@ -29,6 +35,8 @@ LabGate runs your AI coding agent inside a sandboxed container with:
|
|
|
29
35
|
- **Network isolation** — no outbound network by default (configurable)
|
|
30
36
|
- **Command blocking** — `ssh`, `curl`, `wget`, and other commands are blocked by default
|
|
31
37
|
- **Audit logging** — session start/stop and mount configuration logged to `~/.labgate/logs/`
|
|
38
|
+
- **Dashboard instructions editor** — view and update per-session `AGENTS.md` / `CLAUDE.md` from the UI
|
|
39
|
+
- **Session context injection** — LabGate prepends a temporary sandbox-mapping instruction block during active sessions
|
|
32
40
|
- **HPC ready** — first-class Apptainer/Singularity support for shared clusters
|
|
33
41
|
|
|
34
42
|
## Configuration
|
|
@@ -49,7 +57,7 @@ labgate init --force
|
|
|
49
57
|
|
|
50
58
|
| Setting | Default | What it does |
|
|
51
59
|
|---------|---------|-------------|
|
|
52
|
-
| `runtime` | `auto` | `auto`, `apptainer`, `singularity`,
|
|
60
|
+
| `runtime` | `auto` | `auto`, `apptainer`, `singularity`, or `docker` |
|
|
53
61
|
| `image` | `node:20-slim` | Container image |
|
|
54
62
|
| `session_timeout_hours` | `8` | Max session length |
|
|
55
63
|
| `filesystem.blocked_patterns` | `.ssh, .aws, .env, ...` | Hidden from sandbox |
|
|
@@ -65,6 +73,9 @@ labgate codex [workdir] # launch Codex
|
|
|
65
73
|
labgate feedback # submit feedback (interactive or piped)
|
|
66
74
|
labgate status # list running sessions
|
|
67
75
|
labgate stop <id> # stop a session
|
|
76
|
+
labgate ui # start dashboard server (owner-only Unix socket by default)
|
|
77
|
+
labgate logs [-n 20] # view recent audit events
|
|
78
|
+
labgate logs --follow # stream new audit events
|
|
68
79
|
labgate init [--force] # create/reset config
|
|
69
80
|
```
|
|
70
81
|
|
|
@@ -74,6 +85,9 @@ labgate init [--force] # create/reset config
|
|
|
74
85
|
labgate claude --dry-run # print the sandbox command without running
|
|
75
86
|
labgate claude --image my-image:tag # use a different container image
|
|
76
87
|
labgate claude --no-footer # disable the status footer line
|
|
88
|
+
labgate ui --port 7700 # localhost UI, URL includes required auth token
|
|
89
|
+
labgate ui --socket ~/.labgate/ui.sock # custom Unix socket path
|
|
90
|
+
labgate logs --lines 50 --follow # tail last 50 lines and keep following
|
|
77
91
|
```
|
|
78
92
|
|
|
79
93
|
## Feedback
|
|
@@ -90,11 +104,42 @@ If `LABGATE_FEEDBACK_URL` is set, LabGate will `POST` feedback JSON to that URL.
|
|
|
90
104
|
If `LABGATE_FEEDBACK_TOKEN` is set, it will be sent as a Bearer token.
|
|
91
105
|
If no URL is configured or the request fails, feedback is saved locally at `~/.labgate/feedback.jsonl`.
|
|
92
106
|
|
|
107
|
+
## Testing
|
|
108
|
+
|
|
109
|
+
Run tests:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npm run test:unit # fast unit tests
|
|
113
|
+
npm run test:integration # dashboard integration tests
|
|
114
|
+
npm run test:e2e:real # opt-in real runtime OAuth/browser smoke test
|
|
115
|
+
npm test # unit + integration
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Coverage:
|
|
119
|
+
|
|
120
|
+
- **`npm run test:unit`** covers config/runtime/container helpers
|
|
121
|
+
- **`npm run test:integration`** covers dashboard flow that:
|
|
122
|
+
1. Builds the CLI
|
|
123
|
+
2. Starts `labgate ui` on a temporary localhost port
|
|
124
|
+
3. Launches `labgate claude` and `labgate codex` with a mocked `apptainer` runtime
|
|
125
|
+
4. Verifies sessions appear in `/api/sessions` (dashboard data source)
|
|
126
|
+
5. Stops a session through `POST /api/sessions/stop` and verifies it disappears
|
|
127
|
+
6. Verifies UI port fallback when requested ports are occupied
|
|
128
|
+
7. Verifies `/api/config` accepts valid payloads and rejects invalid payloads without mutating config
|
|
129
|
+
8. Verifies `labgate logs --follow` prints tail output and streams newly appended events
|
|
130
|
+
9. Verifies dashboard activity inference for accessed files and websites from agent transcripts
|
|
131
|
+
10. Verifies `GET/PUT /api/sessions/:id/instructions` with conflict detection for `AGENTS.md` and `CLAUDE.md`
|
|
132
|
+
- **`npm run test:e2e:real`** runs a real runtime smoke test for OAuth/browser opening:
|
|
133
|
+
1. Launches real `labgate claude` (no mocked container runtime)
|
|
134
|
+
2. Waits for OAuth URL flow
|
|
135
|
+
3. Verifies host browser-open hook is triggered
|
|
136
|
+
4. Optional overrides: `LABGATE_REAL_E2E_RUNTIME` and `LABGATE_REAL_E2E_IMAGE`
|
|
137
|
+
|
|
93
138
|
## How it works
|
|
94
139
|
|
|
95
140
|
LabGate builds a sandboxed container from your config:
|
|
96
141
|
|
|
97
|
-
1. Detects the best available runtime (apptainer > singularity
|
|
142
|
+
1. Detects the best available runtime (apptainer > singularity; docker only when explicitly configured)
|
|
98
143
|
2. Mounts your working directory at `/work`
|
|
99
144
|
3. Mounts persistent sandbox HOME at `/home/sandbox` (for npm cache, agent config)
|
|
100
145
|
4. Overlays blocked paths (`.ssh`, `.aws`, etc.) with empty mounts
|
package/dist/cli.js
CHANGED
|
@@ -110,8 +110,9 @@ configCmd
|
|
|
110
110
|
.command('get')
|
|
111
111
|
.description('Get a config value (dot-notation key)')
|
|
112
112
|
.argument('<key>', 'Config key (e.g. network.mode, session_timeout_hours)')
|
|
113
|
-
.
|
|
114
|
-
|
|
113
|
+
.option('--raw', 'Show user config value without policy overrides')
|
|
114
|
+
.action((key, opts) => {
|
|
115
|
+
const config = opts.raw ? (0, config_js_1.loadConfig)() : (0, config_js_1.loadEffectiveConfig)().config;
|
|
115
116
|
const value = getNestedValue(config, key);
|
|
116
117
|
if (value === undefined) {
|
|
117
118
|
console.error(`Unknown config key: ${key}`);
|
|
@@ -125,6 +126,13 @@ configCmd
|
|
|
125
126
|
.argument('<key>', 'Config key (e.g. network.mode, session_timeout_hours)')
|
|
126
127
|
.argument('<value>', 'Value to set')
|
|
127
128
|
.action((key, value) => {
|
|
129
|
+
// Check if field is locked by enterprise policy
|
|
130
|
+
const effective = (0, config_js_1.loadEffectiveConfig)();
|
|
131
|
+
const lockConflicts = (0, config_js_1.findLockedFieldConflicts)(key, effective.lockedFields);
|
|
132
|
+
if (effective.enterprise && lockConflicts.length > 0) {
|
|
133
|
+
console.error(`Error: "${key}" conflicts with admin-locked field(s): ${lockConflicts.join(', ')}.`);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
128
136
|
const configPath = (0, config_js_1.getConfigPath)();
|
|
129
137
|
if (!(0, fs_1.existsSync)(configPath)) {
|
|
130
138
|
console.error('No config file found. Run "labgate init" first.');
|
|
@@ -164,7 +172,8 @@ configCmd
|
|
|
164
172
|
console.error(` - ${e}`);
|
|
165
173
|
process.exit(1);
|
|
166
174
|
}
|
|
167
|
-
(0, fs_1.writeFileSync)(configPath, JSON.stringify(obj, null, 2) + '\n', 'utf-8');
|
|
175
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(obj, null, 2) + '\n', { encoding: 'utf-8', mode: config_js_1.PRIVATE_FILE_MODE });
|
|
176
|
+
(0, config_js_1.ensurePrivateFile)(configPath);
|
|
168
177
|
console.log(`Set ${key} = ${JSON.stringify(parsed)}`);
|
|
169
178
|
}
|
|
170
179
|
catch (err) {
|
|
@@ -175,9 +184,15 @@ configCmd
|
|
|
175
184
|
configCmd
|
|
176
185
|
.command('show')
|
|
177
186
|
.description('Show the full resolved config')
|
|
178
|
-
.
|
|
179
|
-
|
|
187
|
+
.option('--raw', 'Show user config without policy overrides')
|
|
188
|
+
.action((opts) => {
|
|
189
|
+
const effective = (0, config_js_1.loadEffectiveConfig)();
|
|
190
|
+
const config = opts.raw ? (0, config_js_1.loadConfig)() : effective.config;
|
|
180
191
|
console.log(JSON.stringify(config, null, 2));
|
|
192
|
+
if (!opts.raw && effective.enterprise && effective.lockedFields.size > 0) {
|
|
193
|
+
console.error(`\nEnterprise: ${effective.institution ?? 'enabled'}`);
|
|
194
|
+
console.error(`Locked fields: ${[...effective.lockedFields].join(', ')}`);
|
|
195
|
+
}
|
|
181
196
|
});
|
|
182
197
|
configCmd
|
|
183
198
|
.command('path')
|
|
@@ -213,15 +228,9 @@ program
|
|
|
213
228
|
}
|
|
214
229
|
const logFile = (0, path_1.resolve)(logDir, files[0]);
|
|
215
230
|
console.log(`Log file: ${logFile}\n`);
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
const allLines = content.split('\n');
|
|
222
|
-
const count = parseInt(opts.lines, 10) || 20;
|
|
223
|
-
const lines = allLines.slice(-count);
|
|
224
|
-
for (const line of lines) {
|
|
231
|
+
const printLogLine = (line) => {
|
|
232
|
+
if (!line.trim())
|
|
233
|
+
return;
|
|
225
234
|
try {
|
|
226
235
|
const event = JSON.parse(line);
|
|
227
236
|
const time = event.timestamp?.slice(11, 19) ?? '??:??:??';
|
|
@@ -241,16 +250,76 @@ program
|
|
|
241
250
|
catch {
|
|
242
251
|
console.log(line);
|
|
243
252
|
}
|
|
253
|
+
};
|
|
254
|
+
const countParsed = parseInt(opts.lines, 10);
|
|
255
|
+
const count = Number.isFinite(countParsed) && countParsed > 0 ? countParsed : 20;
|
|
256
|
+
const initialContent = (0, fs_1.readFileSync)(logFile, 'utf-8');
|
|
257
|
+
if (!initialContent.trim()) {
|
|
258
|
+
console.log('Log file is empty.');
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
const allLines = initialContent.split('\n').filter(line => line.trim().length > 0);
|
|
262
|
+
const lines = allLines.slice(-count);
|
|
263
|
+
for (const line of lines) {
|
|
264
|
+
printLogLine(line);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!opts.follow)
|
|
268
|
+
return;
|
|
269
|
+
console.log('\nFollowing... Press Ctrl+C to stop.');
|
|
270
|
+
let offset = initialContent.length;
|
|
271
|
+
let remainder = '';
|
|
272
|
+
const watcher = (0, fs_1.watch)(logFile, (_eventType) => {
|
|
273
|
+
try {
|
|
274
|
+
const nextContent = (0, fs_1.readFileSync)(logFile, 'utf-8');
|
|
275
|
+
if (nextContent.length < offset) {
|
|
276
|
+
offset = 0;
|
|
277
|
+
remainder = '';
|
|
278
|
+
}
|
|
279
|
+
const chunk = nextContent.slice(offset);
|
|
280
|
+
offset = nextContent.length;
|
|
281
|
+
if (!chunk)
|
|
282
|
+
return;
|
|
283
|
+
const combined = remainder + chunk;
|
|
284
|
+
const lines = combined.split('\n');
|
|
285
|
+
remainder = lines.pop() ?? '';
|
|
286
|
+
for (const line of lines) {
|
|
287
|
+
printLogLine(line);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
// Best effort follow mode; ignore transient read errors
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
for (const sig of ['SIGINT', 'SIGTERM']) {
|
|
295
|
+
process.once(sig, () => {
|
|
296
|
+
watcher.close();
|
|
297
|
+
process.exit(0);
|
|
298
|
+
});
|
|
244
299
|
}
|
|
245
300
|
});
|
|
246
301
|
// ── labgate ui ───────────────────────────────────────────
|
|
247
302
|
program
|
|
248
303
|
.command('ui')
|
|
249
304
|
.description('Open settings dashboard in browser')
|
|
250
|
-
.option('--port <number>', '
|
|
305
|
+
.option('--port <number>', 'Listen on TCP port (requires auth token)', '')
|
|
306
|
+
.option('--socket <path>', 'Unix socket path (owner-only)')
|
|
251
307
|
.action(async (opts) => {
|
|
308
|
+
if (opts.port && opts.socket) {
|
|
309
|
+
console.error('Error: use either --port or --socket, not both.');
|
|
310
|
+
process.exit(1);
|
|
311
|
+
}
|
|
312
|
+
const parsedPort = opts.port ? parseInt(opts.port, 10) : NaN;
|
|
313
|
+
if (opts.port && (!Number.isFinite(parsedPort) || parsedPort <= 0 || parsedPort > 65535)) {
|
|
314
|
+
console.error('Error: --port must be an integer between 1 and 65535.');
|
|
315
|
+
process.exit(1);
|
|
316
|
+
}
|
|
252
317
|
const { startUI } = await import('./lib/ui.js');
|
|
253
|
-
const server = startUI(
|
|
318
|
+
const server = startUI({
|
|
319
|
+
port: Number.isFinite(parsedPort) ? parsedPort : undefined,
|
|
320
|
+
socketPath: opts.socket || (0, config_js_1.getUiSocketPath)(),
|
|
321
|
+
standalone: true,
|
|
322
|
+
});
|
|
254
323
|
// In standalone mode, keep the process alive
|
|
255
324
|
server.ref();
|
|
256
325
|
});
|
|
@@ -271,6 +340,229 @@ program
|
|
|
271
340
|
const { stopSession } = await import('./lib/container.js');
|
|
272
341
|
await stopSession(id);
|
|
273
342
|
});
|
|
343
|
+
// ── labgate restart <id> ──────────────────────────────────
|
|
344
|
+
program
|
|
345
|
+
.command('restart')
|
|
346
|
+
.description('Restart a running labgate session with fresh config')
|
|
347
|
+
.argument('<id>', 'Session ID (or prefix)')
|
|
348
|
+
.option('--dry-run', 'Show what would be done without acting')
|
|
349
|
+
.action(async (id, opts) => {
|
|
350
|
+
const { restartSession } = await import('./lib/container.js');
|
|
351
|
+
await restartSession(id, { dryRun: opts.dryRun ?? false });
|
|
352
|
+
});
|
|
353
|
+
// ── labgate slurm ────────────────────────────────────────
|
|
354
|
+
const slurmCmd = program
|
|
355
|
+
.command('slurm')
|
|
356
|
+
.description('SLURM job tracking commands');
|
|
357
|
+
slurmCmd
|
|
358
|
+
.command('status')
|
|
359
|
+
.description('List tracked SLURM jobs')
|
|
360
|
+
.option('-s, --state <state>', 'Filter by state (PENDING, RUNNING, COMPLETED, FAILED, CANCELLED, TIMEOUT)')
|
|
361
|
+
.option('-n, --limit <count>', 'Max number of jobs to show', '20')
|
|
362
|
+
.option('--search <query>', 'Search by job ID, name, or command')
|
|
363
|
+
.action((opts) => {
|
|
364
|
+
const { SlurmJobDB } = require('./lib/slurm-db.js');
|
|
365
|
+
const dbPath = (0, config_js_1.getSlurmDbPath)();
|
|
366
|
+
if (!(0, fs_1.existsSync)(dbPath)) {
|
|
367
|
+
console.log('No SLURM jobs tracked yet. Enable SLURM tracking in config: slurm.enabled = true');
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const db = new SlurmJobDB(dbPath);
|
|
371
|
+
try {
|
|
372
|
+
const limitParsed = parseInt(opts.limit, 10);
|
|
373
|
+
const limit = Number.isFinite(limitParsed) && limitParsed > 0 ? limitParsed : 20;
|
|
374
|
+
const jobs = db.listJobs({
|
|
375
|
+
state: opts.state || undefined,
|
|
376
|
+
search: opts.search || undefined,
|
|
377
|
+
limit,
|
|
378
|
+
});
|
|
379
|
+
if (jobs.length === 0) {
|
|
380
|
+
console.log('No SLURM jobs found.');
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
// Table header
|
|
384
|
+
const header = ['JOB_ID', 'NAME', 'STATE', 'PARTITION', 'NODES', 'SUBMIT_TIME', 'STDOUT', 'STDERR'];
|
|
385
|
+
const rows = jobs.map((j) => [
|
|
386
|
+
j.job_id,
|
|
387
|
+
(j.name ?? '').slice(0, 20),
|
|
388
|
+
j.state,
|
|
389
|
+
j.partition ?? '-',
|
|
390
|
+
j.nodes ?? '-',
|
|
391
|
+
j.submit_time?.slice(0, 19) ?? '-',
|
|
392
|
+
j.stdout_size != null ? `${j.stdout_size}B` : '-',
|
|
393
|
+
j.stderr_size != null ? `${j.stderr_size}B` : '-',
|
|
394
|
+
]);
|
|
395
|
+
// Compute column widths
|
|
396
|
+
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((r) => r[i].length)));
|
|
397
|
+
const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
|
|
398
|
+
console.log(header.map((h, i) => pad(h, widths[i])).join(' '));
|
|
399
|
+
console.log(widths.map((w) => '-'.repeat(w)).join(' '));
|
|
400
|
+
for (const row of rows) {
|
|
401
|
+
console.log(row.map((c, i) => pad(c, widths[i])).join(' '));
|
|
402
|
+
}
|
|
403
|
+
console.log(`\n${jobs.length} job(s) shown.`);
|
|
404
|
+
}
|
|
405
|
+
finally {
|
|
406
|
+
db.close();
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
slurmCmd
|
|
410
|
+
.command('job')
|
|
411
|
+
.description('Show details for a specific SLURM job')
|
|
412
|
+
.argument('<id>', 'SLURM job ID')
|
|
413
|
+
.action((id) => {
|
|
414
|
+
const { SlurmJobDB } = require('./lib/slurm-db.js');
|
|
415
|
+
const dbPath = (0, config_js_1.getSlurmDbPath)();
|
|
416
|
+
if (!(0, fs_1.existsSync)(dbPath)) {
|
|
417
|
+
console.error('No SLURM database found.');
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
const db = new SlurmJobDB(dbPath);
|
|
421
|
+
try {
|
|
422
|
+
const job = db.getJob(id);
|
|
423
|
+
if (!job) {
|
|
424
|
+
console.error(`Job ${id} not found.`);
|
|
425
|
+
process.exit(1);
|
|
426
|
+
}
|
|
427
|
+
console.log(JSON.stringify(job, null, 2));
|
|
428
|
+
}
|
|
429
|
+
finally {
|
|
430
|
+
db.close();
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
slurmCmd
|
|
434
|
+
.command('output')
|
|
435
|
+
.description('Print stdout or stderr of a SLURM job')
|
|
436
|
+
.argument('<id>', 'SLURM job ID')
|
|
437
|
+
.option('--stderr', 'Show stderr instead of stdout')
|
|
438
|
+
.option('--tail <lines>', 'Number of lines from the end', '50')
|
|
439
|
+
.action((id, opts) => {
|
|
440
|
+
const { SlurmJobDB } = require('./lib/slurm-db.js');
|
|
441
|
+
const dbPath = (0, config_js_1.getSlurmDbPath)();
|
|
442
|
+
if (!(0, fs_1.existsSync)(dbPath)) {
|
|
443
|
+
console.error('No SLURM database found.');
|
|
444
|
+
process.exit(1);
|
|
445
|
+
}
|
|
446
|
+
const db = new SlurmJobDB(dbPath);
|
|
447
|
+
try {
|
|
448
|
+
const job = db.getJob(id);
|
|
449
|
+
if (!job) {
|
|
450
|
+
console.error(`Job ${id} not found.`);
|
|
451
|
+
process.exit(1);
|
|
452
|
+
}
|
|
453
|
+
const filePath = opts.stderr ? job.stderr_path : job.stdout_path;
|
|
454
|
+
const stream = opts.stderr ? 'stderr' : 'stdout';
|
|
455
|
+
if (!filePath) {
|
|
456
|
+
console.error(`No ${stream} path recorded for job ${id}.`);
|
|
457
|
+
process.exit(1);
|
|
458
|
+
}
|
|
459
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
460
|
+
console.error(`${stream} file does not exist: ${filePath}`);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
}
|
|
463
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
464
|
+
const tailParsed = parseInt(opts.tail, 10);
|
|
465
|
+
const tailCount = Number.isFinite(tailParsed) && tailParsed > 0 ? tailParsed : 50;
|
|
466
|
+
const lines = content.split('\n');
|
|
467
|
+
const tail = lines.slice(-tailCount);
|
|
468
|
+
console.log(`=== ${stream} for job ${id} (last ${tailCount} lines) ===`);
|
|
469
|
+
console.log(tail.join('\n'));
|
|
470
|
+
}
|
|
471
|
+
finally {
|
|
472
|
+
db.close();
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
slurmCmd
|
|
476
|
+
.command('cancel')
|
|
477
|
+
.description('Cancel a pending or running SLURM job')
|
|
478
|
+
.argument('<id>', 'SLURM job ID')
|
|
479
|
+
.action(async (id) => {
|
|
480
|
+
const { SlurmJobDB, TERMINAL_STATES } = require('./lib/slurm-db.js');
|
|
481
|
+
const dbPath = (0, config_js_1.getSlurmDbPath)();
|
|
482
|
+
if (!(0, fs_1.existsSync)(dbPath)) {
|
|
483
|
+
console.error('No SLURM database found.');
|
|
484
|
+
process.exit(1);
|
|
485
|
+
}
|
|
486
|
+
const db = new SlurmJobDB(dbPath);
|
|
487
|
+
try {
|
|
488
|
+
const job = db.getJob(id);
|
|
489
|
+
if (!job) {
|
|
490
|
+
console.error(`Job ${id} not found.`);
|
|
491
|
+
process.exit(1);
|
|
492
|
+
}
|
|
493
|
+
if (TERMINAL_STATES.has(job.state)) {
|
|
494
|
+
console.error(`Job ${id} is already in terminal state: ${job.state}`);
|
|
495
|
+
process.exit(1);
|
|
496
|
+
}
|
|
497
|
+
const { execFile } = await import('child_process');
|
|
498
|
+
const { promisify } = await import('util');
|
|
499
|
+
const execFileAsync = promisify(execFile);
|
|
500
|
+
await execFileAsync('scancel', [id], { timeout: 10_000 });
|
|
501
|
+
db.upsertJob({ job_id: id, state: 'CANCELLED' });
|
|
502
|
+
console.log(`Job ${id} has been cancelled.`);
|
|
503
|
+
}
|
|
504
|
+
catch (err) {
|
|
505
|
+
console.error(`Failed to cancel job ${id}: ${err.message}`);
|
|
506
|
+
process.exit(1);
|
|
507
|
+
}
|
|
508
|
+
finally {
|
|
509
|
+
db.close();
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
slurmCmd
|
|
513
|
+
.command('mcp')
|
|
514
|
+
.description('Run the SLURM MCP server over stdio')
|
|
515
|
+
.option('--db <path>', 'Override SLURM SQLite DB path')
|
|
516
|
+
.action(async (opts) => {
|
|
517
|
+
const config = (0, config_js_1.loadConfig)();
|
|
518
|
+
if (!config.slurm.enabled) {
|
|
519
|
+
console.error('SLURM tracking is disabled (slurm.enabled=false).');
|
|
520
|
+
process.exit(1);
|
|
521
|
+
}
|
|
522
|
+
if (!config.slurm.mcp_server) {
|
|
523
|
+
console.error('SLURM MCP server is disabled (slurm.mcp_server=false).');
|
|
524
|
+
process.exit(1);
|
|
525
|
+
}
|
|
526
|
+
process.env.LABGATE_SLURM_DB = opts.db ? (0, path_1.resolve)(opts.db) : (0, config_js_1.getSlurmDbPath)();
|
|
527
|
+
const { main } = await import('./lib/slurm-mcp.js');
|
|
528
|
+
await main();
|
|
529
|
+
});
|
|
530
|
+
// ── labgate license ──────────────────────────────────────
|
|
531
|
+
program
|
|
532
|
+
.command('license')
|
|
533
|
+
.description('Show enterprise license status')
|
|
534
|
+
.action(async () => {
|
|
535
|
+
const { validateLicense } = await import('./lib/license.js');
|
|
536
|
+
const status = validateLicense();
|
|
537
|
+
if (!status.filePath && !status.error) {
|
|
538
|
+
console.log('No enterprise license found.');
|
|
539
|
+
console.log('License file locations (checked in order):');
|
|
540
|
+
console.log(' 1. $LABGATE_LICENSE_PATH (env var)');
|
|
541
|
+
console.log(' 2. /etc/labgate/license.key');
|
|
542
|
+
console.log(' 3. ~/.labgate/license.key');
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
if (status.filePath) {
|
|
546
|
+
console.log(`License file: ${status.filePath}`);
|
|
547
|
+
}
|
|
548
|
+
if (status.error) {
|
|
549
|
+
console.log(`Status: INVALID — ${status.error}`);
|
|
550
|
+
if (status.payload) {
|
|
551
|
+
console.log(`Institution: ${status.payload.institution}`);
|
|
552
|
+
console.log(`Expires: ${status.payload.expires}`);
|
|
553
|
+
}
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
if (status.valid && status.payload) {
|
|
557
|
+
console.log(`Status: VALID`);
|
|
558
|
+
console.log(`Institution: ${status.payload.institution}`);
|
|
559
|
+
console.log(`Tier: ${status.payload.tier}`);
|
|
560
|
+
console.log(`License ID: ${status.payload.id}`);
|
|
561
|
+
console.log(`Issued: ${status.payload.issued}`);
|
|
562
|
+
console.log(`Expires: ${status.payload.expires}`);
|
|
563
|
+
console.log(`Days remaining: ${status.daysRemaining}`);
|
|
564
|
+
}
|
|
565
|
+
});
|
|
274
566
|
// ── Dot-notation helpers ──────────────────────────────────
|
|
275
567
|
function getNestedValue(obj, key) {
|
|
276
568
|
const parts = key.split('.');
|
|
@@ -306,10 +598,12 @@ async function runAgent(agent, workdir, opts) {
|
|
|
306
598
|
if (!(0, fs_1.existsSync)(cfgPath)) {
|
|
307
599
|
await (0, init_js_1.initConfig)({ force: false, quiet: true });
|
|
308
600
|
}
|
|
309
|
-
|
|
601
|
+
// Use effective config (merges user config with admin policy if enterprise)
|
|
602
|
+
const effective = (0, config_js_1.loadEffectiveConfig)();
|
|
603
|
+
const config = effective.config;
|
|
310
604
|
if (verbose) {
|
|
311
605
|
log.header('Config');
|
|
312
|
-
|
|
606
|
+
const rows = [
|
|
313
607
|
['File', cfgPath],
|
|
314
608
|
['Runtime', config.runtime],
|
|
315
609
|
['Image', opts.image ?? config.image],
|
|
@@ -318,7 +612,14 @@ async function runAgent(agent, workdir, opts) {
|
|
|
318
612
|
['Blacklist', config.commands.blacklist.join(', ')],
|
|
319
613
|
['Mounts', `${config.filesystem.extra_paths.length} extra`],
|
|
320
614
|
['Home', `${config_js_1.LABGATE_DIR}/ai-home`],
|
|
321
|
-
]
|
|
615
|
+
];
|
|
616
|
+
if (effective.enterprise) {
|
|
617
|
+
rows.push(['Enterprise', `${effective.institution ?? 'enabled'}`]);
|
|
618
|
+
if (effective.lockedFields.size > 0) {
|
|
619
|
+
rows.push(['Locked', `${effective.lockedFields.size} fields`]);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
log.table(rows);
|
|
322
623
|
console.error('');
|
|
323
624
|
}
|
|
324
625
|
// Check container runtime is available — offer to install if missing
|
|
@@ -341,6 +642,8 @@ async function runAgent(agent, workdir, opts) {
|
|
|
341
642
|
imageOverride: opts.image,
|
|
342
643
|
apiKey: opts.apiKey,
|
|
343
644
|
footerMode: opts.footer === false ? 'off' : 'once',
|
|
645
|
+
sharedSessionsDir: effective.sharedSessionsDir,
|
|
646
|
+
sharedAuditDir: effective.sharedAuditDir,
|
|
344
647
|
});
|
|
345
648
|
}
|
|
346
649
|
program.parse();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/audit.d.ts
CHANGED
|
@@ -5,4 +5,8 @@ export interface AuditEvent {
|
|
|
5
5
|
event: string;
|
|
6
6
|
[key: string]: unknown;
|
|
7
7
|
}
|
|
8
|
-
export
|
|
8
|
+
export interface WriteAuditOptions {
|
|
9
|
+
/** Enterprise: shared audit dir for admin visibility */
|
|
10
|
+
sharedAuditDir?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function writeAuditEvent(config: LabgateConfig, event: AuditEvent, options?: WriteAuditOptions): void;
|
package/dist/lib/audit.js
CHANGED
|
@@ -6,20 +6,36 @@ const path_1 = require("path");
|
|
|
6
6
|
const config_js_1 = require("./config.js");
|
|
7
7
|
function getLogFile(config) {
|
|
8
8
|
const dir = (0, config_js_1.getLogDir)(config);
|
|
9
|
-
(0,
|
|
9
|
+
(0, config_js_1.ensurePrivateDir)(dir);
|
|
10
10
|
const date = new Date().toISOString().slice(0, 10);
|
|
11
11
|
return (0, path_1.join)(dir, `${date}.jsonl`);
|
|
12
12
|
}
|
|
13
|
-
function writeAuditEvent(config, event) {
|
|
13
|
+
function writeAuditEvent(config, event, options) {
|
|
14
14
|
if (!config.audit.enabled)
|
|
15
15
|
return;
|
|
16
|
+
const line = JSON.stringify(event) + '\n';
|
|
16
17
|
try {
|
|
17
18
|
const file = getLogFile(config);
|
|
18
|
-
(0, fs_1.appendFileSync)(file,
|
|
19
|
+
(0, fs_1.appendFileSync)(file, line, { encoding: 'utf-8', flag: 'a', mode: config_js_1.PRIVATE_FILE_MODE });
|
|
20
|
+
(0, config_js_1.ensurePrivateFile)(file);
|
|
19
21
|
}
|
|
20
22
|
catch (err) {
|
|
21
23
|
// Don't crash if audit logging fails — just warn
|
|
22
24
|
console.error(`! Audit log write failed: ${err.message}`);
|
|
23
25
|
}
|
|
26
|
+
// Enterprise: also write to shared audit dir for admin visibility
|
|
27
|
+
if (options?.sharedAuditDir) {
|
|
28
|
+
try {
|
|
29
|
+
if (!(0, fs_1.existsSync)(options.sharedAuditDir)) {
|
|
30
|
+
(0, fs_1.mkdirSync)(options.sharedAuditDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
33
|
+
const sharedFile = (0, path_1.join)(options.sharedAuditDir, `${date}.jsonl`);
|
|
34
|
+
(0, fs_1.appendFileSync)(sharedFile, line, { encoding: 'utf-8', flag: 'a', mode: 0o664 });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Best effort; shared dir may not be writable
|
|
38
|
+
}
|
|
39
|
+
}
|
|
24
40
|
}
|
|
25
41
|
//# sourceMappingURL=audit.js.map
|
package/dist/lib/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/lib/audit.ts"],"names":[],"mappings":";;AAwBA,0CA2BC;AAnDD,2BAA2D;AAC3D,+BAA4B;AAE5B,2CAA+G;AAS/G,SAAS,UAAU,CAAC,MAAqB;IACvC,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,4BAAgB,EAAC,GAAG,CAAC,CAAC;IACtB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO,IAAA,WAAI,EAAC,GAAG,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;AACpC,CAAC;AAOD,SAAgB,eAAe,CAAC,MAAqB,EAAE,KAAiB,EAAE,OAA2B;IACnG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAChC,IAAA,mBAAc,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,6BAAiB,EAAE,CAAC,CAAC;QACtF,IAAA,6BAAiB,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,iDAAiD;QACjD,OAAO,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,kEAAkE;IAClE,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,IAAI,CAAC,IAAA,eAAU,EAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,IAAA,cAAS,EAAC,OAAO,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,cAAc,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;YACjE,IAAA,mBAAc,EAAC,UAAU,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;AACH,CAAC"}
|