@@ -62,9 +62,22 @@ function generateId() {
6262 return Date . now ( ) . toString ( 36 ) + Math . random ( ) . toString ( 36 ) . substring ( 2 ) ;
6363}
6464
65- function createMessageElement ( content , role ) {
65+ function wrapMessageElement ( messageElement , role ) {
66+ const wrapper = document . createElement ( "div" ) ;
67+ wrapper . appendChild ( messageElement ) ;
68+ if ( role == "assistant" ) {
69+ const controlContainer = document . createElement ( "div" ) ;
70+ controlContainer . appendChild ( createCopyButton ( ( ) => messageElement . textContent , ( ) => messageElement . innerHTML ) ) ;
71+ controlContainer . classList . add ( "message-controls" ) ;
72+ wrapper . appendChild ( controlContainer ) ;
73+ }
74+ wrapper . classList . add ( "message-wrapper" , role ) ;
75+ return wrapper ;
76+ }
77+
78+ function createMessageElement ( content ) {
6679 const messageDiv = document . createElement ( "div" ) ;
67- messageDiv . classList . add ( "message" , role ) ;
80+ messageDiv . classList . add ( "message" ) ;
6881 let hdom = new HighlightDom ( messageDiv ) ;
6982 const high = new RenderMarkdown ( hdom ) ;
7083 high . feed ( content ) ;
@@ -105,6 +118,7 @@ async function handleChatStream(response) {
105118 const decoder = new TextDecoder ( ) ;
106119 let buffer = "" ;
107120 let currentMessageElement = null ;
121+ let currentMessageWrapper = null ;
108122 let messageAppended = false ;
109123 let finishReason = null ;
110124 let hdom = null ;
@@ -144,8 +158,9 @@ async function handleChatStream(response) {
144158 }
145159
146160 if ( content && ! messageAppended ) {
147- currentMessageElement = createMessageElement ( "" , "assistant" ) ;
148- chatMessages . appendChild ( currentMessageElement ) ;
161+ currentMessageElement = createMessageElement ( "" ) ;
162+ currentMessageWrapper = wrapMessageElement ( currentMessageElement , "assistant" ) ;
163+ chatMessages . appendChild ( currentMessageWrapper ) ;
149164 hdom = new HighlightDom ( currentMessageElement ) ;
150165 high = new RenderMarkdown ( hdom ) ;
151166 messageAppended = true ;
@@ -220,8 +235,8 @@ async function sendMessage() {
220235 abortController = new AbortController ( ) ;
221236
222237 // add user message to chat
223- const userMessageElement = createMessageElement ( message , "user" ) ;
224- chatMessages . appendChild ( userMessageElement ) ;
238+ const userMessageElement = createMessageElement ( message ) ;
239+ chatMessages . appendChild ( wrapMessageElement ( userMessageElement , "user" ) ) ;
225240 scrollToBottom ( ) ;
226241
227242 // update chat history
@@ -253,16 +268,16 @@ async function sendMessage() {
253268 chatHistory . push ( { role : "assistant" , content : lastMessage } ) ;
254269 } else {
255270 console . error ( "sendMessage() failed due to server error" , response ) ;
256- chatMessages . appendChild ( createMessageElement (
257- `Server replied with error code ${ response . status } ${ response . statusText } ` ,
271+ chatMessages . appendChild ( wrapMessageElement ( createMessageElement (
272+ `Server replied with error code ${ response . status } ${ response . statusText } ` ) ,
258273 "system" ) ) ;
259274 cleanupAfterMessage ( ) ;
260275 }
261276 } catch ( error ) {
262277 if ( error . name !== "AbortError" ) {
263278 console . error ( "sendMessage() failed due to unexpected exception" , error ) ;
264- chatMessages . appendChild ( createMessageElement (
265- "There was an error processing your request." ,
279+ chatMessages . appendChild ( wrapMessageElement ( createMessageElement (
280+ "There was an error processing your request." ) ,
266281 "system" ) ) ;
267282 }
268283 cleanupAfterMessage ( ) ;
@@ -449,8 +464,8 @@ function startChat(history) {
449464 for ( let i = 0 ; i < chatHistory . length ; i ++ ) {
450465 if ( flagz . no_display_prompt && chatHistory [ i ] . role == "system" )
451466 continue ;
452- chatMessages . appendChild ( createMessageElement ( chatHistory [ i ] . content ,
453- chatHistory [ i ] . role ) ) ;
467+ chatMessages . appendChild ( wrapMessageElement ( createMessageElement ( chatHistory [ i ] . content ) ,
468+ chatHistory [ i ] . role ) ) ;
454469 }
455470 scrollToBottom ( ) ;
456471}
0 commit comments