@@ -118,6 +118,7 @@ Must be a valid model supported by server, check `eca-chat-select-model`."
118118(defvar-local eca-chat--spinner-string " " )
119119(defvar-local eca-chat--spinner-timer nil )
120120(defvar-local eca-chat--progress-text " " )
121+ (defvar-local eca-chat--last-user-message-pos nil )
121122
122123(defvar eca-chat-buffer-name " <eca-chat>" )
123124
@@ -309,13 +310,28 @@ This is similar to `backward-delete-char' but protects the prompt/context line."
309310 (select-window (get-buffer-window buffer))
310311 (set-window-buffer (get-buffer-window buffer) buffer)))
311312
312- (defun eca-chat--add-content ( content )
313- " Add CONTENT to the chat ."
313+ (defun eca-chat--mark-header ( )
314+ " Mark last messages header ."
314315 (let ((context-start (eca-chat--prompt-area-start-point)))
315316 (save-excursion
316317 (goto-char context-start)
317318 (goto-char (1- (point )))
318- (insert content)
319+ (setq-local eca-chat--last-user-message-pos (point )))))
320+
321+ (defun eca-chat--add-header (content )
322+ " Add CONTENT to the chat just after last user input."
323+ (when eca-chat--last-user-message-pos
324+ (save-excursion
325+ (goto-char eca-chat--last-user-message-pos)
326+ (insert content))))
327+
328+ (defun eca-chat--add-text (text )
329+ " Add TEXT to the chat current position."
330+ (let ((context-start (eca-chat--prompt-area-start-point)))
331+ (save-excursion
332+ (goto-char context-start)
333+ (goto-char (1- (point )))
334+ (insert text)
319335 (point ))))
320336
321337(defun eca-chat--relativize-filename-for-workspace-root (filename roots )
@@ -482,29 +498,30 @@ This is similar to `backward-delete-char' but protects the prompt/context line."
482498 (" text" (when-let* ((text (plist-get content :text )))
483499 (pcase role
484500 (" user" (progn
485- (eca-chat--add-content
501+ (eca-chat--add-text
486502 (propertize text
487503 'font-lock-face 'eca-chat-user-messages-face
488504 'line-prefix (propertize eca-chat-prompt-prefix 'font-lock-face 'eca-chat-user-messages-face )
489505 'line-spacing 10 ))
506+ (eca-chat--mark-header)
490507 (font-lock-ensure )))
491508 (" system" (progn
492- (eca-chat--add-content
509+ (eca-chat--add-text
493510 (propertize text
494511 'line-height 20
495512 'font-lock-face 'eca-chat-system-messages-face ))))
496- (_ (eca-chat--add-content text)))))
497- (" url" (eca-chat--add-content
513+ (_ (eca-chat--add-text text)))))
514+ (" url" (eca-chat--add-header
498515 (concat
499- " \n "
516+ " 🌐 "
500517 (buttonize
501- (concat " 🌐 " ( plist-get content :title ) )
518+ (plist-get content :title )
502519 (lambda (_ ) (browse-url (plist-get content :url )))
503520 nil
504521 (plist-get content :url ))
505- " \n " )))
522+ " \n\n " )))
506523 (" mcpToolCall" (let ((name (plist-get content :name )))
507- (eca-chat--add-content
524+ (eca-chat--add-text
508525 (format (propertize " \n %s %s\n "
509526 'line-spacing 10 )
510527 (propertize " Calling MCP tool"
@@ -519,7 +536,7 @@ This is similar to `backward-delete-char' but protects the prompt/context line."
519536 (setq-local eca-chat--progress-text (propertize (plist-get content :text ) 'font-lock-face 'eca-chat-system-messages-face ))))
520537 (" finished" (progn
521538 (eca-chat--spinner-stop)
522- (eca-chat--add-content (propertize " \n " 'line-spacing 10 ))
539+ (eca-chat--add-text (propertize " \n " 'line-spacing 10 ))
523540 (setq-local eca-chat--progress-text " " )))))))))
524541
525542(defun eca-chat-open ()
0 commit comments