Skip to content

Commit bdd9ecf

Browse files
author
Bruce Hauman
committed
Improve session history display with EDN conversion and tool execution tracking
- Use msg-conv to convert messages to EDN for consistent handling - Parse tool arguments for readable display - Refactor extract-tool-executions to find ALL tool executions, not just at end - Display user messages, AI responses, and tool executions when resuming - Skip system messages in history display - Add msg-conv import for message conversion utilities
1 parent 8153353 commit bdd9ecf

File tree

1 file changed

+63
-15
lines changed

1 file changed

+63
-15
lines changed

src/clojure_mcp/prompt_cli.clj

Lines changed: 63 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
[clojure-mcp.tools.agent-tool-builder.default-agents :as default-agents]
1616
[clojure-mcp.agent.general-agent :as general-agent]
1717
[clojure-mcp.agent.langchain.chat-listener :as listener]
18+
[clojure-mcp.agent.langchain.message-conv :as msg-conv]
1819
[clojure-mcp.tool-format :as tool-format])
1920
(:import [dev.langchain4j.data.message ChatMessageSerializer ChatMessageDeserializer]
2021
[java.time LocalDateTime]
@@ -122,22 +123,35 @@
122123
:filename (.getName session-file)}))
123124

124125
(defn extract-tool-executions
125-
"Extract tool request/result pairs from messages.
126+
"Extract all tool request/result pairs from messages.
126127
Returns vector of {:type :tool-execution :request <req> :result <res>}"
127128
[messages]
128-
(when (and (seq messages)
129-
(= "TOOL_EXECUTION_RESULT" (:type (last messages))))
130-
(let [reversed (reverse messages)
131-
results (take-while #(= "TOOL_EXECUTION_RESULT" (:type %)) reversed)
132-
ai-msg (first (drop-while #(= "TOOL_EXECUTION_RESULT" (:type %)) reversed))]
133-
(when (and ai-msg (= "AI" (:type ai-msg)))
134-
(let [requests (:toolExecutionRequests ai-msg)]
135-
(mapv (fn [req res]
136-
{:type :tool-execution
137-
:request req
138-
:result res})
139-
requests
140-
(reverse results)))))))
129+
(loop [msgs messages
130+
executions []]
131+
(if (empty? msgs)
132+
executions
133+
(let [[head & tail] msgs]
134+
;; Look for AI messages with tool requests
135+
(if (and (= "AI" (:type head))
136+
(seq (:toolExecutionRequests head)))
137+
;; Found an AI message with tool requests
138+
;; The next messages should be TOOL_EXECUTION_RESULT messages
139+
(let [requests (:toolExecutionRequests head)
140+
results (take (count requests) tail)]
141+
;; Verify all results are TOOL_EXECUTION_RESULT
142+
(if (every? #(= "TOOL_EXECUTION_RESULT" (:type %)) results)
143+
(let [new-executions (mapv (fn [req res]
144+
{:type :tool-execution
145+
:request req
146+
:result res})
147+
requests
148+
results)]
149+
(recur (drop (count results) tail)
150+
(into executions new-executions)))
151+
;; Results don't match, skip this AI message
152+
(recur tail executions)))
153+
;; Not an AI message with tools, continue
154+
(recur tail executions))))))
141155

142156
(defn print-tool-executions
143157
"Print formatted tool executions"
@@ -272,10 +286,44 @@
272286
(or model-to-use (:model agent-config))))
273287
agent (agent-core/build-agent-from-config nrepl-client-atom agent-config)
274288

275-
;; If resuming, add loaded messages to agent's memory
289+
;; If resuming, add loaded messages to agent's memory
276290
_ (when resume
277291
(when-let [loaded-messages (:messages resume-data)]
278292
(println (str "Loading " (count loaded-messages) " messages from session..."))
293+
294+
;; Convert all messages to EDN first
295+
(let [edn-messages (-> loaded-messages
296+
msg-conv/messages->edn
297+
msg-conv/parse-messages-tool-arguments)]
298+
(println "\n=== Session History ===")
299+
300+
;; Display user and AI messages
301+
(doseq [msg edn-messages]
302+
(case (:type msg)
303+
"USER"
304+
(when-let [contents (:contents msg)]
305+
(println "\n--- User ---")
306+
(doseq [content contents]
307+
(when (= "TEXT" (:type content))
308+
(println (:text content)))))
309+
310+
"AI"
311+
(when-let [text (:text msg)]
312+
(when-not (str/blank? text)
313+
(println "\n--- AI Response ---")
314+
(println text)))
315+
316+
;; Skip SYSTEM and TOOL_EXECUTION_RESULT for now
317+
nil))
318+
319+
;; Print tool executions
320+
(when-let [executions (extract-tool-executions edn-messages)]
321+
(println "\n--- Tool Executions ---")
322+
(print-tool-executions executions))
323+
324+
(println "========================\n"))
325+
326+
;; Add Java messages to memory
279327
(doseq [msg loaded-messages]
280328
(.add (:memory agent) msg))))
281329

0 commit comments

Comments
 (0)