labgate 0.5.3 → 0.5.5

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 +49 -4
  2. package/dist/cli.js +322 -19
  3. package/dist/cli.js.map +1 -1
  4. package/dist/lib/audit.d.ts +5 -1
  5. package/dist/lib/audit.js +19 -3
  6. package/dist/lib/audit.js.map +1 -1
  7. package/dist/lib/config.d.ts +71 -2
  8. package/dist/lib/config.js +192 -8
  9. package/dist/lib/config.js.map +1 -1
  10. package/dist/lib/container.d.ts +54 -0
  11. package/dist/lib/container.js +650 -178
  12. package/dist/lib/container.js.map +1 -1
  13. package/dist/lib/init.js +22 -9
  14. package/dist/lib/init.js.map +1 -1
  15. package/dist/lib/license.d.ts +44 -0
  16. package/dist/lib/license.js +164 -0
  17. package/dist/lib/license.js.map +1 -0
  18. package/dist/lib/policy.d.ts +85 -0
  19. package/dist/lib/policy.js +321 -0
  20. package/dist/lib/policy.js.map +1 -0
  21. package/dist/lib/runtime.d.ts +2 -2
  22. package/dist/lib/runtime.js +19 -36
  23. package/dist/lib/runtime.js.map +1 -1
  24. package/dist/lib/slurm-db.d.ts +51 -0
  25. package/dist/lib/slurm-db.js +179 -0
  26. package/dist/lib/slurm-db.js.map +1 -0
  27. package/dist/lib/slurm-mcp.d.ts +12 -0
  28. package/dist/lib/slurm-mcp.js +347 -0
  29. package/dist/lib/slurm-mcp.js.map +1 -0
  30. package/dist/lib/slurm-poller.d.ts +36 -0
  31. package/dist/lib/slurm-poller.js +423 -0
  32. package/dist/lib/slurm-poller.js.map +1 -0
  33. package/dist/lib/test/integration-harness.d.ts +44 -0
  34. package/dist/lib/test/integration-harness.js +260 -0
  35. package/dist/lib/test/integration-harness.js.map +1 -0
  36. package/dist/lib/ui.d.ts +34 -1
  37. package/dist/lib/ui.html +3081 -356
  38. package/dist/lib/ui.js +2123 -106
  39. package/dist/lib/ui.js.map +1 -1
  40. package/package.json +13 -4
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DashboardIntegrationHarness = void 0;
4
+ exports.waitFor = waitFor;
5
+ exports.stopProcess = stopProcess;
6
+ const fs_1 = require("fs");
7
+ const os_1 = require("os");
8
+ const path_1 = require("path");
9
+ const child_process_1 = require("child_process");
10
+ const http_1 = require("http");
11
+ async function waitFor(producer, timeoutMs = 15_000, intervalMs = 200) {
12
+ const deadline = Date.now() + timeoutMs;
13
+ while (Date.now() < deadline) {
14
+ const value = await producer();
15
+ if (value !== null)
16
+ return value;
17
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
18
+ }
19
+ throw new Error(`Timed out after ${timeoutMs}ms`);
20
+ }
21
+ async function getFreePort() {
22
+ return new Promise((resolve, reject) => {
23
+ const server = (0, http_1.createServer)();
24
+ server.on('error', reject);
25
+ server.listen(0, '127.0.0.1', () => {
26
+ const address = server.address();
27
+ const port = typeof address === 'object' && address ? address.port : 0;
28
+ server.close((err) => {
29
+ if (err) {
30
+ reject(err);
31
+ return;
32
+ }
33
+ resolve(port);
34
+ });
35
+ });
36
+ });
37
+ }
38
+ function spawnLabgate(repoDir, args, env) {
39
+ const proc = (0, child_process_1.spawn)(process.execPath, ['dist/cli.js', ...args], {
40
+ cwd: repoDir,
41
+ env,
42
+ stdio: ['ignore', 'pipe', 'pipe'],
43
+ });
44
+ const handle = { proc, stdout: '', stderr: '' };
45
+ proc.stdout?.on('data', (chunk) => {
46
+ handle.stdout += chunk.toString();
47
+ });
48
+ proc.stderr?.on('data', (chunk) => {
49
+ handle.stderr += chunk.toString();
50
+ });
51
+ return handle;
52
+ }
53
+ function waitForExit(proc, timeoutMs = 5_000) {
54
+ return new Promise((resolve) => {
55
+ if (proc.exitCode !== null) {
56
+ resolve(true);
57
+ return;
58
+ }
59
+ const timer = setTimeout(() => {
60
+ cleanup();
61
+ resolve(false);
62
+ }, timeoutMs);
63
+ const onExit = () => {
64
+ cleanup();
65
+ resolve(true);
66
+ };
67
+ const cleanup = () => {
68
+ clearTimeout(timer);
69
+ proc.off('exit', onExit);
70
+ proc.off('close', onExit);
71
+ };
72
+ proc.on('exit', onExit);
73
+ proc.on('close', onExit);
74
+ });
75
+ }
76
+ async function stopProcess(handle) {
77
+ if (!handle)
78
+ return;
79
+ const proc = handle.proc;
80
+ if (proc.exitCode !== null)
81
+ return;
82
+ proc.kill('SIGTERM');
83
+ const exited = await waitForExit(proc, 6_000);
84
+ if (exited)
85
+ return;
86
+ proc.kill('SIGKILL');
87
+ await waitForExit(proc, 2_000);
88
+ }
89
+ class DashboardIntegrationHarness {
90
+ repoDir;
91
+ tempRoot = '';
92
+ homeDir = '';
93
+ workdir = '';
94
+ port = 0;
95
+ env = {};
96
+ ui = null;
97
+ accessToken = '';
98
+ writeToken = '';
99
+ agents = new Set();
100
+ constructor(repoDir) {
101
+ this.repoDir = repoDir;
102
+ }
103
+ async setup() {
104
+ this.tempRoot = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), 'labgate-integration-'));
105
+ this.homeDir = (0, path_1.join)(this.tempRoot, 'home');
106
+ this.workdir = (0, path_1.join)(this.tempRoot, 'workspace');
107
+ const fakeBin = (0, path_1.join)(this.tempRoot, 'fake-bin');
108
+ (0, fs_1.mkdirSync)(this.homeDir, { recursive: true });
109
+ (0, fs_1.mkdirSync)(this.workdir, { recursive: true });
110
+ (0, fs_1.mkdirSync)(fakeBin, { recursive: true });
111
+ const configDir = (0, path_1.join)(this.homeDir, '.labgate');
112
+ (0, fs_1.mkdirSync)(configDir, { recursive: true });
113
+ (0, fs_1.writeFileSync)((0, path_1.join)(configDir, 'config.json'), JSON.stringify({
114
+ runtime: 'apptainer',
115
+ image: 'docker.io/library/node:20-slim',
116
+ session_timeout_hours: 1,
117
+ filesystem: { extra_paths: [], blocked_patterns: [] },
118
+ commands: { blacklist: [] },
119
+ network: { mode: 'none', allowed_domains: [] },
120
+ slurm: { enabled: false },
121
+ audit: { enabled: false, log_dir: '~/.labgate/logs' },
122
+ }, null, 2) + '\n', 'utf-8');
123
+ const fakeApptainer = `#!/bin/sh
124
+ cmd="$1"
125
+ shift || true
126
+ case "$cmd" in
127
+ --version)
128
+ echo "apptainer version 1.3.0"
129
+ exit 0
130
+ ;;
131
+ pull)
132
+ sif="$1"
133
+ mkdir -p "$(dirname "$sif")"
134
+ : > "$sif"
135
+ exit 0
136
+ ;;
137
+ exec)
138
+ trap 'exit 0' INT TERM
139
+ while :; do
140
+ sleep 1
141
+ done
142
+ ;;
143
+ *)
144
+ exit 0
145
+ ;;
146
+ esac
147
+ `;
148
+ const apptainerPath = (0, path_1.join)(fakeBin, 'apptainer');
149
+ (0, fs_1.writeFileSync)(apptainerPath, fakeApptainer, 'utf-8');
150
+ (0, fs_1.chmodSync)(apptainerPath, 0o755);
151
+ this.env = {
152
+ ...process.env,
153
+ HOME: this.homeDir,
154
+ PATH: `${fakeBin}${path_1.delimiter}${process.env.PATH ?? ''}`,
155
+ };
156
+ this.port = await getFreePort();
157
+ this.ui = spawnLabgate(this.repoDir, ['ui', '--port', String(this.port)], this.env);
158
+ this.accessToken = await waitFor(async () => {
159
+ const output = `${this.ui?.stdout || ''}\n${this.ui?.stderr || ''}`;
160
+ const match = output.match(new RegExp(`Settings: http://localhost:${this.port}/\\?token=([a-f0-9]+)`));
161
+ return match?.[1] || null;
162
+ }, 20_000, 250);
163
+ this.writeToken = await waitFor(async () => {
164
+ try {
165
+ const res = await fetch(`http://127.0.0.1:${this.port}/?token=${encodeURIComponent(this.accessToken)}`);
166
+ if (!res.ok)
167
+ return null;
168
+ const html = await res.text();
169
+ const match = html.match(/var LABGATE_WRITE_TOKEN = '([a-f0-9]+)';/);
170
+ return match?.[1] || null;
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }, 20_000, 250);
176
+ await waitFor(async () => {
177
+ try {
178
+ await this.fetchSessions();
179
+ return true;
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }, 20_000, 250);
185
+ }
186
+ async teardown() {
187
+ await this.stopAllAgents();
188
+ await stopProcess(this.ui);
189
+ this.ui = null;
190
+ if (this.tempRoot) {
191
+ (0, fs_1.rmSync)(this.tempRoot, { recursive: true, force: true });
192
+ this.tempRoot = '';
193
+ }
194
+ }
195
+ async startAgent(agent) {
196
+ const handle = spawnLabgate(this.repoDir, [agent, this.workdir, '--no-footer'], this.env);
197
+ this.agents.add(handle);
198
+ return handle;
199
+ }
200
+ async stopAgent(handle) {
201
+ await stopProcess(handle);
202
+ if (handle)
203
+ this.agents.delete(handle);
204
+ }
205
+ async stopAllAgents() {
206
+ for (const handle of [...this.agents]) {
207
+ await this.stopAgent(handle);
208
+ }
209
+ }
210
+ async fetchSessions() {
211
+ const res = await fetch(`http://127.0.0.1:${this.port}/api/sessions`, {
212
+ headers: { 'X-LabGate-Auth': this.accessToken },
213
+ });
214
+ if (!res.ok) {
215
+ throw new Error(`HTTP ${res.status}`);
216
+ }
217
+ return (await res.json());
218
+ }
219
+ async waitForSession(agent, timeoutMs = 20_000) {
220
+ return waitFor(async () => {
221
+ try {
222
+ const data = await this.fetchSessions();
223
+ return data.sessions.find((s) => s.agent === agent && s.workdir === this.workdir) ?? null;
224
+ }
225
+ catch {
226
+ return null;
227
+ }
228
+ }, timeoutMs, 250);
229
+ }
230
+ async waitForNoSessions(timeoutMs = 12_000) {
231
+ await waitFor(async () => {
232
+ try {
233
+ const data = await this.fetchSessions();
234
+ return data.sessions.length === 0 ? true : null;
235
+ }
236
+ catch {
237
+ return null;
238
+ }
239
+ }, timeoutMs, 250);
240
+ }
241
+ async stopSessionViaApi(id) {
242
+ const res = await fetch(`http://127.0.0.1:${this.port}/api/sessions/stop`, {
243
+ method: 'POST',
244
+ headers: {
245
+ 'Content-Type': 'application/json',
246
+ 'X-LabGate-Auth': this.accessToken,
247
+ 'X-LabGate-Token': this.writeToken,
248
+ },
249
+ body: JSON.stringify({ id }),
250
+ });
251
+ return (await res.json());
252
+ }
253
+ async waitForProcessExit(handle, timeoutMs = 12_000) {
254
+ await waitFor(async () => {
255
+ return handle.proc.exitCode !== null ? true : null;
256
+ }, timeoutMs, 200);
257
+ }
258
+ }
259
+ exports.DashboardIntegrationHarness = DashboardIntegrationHarness;
260
+ //# sourceMappingURL=integration-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-harness.js","sourceRoot":"","sources":["../../../src/lib/test/integration-harness.ts"],"names":[],"mappings":"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"}
package/dist/lib/ui.d.ts CHANGED
@@ -1,7 +1,40 @@
1
+ export type ActivityStatus = 'thinking' | 'tool_use' | 'waiting' | 'idle' | 'unknown';
2
+ export interface FileAccess {
3
+ name: string;
4
+ path: string;
5
+ accessedAt: number;
6
+ isDir: boolean;
7
+ }
8
+ export interface WebsiteAccess {
9
+ url: string;
10
+ host: string;
11
+ accessedAt: number;
12
+ }
13
+ export interface ClaudeActivity {
14
+ status: ActivityStatus;
15
+ label: string;
16
+ detail: string;
17
+ prompt: string;
18
+ since: number;
19
+ lastActive: number;
20
+ files: FileAccess[];
21
+ websites: WebsiteAccess[];
22
+ }
23
+ export interface ContainerStats {
24
+ cpuPercent: number;
25
+ memUsageMB: number;
26
+ memLimitMB: number;
27
+ memPercent: number;
28
+ }
1
29
  import type { Server } from 'http';
30
+ export interface UIStartOptions {
31
+ port?: number;
32
+ socketPath?: string;
33
+ standalone?: boolean;
34
+ }
2
35
  /**
3
36
  * Start the settings UI server.
4
37
  * Returns the HTTP server so callers can close it when done.
5
38
  * In standalone mode (`labgate ui`), pass standalone=true for extra logging.
6
39
  */
7
- export declare function startUI(port: number, standalone?: boolean): Server;
40
+ export declare function startUI(optsOrPort?: number | UIStartOptions, standaloneArg?: boolean): Server;