@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
50 lines • 1.98 kB
JavaScript
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