mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-14 01:50:39 +09:00
86 lines
2.7 KiB
TypeScript
86 lines
2.7 KiB
TypeScript
|
|
// @vitest-environment node
|
||
|
|
import { describe, expect, it } from "vitest";
|
||
|
|
import { buildDuplicateAgentPayload, duplicateAgentName } from "./duplicate-agent-payload";
|
||
|
|
import type { AgentDetail } from "@paperclipai/shared";
|
||
|
|
|
||
|
|
const baseAgent: AgentDetail = {
|
||
|
|
id: "agent-1",
|
||
|
|
companyId: "company-1",
|
||
|
|
name: "Senior Product Engineer",
|
||
|
|
urlKey: "senior-product-engineer",
|
||
|
|
role: "engineer",
|
||
|
|
title: "Senior Product Engineer",
|
||
|
|
icon: "code",
|
||
|
|
status: "idle",
|
||
|
|
reportsTo: "manager-1",
|
||
|
|
capabilities: "Builds product features.",
|
||
|
|
adapterType: "codex_local",
|
||
|
|
adapterConfig: {
|
||
|
|
model: "gpt-5.3-codex",
|
||
|
|
instructionsBundleMode: "managed",
|
||
|
|
instructionsRootPath: "/tmp/original/instructions",
|
||
|
|
instructionsEntryFile: "AGENTS.md",
|
||
|
|
instructionsFilePath: "/tmp/original/instructions/AGENTS.md",
|
||
|
|
promptTemplate: "legacy prompt",
|
||
|
|
bootstrapPromptTemplate: "legacy bootstrap",
|
||
|
|
},
|
||
|
|
runtimeConfig: {
|
||
|
|
heartbeat: { enabled: true },
|
||
|
|
},
|
||
|
|
defaultEnvironmentId: "environment-1",
|
||
|
|
budgetMonthlyCents: 500,
|
||
|
|
spentMonthlyCents: 123,
|
||
|
|
pauseReason: null,
|
||
|
|
pausedAt: null,
|
||
|
|
permissions: { canCreateAgents: true },
|
||
|
|
lastHeartbeatAt: null,
|
||
|
|
metadata: { source: "test" },
|
||
|
|
createdAt: new Date("2026-05-10T00:00:00.000Z"),
|
||
|
|
updatedAt: new Date("2026-05-10T00:00:00.000Z"),
|
||
|
|
chainOfCommand: [],
|
||
|
|
access: {
|
||
|
|
canAssignTasks: true,
|
||
|
|
taskAssignSource: "explicit_grant",
|
||
|
|
membership: null,
|
||
|
|
grants: [],
|
||
|
|
},
|
||
|
|
};
|
||
|
|
|
||
|
|
describe("duplicate agent payload", () => {
|
||
|
|
it("suffixes duplicate names", () => {
|
||
|
|
expect(duplicateAgentName("Senior Product Engineer")).toBe("Senior Product Engineer Copy");
|
||
|
|
expect(duplicateAgentName(" ")).toBe("Agent Copy");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("copies agent fields while removing original instruction paths", () => {
|
||
|
|
const payload = buildDuplicateAgentPayload(baseAgent, {
|
||
|
|
entryFile: "AGENTS.md",
|
||
|
|
files: {
|
||
|
|
"AGENTS.md": "You are a copy.",
|
||
|
|
},
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(payload).toMatchObject({
|
||
|
|
name: "Senior Product Engineer Copy",
|
||
|
|
role: "engineer",
|
||
|
|
title: "Senior Product Engineer",
|
||
|
|
icon: "code",
|
||
|
|
reportsTo: "manager-1",
|
||
|
|
capabilities: "Builds product features.",
|
||
|
|
adapterType: "codex_local",
|
||
|
|
adapterConfig: { model: "gpt-5.3-codex" },
|
||
|
|
runtimeConfig: { heartbeat: { enabled: true } },
|
||
|
|
defaultEnvironmentId: "environment-1",
|
||
|
|
budgetMonthlyCents: 500,
|
||
|
|
permissions: { canCreateAgents: true },
|
||
|
|
metadata: { source: "test" },
|
||
|
|
instructionsBundle: {
|
||
|
|
entryFile: "AGENTS.md",
|
||
|
|
files: { "AGENTS.md": "You are a copy." },
|
||
|
|
},
|
||
|
|
});
|
||
|
|
expect(payload.adapterConfig).not.toHaveProperty("instructionsFilePath");
|
||
|
|
expect(payload.adapterConfig).not.toHaveProperty("promptTemplate");
|
||
|
|
});
|
||
|
|
});
|