Truncate tool results to 16KB to prevent context overflow

ober

81781baca0aaa22bb9c29e18cadab8fad3084168

diff --git a/lib/jcode/tool/registry.sls b/lib/jcode/tool/registry.sls
index f7794f6..65f715f 100644
--- a/lib/jcode/tool/registry.sls
+++ b/lib/jcode/tool/registry.sls
@@ -35,17 +35,32 @@
        (register-tool! name description schema handler)
        (let ([t (hash-get *tools* name)])
          (when t (hash-put! t "internal" #t))))
+  (def *max-tool-result-len* 16000)
+  (def (truncate-result str)
+       (if (<= (string-length str) *max-tool-result-len*)
+           str
+           (let ([keep (quotient *max-tool-result-len* 2)])
+             (string-append
+               (substring str 0 keep)
+               (format
+                 "\n\n... [truncated ~a chars] ...\n\n"
+                 (- (string-length str) *max-tool-result-len*))
+               (substring
+                 str
+                 (- (string-length str) keep)
+                 (string-length str))))))
   (def (tool-execute name args)
        (log-info logger "execute" `((name . ,name)))
        (let ([tool (hash-get *tools* name)])
          (if tool
-             (try ((hash-ref tool "handler") args)
-                  (catch
-                    (e)
-                    (format
-                      "Error executing ~a: ~a"
-                      name
-                      (err->string e))))
+             (let ([result (try ((hash-ref tool "handler") args)
+                                (catch
+                                  (e)
+                                  (format
+                                    "Error executing ~a: ~a"
+                                    name
+                                    (err->string e))))])
+               (truncate-result result))
              (format "Unknown tool: ~a" name))))
   (def (get-tool-schemas)
        (map tool->openai-schema
diff --git a/src/jcode/tool/registry.ss b/src/jcode/tool/registry.ss
index cad3e1a..f77772e 100644
--- a/src/jcode/tool/registry.ss
+++ b/src/jcode/tool/registry.ss
@@ -33,14 +33,27 @@
   (let ((t (hash-get *tools* name)))
     (when t (hash-put! t "internal" #t))))
 
+(def *max-tool-result-len* 16000)
+
+(def (truncate-result str)
+  (if (<= (string-length str) *max-tool-result-len*)
+    str
+    (let ((keep (quotient *max-tool-result-len* 2)))
+      (string-append
+        (substring str 0 keep)
+        (format "\n\n... [truncated ~a chars] ...\n\n"
+          (- (string-length str) *max-tool-result-len*))
+        (substring str (- (string-length str) keep) (string-length str))))))
+
 (def (tool-execute name args)
   (log-info logger "execute" `((name . ,name)))
   (let ((tool (hash-get *tools* name)))
     (if tool
-      (try
-        ((hash-ref tool "handler") args)
-        (catch (e)
-          (format "Error executing ~a: ~a" name (err->string e))))
+      (let ((result (try
+                      ((hash-ref tool "handler") args)
+                      (catch (e)
+                        (format "Error executing ~a: ~a" name (err->string e))))))
+        (truncate-result result))
       (format "Unknown tool: ~a" name))))
 
 (def (get-tool-schemas)