From ba7c8c3235d9089780fca02477772924a634a4f0 Mon Sep 17 00:00:00 2001 From: murashit Date: Mon, 15 Jun 2026 14:04:25 +0900 Subject: [PATCH] Fix thread title context type narrowing --- .../chat/application/threads/title-context.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/features/chat/application/threads/title-context.ts b/src/features/chat/application/threads/title-context.ts index f7a2a422..b72ac0df 100644 --- a/src/features/chat/application/threads/title-context.ts +++ b/src/features/chat/application/threads/title-context.ts @@ -7,15 +7,8 @@ const MAX_CONTEXT_CHARS = 4_000; export function threadTitleContextFromMessageStreamItems(turnId: string, items: readonly MessageStreamItem[]): ThreadTitleContext | null { const turnItems = items.filter((item) => item.turnId === turnId); - const userRequest = - turnItems.find((item) => item.kind === "message" && item.role === "user")?.text.trim() ?? - precedingUnscopedTitleSeed(turnId, items) ?? - ""; - const assistantResponse = - [...turnItems] - .reverse() - .find((item): item is MessageStreamMessageItem => item.kind === "message" && isCompletedTurnOutcomeMessage(item)) - ?.text.trim() ?? ""; + const userRequest = turnItems.find(isUserMessageStreamItem)?.text.trim() ?? precedingUnscopedTitleSeed(turnId, items) ?? ""; + const assistantResponse = [...turnItems].reverse().find(isCompletedTurnOutcomeMessageItem)?.text.trim() ?? ""; if (!userRequest || !assistantResponse) return null; return { userRequest: truncateForPrompt(userRequest), @@ -34,6 +27,14 @@ export function firstThreadTitleContextFromMessageStreamItems(items: readonly Me return null; } +function isUserMessageStreamItem(item: MessageStreamItem): item is MessageStreamMessageItem & { role: "user" } { + return item.kind === "message" && item.role === "user"; +} + +function isCompletedTurnOutcomeMessageItem(item: MessageStreamItem): item is MessageStreamMessageItem { + return item.kind === "message" && isCompletedTurnOutcomeMessage(item); +} + function precedingUnscopedTitleSeed(turnId: string, items: readonly MessageStreamItem[]): string | null { const firstTurnItemIndex = items.findIndex((item) => item.turnId === turnId); if (firstTurnItemIndex < 1) return null;