branch: externals/ellama
commit 45db4174ed73e4ebc2fe21f99fe4bfc01da9d488
Merge: 2857f85b8f c1a1ca06b3
Author: Sergey Kostyaev <[email protected]>
Commit: GitHub <[email protected]>

    Merge pull request #350 from stsquad/transient/show-context
    
    expand ellama-session-line to include context summary
---
 ellama-context.el   | 26 ++++++++++++++++++++++++++
 ellama-transient.el | 37 ++++++++++++++++++++++++++++++++++---
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/ellama-context.el b/ellama-context.el
index ff0e82ff24..dcdb1a263a 100644
--- a/ellama-context.el
+++ b/ellama-context.el
@@ -332,6 +332,9 @@ the context."
 (cl-defgeneric ellama-context-element-format (element mode)
   "Format the context ELEMENT for the major MODE.")
 
+(cl-defgeneric ellama-context-element-quote-p (element)
+  "Return t is ELEMENT is a quote, nil otherwise.")
+
 (cl-defmethod ellama-context-element-add ((element ellama-context-element))
   "Add the ELEMENT to the Ellama context."
   (setf ellama-context-global (nreverse ellama-context-global))
@@ -350,6 +353,10 @@ the context."
   (get-buffer-create ellama--context-buffer t)
   (ellama-context-update-show))
 
+(cl-defmethod ellama-context-element-quote-p ((_element 
ellama-context-element))
+  "Return t is ELEMENT is a quote, nil otherwise."
+  nil)
+
 ;; Buffer context element
 
 (defclass ellama-context-element-buffer (ellama-context-element)
@@ -427,6 +434,11 @@ the context."
       (format "[[%s][%s]] [[elisp:(display-buffer \"%s\")][show]]"
              name name (ellama-context--quote-buffer content)))))
 
+(cl-defmethod ellama-context-element-quote-p
+  ((_element ellama-context-element-buffer-quote))
+  "Return t to indicate this `ELEMENT' is a quote."
+  t)
+
 ;; File context element
 
 (defclass ellama-context-element-file (ellama-context-element)
@@ -617,6 +629,11 @@ the context."
       (format "[[%s][%s]] [[elisp:(display-buffer \"%s\")][show]]"
              url name (ellama-context--quote-buffer content)))))
 
+(cl-defmethod ellama-context-element-quote-p
+  ((_element ellama-context-element-webpage-quote))
+  "Return t to indicate this `ELEMENT' is a quote."
+  t)
+
 ;; Info node quote context elements
 
 (defclass ellama-context-element-info-node-quote (ellama-context-element)
@@ -669,6 +686,11 @@ the context."
                name)
              (ellama-context--quote-buffer content)))))
 
+(cl-defmethod ellama-context-element-quote-p
+  ((_element ellama-context-element-info-node-quote))
+  "Return t to indicate this `ELEMENT' is a quote."
+  t)
+
 ;; File quote context elements
 
 (defclass ellama-context-element-file-quote (ellama-context-element)
@@ -710,6 +732,10 @@ the context."
       (format "[[%s][%s]] [[elisp:(display-buffer \"%s\")][show]]"
              path path (ellama-context--quote-buffer content)))))
 
+(cl-defmethod ellama-context-element-quote-p
+  ((_element ellama-context-element-file-quote))
+  "Return t to indicate this `ELEMENT' is a quote."
+  t)
 
 ;;;###autoload
 (defun ellama-context-add-file (&optional ephemeral)
diff --git a/ellama-transient.el b/ellama-transient.el
index f000677c60..81c9a56feb 100644
--- a/ellama-transient.el
+++ b/ellama-transient.el
@@ -203,11 +203,42 @@ Otherwise, prompt the user to enter a system message."
    (transient-arg-value "--new-session" args)
    :ephemeral (transient-arg-value "--ephemeral" args)))
 
+(defun ellama--context-summary ()
+  "Return a summary of context elements as a string."
+  (let ((context (append
+                  ellama-context-global ellama-context-ephemeral))
+        (total-chars 0)
+        (summary))
+
+    (cl-loop for element in context do
+             (let* ((content
+                     (ellama-context-element-extract element))
+                    (chars (length content))
+                    (name (ellama-context-element-display element)))
+               (cl-incf total-chars chars)
+               (push
+                (if (ellama-context-element-quote-p element)
+                    (format "%s (%d chars region)" name chars)
+                  (format "%s" name))
+                summary)))
+    (concat "Context: " (string-join summary ", ") (format " (total %d chars)" 
total-chars))))
+
+
+(defun ellama--transient-context ()
+  "Summarise session and context for transient menus."
+  (format "%s %s %s %s"
+          (propertize "Session:" 'face 'ellama-key-face)
+         (if ellama--current-session
+             (ellama-session-id ellama--current-session)
+           ellama--current-session-id)
+          (propertize "Context: " 'face 'ellama-key-face)
+          (ellama--context-summary)))
+
 ;;;###autoload (autoload 'ellama-transient-code-menu "ellama-transient" nil t)
 (transient-define-prefix ellama-transient-code-menu ()
   "Code Commands."
   ["Session Options"
-   :description (lambda () (ellama-session-line))
+   :description (lambda () (ellama--transient-context))
    ("-n" "Create New Session" "--new-session")]
   ["Ephemeral sessions"
    :if (lambda () ellama-session-auto-save)
@@ -284,7 +315,7 @@ Otherwise, prompt the user to enter a system message."
 (transient-define-prefix ellama-transient-ask-menu ()
   "Ask Commands."
   ["Session Options"
-   :description (lambda () (ellama-session-line))
+   :description (lambda () (ellama--transient-context))
    ("-n" "Create New Session" "--new-session")]
   ["Ephemeral sessions"
    :if (lambda () ellama-session-auto-save)
@@ -411,7 +442,7 @@ ARGS used for transient arguments."
 (transient-define-prefix ellama-transient-main-menu ()
   "Main Menu."
   ["Session Options"
-   :description (lambda () (ellama-session-line))
+   :description (lambda () (ellama--transient-context))
    ("-n" "Create New Session" "--new-session")]
   ["Ephemeral sessions"
    :if (lambda () ellama-session-auto-save)

Reply via email to