Files
gnome-jarvis/vendor/agent-harness/agent/sandbox.js
T
2026-09-11 13:41:22 -04:00

83 lines
2.0 KiB
JavaScript

/**
* Agent path jail + permission policy.
*/
const path = require('path');
const {
getAgentOriginRoot,
ensureDir,
resolveUnderAnyRoot,
isPathInside,
sanitizeId,
} = require('../lib/paths.js');
const policy = require('./policy.js');
const grantedRoots = new Set();
const alwaysApproveOrigins = new Set();
function setGrants(opts) {
opts = opts || {};
grantedRoots.clear();
for (const r of opts.roots || []) {
if (r) grantedRoots.add(path.resolve(String(r)));
}
alwaysApproveOrigins.clear();
for (const o of opts.alwaysApproveOrigins || []) {
if (o) alwaysApproveOrigins.add(String(o));
}
}
function listGrantedRoots() {
return Array.from(grantedRoots);
}
function defaultCwd(origin) {
return ensureDir(getAgentOriginRoot(origin));
}
function workspaceRoots(origin) {
const roots = [defaultCwd(origin)];
for (const r of grantedRoots) roots.push(r);
return roots;
}
function resolvePath(origin, userPath, cwd) {
const roots = workspaceRoots(origin);
const base = cwd && isAllowed(origin, cwd) ? cwd : roots[0];
if (!userPath || userPath === '.' || userPath === '') return path.resolve(base);
return resolveUnderAnyRoot(roots, userPath, base);
}
function isAllowed(origin, absPath) {
const roots = workspaceRoots(origin);
const resolved = path.resolve(absPath);
return roots.some((r) => isPathInside(r, resolved));
}
function permissionMode(payload) {
if (payload && payload._alwaysApprove) return 'always-approve';
if (payload && payload.permissionMode) return payload.permissionMode;
if (payload && payload._origin && alwaysApproveOrigins.has(payload._origin)) return 'always-approve';
return 'ask';
}
function needsPermission(toolName, mode) {
return policy.needsPermission(toolName, mode);
}
module.exports = {
setGrants,
listGrantedRoots,
defaultCwd,
workspaceRoots,
resolvePath,
isAllowed,
permissionMode,
needsPermission,
shellAllowlisted: policy.shellAllowlisted,
shellSafe: policy.shellSafe,
shellName: policy.shellName,
sanitizeId,
};