Auto-deduplicate agent shortname on join request approval

When approving an agent join request with a shortname already in use,
append a numeric suffix (e.g. "openclaw-2") instead of returning an error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dotta
2026-03-06 13:54:58 -06:00
parent d8f7c6bf81
commit 0b42045053
4 changed files with 1305 additions and 766 deletions

View File

@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { hasAgentShortnameCollision } from "../services/agents.ts";
import { hasAgentShortnameCollision, deduplicateAgentName } from "../services/agents.ts";
describe("hasAgentShortnameCollision", () => {
it("detects collisions by normalized shortname", () => {
@@ -35,3 +35,35 @@ describe("hasAgentShortnameCollision", () => {
expect(collision).toBe(false);
});
});
describe("deduplicateAgentName", () => {
it("returns original name when no collision", () => {
const name = deduplicateAgentName("OpenClaw", [
{ id: "a1", name: "other-agent", status: "idle" },
]);
expect(name).toBe("OpenClaw");
});
it("appends suffix when name collides", () => {
const name = deduplicateAgentName("OpenClaw", [
{ id: "a1", name: "openclaw", status: "idle" },
]);
expect(name).toBe("OpenClaw 2");
});
it("increments suffix until unique", () => {
const name = deduplicateAgentName("OpenClaw", [
{ id: "a1", name: "openclaw", status: "idle" },
{ id: "a2", name: "openclaw-2", status: "idle" },
{ id: "a3", name: "openclaw-3", status: "idle" },
]);
expect(name).toBe("OpenClaw 4");
});
it("ignores terminated agents for collision", () => {
const name = deduplicateAgentName("OpenClaw", [
{ id: "a1", name: "openclaw", status: "terminated" },
]);
expect(name).toBe("OpenClaw");
});
});