From 5ee266a4d9708805a1c172176ddeae13ddcd5778 Mon Sep 17 00:00:00 2001 From: indifferentketchup Date: Sat, 16 May 2026 15:20:52 +0000 Subject: [PATCH] feat(auto_name): propagate first chat name to parent session When a chat is auto-named, also rename the parent session if it is still on its default 'New session' label. UPDATE is gated by an atomic WHERE clause so user renames and prior propagations are not clobbered. Publishes session_renamed via broker.publishUser; useSidebar already listens. Closes the gap where sessions auto-created from the sidebar would stay 'New session' forever. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/server/src/services/auto_name.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/apps/server/src/services/auto_name.ts b/apps/server/src/services/auto_name.ts index c1e43dd..341c60b 100644 --- a/apps/server/src/services/auto_name.ts +++ b/apps/server/src/services/auto_name.ts @@ -144,4 +144,23 @@ export async function maybeAutoNameChat( updated_at: updated[0]!.updated_at, }); ctx.log.info({ chatId, name }, 'chat auto-named'); + + // Propagate to the parent session if it's still on its default name. + // The WHERE guard makes the check atomic — if the user has already + // renamed (or a prior chat already propagated), this UPDATE matches + // zero rows and we do nothing. First chat wins; manual renames win. + const renamedSession = await ctx.sql<{ id: string; name: string }[]>` + UPDATE sessions + SET name = ${name} + WHERE id = ${sessionId} AND name = 'New session' + RETURNING id, name + `; + if (renamedSession.length > 0) { + ctx.publishUser({ + type: 'session_renamed', + session_id: sessionId, + name, + }); + ctx.log.info({ sessionId, name }, 'session auto-named from chat'); + } }