feat(FN-4599): complete Step 1 — export approval gate tool metadata

Fusion-Task-Id: FN-4599
Fusion-Task-Lineage: 39bdbfd4-d90a-4232-a447-23ef107732e4
This commit is contained in:
Fusion
2026-05-15 06:53:18 -07:00
committed by gsxdsm
parent 277d29abfe
commit 2a8ffa442d
3 changed files with 69 additions and 0 deletions

View File

@@ -1,5 +1,7 @@
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { import {
AGENT_PERMISSION_POLICY_CATEGORY_TOOL_EXAMPLES,
AGENT_PERMISSION_POLICY_EXEMPT_TOOL_EXAMPLES,
DEFAULT_AGENT_PERMISSION_POLICY_PRESET_ID, DEFAULT_AGENT_PERMISSION_POLICY_PRESET_ID,
getBuiltInAgentPermissionPolicyPresets, getBuiltInAgentPermissionPolicyPresets,
isAgentPermissionPolicyPresetId, isAgentPermissionPolicyPresetId,
@@ -7,6 +9,10 @@ import {
resolveEffectiveAgentPermissionPolicy, resolveEffectiveAgentPermissionPolicy,
} from "../agent-permission-policy.js"; } from "../agent-permission-policy.js";
import { AGENT_PERMISSION_POLICY_ACTION_CATEGORIES } from "../types.js"; import { AGENT_PERMISSION_POLICY_ACTION_CATEGORIES } from "../types.js";
import {
ACTION_GATE_TASK_AGENT_MANAGEMENT_TOOLS,
COORDINATION_EXEMPT_TOOLS,
} from "../../../engine/src/gating-classifications.js";
describe("agent-permission-policy", () => { describe("agent-permission-policy", () => {
it("returns the canonical built-in preset catalog", () => { it("returns the canonical built-in preset catalog", () => {
@@ -68,4 +74,29 @@ describe("agent-permission-policy", () => {
expect(isAgentPermissionPolicyPresetId("locked-down")).toBe(true); expect(isAgentPermissionPolicyPresetId("locked-down")).toBe(true);
expect(isAgentPermissionPolicyPresetId("custom")).toBe(true); expect(isAgentPermissionPolicyPresetId("custom")).toBe(true);
}); });
it("provides non-empty tool examples for every action category", () => {
for (const category of AGENT_PERMISSION_POLICY_ACTION_CATEGORIES) {
expect(AGENT_PERMISSION_POLICY_CATEGORY_TOOL_EXAMPLES[category].length).toBeGreaterThan(0);
}
});
it("includes key discoverability examples", () => {
expect(AGENT_PERMISSION_POLICY_CATEGORY_TOOL_EXAMPLES.network_api).toContain("fn_research_run (web/research)");
expect(AGENT_PERMISSION_POLICY_CATEGORY_TOOL_EXAMPLES.task_agent_mutation).toContain("fn_task_create");
expect(AGENT_PERMISSION_POLICY_EXEMPT_TOOL_EXAMPLES).toContain("fn_send_message");
});
it("keeps task-agent mutation examples aligned with action-gate tool classifications", () => {
for (const toolName of AGENT_PERMISSION_POLICY_CATEGORY_TOOL_EXAMPLES.task_agent_mutation) {
expect(toolName.startsWith("fn_")).toBe(true);
expect(ACTION_GATE_TASK_AGENT_MANAGEMENT_TOOLS.has(toolName)).toBe(true);
}
});
it("keeps exempt examples aligned with coordination-exempt classifications", () => {
for (const toolName of AGENT_PERMISSION_POLICY_EXEMPT_TOOL_EXAMPLES) {
expect(COORDINATION_EXEMPT_TOOLS).toContain(toolName);
}
});
}); });

View File

@@ -1,5 +1,6 @@
import type { import type {
AgentPermissionPolicy, AgentPermissionPolicy,
AgentPermissionPolicyActionCategory,
AgentPermissionPolicyDisposition, AgentPermissionPolicyDisposition,
AgentPermissionPolicyPresetId, AgentPermissionPolicyPresetId,
AgentPermissionPolicyRules, AgentPermissionPolicyRules,
@@ -8,6 +9,41 @@ import { AGENT_PERMISSION_POLICY_ACTION_CATEGORIES, AGENT_PERMISSION_POLICY_PRES
export const DEFAULT_AGENT_PERMISSION_POLICY_PRESET_ID: AgentPermissionPolicyPresetId = "unrestricted"; export const DEFAULT_AGENT_PERMISSION_POLICY_PRESET_ID: AgentPermissionPolicyPresetId = "unrestricted";
export const AGENT_PERMISSION_POLICY_CATEGORY_TOOL_EXAMPLES: Record<
AgentPermissionPolicyActionCategory,
readonly string[]
> = {
git_write: ["git commit", "git push", "git merge", "git branch -d", "git worktree add", "write", "edit"],
file_write_delete: ["write", "edit", "fn_task_attach"],
command_execution: ["bash (non-git)", "read", "find", "grep", "ls"],
network_api: ["fn_research_run (web/research)"],
task_agent_mutation: [
"fn_task_create",
"fn_delegate_task",
"fn_task_import_github",
"fn_task_import_github_issue",
"fn_spawn_agent",
"fn_update_agent_config",
"fn_update_identity",
],
};
export const AGENT_PERMISSION_POLICY_EXEMPT_TOOL_EXAMPLES: readonly string[] = [
"fn_send_message",
"fn_post_room_message",
"fn_read_messages",
"fn_task_log",
"fn_task_done",
"fn_heartbeat_done",
"fn_task_document_write",
"fn_task_document_read",
"fn_memory_search",
"fn_memory_get",
"fn_memory_append",
"fn_read_evaluations",
"fn_reflect_on_performance",
];
export interface BuiltInAgentPermissionPolicyPreset { export interface BuiltInAgentPermissionPolicyPreset {
id: AgentPermissionPolicyPresetId; id: AgentPermissionPolicyPresetId;
name: string; name: string;

View File

@@ -61,6 +61,8 @@ export {
} from "./agent-permissions.js"; } from "./agent-permissions.js";
export { export {
DEFAULT_AGENT_PERMISSION_POLICY_PRESET_ID, DEFAULT_AGENT_PERMISSION_POLICY_PRESET_ID,
AGENT_PERMISSION_POLICY_CATEGORY_TOOL_EXAMPLES,
AGENT_PERMISSION_POLICY_EXEMPT_TOOL_EXAMPLES,
getBuiltInAgentPermissionPolicyPresets, getBuiltInAgentPermissionPolicyPresets,
resolveAgentPermissionPolicyPreset, resolveAgentPermissionPolicyPreset,
normalizeAgentPermissionPolicyFromPreset, normalizeAgentPermissionPolicyFromPreset,