85 lines
2.6 KiB
TypeScript
85 lines
2.6 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
import type { UIMessage } from "ai";
|
|
|
|
import { getForcedAssistantToolName, withAssistantToolPolicy } from "./assistant-tool-policy";
|
|
|
|
const assistantMessage = (...parts: UIMessage["parts"]): UIMessage => ({
|
|
id: "assistant-message",
|
|
role: "assistant",
|
|
parts,
|
|
});
|
|
|
|
describe("withAssistantToolPolicy", () => {
|
|
test("tells models to call approval-gated mutations without a prose confirmation", () => {
|
|
const description = withAssistantToolPolicy("Create a Homarr app.", true);
|
|
|
|
expect(description).toContain("call this tool immediately");
|
|
expect(description).toContain("does not execute until the user selects Approve and run");
|
|
expect(description).toContain("Never ask for confirmation in prose");
|
|
});
|
|
|
|
test("does not alter read-only tool descriptions", () => {
|
|
expect(withAssistantToolPolicy("List all Homarr apps.", false)).toBe("List all Homarr apps.");
|
|
});
|
|
});
|
|
|
|
describe("getForcedAssistantToolName", () => {
|
|
test("continues directly from the reviewed app form to app creation", () => {
|
|
expect(
|
|
getForcedAssistantToolName([
|
|
assistantMessage({
|
|
type: "dynamic-tool",
|
|
toolName: "configure_app",
|
|
toolCallId: "configure-1",
|
|
input: { name: "YouTube" },
|
|
state: "output-available",
|
|
output: {
|
|
name: "YouTube",
|
|
iconUrl: "/api/icons/youtube.svg",
|
|
href: "https://youtube.com",
|
|
},
|
|
}),
|
|
]),
|
|
).toBe("app_create");
|
|
});
|
|
|
|
test("waits for the user to finish reviewing the app form", () => {
|
|
expect(
|
|
getForcedAssistantToolName([
|
|
assistantMessage({
|
|
type: "dynamic-tool",
|
|
toolName: "configure_app",
|
|
toolCallId: "configure-1",
|
|
input: { name: "YouTube" },
|
|
state: "input-available",
|
|
}),
|
|
]),
|
|
).toBeUndefined();
|
|
});
|
|
|
|
test("does not repeat app creation after the mutation tool has been called", () => {
|
|
expect(
|
|
getForcedAssistantToolName([
|
|
assistantMessage(
|
|
{
|
|
type: "dynamic-tool",
|
|
toolName: "configure_app",
|
|
toolCallId: "configure-1",
|
|
input: { name: "YouTube" },
|
|
state: "output-available",
|
|
output: { name: "YouTube", href: "https://youtube.com" },
|
|
},
|
|
{
|
|
type: "dynamic-tool",
|
|
toolName: "app_create",
|
|
toolCallId: "create-1",
|
|
input: { name: "YouTube", href: "https://youtube.com" },
|
|
state: "approval-requested",
|
|
approval: { id: "approval-1" },
|
|
},
|
|
),
|
|
]),
|
|
).toBeUndefined();
|
|
});
|
|
});
|