Add virtualized chat pagination (#1080)

This commit is contained in:
ekko
2026-05-28 09:34:30 +08:00
committed by GitHub
parent 21bb8385f2
commit a6b3bec29b
16 changed files with 692 additions and 161 deletions
+4
View File
@@ -75,6 +75,10 @@ export interface RunEvent {
export interface ResumeSessionPayload {
session_id: string
messages: any[]
messageTotal?: number
messageLoadedCount?: number
messagePageLimit?: number
hasMoreBefore?: boolean
isWorking: boolean
isAborting?: boolean
events: Array<{ event: string; data: RunEvent }>
+9 -2
View File
@@ -162,8 +162,15 @@ export async function listRooms(): Promise<{ rooms: RoomInfo[] }> {
return request('/api/hermes/group-chat/rooms')
}
export async function getRoomDetail(roomId: string): Promise<{ room: RoomInfo; messages: ChatMessage[]; agents: RoomAgent[]; members: MemberInfo[] }> {
return request(`/api/hermes/group-chat/rooms/${roomId}`)
export async function getRoomDetail(
roomId: string,
options: { offset?: number; limit?: number } = {},
): Promise<{ room: RoomInfo; messages: ChatMessage[]; agents: RoomAgent[]; members: MemberInfo[]; total?: number; offset?: number; limit?: number; hasMore?: boolean }> {
const params = new URLSearchParams()
if (options.offset != null) params.set('offset', String(options.offset))
if (options.limit != null) params.set('limit', String(options.limit))
const query = params.toString()
return request(`/api/hermes/group-chat/rooms/${roomId}${query ? `?${query}` : ''}`)
}
export async function joinRoomByCode(code: string): Promise<{ room: RoomInfo }> {
@@ -30,6 +30,15 @@ export interface SessionDetail extends SessionSummary {
messages: HermesMessage[]
}
export interface PaginatedSessionMessages {
session: SessionSummary
messages: HermesMessage[]
total: number
offset: number
limit: number
hasMore: boolean
}
export interface SessionSearchResult extends SessionSummary {
matched_message_id: number | null
snippet: string
@@ -96,6 +105,26 @@ export async function fetchSession(id: string, profile?: string | null): Promise
}
}
export async function fetchSessionMessagesPage(
id: string,
offset: number,
limit = 300,
profile?: string | null,
): Promise<PaginatedSessionMessages | null> {
try {
const params = new URLSearchParams()
params.set('offset', String(offset))
params.set('limit', String(limit))
if (profile) params.set('profile', profile)
const res = await request<PaginatedSessionMessages>(
`/api/hermes/sessions/conversations/${encodeURIComponent(id)}/messages/paginated?${params}`,
)
return res
} catch {
return null
}
}
/**
* Fetch Hermes session detail only (exclude api_server source)
*/