fix: keep conversation order stable during streaming
Sort pinned and unpinned conversations by their latest message creation time so parallel replies no longer repeatedly swap sidebar positions. Include the same timestamp in lightweight summaries while preserving updatedAt for persistence and snapshot merging. Validation: 13 focused tests, typecheck and ESLint passed. The full test run timed out after ten minutes and reported configuration-summary and Agent offline-install failures. Release note: Conversation order stays stable while replies stream or tools report progress; new messages still move conversations forward, with pinned conversations first.
This commit is contained in:
@@ -545,6 +545,10 @@ describe('AssistantDatabase', () => {
|
||||
expect(summaries).toHaveLength(100)
|
||||
expect(summaries.every(item => item.messages.length === 0 &&
|
||||
item.messageSummary?.count === 16 && item.messageSummary.firstRole === 'assistant')).toBe(true)
|
||||
for (const snapshot of snapshots) {
|
||||
expect(summaries.find(item => item.id === snapshot.id)?.messageSummary?.latestMessageAt)
|
||||
.toBe(Math.max(...snapshot.messages.map(message => message.createdAt)))
|
||||
}
|
||||
expect(JSON.stringify(summaries).length).toBeLessThan(JSON.stringify(snapshots).length * 0.02)
|
||||
const id = snapshots[0]!.id
|
||||
const detail = database.listConversationSummaries([id]).find(item => item.id === id)!
|
||||
@@ -557,12 +561,14 @@ describe('AssistantDatabase', () => {
|
||||
expect(database.searchConversations(' ')).toEqual([])
|
||||
const added = { id: randomUUID(), title: 'Newer', updatedAt: 1000 }
|
||||
database.saveLocalConversations([{ header: added, messages: [] }])
|
||||
expect(database.listConversationSummaries().find(item => item.id === added.id)?.messageSummary?.latestMessageAt).toBeUndefined()
|
||||
expect(database.listConversationSummaries().some(item => item.id === id)).toBe(true)
|
||||
expect(database.searchConversations('äpfel 中文 0 %_')).toEqual([id])
|
||||
expect(database.listConversationSummaries([id]).find(item => item.id === id)?.messages).toHaveLength(16)
|
||||
// A header-only save of a summary cannot replace or erase messages.
|
||||
database.saveLocalConversations([{ header: { id, title: 'Renamed', updatedAt: 101 }, messages: [] }])
|
||||
expect(database.getConversation(id).messages).toEqual(snapshots[0]!.messages)
|
||||
expect(database.listConversationSummaries().find(item => item.id === id)?.messageSummary?.latestMessageAt).toBe(15)
|
||||
} finally { database.close() }
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user