v0.7.2: wire gate-trace-lines into view-chat — TDD
Gate trace lines rendered below each agent message in dim color. Collapsed-gates state field for Tab toggle (default: visible). Uses passepartout::gate-trace-lines for colored entries. - channel-tui-view: view-chat renders gate-trace after message content - channel-tui-state: :collapsed-gates field in init-state - View tests: 29/29 (1 new state-field test)
This commit is contained in:
@@ -114,7 +114,8 @@ See *tui-theme-presets* for named presets (dark, light, solarized, gruvbox).")
|
|||||||
:scroll-offset 0 :busy nil :cursor-pos 0
|
:scroll-offset 0 :busy nil :cursor-pos 0
|
||||||
:pending-ctrl-x nil
|
:pending-ctrl-x nil
|
||||||
:scroll-at-bottom t :scroll-notify nil
|
:scroll-at-bottom t :scroll-notify nil
|
||||||
:streaming-text nil :url-buffer nil ; v0.7.1
|
:streaming-text nil :url-buffer nil ; v0.7.1
|
||||||
|
:collapsed-gates nil ; v0.7.2
|
||||||
:dirty (list nil nil nil))))
|
:dirty (list nil nil nil))))
|
||||||
|
|
||||||
(defun now ()
|
(defun now ()
|
||||||
|
|||||||
@@ -86,14 +86,21 @@ Returns list of trimmed strings. Single words wider than width are split."
|
|||||||
(prefix (case role (:user "⬆") (:agent "⬇") (t " ")))
|
(prefix (case role (:user "⬆") (:agent "⬇") (t " ")))
|
||||||
(line-text (format nil "~a [~a] ~a" prefix time content))
|
(line-text (format nil "~a [~a] ~a" prefix time content))
|
||||||
(wrapped (word-wrap line-text (- w 2))))
|
(wrapped (word-wrap line-text (- w 2))))
|
||||||
(dolist (line wrapped)
|
(dolist (line wrapped)
|
||||||
(when (< y (1- h))
|
(when (< y (1- h))
|
||||||
(if (eq role :agent)
|
(if (eq role :agent)
|
||||||
(let ((segments (parse-markdown-spans line)))
|
(let ((segments (parse-markdown-spans line)))
|
||||||
(setf y (render-styled win segments y 1 w)))
|
(setf y (render-styled win segments y 1 w)))
|
||||||
(progn
|
(progn
|
||||||
(add-string win line :y y :x 1 :n (1- w) :fgcolor color)
|
(add-string win line :y y :x 1 :n (1- w) :fgcolor color)
|
||||||
(incf y))))))))))
|
(incf y)))))
|
||||||
|
;; v0.7.2: gate trace below agent messages
|
||||||
|
(let ((gate-trace (getf msg :gate-trace)))
|
||||||
|
(when (and gate-trace (not (member i (st :collapsed-gates))))
|
||||||
|
(dolist (entry (passepartout::gate-trace-lines gate-trace))
|
||||||
|
(when (< y (1- h))
|
||||||
|
(add-string win (car entry) :y y :x 3 :n (- w 4) :fgcolor (or (getf (cdr entry) :fgcolor) :dim))
|
||||||
|
(incf y))))))))))
|
||||||
(refresh win))
|
(refresh win))
|
||||||
|
|
||||||
(defun view-input (win)
|
(defun view-input (win)
|
||||||
@@ -386,3 +393,9 @@ ASCII < 128 = 1. CJK, fullwidth, emoji = 2. Combining marks = 0. Tab = 8."
|
|||||||
'((:gate "network" :result :approval)))))
|
'((:gate "network" :result :approval)))))
|
||||||
(is (= 1 (length lines)))
|
(is (= 1 (length lines)))
|
||||||
(is (search "HITL" (caar lines)))))
|
(is (search "HITL" (caar lines)))))
|
||||||
|
|
||||||
|
(test test-init-state-has-collapsed-gates
|
||||||
|
"Contract v0.7.2: init-state includes :collapsed-gates field."
|
||||||
|
(passepartout.channel-tui::init-state)
|
||||||
|
(let ((cg (passepartout.channel-tui::st :collapsed-gates)))
|
||||||
|
(is (null cg))))
|
||||||
|
|||||||
@@ -134,7 +134,8 @@ See *tui-theme-presets* for named presets (dark, light, solarized, gruvbox).")
|
|||||||
:scroll-offset 0 :busy nil :cursor-pos 0
|
:scroll-offset 0 :busy nil :cursor-pos 0
|
||||||
:pending-ctrl-x nil
|
:pending-ctrl-x nil
|
||||||
:scroll-at-bottom t :scroll-notify nil
|
:scroll-at-bottom t :scroll-notify nil
|
||||||
:streaming-text nil :url-buffer nil ; v0.7.1
|
:streaming-text nil :url-buffer nil ; v0.7.1
|
||||||
|
:collapsed-gates nil ; v0.7.2
|
||||||
:dirty (list nil nil nil))))
|
:dirty (list nil nil nil))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|||||||
@@ -134,14 +134,21 @@ Returns list of trimmed strings. Single words wider than width are split."
|
|||||||
(prefix (case role (:user "⬆") (:agent "⬇") (t " ")))
|
(prefix (case role (:user "⬆") (:agent "⬇") (t " ")))
|
||||||
(line-text (format nil "~a [~a] ~a" prefix time content))
|
(line-text (format nil "~a [~a] ~a" prefix time content))
|
||||||
(wrapped (word-wrap line-text (- w 2))))
|
(wrapped (word-wrap line-text (- w 2))))
|
||||||
(dolist (line wrapped)
|
(dolist (line wrapped)
|
||||||
(when (< y (1- h))
|
(when (< y (1- h))
|
||||||
(if (eq role :agent)
|
(if (eq role :agent)
|
||||||
(let ((segments (parse-markdown-spans line)))
|
(let ((segments (parse-markdown-spans line)))
|
||||||
(setf y (render-styled win segments y 1 w)))
|
(setf y (render-styled win segments y 1 w)))
|
||||||
(progn
|
(progn
|
||||||
(add-string win line :y y :x 1 :n (1- w) :fgcolor color)
|
(add-string win line :y y :x 1 :n (1- w) :fgcolor color)
|
||||||
(incf y))))))))))
|
(incf y)))))
|
||||||
|
;; v0.7.2: gate trace below agent messages
|
||||||
|
(let ((gate-trace (getf msg :gate-trace)))
|
||||||
|
(when (and gate-trace (not (member i (st :collapsed-gates))))
|
||||||
|
(dolist (entry (passepartout::gate-trace-lines gate-trace))
|
||||||
|
(when (< y (1- h))
|
||||||
|
(add-string win (car entry) :y y :x 3 :n (- w 4) :fgcolor (or (getf (cdr entry) :fgcolor) :dim))
|
||||||
|
(incf y))))))))))
|
||||||
(refresh win))
|
(refresh win))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -452,4 +459,10 @@ ASCII < 128 = 1. CJK, fullwidth, emoji = 2. Combining marks = 0. Tab = 8."
|
|||||||
'((:gate "network" :result :approval)))))
|
'((:gate "network" :result :approval)))))
|
||||||
(is (= 1 (length lines)))
|
(is (= 1 (length lines)))
|
||||||
(is (search "HITL" (caar lines)))))
|
(is (search "HITL" (caar lines)))))
|
||||||
|
|
||||||
|
(test test-init-state-has-collapsed-gates
|
||||||
|
"Contract v0.7.2: init-state includes :collapsed-gates field."
|
||||||
|
(passepartout.channel-tui::init-state)
|
||||||
|
(let ((cg (passepartout.channel-tui::st :collapsed-gates)))
|
||||||
|
(is (null cg))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
Reference in New Issue
Block a user