From e65f70e2ef80f47fac15a16fdc73ee4bec96b7aa Mon Sep 17 00:00:00 2001 From: Syed Osama Ali Shah <86572800+Osamaali313@users.noreply.github.com> Date: Wed, 8 Jul 2026 01:53:31 +0300 Subject: [PATCH] fix(ui): strip trailing dashes in slugify (#1387) slugify's docstring promises "no leading/trailing dashes" and the sibling isValidSlug rejects a trailing dash, but slugify only stripped leading dashes. Any input ending in a non-[a-z0-9] character (e.g. "hello world!", a trailing space, "trailing---") produced a slug ending in "-" that then failed isValidSlug, causing invalid persisted keys and spurious validation errors on agent/channel/provider/cron/mcp name fields. Add a symmetric trailing-dash strip, matching the Go helpers (strings.Trim(s, "-")). --- ui/web/src/lib/slug.test.ts | 20 ++++++++++++++++++++ ui/web/src/lib/slug.ts | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 ui/web/src/lib/slug.test.ts diff --git a/ui/web/src/lib/slug.test.ts b/ui/web/src/lib/slug.test.ts new file mode 100644 index 00000000..6d98f130 --- /dev/null +++ b/ui/web/src/lib/slug.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it } from "vitest"; + +import { isValidSlug, slugify } from "./slug"; + +describe("slugify", () => { + it("does not leave a trailing dash and passes isValidSlug", () => { + for (const input of ["hello world!", "My Agent ", "trailing---", "café résumé!", " spaced "]) { + const s = slugify(input); + expect(s.endsWith("-")).toBe(false); + expect(isValidSlug(s)).toBe(true); + } + expect(slugify("hello world!")).toBe("hello-world"); + }); + + it("still handles already-valid slugs and diacritics", () => { + expect(slugify("valid-slug")).toBe("valid-slug"); + expect(slugify("abc")).toBe("abc"); + expect(slugify("Đà Nẵng")).toBe("da-nang"); + }); +}); diff --git a/ui/web/src/lib/slug.ts b/ui/web/src/lib/slug.ts index 6bac8e32..5f8ce89b 100644 --- a/ui/web/src/lib/slug.ts +++ b/ui/web/src/lib/slug.ts @@ -11,7 +11,8 @@ export function slugify(input: string): string { .toLowerCase() .replace(/[^a-z0-9-]/g, "-") .replace(/-{2,}/g, "-") - .replace(/^-+/g, ""); + .replace(/^-+/g, "") + .replace(/-+$/g, ""); } /**