4fa4f13558
Co-authored-by: iamlukethedev <iamlukethedev@users.noreply.github.com>
115 lines
3.4 KiB
TypeScript
115 lines
3.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
isPermissionsCustom,
|
|
resolveAgentPermissionsDraft,
|
|
resolveCommandModeFromRole,
|
|
resolvePresetDefaultsForRole,
|
|
resolveRoleForCommandMode,
|
|
resolveToolGroupOverrides,
|
|
resolveToolGroupStateFromConfigEntry,
|
|
} from "@/features/agents/operations/agentPermissionsOperation";
|
|
|
|
describe("agentPermissionsOperation", () => {
|
|
it("maps command mode and preset role in both directions", () => {
|
|
expect(resolveRoleForCommandMode("off")).toBe("conservative");
|
|
expect(resolveRoleForCommandMode("ask")).toBe("collaborative");
|
|
expect(resolveRoleForCommandMode("auto")).toBe("autonomous");
|
|
|
|
expect(resolveCommandModeFromRole("conservative")).toBe("off");
|
|
expect(resolveCommandModeFromRole("collaborative")).toBe("ask");
|
|
expect(resolveCommandModeFromRole("autonomous")).toBe("auto");
|
|
});
|
|
|
|
it("resolves autonomous preset defaults to permissive capabilities", () => {
|
|
expect(resolvePresetDefaultsForRole("autonomous")).toEqual({
|
|
commandMode: "auto",
|
|
webAccess: true,
|
|
fileTools: true,
|
|
});
|
|
});
|
|
|
|
it("derives tool-group state from allow and deny with deny precedence", () => {
|
|
const state = resolveToolGroupStateFromConfigEntry({
|
|
allow: ["group:web", "group:runtime"],
|
|
deny: ["group:web"],
|
|
});
|
|
|
|
expect(state.usesAllow).toBe(true);
|
|
expect(state.runtime).toBe(true);
|
|
expect(state.web).toBe(false);
|
|
expect(state.fs).toBeNull();
|
|
});
|
|
|
|
it("merges group toggles while preserving allow mode", () => {
|
|
const overrides = resolveToolGroupOverrides({
|
|
existingTools: {
|
|
allow: ["group:web", "custom:tool"],
|
|
deny: ["group:runtime", "group:fs"],
|
|
},
|
|
runtimeEnabled: true,
|
|
webEnabled: false,
|
|
fsEnabled: true,
|
|
});
|
|
|
|
expect(overrides.tools.allow).toEqual(
|
|
expect.arrayContaining(["custom:tool", "group:runtime", "group:fs"])
|
|
);
|
|
expect(overrides.tools.allow).not.toEqual(expect.arrayContaining(["group:web"]));
|
|
expect(overrides.tools.deny).toEqual(expect.arrayContaining(["group:web"]));
|
|
expect(overrides.tools.deny).not.toEqual(
|
|
expect.arrayContaining(["group:runtime", "group:fs"])
|
|
);
|
|
});
|
|
|
|
it("merges group toggles while preserving alsoAllow mode", () => {
|
|
const overrides = resolveToolGroupOverrides({
|
|
existingTools: {
|
|
alsoAllow: ["group:web"],
|
|
deny: [],
|
|
},
|
|
runtimeEnabled: true,
|
|
webEnabled: true,
|
|
fsEnabled: false,
|
|
});
|
|
|
|
expect(overrides.tools).not.toHaveProperty("allow");
|
|
expect(overrides.tools.alsoAllow).toEqual(
|
|
expect.arrayContaining(["group:web", "group:runtime"])
|
|
);
|
|
expect(overrides.tools.deny).toEqual(expect.arrayContaining(["group:fs"]));
|
|
});
|
|
|
|
it("resolves draft from session role and config group overrides", () => {
|
|
const draft = resolveAgentPermissionsDraft({
|
|
agent: {
|
|
sessionExecSecurity: "allowlist",
|
|
sessionExecAsk: "always",
|
|
},
|
|
existingTools: {
|
|
allow: ["group:web"],
|
|
deny: ["group:fs"],
|
|
},
|
|
});
|
|
|
|
expect(draft).toEqual({
|
|
commandMode: "ask",
|
|
webAccess: true,
|
|
fileTools: false,
|
|
});
|
|
});
|
|
|
|
it("flags custom draft when advanced values diverge from preset baseline", () => {
|
|
expect(
|
|
isPermissionsCustom({
|
|
role: "autonomous",
|
|
draft: {
|
|
commandMode: "auto",
|
|
webAccess: false,
|
|
fileTools: true,
|
|
},
|
|
})
|
|
).toBe(true);
|
|
});
|
|
});
|