fix(chat): keep messages chronological across ID rollover

This commit is contained in:
Bohdan Triapitsyn
2026-08-14 16:53:05 +03:00
parent 7cf869d5eb
commit fe1f6130d6
23 changed files with 405 additions and 132 deletions
@@ -93,7 +93,8 @@ export const RevertedMessageDock: React.FC<RevertedMessageDockProps> = React.mem
if (!sessionId || restoringId) return;
setRestoringId(messageId);
try {
const nextMessage = userMessages.find((message) => message.id > messageId);
const messageIndex = userMessages.findIndex((message) => message.id === messageId);
const nextMessage = messageIndex >= 0 ? userMessages[messageIndex + 1] : undefined;
if (nextMessage) {
await revertToMessage(sessionId, nextMessage.id, { skipRedoPush: true });
} else {
@@ -86,4 +86,20 @@ describe('buildRevertedMessageDockState', () => {
expect(second).not.toBe(first);
expect(second.records).toHaveLength(1);
});
test('collects a post-rollover reverted tail by marker position', () => {
const before = message('msg_ffffffffffffBefore', 'user');
const marker = message('msg_000000000000Marker', 'user');
const after = message('msg_000000000001After', 'user');
const snapshot = buildRevertedMessageDockState(
state({
session: [{ id: 'ses_1', revert: { messageID: marker.id } } as State['session'][number]],
message: { ses_1: [before, marker, after] },
}),
'ses_1',
);
expect(snapshot.records.map((record) => record.message.id)).toEqual([marker.id, after.id]);
});
});
@@ -1,5 +1,6 @@
import type { Message, Part } from '@opencode-ai/sdk/v2/client';
import type { State } from '@/sync/types';
import { findMessageIndex } from '@/sync/message-ordering';
type RevertedMessageRecord = {
message: Message & { role: 'user' };
@@ -50,9 +51,14 @@ export const buildRevertedMessageDockState = (
}
const messages = state.message[sessionId] ?? [];
const revertIndex = findMessageIndex(messages, revertMessageID);
if (revertIndex < 0) {
return EMPTY_REVERTED_MESSAGE_DOCK_STATE;
}
const records: RevertedMessageRecord[] = [];
for (const message of messages) {
if (!isUserMessage(message) || message.id < revertMessageID) {
for (let index = revertIndex; index < messages.length; index += 1) {
const message = messages[index];
if (!isUserMessage(message)) {
continue;
}
records.push({