|
15 | 15 | [clojure-mcp.tools.agent-tool-builder.default-agents :as default-agents] |
16 | 16 | [clojure-mcp.agent.general-agent :as general-agent] |
17 | 17 | [clojure-mcp.agent.langchain.chat-listener :as listener] |
| 18 | + [clojure-mcp.agent.langchain.message-conv :as msg-conv] |
18 | 19 | [clojure-mcp.tool-format :as tool-format]) |
19 | 20 | (:import [dev.langchain4j.data.message ChatMessageSerializer ChatMessageDeserializer] |
20 | 21 | [java.time LocalDateTime] |
|
122 | 123 | :filename (.getName session-file)})) |
123 | 124 |
|
124 | 125 | (defn extract-tool-executions |
125 | | - "Extract tool request/result pairs from messages. |
| 126 | + "Extract all tool request/result pairs from messages. |
126 | 127 | Returns vector of {:type :tool-execution :request <req> :result <res>}" |
127 | 128 | [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)))))) |
141 | 155 |
|
142 | 156 | (defn print-tool-executions |
143 | 157 | "Print formatted tool executions" |
|
272 | 286 | (or model-to-use (:model agent-config)))) |
273 | 287 | agent (agent-core/build-agent-from-config nrepl-client-atom agent-config) |
274 | 288 |
|
275 | | - ;; If resuming, add loaded messages to agent's memory |
| 289 | +;; If resuming, add loaded messages to agent's memory |
276 | 290 | _ (when resume |
277 | 291 | (when-let [loaded-messages (:messages resume-data)] |
278 | 292 | (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 |
279 | 327 | (doseq [msg loaded-messages] |
280 | 328 | (.add (:memory agent) msg)))) |
281 | 329 |
|
|
0 commit comments