+11
@@ -12,6 +12,7 @@ const MAX_DESC = 2000;
|
||||
const bySession = new Map();
|
||||
const sessionOpts = new Map();
|
||||
const handlers = new Map();
|
||||
const permissions = new Map();
|
||||
|
||||
function setReserved(names) {
|
||||
reserved = new Set(names);
|
||||
@@ -83,6 +84,9 @@ function register(sessionId, tools) {
|
||||
throw new Error('too many custom tools (max ' + MAX_TOOLS + ')');
|
||||
}
|
||||
map.set(schema.name, schema);
|
||||
let gates = permissions.get(sessionId);
|
||||
if (!gates) permissions.set(sessionId, gates = new Map());
|
||||
gates.set(schema.name, t.permission || 'write');
|
||||
if (typeof t.execute === 'function') {
|
||||
let h = handlers.get(sessionId);
|
||||
if (!h) {
|
||||
@@ -101,6 +105,7 @@ function unregister(sessionId, name) {
|
||||
if (map && name) map.delete(name);
|
||||
const h = handlers.get(sessionId);
|
||||
if (h && name) h.delete(name);
|
||||
permissions.get(sessionId)?.delete(name);
|
||||
return list(sessionId);
|
||||
}
|
||||
|
||||
@@ -108,6 +113,7 @@ function clear(sessionId) {
|
||||
bySession.delete(sessionId);
|
||||
sessionOpts.delete(sessionId);
|
||||
handlers.delete(sessionId);
|
||||
permissions.delete(sessionId);
|
||||
}
|
||||
|
||||
function has(sessionId, name) {
|
||||
@@ -120,11 +126,16 @@ function getHandler(sessionId, name) {
|
||||
return h && h.get(name);
|
||||
}
|
||||
|
||||
function needsPermission(sessionId, name, mode) {
|
||||
return mode !== 'always-approve' && has(sessionId, name) && permissions.get(sessionId)?.get(name) !== 'read';
|
||||
}
|
||||
|
||||
function defs(sessionId) {
|
||||
return list(sessionId);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
needsPermission,
|
||||
NAME_RE,
|
||||
MAX_TOOLS,
|
||||
setReserved,
|
||||
|
||||
Vendored
+1
-1
@@ -781,7 +781,7 @@ async function runTurn(ctx) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (sandbox.needsPermission(name, mode) && !planMode.isPlanFilePath(args.path, tracker.planPath)) {
|
||||
if (customTools.needsPermission(session.id, name, mode) || (sandbox.needsPermission(name, mode) && !((name === 'write_file' || name === 'search_replace') && planMode.isPlanFilePath(args.path, tracker.planPath)))) {
|
||||
let remembered = null;
|
||||
try {
|
||||
remembered = permStore.resolve(name, args);
|
||||
|
||||
Reference in New Issue
Block a user