UNPKG

@struktoai/mirage-core

Version:

A Unified Virtual Filesystem For AI Agents

50 lines • 1.98 kB
export const DEFAULT_PROCESS_PERMISSIONS = Object.freeze({ list: 'session', kill: 'session', max: null, }); const SCOPES = ['session', 'workspace']; function parseScope(value, key) { if (value !== 'session' && value !== 'workspace') throw new Error(`invalid processes.${key} scope`); return value; } /** A profile's `processes`: a bare scope for both, or a mapping of the fields. */ export function parseProcessPermissions(value) { if (typeof value === 'string') { const scope = parseScope(value, 'list'); return Object.freeze({ ...DEFAULT_PROCESS_PERMISSIONS, list: scope, kill: scope }); } if (typeof value !== 'object' || value === null || Array.isArray(value) || (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)) throw new Error('processes must be a scope or a mapping'); const out = { ...DEFAULT_PROCESS_PERMISSIONS, }; for (const [key, v] of Object.entries(value)) { if (key === 'max') { if (v !== null && !(Number.isInteger(v) && v >= 1)) throw new Error('processes.max must be a positive integer'); out.max = v; } else if (key === 'list' || key === 'kill') out[key] = parseScope(v, key); else throw new Error(`processes: unknown field ${key}`); } if (SCOPES.indexOf(out.kill) > SCOPES.indexOf(out.list)) throw new Error('processes.kill cannot reach past processes.list'); return Object.freeze(out); } export function restrictProcesses(a, b) { const min = (x, y) => SCOPES[Math.min(SCOPES.indexOf(x), SCOPES.indexOf(y))] ?? 'session'; const caps = [a.max, b.max].filter((cap) => cap !== null); return Object.freeze({ list: min(a.list, b.list), kill: min(a.kill, b.kill), max: caps.length === 0 ? null : Math.min(...caps), }); } //# sourceMappingURL=config.js.map