From e5b0e5bf98a2b7ec034f103b691df81543d68f69 Mon Sep 17 00:00:00 2001 From: Zoe Date: Thu, 15 Oct 2026 10:58:20 -0500 Subject: [PATCH] fix: forking of a regeneration sometimes copied messages after the root --- server/api/topic/[topicId]/fork.post.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/server/api/topic/[topicId]/fork.post.ts b/server/api/topic/[topicId]/fork.post.ts index e03c103..457748f 100644 --- a/server/api/topic/[topicId]/fork.post.ts +++ b/server/api/topic/[topicId]/fork.post.ts @@ -85,15 +85,21 @@ export default defineEventHandler(async (event) => { current = current.parentMessageId ? messageMap.get(current.parentMessageId) : undefined; } - const forkIndex = topicMessages.findIndex(m => m.id === messageId); + // A regeneration can be created after later roots, so the fork + // point has to be located by its root rather than by its own createdAt. + let forkRoot = forkMessage; + while (forkRoot.parentMessageId && messageMap.has(forkRoot.parentMessageId)) { + forkRoot = messageMap.get(forkRoot.parentMessageId)!; + } + + const rootMessages = topicMessages.filter(m => !m.parentMessageId); + const forkIndex = rootMessages.findIndex(m => m.id === forkRoot.id); for (let i = 0; i <= forkIndex; i++) { - const msg = topicMessages[i]!; - if (!msg.parentMessageId) { - messageIdsToCopy.add(msg.id); - const children = childrenMap.get(msg.id) || []; - for (const child of children) { - messageIdsToCopy.add(child.id); - } + const msg = rootMessages[i]!; + messageIdsToCopy.add(msg.id); + const children = childrenMap.get(msg.id) || []; + for (const child of children) { + messageIdsToCopy.add(child.id); } }