Files
OpenOPC/opc/plugins/office_ui/frontend_src/chat/ChatStore.test.ts
T
2026-07-01 17:56:31 +08:00

156 lines
4.2 KiB
TypeScript

import assert from 'node:assert/strict'
import type { ChatMessage } from '../types/chat'
import { mapBackendMessage } from '../lib/collabSync'
import { analyzeCheckpointMessages } from './checkpointUtils'
import { __chatStoreTestUtils } from './ChatStore'
const syntheticCheckpoint: ChatMessage = {
id: 'checkpoint::cp-delivery',
channelId: 'session:task-1',
sender: 'assistant',
senderName: 'Company Member',
content: 'Human review requested.',
timestamp: 1,
mentions: [],
metadata: {
checkpoint_type: 'company_delivery_feedback',
checkpoint_id: 'cp-delivery',
summary: 'Pending review',
},
}
const backendCheckpointUpdate: ChatMessage = {
id: 'db-message-1',
channelId: 'session:task-1',
sender: 'assistant',
senderName: 'Company Member',
content: 'Human review requested.',
timestamp: 2,
mentions: [],
metadata: {
checkpoint_type: 'company_delivery_feedback',
checkpoint_id: 'cp-delivery',
checkpoint_status: 'ignored',
checkpoint_reply_kind: 'ignore',
},
}
const mergedCheckpoint = __chatStoreTestUtils.dedupeMessages([
syntheticCheckpoint,
backendCheckpointUpdate,
])
assert.equal(mergedCheckpoint.length, 1)
assert.equal(mergedCheckpoint[0].id, 'db-message-1')
assert.equal(mergedCheckpoint[0].metadata?.checkpoint_status, 'ignored')
assert.deepEqual([...analyzeCheckpointMessages(mergedCheckpoint).pendingMessageIds], [])
assert.deepEqual([...analyzeCheckpointMessages(mergedCheckpoint).respondedMessageIds], ['db-message-1'])
const terminalSyntheticCheckpoint: ChatMessage = {
...syntheticCheckpoint,
timestamp: 2,
metadata: {
...syntheticCheckpoint.metadata,
checkpoint_status: 'ignored',
checkpoint_reply_kind: 'ignore',
},
}
const mergedSameIdCheckpoint = __chatStoreTestUtils.dedupeMessages([
syntheticCheckpoint,
terminalSyntheticCheckpoint,
])
assert.equal(mergedSameIdCheckpoint.length, 1)
assert.equal(mergedSameIdCheckpoint[0].id, 'checkpoint::cp-delivery')
assert.equal(mergedSameIdCheckpoint[0].metadata?.checkpoint_status, 'ignored')
assert.deepEqual([...analyzeCheckpointMessages(mergedSameIdCheckpoint).pendingMessageIds], [])
const optimisticUserMessage: ChatMessage = {
id: 'msg-local',
channelId: 'session:task-1',
sender: 'user',
senderName: 'You',
content: 'New requirement',
timestamp: 3,
mentions: [],
metadata: {
ui_message_id: 'ui-1',
},
}
const backendUserMessage: ChatMessage = {
id: 'db-user-1',
channelId: 'session:task-1',
sender: 'user',
senderName: 'You',
content: 'New requirement',
timestamp: 4,
mentions: [],
metadata: {
ui_message_id: 'ui-1',
},
}
const mergedUserMessage = __chatStoreTestUtils.dedupeMessages([
optimisticUserMessage,
backendUserMessage,
])
assert.equal(mergedUserMessage.length, 1)
assert.equal(mergedUserMessage[0].metadata?.ui_message_id, 'ui-1')
const nativeCompanyRawTurn: ChatMessage = {
id: 'native-raw-1',
channelId: 'session:task-1',
sender: 'assistant',
senderName: 'Task Generalist',
content: '最终分析已经完成,结论如下。',
timestamp: 5,
mentions: [],
metadata: {
source: 'engine',
transcript_kind: 'runtime_v2_assistant',
},
}
const companyRoleResult: ChatMessage = {
id: 'role-result-1',
channelId: 'session:task-1',
sender: 'chao',
senderName: 'Chao',
content: '最终分析已经完成,结论如下。',
timestamp: 6,
mentions: [],
metadata: {
source: 'engine',
transcript_kind: 'company_role_result',
},
}
const mergedNativeCompanyDuplicate = __chatStoreTestUtils.dedupeMessages([
nativeCompanyRawTurn,
companyRoleResult,
])
assert.equal(mergedNativeCompanyDuplicate.length, 1)
assert.equal(mergedNativeCompanyDuplicate[0].id, 'role-result-1')
assert.equal(mergedNativeCompanyDuplicate[0].senderName, 'Chao')
const mappedTaskGeneralistMessage = mapBackendMessage({
message_id: 'legacy-task-generalist',
channel_id: 'session:task-1',
sender: 'task_generalist',
sender_name: 'Task Generalist',
content: 'Legacy native task result.',
created_at: 10,
metadata: {
transcript_kind: 'runtime_v2_company_assistant',
},
})
assert.equal(mappedTaskGeneralistMessage.senderName, 'OPC')
console.log('ChatStore.test.ts: OK (optimistic, checkpoint, and company result identity merging)')