branch: elpa/gptel
commit 2a201016ff954304679ac1f1c81ea7bd78f507ae
Author: Karthik Chikmagalur <[email protected]>
Commit: Karthik Chikmagalur <[email protected]>

    gptel: Fix simultaneous tool call display from multiple requests
    
    * gptel.el (gptel--display-tool-calls): When there is more than
    one request originating from a single prompt region in a buffer
    and more than one request creates a tool call that needs
    confirmation, only the latest tool call was confirmed.  Ensure
    that all pending tool calls are dispatched.  This fix works by
    appending the tool call details (spec, args, callback and
    previewer) to the existing tool-call display overlay properties
    instead of overwriting them.  The corresponding overlay properties
    are now lists.
    
    (Multiple requests originating from a single prompt region is a
    common occurrence when sub-agents or custom gptel-requests are
    involved.)
    
    (gptel--accept-tool-calls, gptel--reject-tool-calls): Adjustments
    for tool-call lists.
---
 gptel.el | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/gptel.el b/gptel.el
index 8c40d8cff5..1e0deccac8 100644
--- a/gptel.el
+++ b/gptel.el
@@ -1816,12 +1816,15 @@ USE-MINIBUFFER is non-nil)."
              (concat (propertize "\n" 'face
                                  '(:inherit font-lock-string-face :underline t 
:extend t))))
             (overlay-put prompt-ov 'evaporate t)
-            (overlay-put ov 'prompt prompt-ov)
+            (overlay-put ov 'prompt (cons prompt-ov (overlay-get ov 'prompt)))
             (move-overlay ov ov-start (point)))
           ;; Add confirmation prompt to the overlay
-          (when preview-handlers (overlay-put ov 'previews preview-handlers))
+          (when preview-handlers
+            (overlay-put ov 'previews
+                         (nconc (overlay-get ov 'previews) preview-handlers)))
           (overlay-put ov 'mouse-face 'highlight)
-          (overlay-put ov 'gptel-tool tool-calls)
+          (overlay-put ov 'gptel-tool
+                       (nconc (overlay-get ov 'gptel-tool) tool-calls))
           (overlay-put ov 'help-echo
                        (concat "Tool call(s) requested: " actions-string))
           (overlay-put ov 'keymap gptel-tool-call-actions-map)
@@ -1963,11 +1966,11 @@ NAME and ARG-VALUES are the name and arguments for the 
call."
       (when-let* ((preview-handles (overlay-get ov 'previews)))
         (dolist (func-to-handle preview-handles)
           (when (car func-to-handle) (apply func-to-handle))))
-      (when-let* ((prompt-ov (overlay-get ov 'prompt))
-                  ((overlay-buffer prompt-ov))
-                  (inhibit-read-only t))
-        (delete-region (overlay-start prompt-ov)
-                       (overlay-end prompt-ov))))
+      (dolist (prompt-ov (overlay-get ov 'prompt))
+        (when-let* (((overlay-buffer prompt-ov))
+                    (inhibit-read-only t))
+          (delete-region (overlay-start prompt-ov)
+                         (overlay-end prompt-ov)))))
     (delete-overlay ov)))
 
 (defun gptel--reject-tool-calls (&optional _response ov)
@@ -1982,11 +1985,11 @@ NAME and ARG-VALUES are the name and arguments for the 
call."
       (when-let* ((preview-handles (overlay-get ov 'previews)))
         (dolist (func-to-handle preview-handles)
           (when (car func-to-handle) (apply func-to-handle))))
-      (when-let* ((prompt-ov (overlay-get ov 'prompt))
-                  ((overlay-buffer prompt-ov))
-                  (inhibit-read-only t))
-        (delete-region (overlay-start prompt-ov)
-                       (overlay-end prompt-ov))))
+      (dolist (prompt-ov (overlay-get ov 'prompt))
+        (when-let* (((overlay-buffer prompt-ov))
+                    (inhibit-read-only t))
+          (delete-region (overlay-start prompt-ov)
+                         (overlay-end prompt-ov)))))
     (delete-overlay ov)))
 
 (defun gptel--dispatch-tool-calls (choice)

Reply via email to