@@ -397,22 +397,23 @@ end
397397
398398function Chat :add_message (message , replace )
399399 local current_message = self .messages [# self .messages ]
400- local needs_header = false
400+ local is_new = not current_message
401+ or current_message .role ~= message .role
402+ or (message .id and current_message .id ~= message .id )
401403
402- -- Check if we need to add a header (role change or first message)
403- if not current_message or current_message .role ~= message .role then
404- needs_header = true
405- end
406-
407- -- Add appropriate header based on role
408- if needs_header then
404+ if is_new then
405+ -- Add appropriate header based on role and generate a new ID if not provided
409406 message .id = message .id or utils .uuid ()
410407 local header = self .headers [message .role ]
411408 if current_message then
412409 header = ' \n ' .. header
413410 end
411+
412+ table.insert (self .messages , message )
414413 self :append (header .. ' (' .. message .id .. ' )' .. self .separator .. ' \n\n ' )
414+ self :append (message .content )
415415 elseif replace and current_message then
416+ -- Replace the content of the current message
416417 self :append (' ' )
417418 self :render ()
418419
@@ -432,15 +433,9 @@ function Chat:add_message(message, replace)
432433 end
433434
434435 self :append (' ' )
435- return
436- end
437-
438- -- Handle message content combining or creation
439- if current_message and current_message .role == message .role then
440- current_message .content = current_message .content .. message .content
441- self :append (message .content )
442436 else
443- table.insert (self .messages , message )
437+ -- Append to the current message
438+ current_message .content = current_message .content .. message .content
444439 self :append (message .content )
445440 end
446441end
@@ -561,7 +556,7 @@ function Chat:render()
561556 local current_block = nil
562557
563558 local function parse_header (header , line )
564- return line :match (' ^' .. vim .pesc (header ) .. ' %(([%w%- ]+)%)' .. vim .pesc (self .separator ) .. ' $' )
559+ return line :match (' ^' .. vim .pesc (header ) .. ' %(([^) ]+)%)' .. vim .pesc (self .separator ) .. ' $' )
565560 end
566561
567562 for l , line in ipairs (lines ) do
0 commit comments