This commit is contained in:
70
packages/agent/tests/permissions.test.ts
Normal file
70
packages/agent/tests/permissions.test.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { PermissionManager, READONLY_TOOLS } from '../src/permissions.js';
|
||||
import type { ToolDefinition } from '../src/tools.js';
|
||||
|
||||
function makeTool(name: string): ToolDefinition {
|
||||
return {
|
||||
name,
|
||||
description: `${name} tool`,
|
||||
parameters: {},
|
||||
execute: async () => 'ok',
|
||||
};
|
||||
}
|
||||
|
||||
describe('PermissionManager', () => {
|
||||
it('default allows all tools', () => {
|
||||
const pm = new PermissionManager();
|
||||
expect(pm.isAllowed('bash')).toBe(true);
|
||||
expect(pm.isAllowed('write_file')).toBe(true);
|
||||
expect(pm.isAllowed('read_file')).toBe(true);
|
||||
expect(pm.isAllowed('anything')).toBe(true);
|
||||
});
|
||||
|
||||
it('blacklist blocks listed tools, allows others', () => {
|
||||
const pm = new PermissionManager({ blacklist: ['bash', 'write_file'] });
|
||||
expect(pm.isAllowed('bash')).toBe(false);
|
||||
expect(pm.isAllowed('write_file')).toBe(false);
|
||||
expect(pm.isAllowed('read_file')).toBe(true);
|
||||
expect(pm.isAllowed('search_files')).toBe(true);
|
||||
});
|
||||
|
||||
it('whitelist allows only listed tools', () => {
|
||||
const pm = new PermissionManager({ whitelist: ['read_file', 'search_files'] });
|
||||
expect(pm.isAllowed('read_file')).toBe(true);
|
||||
expect(pm.isAllowed('search_files')).toBe(true);
|
||||
expect(pm.isAllowed('bash')).toBe(false);
|
||||
expect(pm.isAllowed('write_file')).toBe(false);
|
||||
});
|
||||
|
||||
it('blacklist takes priority over whitelist', () => {
|
||||
const pm = new PermissionManager({
|
||||
whitelist: ['read_file', 'bash'],
|
||||
blacklist: ['bash'],
|
||||
});
|
||||
expect(pm.isAllowed('read_file')).toBe(true);
|
||||
expect(pm.isAllowed('bash')).toBe(false);
|
||||
expect(pm.isAllowed('write_file')).toBe(false);
|
||||
});
|
||||
|
||||
it('sandbox() only allows readonly tools', () => {
|
||||
const pm = PermissionManager.sandbox();
|
||||
for (const tool of READONLY_TOOLS) {
|
||||
expect(pm.isAllowed(tool)).toBe(true);
|
||||
}
|
||||
expect(pm.isAllowed('bash')).toBe(false);
|
||||
expect(pm.isAllowed('write_file')).toBe(false);
|
||||
expect(pm.isAllowed('edit_file')).toBe(false);
|
||||
});
|
||||
|
||||
it('filterTools returns only allowed ToolDefinitions', () => {
|
||||
const tools = [
|
||||
makeTool('read_file'),
|
||||
makeTool('bash'),
|
||||
makeTool('write_file'),
|
||||
makeTool('search_files'),
|
||||
];
|
||||
const pm = new PermissionManager({ blacklist: ['bash', 'write_file'] });
|
||||
const filtered = pm.filterTools(tools);
|
||||
expect(filtered.map(t => t.name)).toEqual(['read_file', 'search_files']);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user