@@ -2,51 +2,14 @@ package tool
22
33import (
44 "encoding/json"
5+ "fmt"
56 "strings"
67
7- "github.com/charmbracelet/glamour/v2"
8-
9- "github.com/docker/cagent/pkg/codemode"
108 "github.com/docker/cagent/pkg/tools"
119 "github.com/docker/cagent/pkg/tools/builtin"
10+ "github.com/docker/cagent/pkg/tui/styles"
1211)
1312
14- func renderSearchFiles (toolCall tools.ToolCall ) string {
15- var args builtin.SearchFilesArgs
16- if err := json .Unmarshal ([]byte (toolCall .Function .Arguments ), & args ); err != nil {
17- return ""
18- }
19-
20- // Search pattern
21- output := args .Pattern
22-
23- // Optional search path
24- if path := args .Path ; path != "" && path != "." {
25- output += " in " + path
26- }
27-
28- // Optional exclude patterns
29- if exclude := args .ExcludePatterns ; len (exclude ) > 0 {
30- output += " excluding [" + strings .Join (exclude , ", " ) + "]"
31- }
32-
33- return output
34- }
35-
36- func renderRunToolsWithJavascript (toolCall tools.ToolCall , renderer * glamour.TermRenderer ) string {
37- var args codemode.RunToolsWithJavascriptArgs
38- if err := json .Unmarshal ([]byte (toolCall .Function .Arguments ), & args ); err != nil {
39- return ""
40- }
41-
42- md , err := renderer .Render ("```javascript\n " + args .Script + "\n ```" )
43- if err != nil {
44- return args .Script
45- }
46-
47- return md
48- }
49-
5013func renderEditFile (toolCall tools.ToolCall , width int ) (string , string ) {
5114 var args builtin.EditFileArgs
5215 if err := json .Unmarshal ([]byte (toolCall .Function .Arguments ), & args ); err != nil {
@@ -70,20 +33,67 @@ func renderEditFile(toolCall tools.ToolCall, width int) (string, string) {
7033 return output .String (), args .Path
7134}
7235
73- func renderShell (toolCall tools.ToolCall , renderer * glamour.TermRenderer ) string {
74- var args builtin.RunShellArgs
75- if err := json .Unmarshal ([]byte (toolCall .Function .Arguments ), & args ); err != nil {
36+ func renderToolArgs (toolCall tools.ToolCall , width int ) string {
37+ decoder := json .NewDecoder (strings .NewReader (toolCall .Function .Arguments ))
38+
39+ tok , err := decoder .Token ()
40+ if err != nil {
41+ return ""
42+ }
43+ if delim , ok := tok .(json.Delim ); ! ok || delim != '{' {
7644 return ""
7745 }
7846
79- md , err := renderer .Render ("```sh\n " + args .Cmd + "\n ```" )
80- if err != nil {
81- md = args .Cmd
47+ type kv struct {
48+ Key string
49+ Value any
50+ }
51+ var kvs []kv
52+
53+ for decoder .More () {
54+ tok , err := decoder .Token ()
55+ if err != nil {
56+ return ""
57+ }
58+ key , ok := tok .(string )
59+ if ! ok {
60+ return ""
61+ }
62+
63+ var val any
64+ if err := decoder .Decode (& val ); err != nil {
65+ return ""
66+ }
67+
68+ kvs = append (kvs , kv {Key : key , Value : val })
8269 }
70+ _ , _ = decoder .Token ()
71+
72+ style := styles .ToolCallArgs .Width (width )
73+
74+ var md strings.Builder
75+ for i , kv := range kvs {
76+ if i > 0 {
77+ md .WriteString ("\n " )
78+ }
8379
84- if args .Cwd != "." {
85- md += "\n In directory: " + args .Cwd + "\n "
80+ var content string
81+ if v , ok := kv .Value .(string ); ok {
82+ content = v
83+ } else {
84+ buf , err := json .MarshalIndent (kv .Value , "" , " " )
85+ if err != nil {
86+ content = fmt .Sprintf ("%v" , kv .Value )
87+ } else {
88+ content = string (buf )
89+ }
90+ }
91+
92+ fmt .Fprintf (& md , "%s:\n %s" , styles .ToolCallArgKey .Render (kv .Key ), content )
93+ if ! strings .HasSuffix (content , "\n " ) {
94+ md .WriteString ("\n " )
95+ }
8696 }
8797
88- return md
98+ return " \n " + style . Render ( strings . TrimSuffix ( md . String (), " \n " ))
8999}
0 commit comments