From 3f623f7e00abb59008cc642bc7b20b24cb97c45d Mon Sep 17 00:00:00 2001 From: w287346141 <287346141@qq.com> Date: Sun, 31 May 2026 20:44:08 +0800 Subject: [PATCH] Reject empty session title slugs --- src/session-title.ts | 15 +++++++-------- tests/session-title.test.ts | 5 +++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/session-title.ts b/src/session-title.ts index 612372c..14c946e 100644 --- a/src/session-title.ts +++ b/src/session-title.ts @@ -71,14 +71,13 @@ export function makeSessionNameFromTitle( ): string | null { const normalized = normalizeGeneratedSessionTitle(title); if (!normalized) return null; - const base = sanitizeName( - normalized - .replace(/[\s_]+/g, "-") - .replace(/[^\w\-\u4e00-\u9fa5]+/g, "-") - .replace(/-+/g, "-") - .replace(/^-|-$/g, ""), - ); - if (!base) return null; + const slug = normalized + .replace(/[\s_]+/g, "-") + .replace(/[^\w\-\u4e00-\u9fa5]+/g, "-") + .replace(/-+/g, "-") + .replace(/^-|-$/g, ""); + if (!slug) return null; + const base = sanitizeName(slug); const current = opts.currentName ? sanitizeName(opts.currentName) : ""; const exists = opts.exists ?? ((name: string) => existsSync(sessionPath(name))); if (base === current || !exists(base)) return base; diff --git a/tests/session-title.test.ts b/tests/session-title.test.ts index 7b02840..8c71750 100644 --- a/tests/session-title.test.ts +++ b/tests/session-title.test.ts @@ -26,6 +26,11 @@ describe("session title generation", () => { ).toBe("修复-会话-损坏"); }); + it("rejects titles that do not contain usable slug text", () => { + expect(makeSessionNameFromTitle("___", { exists: () => false })).toBeNull(); + expect(makeSessionNameFromTitle("---", { exists: () => false })).toBeNull(); + }); + it("only auto-names default first-turn sessions that have not been named before", () => { expect(shouldAutoNameSession("default-20260517123456", {}, 1)).toBe(true); expect(shouldAutoNameSession("default-20260517123456", {}, 2)).toBe(false);