diff --git a/src/plugin/messages-transform.ts b/src/plugin/messages-transform.ts index ab3999456..e301c4efc 100644 --- a/src/plugin/messages-transform.ts +++ b/src/plugin/messages-transform.ts @@ -28,6 +28,34 @@ function findLastUserMessage(messages: MessageWithParts[]): UserMessageInfo | un return undefined } +function findLastUserTurn(messages: MessageWithParts[]): MessageWithParts | undefined { + for (let index = messages.length - 1; index >= 0; index -= 1) { + const message = messages[index] + if (message?.info.role === "user") { + return message + } + } + + return undefined +} + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null +} + +function isCompactionContinuationPart(part: unknown): boolean { + if (!isRecord(part)) { + return false + } + + const metadata = part["metadata"] + return isRecord(metadata) && metadata["compaction_continue"] === true +} + +function hasInternalContinuationTrigger(messages: MessageWithParts[]): boolean { + return findLastUserTurn(messages)?.parts.some(isCompactionContinuationPart) === true +} + function createAssistantPrefillRecoveryMessage( lastAssistantMessage: MessageWithParts, messages: MessageWithParts[], @@ -70,6 +98,10 @@ function ensureUserTurnAfterAssistantTail(output: MessagesTransformOutput): void return } + if (!hasInternalContinuationTrigger(output.messages)) { + return + } + output.messages.push(createAssistantPrefillRecoveryMessage(lastMessage, output.messages)) }