fix(chat): keep messages chronological across ID rollover
This commit is contained in:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user