labgate 0.4.2 → 0.5.0

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/lib/ui.js ADDED
@@ -0,0 +1,249 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startUI = startUI;
37
+ const http_1 = require("http");
38
+ const fs_1 = require("fs");
39
+ const path_1 = require("path");
40
+ const child_process_1 = require("child_process");
41
+ const config_js_1 = require("./config.js");
42
+ const runtime_js_1 = require("./runtime.js");
43
+ const log = __importStar(require("./log.js"));
44
+ const HTML_PATH = (0, path_1.resolve)(__dirname, '..', 'lib', 'ui.html');
45
+ function readBody(req) {
46
+ return new Promise((resolve, reject) => {
47
+ const chunks = [];
48
+ req.on('data', (chunk) => chunks.push(chunk));
49
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
50
+ req.on('error', reject);
51
+ });
52
+ }
53
+ function json(res, data, status = 200) {
54
+ res.writeHead(status, { 'Content-Type': 'application/json' });
55
+ res.end(JSON.stringify(data));
56
+ }
57
+ function serveHTML(res) {
58
+ try {
59
+ const html = (0, fs_1.readFileSync)(HTML_PATH, 'utf-8');
60
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
61
+ res.end(html);
62
+ }
63
+ catch {
64
+ res.writeHead(500, { 'Content-Type': 'text/plain' });
65
+ res.end('Could not load UI HTML');
66
+ }
67
+ }
68
+ function handleGetConfig(_req, res) {
69
+ const config = (0, config_js_1.loadConfig)();
70
+ json(res, config);
71
+ }
72
+ async function handlePostConfig(req, res) {
73
+ try {
74
+ const body = await readBody(req);
75
+ const incoming = JSON.parse(body);
76
+ const errors = (0, config_js_1.validateConfig)(incoming);
77
+ if (errors.length > 0) {
78
+ json(res, { ok: false, errors }, 400);
79
+ return;
80
+ }
81
+ const configPath = (0, config_js_1.getConfigPath)();
82
+ // Read existing raw file and parse (strip comments)
83
+ let obj = {};
84
+ if ((0, fs_1.existsSync)(configPath)) {
85
+ const rawText = (0, fs_1.readFileSync)(configPath, 'utf-8');
86
+ const stripped = rawText
87
+ .split('\n')
88
+ .filter(line => !line.trimStart().startsWith('//'))
89
+ .join('\n');
90
+ try {
91
+ obj = JSON.parse(stripped);
92
+ }
93
+ catch {
94
+ obj = {};
95
+ }
96
+ }
97
+ // Merge incoming config
98
+ obj.runtime = incoming.runtime;
99
+ obj.image = incoming.image;
100
+ obj.session_timeout_hours = incoming.session_timeout_hours;
101
+ obj.filesystem = incoming.filesystem;
102
+ obj.commands = incoming.commands;
103
+ obj.network = incoming.network;
104
+ obj.audit = incoming.audit;
105
+ if (incoming.slurm)
106
+ obj.slurm = incoming.slurm;
107
+ const { writeFileSync } = await import('fs');
108
+ writeFileSync(configPath, JSON.stringify(obj, null, 2) + '\n', 'utf-8');
109
+ json(res, { ok: true });
110
+ }
111
+ catch (err) {
112
+ json(res, { ok: false, errors: [err.message ?? String(err)] }, 400);
113
+ }
114
+ }
115
+ function handleGetConfigPath(_req, res) {
116
+ json(res, { path: (0, config_js_1.getConfigPath)() });
117
+ }
118
+ function handleGetSessions(_req, res) {
119
+ const config = (0, config_js_1.loadConfig)();
120
+ const check = (0, runtime_js_1.checkRuntime)(config.runtime);
121
+ if (!check.ok || !check.runtime) {
122
+ json(res, { sessions: [], message: 'No container runtime found' });
123
+ return;
124
+ }
125
+ const runtime = check.runtime;
126
+ if ((0, runtime_js_1.isApptainerFamily)(runtime)) {
127
+ json(res, { sessions: [], message: 'Apptainer sessions run as processes. Use: ps aux | grep apptainer' });
128
+ return;
129
+ }
130
+ try {
131
+ const output = (0, child_process_1.execFileSync)(runtime, [
132
+ 'ps',
133
+ '--filter', 'name=labgate-',
134
+ '--format', '{{.Names}}\t{{.Status}}\t{{.RunningFor}}',
135
+ ], { encoding: 'utf-8', timeout: 5000 }).trim();
136
+ if (!output) {
137
+ json(res, { sessions: [] });
138
+ return;
139
+ }
140
+ const sessions = output.split('\n').map(line => {
141
+ const parts = line.split('\t');
142
+ return { name: parts[0] || '', status: parts[1] || '', running: parts[2] || '' };
143
+ });
144
+ json(res, { sessions });
145
+ }
146
+ catch {
147
+ json(res, { sessions: [] });
148
+ }
149
+ }
150
+ function handleGetLogs(_req, res) {
151
+ const config = (0, config_js_1.loadConfig)();
152
+ if (!config.audit.enabled) {
153
+ json(res, { entries: [], message: 'Audit logging is disabled' });
154
+ return;
155
+ }
156
+ const logDir = (0, config_js_1.getLogDir)(config);
157
+ if (!(0, fs_1.existsSync)(logDir)) {
158
+ json(res, { entries: [], message: 'No audit logs found yet' });
159
+ return;
160
+ }
161
+ const files = (0, fs_1.readdirSync)(logDir)
162
+ .filter((f) => f.endsWith('.jsonl'))
163
+ .sort()
164
+ .reverse();
165
+ if (files.length === 0) {
166
+ json(res, { entries: [], message: 'No audit logs found yet' });
167
+ return;
168
+ }
169
+ const logFile = (0, path_1.resolve)(logDir, files[0]);
170
+ try {
171
+ const content = (0, fs_1.readFileSync)(logFile, 'utf-8').trim();
172
+ if (!content) {
173
+ json(res, { entries: [], message: 'Log file is empty' });
174
+ return;
175
+ }
176
+ const allLines = content.split('\n');
177
+ const lines = allLines.slice(-50);
178
+ const entries = lines
179
+ .map(line => { try {
180
+ return JSON.parse(line);
181
+ }
182
+ catch {
183
+ return null;
184
+ } })
185
+ .filter(Boolean)
186
+ .reverse();
187
+ json(res, { entries });
188
+ }
189
+ catch (err) {
190
+ json(res, { entries: [], message: 'Could not read log file: ' + (err.message ?? String(err)) });
191
+ }
192
+ }
193
+ /**
194
+ * Start the settings UI server.
195
+ * Returns the HTTP server so callers can close it when done.
196
+ * In standalone mode (`labgate ui`), pass standalone=true for extra logging.
197
+ */
198
+ function startUI(port, standalone = true) {
199
+ const server = (0, http_1.createServer)(async (req, res) => {
200
+ const url = req.url ?? '/';
201
+ const method = req.method ?? 'GET';
202
+ res.setHeader('Access-Control-Allow-Origin', '*');
203
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
204
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
205
+ if (method === 'OPTIONS') {
206
+ res.writeHead(204);
207
+ res.end();
208
+ return;
209
+ }
210
+ try {
211
+ if (url === '/' && method === 'GET') {
212
+ serveHTML(res);
213
+ }
214
+ else if (url === '/api/config' && method === 'GET') {
215
+ handleGetConfig(req, res);
216
+ }
217
+ else if (url === '/api/config' && method === 'POST') {
218
+ await handlePostConfig(req, res);
219
+ }
220
+ else if (url === '/api/config/path' && method === 'GET') {
221
+ handleGetConfigPath(req, res);
222
+ }
223
+ else if (url === '/api/sessions' && method === 'GET') {
224
+ handleGetSessions(req, res);
225
+ }
226
+ else if (url === '/api/logs' && method === 'GET') {
227
+ handleGetLogs(req, res);
228
+ }
229
+ else {
230
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
231
+ res.end('Not found');
232
+ }
233
+ }
234
+ catch (err) {
235
+ res.writeHead(500, { 'Content-Type': 'text/plain' });
236
+ res.end('Internal server error');
237
+ }
238
+ });
239
+ server.listen(port, '127.0.0.1', () => {
240
+ log.step(`Settings: http://127.0.0.1:${port}`);
241
+ if (standalone) {
242
+ log.step('Press Ctrl+C to stop');
243
+ }
244
+ });
245
+ // Don't keep the process alive just for the UI server
246
+ server.unref();
247
+ return server;
248
+ }
249
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "labgate",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Policy-controlled sandboxes for LLM coding agents on HPC",
5
5
  "bin": {
6
6
  "labgate": "bin/labgate.js"
7
7
  },
8
8
  "scripts": {
9
- "build": "tsc",
9
+ "build": "tsc && cp src/lib/ui.html dist/lib/ui.html",
10
10
  "dev": "tsc --watch",
11
11
  "start": "node bin/labgate.js",
12
12
  "test": "vitest run",