Files
openclaw/src/agents/tool-policy-pipeline.test.ts
Nyanako d72cc7a380 fix: route codex responses over websocket and preserve tool warnings (#53702) (thanks @Nanako0129)
* fix: route codex responses over websocket and suppress gated core tool warnings

* fix: rebase codex websocket patch onto main

* fix: preserve explicit alsoAllow warnings (#53702) (thanks @Nanako0129)

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-03-26 12:28:17 +05:30

208 lines
6.8 KiB
TypeScript

import { beforeEach, describe, expect, test } from "vitest";
import {
applyToolPolicyPipeline,
resetToolPolicyWarningCacheForTest,
} from "./tool-policy-pipeline.js";
type DummyTool = { name: string };
describe("tool-policy-pipeline", () => {
beforeEach(() => {
resetToolPolicyWarningCacheForTest();
});
test("strips allowlists that would otherwise disable core tools", () => {
const tools = [{ name: "exec" }, { name: "plugin_tool" }] as unknown as DummyTool[];
const filtered = applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: (t: any) => (t.name === "plugin_tool" ? { pluginId: "foo" } : undefined),
warn: () => {},
steps: [
{
policy: { allow: ["plugin_tool"] },
label: "tools.allow",
stripPluginOnlyAllowlist: true,
},
],
});
const names = filtered.map((t) => (t as unknown as DummyTool).name).toSorted();
expect(names).toEqual(["exec", "plugin_tool"]);
});
test("warns about unknown allowlist entries", () => {
const warnings: string[] = [];
const tools = [{ name: "exec" }] as unknown as DummyTool[];
applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: (msg) => warnings.push(msg),
steps: [
{
policy: { allow: ["wat"] },
label: "tools.allow",
stripPluginOnlyAllowlist: true,
},
],
});
expect(warnings.length).toBe(1);
expect(warnings[0]).toContain("unknown entries (wat)");
});
test("suppresses built-in profile warnings for unavailable gated core tools", () => {
const warnings: string[] = [];
const tools = [{ name: "exec" }] as unknown as DummyTool[];
applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: (msg) => warnings.push(msg),
steps: [
{
policy: { allow: ["apply_patch"] },
label: "tools.profile (coding)",
stripPluginOnlyAllowlist: true,
suppressUnavailableCoreToolWarning: true,
},
],
});
expect(warnings).toEqual([]);
});
test("still warns for profile steps when explicit alsoAllow entries are present", () => {
const warnings: string[] = [];
const tools = [{ name: "exec" }] as unknown as DummyTool[];
applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: (msg) => warnings.push(msg),
steps: [
{
policy: { allow: ["apply_patch"] },
label: "tools.profile (coding)",
stripPluginOnlyAllowlist: true,
suppressUnavailableCoreToolWarning: false,
},
],
});
expect(warnings.length).toBe(1);
expect(warnings[0]).toContain("unknown entries (apply_patch)");
expect(warnings[0]).toContain(
"shipped core tools but unavailable in the current runtime/provider/model/config",
);
});
test("still warns for explicit allowlists that mention unavailable gated core tools", () => {
const warnings: string[] = [];
const tools = [{ name: "exec" }] as unknown as DummyTool[];
applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: (msg) => warnings.push(msg),
steps: [
{
policy: { allow: ["apply_patch"] },
label: "tools.allow",
stripPluginOnlyAllowlist: true,
},
],
});
expect(warnings.length).toBe(1);
expect(warnings[0]).toContain("unknown entries (apply_patch)");
expect(warnings[0]).toContain(
"shipped core tools but unavailable in the current runtime/provider/model/config",
);
expect(warnings[0]).not.toContain("unless the plugin is enabled");
});
test("dedupes identical unknown-allowlist warnings across repeated runs", () => {
const warnings: string[] = [];
const tools = [{ name: "exec" }] as unknown as DummyTool[];
const params = {
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: (msg: string) => warnings.push(msg),
steps: [
{
policy: { allow: ["wat"] },
label: "tools.allow",
stripPluginOnlyAllowlist: true,
},
],
};
applyToolPolicyPipeline(params);
applyToolPolicyPipeline(params);
expect(warnings).toHaveLength(1);
});
test("bounds the warning dedupe cache so new warnings still surface", () => {
const warnings: string[] = [];
const tools = [{ name: "exec" }] as unknown as DummyTool[];
for (let i = 0; i < 257; i += 1) {
applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: (msg: string) => warnings.push(msg),
steps: [
{
policy: { allow: [`unknown_${i}`] },
label: "tools.profile (coding)",
stripPluginOnlyAllowlist: true,
},
],
});
}
applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: (msg: string) => warnings.push(msg),
steps: [
{
policy: { allow: ["unknown_0"] },
label: "tools.profile (coding)",
stripPluginOnlyAllowlist: true,
},
],
});
expect(warnings).toHaveLength(258);
});
test("applies allowlist filtering when core tools are explicitly listed", () => {
const tools = [{ name: "exec" }, { name: "process" }] as unknown as DummyTool[];
const filtered = applyToolPolicyPipeline({
// oxlint-disable-next-line typescript/no-explicit-any
tools: tools as any,
// oxlint-disable-next-line typescript/no-explicit-any
toolMeta: () => undefined,
warn: () => {},
steps: [
{
policy: { allow: ["exec"] },
label: "tools.allow",
stripPluginOnlyAllowlist: true,
},
],
});
expect(filtered.map((t) => (t as unknown as DummyTool).name)).toEqual(["exec"]);
});
});