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)