diff --git a/tools/server/webui/src/lib/clients/agentic.client.ts b/tools/server/webui/src/lib/clients/agentic.client.ts index 13677898cb..198169fab0 100644 --- a/tools/server/webui/src/lib/clients/agentic.client.ts +++ b/tools/server/webui/src/lib/clients/agentic.client.ts @@ -48,7 +48,7 @@ import type { DatabaseMessageExtraImageFile, McpServerOverride } from '$lib/types/database'; -import { AttachmentType } from '$lib/enums'; +import { AttachmentType, MessageRole } from '$lib/enums'; export interface AgenticFlowCallbacks { onChunk?: (chunk: string) => void; @@ -190,7 +190,7 @@ export class AgenticClient { return msg as ApiChatMessageData; }) .filter((msg) => { - if (msg.role === 'system') { + if (msg.role === MessageRole.SYSTEM) { const content = typeof msg.content === 'string' ? msg.content : ''; return content.trim().length > 0; } @@ -467,7 +467,7 @@ export class AgenticClient { onToolCallChunk?.(JSON.stringify(allToolCalls)); sessionMessages.push({ - role: 'assistant', + role: MessageRole.ASSISTANT, content: turnContent || undefined, tool_calls: normalizedCalls }); @@ -562,7 +562,7 @@ export class AgenticClient { } sessionMessages.push({ - role: 'tool', + role: MessageRole.TOOL, tool_call_id: toolCall.id, content: contentParts.length === 1 ? cleanedResult : contentParts }); diff --git a/tools/server/webui/src/lib/clients/chat.client.ts b/tools/server/webui/src/lib/clients/chat.client.ts index 4c22b20b48..5689a8a438 100644 --- a/tools/server/webui/src/lib/clients/chat.client.ts +++ b/tools/server/webui/src/lib/clients/chat.client.ts @@ -20,6 +20,7 @@ import { SYSTEM_MESSAGE_PLACEHOLDER } from '$lib/constants/ui'; import { REASONING_TAGS } from '$lib/constants/agentic'; import type { ChatMessageTimings, ChatMessagePromptProgress } from '$lib/types/chat'; import type { DatabaseMessage, DatabaseMessageExtra } from '$lib/types/database'; +import { MessageRole, MessageType } from '$lib/enums'; export interface ApiProcessingState { status: 'idle' | 'preparing' | 'generating'; @@ -68,9 +69,6 @@ export interface ChatStreamCallbacks { onError?: (error: Error) => void; } -type ChatRole = 'user' | 'assistant' | 'system' | 'tool'; -type ChatMessageType = 'text' | 'root'; - interface ChatStoreStateCallbacks { setChatLoading: (convId: string, loading: boolean) => void; setChatStreaming: (convId: string, response: string, messageId: string) => void; @@ -157,7 +155,7 @@ export class ChatClient { private getMessageByIdWithRole( messageId: string, - expectedRole?: ChatRole + expectedRole?: MessageRole ): { message: DatabaseMessage; index: number } | null { const index = conversationsStore.findMessageIndex(messageId); if (index === -1) return null; @@ -178,9 +176,9 @@ export class ChatClient { * @returns The created message or null if failed */ async addMessage( - role: ChatRole, + role: MessageRole, content: string, - type: ChatMessageType = 'text', + type: MessageType = MessageType.TEXT, parent: string = '-1', extras?: DatabaseMessageExtra[] ): Promise { @@ -261,7 +259,7 @@ export class ChatClient { } const existingSystemMessage = allMessages.find( - (m) => m.role === 'system' && m.parent === rootId + (m) => m.role === MessageRole.SYSTEM && m.parent === rootId ); if (existingSystemMessage) { @@ -326,7 +324,7 @@ export class ChatClient { try { const allMessages = await conversationsStore.getConversationMessages(activeConv.id); const systemMessage = allMessages.find((m) => m.id === messageId); - if (!systemMessage || systemMessage.role !== 'system') return false; + if (!systemMessage || systemMessage.role !== MessageRole.SYSTEM) return false; const rootMessage = allMessages.find((m) => m.type === 'root' && m.parent === null); if (!rootMessage) return false; @@ -385,7 +383,7 @@ export class ChatClient { { convId: activeConv.id, type: 'text', - role: 'assistant', + role: MessageRole.ASSISTANT, content: '', timestamp: Date.now(), toolCalls: '', @@ -443,9 +441,9 @@ export class ChatClient { } const userMessage = await this.addMessage( - 'user', + MessageRole.USER, content, - 'text', + MessageType.TEXT, parentIdForUserMessage ?? '-1', extras ); @@ -768,7 +766,7 @@ export class ChatClient { const lastMessage = messages[messages.length - 1]; - if (lastMessage?.role === 'assistant') { + if (lastMessage?.role === MessageRole.ASSISTANT) { try { const updateData: { content: string; timings?: ChatMessageTimings } = { content: streamingState.response @@ -818,7 +816,7 @@ export class ChatClient { if (!activeConv) return; if (this.isChatLoading(activeConv.id)) await this.stopGeneration(); - const result = this.getMessageByIdWithRole(messageId, 'user'); + const result = this.getMessageByIdWithRole(messageId, MessageRole.USER); if (!result) return; const { message: messageToUpdate, index: messageIndex } = result; const originalContent = messageToUpdate.content; @@ -886,7 +884,7 @@ export class ChatClient { const activeConv = conversationsStore.activeConversation; if (!activeConv || this.isChatLoading(activeConv.id)) return; - const result = this.getMessageByIdWithRole(messageId, 'assistant'); + const result = this.getMessageByIdWithRole(messageId, MessageRole.ASSISTANT); if (!result) return; const { index: messageIndex } = result; @@ -929,7 +927,7 @@ export class ChatClient { const idx = conversationsStore.findMessageIndex(messageId); if (idx === -1) return; const msg = conversationsStore.activeMessages[idx]; - if (msg.role !== 'assistant') return; + if (msg.role !== MessageRole.ASSISTANT) return; const allMessages = await conversationsStore.getConversationMessages(activeConv.id); const parentMessage = allMessages.find((m) => m.id === msg.parent); @@ -1006,10 +1004,10 @@ export class ChatClient { assistantMessages = 0; const messageTypes: string[] = []; for (const msg of messagesToDelete) { - if (msg.role === 'user') { + if (msg.role === MessageRole.USER) { userMessages++; if (!messageTypes.includes('user message')) messageTypes.push('user message'); - } else if (msg.role === 'assistant') { + } else if (msg.role === MessageRole.ASSISTANT) { assistantMessages++; if (!messageTypes.includes('assistant response')) messageTypes.push('assistant response'); } @@ -1075,7 +1073,7 @@ export class ChatClient { const activeConv = conversationsStore.activeConversation; if (!activeConv || this.isChatLoading(activeConv.id)) return; - const result = this.getMessageByIdWithRole(messageId, 'assistant'); + const result = this.getMessageByIdWithRole(messageId, MessageRole.ASSISTANT); if (!result) return; const { message: msg, index: idx } = result; @@ -1097,7 +1095,7 @@ export class ChatClient { const conversationContext = conversationsStore.activeMessages.slice(0, idx); const contextWithContinue = [ ...conversationContext, - { role: 'assistant' as const, content: originalContent } + { role: MessageRole.ASSISTANT as const, content: originalContent } ]; let appendedContent = ''; @@ -1252,7 +1250,7 @@ export class ChatClient { const activeConv = conversationsStore.activeConversation; if (!activeConv || this.isChatLoading(activeConv.id)) return; - const result = this.getMessageByIdWithRole(messageId, 'assistant'); + const result = this.getMessageByIdWithRole(messageId, MessageRole.ASSISTANT); if (!result) return; const { message: msg, index: idx } = result; @@ -1301,7 +1299,7 @@ export class ChatClient { const activeConv = conversationsStore.activeConversation; if (!activeConv) return; - const result = this.getMessageByIdWithRole(messageId, 'user'); + const result = this.getMessageByIdWithRole(messageId, MessageRole.USER); if (!result) return; const { message: msg, index: idx } = result; @@ -1347,10 +1345,10 @@ export class ChatClient { const activeConv = conversationsStore.activeConversation; if (!activeConv || this.isChatLoading(activeConv.id)) return; - let result = this.getMessageByIdWithRole(messageId, 'user'); + let result = this.getMessageByIdWithRole(messageId, MessageRole.USER); if (!result) { - result = this.getMessageByIdWithRole(messageId, 'system'); + result = this.getMessageByIdWithRole(messageId, MessageRole.SYSTEM); } if (!result) return; @@ -1360,7 +1358,7 @@ export class ChatClient { const allMessages = await conversationsStore.getConversationMessages(activeConv.id); const rootMessage = allMessages.find((m) => m.type === 'root' && m.parent === null); const isFirstUserMessage = - msg.role === 'user' && rootMessage && msg.parent === rootMessage.id; + msg.role === MessageRole.USER && rootMessage && msg.parent === rootMessage.id; const parentId = msg.parent || rootMessage?.id; if (!parentId) return; @@ -1397,7 +1395,7 @@ export class ChatClient { } await conversationsStore.refreshActiveMessages(); - if (msg.role === 'user') { + if (msg.role === MessageRole.USER) { await this.generateResponseForMessage(newMessage.id); } } catch (error) { @@ -1426,7 +1424,7 @@ export class ChatClient { convId: activeConv.id, type: 'text', timestamp: Date.now(), - role: 'assistant', + role: MessageRole.ASSISTANT, content: '', toolCalls: '', children: [], @@ -1566,7 +1564,7 @@ export class ChatClient { restoreProcessingStateFromMessages(messages: DatabaseMessage[], conversationId: string): void { for (let i = messages.length - 1; i >= 0; i--) { const message = messages[i]; - if (message.role === 'assistant' && message.timings) { + if (message.role === MessageRole.ASSISTANT && message.timings) { const restoredState = this.parseTimingData({ prompt_n: message.timings.prompt_n || 0, prompt_ms: message.timings.prompt_ms, @@ -1592,7 +1590,7 @@ export class ChatClient { getConversationModel(messages: DatabaseMessage[]): string | null { for (let i = messages.length - 1; i >= 0; i--) { const message = messages[i]; - if (message.role === 'assistant' && message.model) { + if (message.role === MessageRole.ASSISTANT && message.model) { return message.model; } } diff --git a/tools/server/webui/src/lib/clients/conversations.client.ts b/tools/server/webui/src/lib/clients/conversations.client.ts index 0ae654697e..2f0466160b 100644 --- a/tools/server/webui/src/lib/clients/conversations.client.ts +++ b/tools/server/webui/src/lib/clients/conversations.client.ts @@ -28,6 +28,7 @@ import { filterByLeafNodeId, findLeafNode } from '$lib/utils'; import { getEnabledServersForConversation } from '$lib/utils/mcp'; import { mcpClient } from '$lib/clients/mcp.client'; import type { McpServerOverride } from '$lib/types/database'; +import { MessageRole } from '$lib/enums'; interface ConversationsStoreStateCallbacks { getConversations: () => DatabaseConversation[]; @@ -410,7 +411,7 @@ export class ConversationsClient { const rootMessage = allMessages.find((m) => m.type === 'root' && m.parent === null); const activeMessages = this.store.getActiveMessages(); const currentFirstUserMessage = activeMessages.find( - (m) => m.role === 'user' && m.parent === rootMessage?.id + (m) => m.role === MessageRole.USER && m.parent === rootMessage?.id ); const currentLeafNodeId = findLeafNode(allMessages, siblingId); @@ -422,7 +423,7 @@ export class ConversationsClient { const updatedActiveMessages = this.store.getActiveMessages(); if (rootMessage && updatedActiveMessages.length > 0) { const newFirstUserMessage = updatedActiveMessages.find( - (m) => m.role === 'user' && m.parent === rootMessage.id + (m) => m.role === MessageRole.USER && m.parent === rootMessage.id ); if ( diff --git a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageAssistant.svelte b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageAssistant.svelte index d0e10f2c57..0f17a39908 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageAssistant.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessageAssistant.svelte @@ -121,7 +121,7 @@ role="group" aria-label="Assistant message with actions" > - {#if message?.role === 'assistant' && isLoading() && !message?.content?.trim()} + {#if message?.role === MessageRole.ASSISTANT && isLoading() && !message?.content?.trim()}
@@ -169,7 +169,7 @@
- {:else if message.role === 'assistant'} + {:else if message.role === MessageRole.ASSISTANT} {#if showRawOutput}
{messageContent || ''}
{:else if isStructuredContent} diff --git a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessages.svelte b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessages.svelte index c203f10098..c0d767aae6 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessages.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessages.svelte @@ -1,5 +1,6 @@