labgate 0.5.3 → 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.
Files changed (40) hide show
  1. package/README.md +48 -3
  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 +11 -3
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSystemPolicyDir = getSystemPolicyDir;
4
+ exports.getSystemPolicyPath = getSystemPolicyPath;
5
+ exports.findPolicyFile = findPolicyFile;
6
+ exports.loadPolicy = loadPolicy;
7
+ exports.validatePolicy = validatePolicy;
8
+ exports.checkIsAdmin = checkIsAdmin;
9
+ exports.mergeWithPolicy = mergeWithPolicy;
10
+ exports.savePolicy = savePolicy;
11
+ const fs_1 = require("fs");
12
+ const path_1 = require("path");
13
+ const os_1 = require("os");
14
+ const crypto_1 = require("crypto");
15
+ // ── Constants ─────────────────────────────────────────────
16
+ const SYSTEM_POLICY_DIR = '/etc/labgate';
17
+ const SYSTEM_POLICY_FILE = 'policy.json';
18
+ // ── File discovery ────────────────────────────────────────
19
+ function getSystemPolicyDir() {
20
+ return process.env.LABGATE_POLICY_DIR ?? SYSTEM_POLICY_DIR;
21
+ }
22
+ function getSystemPolicyPath() {
23
+ const envPath = process.env.LABGATE_POLICY_PATH;
24
+ if (envPath)
25
+ return envPath;
26
+ return (0, path_1.join)(getSystemPolicyDir(), SYSTEM_POLICY_FILE);
27
+ }
28
+ /**
29
+ * Search for a policy file. Returns the path if found, null otherwise.
30
+ */
31
+ function findPolicyFile() {
32
+ const candidates = [];
33
+ // 1. Env var override
34
+ const envPath = process.env.LABGATE_POLICY_PATH;
35
+ if (envPath) {
36
+ candidates.push(envPath);
37
+ }
38
+ else {
39
+ // 2. System-wide location (respects LABGATE_POLICY_DIR override)
40
+ candidates.push(getSystemPolicyPath());
41
+ }
42
+ for (const p of candidates) {
43
+ if ((0, fs_1.existsSync)(p))
44
+ return p;
45
+ }
46
+ return null;
47
+ }
48
+ // ── Security checks ───────────────────────────────────────
49
+ /**
50
+ * Check if a file is world-writable (other-write bit set).
51
+ * Returns true if the file is safe to load.
52
+ */
53
+ function isFileSecure(filePath) {
54
+ try {
55
+ const stats = (0, fs_1.statSync)(filePath);
56
+ // Check if "others" have write permission (mode & 0o002)
57
+ const othersWrite = stats.mode & 0o002;
58
+ return othersWrite === 0;
59
+ }
60
+ catch {
61
+ // If we can't stat, treat as insecure
62
+ return false;
63
+ }
64
+ }
65
+ // ── Loading ───────────────────────────────────────────────
66
+ /**
67
+ * Load and validate the admin policy file.
68
+ * Returns null if no policy file exists or if it's invalid/insecure.
69
+ */
70
+ function loadPolicy() {
71
+ const policyPath = findPolicyFile();
72
+ if (!policyPath)
73
+ return null;
74
+ // Security: refuse world-writable policy files
75
+ if (!isFileSecure(policyPath)) {
76
+ console.error(`Warning: policy file ${policyPath} is world-writable. ` +
77
+ 'Refusing to load — fix permissions: chmod 644 ' + policyPath);
78
+ return null;
79
+ }
80
+ try {
81
+ const rawText = (0, fs_1.readFileSync)(policyPath, 'utf-8');
82
+ // Strip full-line // comments (same as config)
83
+ const stripped = rawText
84
+ .split('\n')
85
+ .filter(line => !line.trimStart().startsWith('//'))
86
+ .join('\n');
87
+ const raw = JSON.parse(stripped);
88
+ const errors = validatePolicy(raw);
89
+ if (errors.length > 0) {
90
+ console.error(`Warning: invalid policy in ${policyPath}:`);
91
+ for (const e of errors)
92
+ console.error(` - ${e}`);
93
+ return null;
94
+ }
95
+ return raw;
96
+ }
97
+ catch (err) {
98
+ console.error(`Warning: could not parse policy ${policyPath}: ${err.message}`);
99
+ return null;
100
+ }
101
+ }
102
+ // ── Validation ────────────────────────────────────────────
103
+ const VALID_RUNTIMES = ['auto', 'apptainer', 'singularity', 'docker'];
104
+ const VALID_NETWORK_MODES = ['none', 'filtered', 'host'];
105
+ function validatePolicy(raw) {
106
+ const errors = [];
107
+ if (!raw || typeof raw !== 'object') {
108
+ return ['policy must be a JSON object'];
109
+ }
110
+ const p = raw;
111
+ if (p.version !== 1) {
112
+ errors.push('version must be 1');
113
+ }
114
+ if (p.institution !== undefined && typeof p.institution !== 'string') {
115
+ errors.push('institution must be a string');
116
+ }
117
+ // admins
118
+ if (!p.admins || typeof p.admins !== 'object') {
119
+ errors.push('admins must be an object');
120
+ }
121
+ else {
122
+ const admins = p.admins;
123
+ if (!Array.isArray(admins.usernames)) {
124
+ errors.push('admins.usernames must be an array of strings');
125
+ }
126
+ else {
127
+ for (const u of admins.usernames) {
128
+ if (typeof u !== 'string') {
129
+ errors.push('each admins.usernames entry must be a string');
130
+ break;
131
+ }
132
+ }
133
+ }
134
+ }
135
+ // force
136
+ if (p.force !== undefined) {
137
+ if (typeof p.force !== 'object' || p.force === null) {
138
+ errors.push('force must be an object');
139
+ }
140
+ else {
141
+ const f = p.force;
142
+ if (f.runtime !== undefined && !VALID_RUNTIMES.includes(f.runtime)) {
143
+ errors.push(`force.runtime must be one of: ${VALID_RUNTIMES.join(', ')}`);
144
+ }
145
+ if (f.image !== undefined && typeof f.image !== 'string') {
146
+ errors.push('force.image must be a string');
147
+ }
148
+ if (f.network_mode !== undefined && !VALID_NETWORK_MODES.includes(f.network_mode)) {
149
+ errors.push(`force.network_mode must be one of: ${VALID_NETWORK_MODES.join(', ')}`);
150
+ }
151
+ if (f.audit_enabled !== undefined && typeof f.audit_enabled !== 'boolean') {
152
+ errors.push('force.audit_enabled must be a boolean');
153
+ }
154
+ if (f.audit_log_dir !== undefined && typeof f.audit_log_dir !== 'string') {
155
+ errors.push('force.audit_log_dir must be a string');
156
+ }
157
+ if (f.slurm_enabled !== undefined && typeof f.slurm_enabled !== 'boolean') {
158
+ errors.push('force.slurm_enabled must be a boolean');
159
+ }
160
+ }
161
+ }
162
+ // constraints
163
+ if (p.constraints !== undefined) {
164
+ if (typeof p.constraints !== 'object' || p.constraints === null) {
165
+ errors.push('constraints must be an object');
166
+ }
167
+ else {
168
+ const c = p.constraints;
169
+ if (c.max_session_timeout_hours !== undefined) {
170
+ if (typeof c.max_session_timeout_hours !== 'number' || c.max_session_timeout_hours <= 0) {
171
+ errors.push('constraints.max_session_timeout_hours must be a positive number');
172
+ }
173
+ }
174
+ for (const field of ['min_blocked_patterns', 'min_command_blacklist', 'allowed_images', 'min_allowed_domains', 'max_allowed_domains']) {
175
+ if (c[field] !== undefined && !Array.isArray(c[field])) {
176
+ errors.push(`constraints.${field} must be an array`);
177
+ continue;
178
+ }
179
+ if (Array.isArray(c[field])) {
180
+ const values = c[field];
181
+ for (const value of values) {
182
+ if (typeof value !== 'string' || value.trim().length === 0) {
183
+ errors.push(`constraints.${field} entries must be non-empty strings`);
184
+ break;
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ // shared dirs
192
+ if (p.shared_sessions_dir !== undefined && typeof p.shared_sessions_dir !== 'string') {
193
+ errors.push('shared_sessions_dir must be a string');
194
+ }
195
+ if (p.shared_audit_dir !== undefined && typeof p.shared_audit_dir !== 'string') {
196
+ errors.push('shared_audit_dir must be a string');
197
+ }
198
+ return errors;
199
+ }
200
+ // ── Admin detection ───────────────────────────────────────
201
+ /**
202
+ * Check if the current user is an admin according to the policy.
203
+ */
204
+ function checkIsAdmin(policy) {
205
+ const currentUser = (0, os_1.userInfo)().username;
206
+ return policy.admins.usernames.includes(currentUser);
207
+ }
208
+ // ── Policy merging ────────────────────────────────────────
209
+ /**
210
+ * Merge a user config with the admin policy.
211
+ * Returns the effective config with locked field tracking.
212
+ */
213
+ function mergeWithPolicy(userConfig, policy) {
214
+ // Deep clone so we don't mutate the original
215
+ const config = JSON.parse(JSON.stringify(userConfig));
216
+ const lockedFields = new Set();
217
+ const lockedListItems = {
218
+ blocked_patterns: [],
219
+ blacklist: [],
220
+ allowed_domains: [],
221
+ };
222
+ const constraints = {};
223
+ const force = policy.force;
224
+ const cons = policy.constraints;
225
+ // ── Force fields ──────────────────────────────────────
226
+ if (force?.runtime !== undefined) {
227
+ config.runtime = force.runtime;
228
+ lockedFields.add('runtime');
229
+ }
230
+ if (force?.image !== undefined) {
231
+ config.image = force.image;
232
+ lockedFields.add('image');
233
+ }
234
+ if (force?.network_mode !== undefined) {
235
+ config.network.mode = force.network_mode;
236
+ lockedFields.add('network.mode');
237
+ }
238
+ if (force?.audit_enabled !== undefined) {
239
+ config.audit.enabled = force.audit_enabled;
240
+ lockedFields.add('audit.enabled');
241
+ }
242
+ if (force?.audit_log_dir !== undefined) {
243
+ config.audit.log_dir = force.audit_log_dir;
244
+ lockedFields.add('audit.log_dir');
245
+ }
246
+ if (force?.slurm_enabled !== undefined) {
247
+ config.slurm.enabled = force.slurm_enabled;
248
+ lockedFields.add('slurm.enabled');
249
+ }
250
+ // ── Constraints ───────────────────────────────────────
251
+ // Session timeout cap
252
+ if (cons?.max_session_timeout_hours !== undefined) {
253
+ constraints.max_session_timeout_hours = cons.max_session_timeout_hours;
254
+ if (config.session_timeout_hours > cons.max_session_timeout_hours) {
255
+ config.session_timeout_hours = cons.max_session_timeout_hours;
256
+ }
257
+ }
258
+ // Image whitelist
259
+ if (cons?.allowed_images !== undefined && cons.allowed_images.length > 0) {
260
+ constraints.allowed_images = cons.allowed_images;
261
+ // If force.image is set, it takes precedence (already applied above)
262
+ if (!lockedFields.has('image')) {
263
+ if (!cons.allowed_images.includes(config.image)) {
264
+ config.image = cons.allowed_images[0];
265
+ }
266
+ }
267
+ }
268
+ // Minimum blocked patterns (union with user's, admin items are non-removable)
269
+ if (cons?.min_blocked_patterns !== undefined) {
270
+ const minSet = new Set(cons.min_blocked_patterns);
271
+ lockedListItems.blocked_patterns = [...minSet];
272
+ for (const pattern of minSet) {
273
+ if (!config.filesystem.blocked_patterns.includes(pattern)) {
274
+ config.filesystem.blocked_patterns.push(pattern);
275
+ }
276
+ }
277
+ }
278
+ // Minimum command blacklist
279
+ if (cons?.min_command_blacklist !== undefined) {
280
+ const minSet = new Set(cons.min_command_blacklist);
281
+ lockedListItems.blacklist = [...minSet];
282
+ for (const cmd of minSet) {
283
+ if (!config.commands.blacklist.includes(cmd)) {
284
+ config.commands.blacklist.push(cmd);
285
+ }
286
+ }
287
+ }
288
+ // Minimum allowed domains
289
+ if (cons?.min_allowed_domains !== undefined) {
290
+ const minSet = new Set(cons.min_allowed_domains);
291
+ lockedListItems.allowed_domains = [...minSet];
292
+ for (const domain of minSet) {
293
+ if (!config.network.allowed_domains.includes(domain)) {
294
+ config.network.allowed_domains.push(domain);
295
+ }
296
+ }
297
+ }
298
+ // Maximum allowed domains (intersect)
299
+ if (cons?.max_allowed_domains !== undefined) {
300
+ const maxSet = new Set(cons.max_allowed_domains);
301
+ // Keep only domains that are in the max set OR in the min set
302
+ const minSet = new Set(cons.min_allowed_domains ?? []);
303
+ config.network.allowed_domains = config.network.allowed_domains.filter(d => maxSet.has(d) || minSet.has(d));
304
+ }
305
+ return { config, lockedFields, lockedListItems, constraints };
306
+ }
307
+ // ── Save policy ───────────────────────────────────────────
308
+ /**
309
+ * Save a policy file. Uses atomic write (temp + rename) for safety on NFS.
310
+ */
311
+ function savePolicy(policy, filePath) {
312
+ const target = filePath ?? getSystemPolicyPath();
313
+ const dir = (0, path_1.dirname)(target);
314
+ const tmpPath = (0, path_1.join)(dir, `.policy-${(0, crypto_1.randomBytes)(4).toString('hex')}.tmp`);
315
+ (0, fs_1.writeFileSync)(tmpPath, JSON.stringify(policy, null, 2) + '\n', {
316
+ encoding: 'utf-8',
317
+ mode: 0o644,
318
+ });
319
+ (0, fs_1.renameSync)(tmpPath, target);
320
+ }
321
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/lib/policy.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { RuntimePreference } from './config.js';
2
- export type RuntimeType = 'apptainer' | 'singularity' | 'podman' | 'docker';
2
+ export type RuntimeType = 'apptainer' | 'singularity' | 'docker';
3
3
  export interface RuntimeCheck {
4
4
  ok: boolean;
5
5
  runtime?: RuntimeType;
@@ -8,7 +8,7 @@ export interface RuntimeCheck {
8
8
  }
9
9
  /** Apptainer or Singularity — SIF-based runtimes */
10
10
  export declare function isApptainerFamily(rt: RuntimeType): boolean;
11
- /** Podman or Docker — OCI container runtimes */
11
+ /** Docker — OCI container runtime */
12
12
  export declare function isOciFamily(rt: RuntimeType): boolean;
13
13
  export declare function checkRuntime(preferred?: RuntimePreference): RuntimeCheck;
14
14
  /**
@@ -46,17 +46,17 @@ const log = __importStar(require("./log.js"));
46
46
  function isApptainerFamily(rt) {
47
47
  return rt === 'apptainer' || rt === 'singularity';
48
48
  }
49
- /** Podman or Docker — OCI container runtimes */
49
+ /** Docker — OCI container runtime */
50
50
  function isOciFamily(rt) {
51
- return rt === 'podman' || rt === 'docker';
51
+ return rt === 'docker';
52
52
  }
53
53
  /**
54
54
  * Detection order when preference is 'auto':
55
- * apptainer → singularity → podman
55
+ * apptainer → singularity
56
56
  * Docker is not auto-detected (requires root/group on most HPC systems).
57
57
  * Users can still set runtime: "docker" explicitly if needed.
58
58
  */
59
- const AUTO_ORDER = ['apptainer', 'singularity', 'podman'];
59
+ const AUTO_ORDER = ['apptainer', 'singularity'];
60
60
  function tryRuntime(cmd) {
61
61
  try {
62
62
  const version = (0, child_process_1.execFileSync)(cmd, ['--version'], {
@@ -65,7 +65,7 @@ function tryRuntime(cmd) {
65
65
  }).trim();
66
66
  // For OCI runtimes, verify daemon access — `docker --version` succeeds
67
67
  // even without permission to the Docker socket
68
- if (cmd === 'docker' || cmd === 'podman') {
68
+ if (cmd === 'docker') {
69
69
  (0, child_process_1.execFileSync)(cmd, ['info'], { stdio: 'ignore', timeout: 10000 });
70
70
  }
71
71
  return { ok: true, runtime: cmd, version };
@@ -97,11 +97,12 @@ function checkRuntime(preferred) {
97
97
  '',
98
98
  'LabGate needs a container runtime. Install one of:',
99
99
  ' apptainer — https://apptainer.org/docs/admin/main/installation.html',
100
- ' podman — https://podman.io/getting-started/installation',
100
+ ' singularity — https://docs.sylabs.io/guides/latest/user-guide/quick_start.html',
101
+ ' docker (optional) — https://docs.docker.com/engine/install/',
101
102
  '',
102
103
  'On HPC clusters, apptainer is usually pre-installed (module load apptainer).',
103
- 'On RHEL/CentOS/Fedora: sudo dnf install podman',
104
- 'On Ubuntu/Debian: sudo apt install podman',
104
+ 'On Ubuntu/Debian: sudo apt install apptainer',
105
+ 'On RHEL/CentOS/Fedora: sudo dnf install apptainer',
105
106
  ].join('\n'),
106
107
  };
107
108
  }
@@ -137,34 +138,7 @@ function prompt(question) {
137
138
  function getInstallOptions() {
138
139
  const os = (0, os_1.platform)();
139
140
  const options = [];
140
- if (os === 'darwin') {
141
- if (hasCommand('brew')) {
142
- options.push({
143
- name: 'podman',
144
- description: 'Podman via Homebrew (recommended for macOS)',
145
- commands: [
146
- 'brew install podman',
147
- 'podman machine init',
148
- 'podman machine start',
149
- ],
150
- });
151
- }
152
- }
153
- else if (os === 'linux') {
154
- if (hasCommand('apt-get')) {
155
- options.push({
156
- name: 'podman',
157
- description: 'Podman via apt',
158
- commands: ['sudo apt-get update', 'sudo apt-get install -y podman'],
159
- });
160
- }
161
- else if (hasCommand('dnf')) {
162
- options.push({
163
- name: 'podman',
164
- description: 'Podman via dnf',
165
- commands: ['sudo dnf install -y podman'],
166
- });
167
- }
141
+ if (os === 'linux') {
168
142
  // Apptainer on Linux via apt/dnf repos
169
143
  if (hasCommand('apt-get')) {
170
144
  options.push({
@@ -179,6 +153,15 @@ function getInstallOptions() {
179
153
  ],
180
154
  });
181
155
  }
156
+ else if (hasCommand('dnf')) {
157
+ options.push({
158
+ name: 'apptainer',
159
+ description: 'Apptainer via dnf',
160
+ commands: [
161
+ 'sudo dnf install -y apptainer',
162
+ ],
163
+ });
164
+ }
182
165
  }
183
166
  return options;
184
167
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/lib/runtime.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,8CAEC;AAGD,kCAEC;AA6BD,oCA8BC;AAMD,gCAIC;AAkFD,sCA8CC;AA5ND,iDAAuD;AACvD,uCAA2C;AAC3C,2BAA8B;AAE9B,8CAAgC;AAWhC,oDAAoD;AACpD,SAAgB,iBAAiB,CAAC,EAAe;IAC/C,OAAO,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,aAAa,CAAC;AACpD,CAAC;AAED,gDAAgD;AAChD,SAAgB,WAAW,CAAC,EAAe;IACzC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,QAAQ,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,GAAkB,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAEzE,SAAS,UAAU,CAAC,GAAgB;IAClC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,4BAAY,EAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE;YAC/C,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,uEAAuE;QACvE,+CAA+C;QAC/C,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAA,4BAAY,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,SAA6B;IACxD,IAAI,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,SAAwB,CAAC,CAAC;QACpD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,2DAA2D;QAC3D,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,6BAA6B,SAAS,wFAAwF;SACtI,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,4CAA4C;YAC5C,EAAE;YACF,oDAAoD;YACpD,uEAAuE;YACvE,8DAA8D;YAC9D,EAAE;YACF,8EAA8E;YAC9E,iDAAiD;YACjD,iDAAiD;SAClD,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,SAA6B;IACtD,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAQ,CAAC;AACxB,CAAC;AAED,6DAA6D;AAE7D,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,IAAA,4BAAY,EAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,QAAgB;IAC9B,MAAM,EAAE,GAAG,IAAA,0BAAe,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAQD,SAAS,iBAAiB;IACxB,MAAM,EAAE,GAAG,IAAA,aAAQ,GAAE,CAAC;IACtB,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6CAA6C;gBAC1D,QAAQ,EAAE;oBACR,qBAAqB;oBACrB,qBAAqB;oBACrB,sBAAsB;iBACvB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gBAAgB;gBAC7B,QAAQ,EAAE,CAAC,qBAAqB,EAAE,gCAAgC,CAAC;aACpE,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gBAAgB;gBAC7B,QAAQ,EAAE,CAAC,4BAA4B,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;QACD,uCAAuC;QACvC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,6BAA6B;gBAC1C,QAAQ,EAAE;oBACR,qBAAqB;oBACrB,oDAAoD;oBACpD,8CAA8C;oBAC9C,qBAAqB;oBACrB,mCAAmC;iBACpC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,aAAa,CAAC,SAA6B;IAC/D,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAEjC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IAEpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,gDAAgD;QAChD,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC5C,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAExD,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7D,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,IAAI,KAAK,CAAC,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC;QACrE,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC;IAE3C,WAAW;IACX,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/lib/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export type SlurmJobState = 'PENDING' | 'RUNNING' | 'COMPLETING' | 'COMPLETED' | 'FAILED' | 'CANCELLED' | 'TIMEOUT' | 'NODE_FAIL' | 'PREEMPTED' | 'OUT_OF_MEMORY' | 'SUSPENDED' | 'UNKNOWN';
2
+ export declare const TERMINAL_STATES: ReadonlySet<string>;
3
+ export interface SlurmJob {
4
+ job_id: string;
5
+ name: string | null;
6
+ state: SlurmJobState;
7
+ submit_time: string;
8
+ start_time: string | null;
9
+ end_time: string | null;
10
+ partition: string | null;
11
+ nodes: string | null;
12
+ num_nodes: number | null;
13
+ num_tasks: number | null;
14
+ cpus_per_task: number | null;
15
+ mem: string | null;
16
+ stdout_path: string | null;
17
+ stderr_path: string | null;
18
+ stdout_size: number | null;
19
+ stderr_size: number | null;
20
+ command: string | null;
21
+ script_path: string | null;
22
+ session_id: string | null;
23
+ workdir: string | null;
24
+ exit_code: number | null;
25
+ account: string | null;
26
+ qos: string | null;
27
+ time_limit: string | null;
28
+ notes: string | null;
29
+ discovered_at: string;
30
+ updated_at: string;
31
+ }
32
+ export interface ListJobsOptions {
33
+ state?: string;
34
+ session_id?: string;
35
+ search?: string;
36
+ limit?: number;
37
+ offset?: number;
38
+ }
39
+ export declare class SlurmJobDB {
40
+ private db;
41
+ constructor(dbPath: string);
42
+ upsertJob(job: Partial<SlurmJob> & {
43
+ job_id: string;
44
+ }): void;
45
+ updateJobNotes(jobId: string, notes: string | null): boolean;
46
+ getJob(jobId: string): SlurmJob | null;
47
+ listJobs(opts?: ListJobsOptions): SlurmJob[];
48
+ getActiveJobIds(): string[];
49
+ getJobCount(state?: string): number;
50
+ close(): void;
51
+ }