From 9172a25b929729d02af429bc9643f387b030b9bf Mon Sep 17 00:00:00 2001 From: David Gageot Date: Fri, 5 Dec 2025 08:35:38 +0100 Subject: [PATCH 1/2] Better format generic tool Signed-off-by: David Gageot --- pkg/tui/components/toolcommon/common.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/tui/components/toolcommon/common.go b/pkg/tui/components/toolcommon/common.go index d3d48b40d..63f89fb5a 100644 --- a/pkg/tui/components/toolcommon/common.go +++ b/pkg/tui/components/toolcommon/common.go @@ -38,7 +38,7 @@ func FormatToolResult(content string, width int) string { } padding := styles.ToolCallResult.Padding().GetHorizontalPadding() - availableWidth := max(width-2-padding, 10) // Minimum readable width + availableWidth := max(width-5-padding, 10) // Minimum readable width lines := wrapLines(formattedContent, availableWidth) @@ -51,7 +51,7 @@ func FormatToolResult(content string, width int) string { trimmedContent := strings.Join(lines, "\n") if trimmedContent != "" { - return "\n" + styles.ToolCallResult.Render(styles.ToolCallResultKey.Render("\n-> "+header+":")+"\n"+trimmedContent) + return styles.ToolCallResult.Render(styles.ToolCallResultKey.Render("\n-> "+header+":") + "\n" + trimmedContent) } return "" From a90009971c544f0b662e38773fcf6a71e67d6281 Mon Sep 17 00:00:00 2001 From: David Gageot Date: Fri, 5 Dec 2025 08:38:29 +0100 Subject: [PATCH 2/2] Shorter handoffs rendering Signed-off-by: David Gageot --- pkg/tui/components/tool/factory.go | 2 + pkg/tui/components/tool/handoff/handoff.go | 48 +++++++++++++++++++ .../tool/transfertask/transfertask.go | 4 +- 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 pkg/tui/components/tool/handoff/handoff.go diff --git a/pkg/tui/components/tool/factory.go b/pkg/tui/components/tool/factory.go index 2333b9dcf..3ef62e1d3 100644 --- a/pkg/tui/components/tool/factory.go +++ b/pkg/tui/components/tool/factory.go @@ -4,6 +4,7 @@ import ( "github.com/docker/cagent/pkg/tools/builtin" "github.com/docker/cagent/pkg/tui/components/tool/defaulttool" "github.com/docker/cagent/pkg/tui/components/tool/editfile" + "github.com/docker/cagent/pkg/tui/components/tool/handoff" "github.com/docker/cagent/pkg/tui/components/tool/readfile" "github.com/docker/cagent/pkg/tui/components/tool/shell" "github.com/docker/cagent/pkg/tui/components/tool/todotool" @@ -46,6 +47,7 @@ func newDefaultRegistry() *Registry { registry := NewRegistry() registry.Register(builtin.ToolNameTransferTask, transfertask.New) + registry.Register(builtin.ToolNameHandoff, handoff.New) registry.Register(builtin.ToolNameEditFile, editfile.New) registry.Register(builtin.ToolNameWriteFile, writefile.New) registry.Register(builtin.ToolNameReadFile, readfile.New) diff --git a/pkg/tui/components/tool/handoff/handoff.go b/pkg/tui/components/tool/handoff/handoff.go new file mode 100644 index 000000000..22f1c70ec --- /dev/null +++ b/pkg/tui/components/tool/handoff/handoff.go @@ -0,0 +1,48 @@ +package handoff + +import ( + "encoding/json" + + tea "charm.land/bubbletea/v2" + + "github.com/docker/cagent/pkg/tools/builtin" + "github.com/docker/cagent/pkg/tui/core/layout" + "github.com/docker/cagent/pkg/tui/service" + "github.com/docker/cagent/pkg/tui/styles" + "github.com/docker/cagent/pkg/tui/types" +) + +// Component is a specialized component for rendering handoff tool calls. +type Component struct { + message *types.Message +} + +func New( + msg *types.Message, + _ *service.SessionState, +) layout.Model { + return &Component{ + message: msg, + } +} + +func (c *Component) SetSize(int, int) tea.Cmd { + return nil +} + +func (c *Component) Init() tea.Cmd { + return nil +} + +func (c *Component) Update(tea.Msg) (layout.Model, tea.Cmd) { + return c, nil +} + +func (c *Component) View() string { + var params builtin.HandoffArgs + if err := json.Unmarshal([]byte(c.message.ToolCall.Function.Arguments), ¶ms); err != nil { + return "" // TODO: Partial tool call + } + + return styles.AgentBadgeStyle.Render("["+c.message.Sender+"]") + styles.MutedStyle.Render("hands off to") + styles.AgentBadgeStyle.Render("["+params.Agent+"]") +} diff --git a/pkg/tui/components/tool/transfertask/transfertask.go b/pkg/tui/components/tool/transfertask/transfertask.go index d529ec44b..9e45da2a5 100644 --- a/pkg/tui/components/tool/transfertask/transfertask.go +++ b/pkg/tui/components/tool/transfertask/transfertask.go @@ -44,7 +44,7 @@ func (c *Component) View() string { return "" // TODO: Partial tool call } - badge := styles.TransferBadgeStyle.Render(c.message.Sender + " -> " + params.Agent + ": ") + badge := styles.AgentBadgeStyle.Render("["+c.message.Sender+"]") + styles.MutedStyle.Render("transfers task to") + styles.AgentBadgeStyle.Render("["+params.Agent+"]"+":") content := styles.MutedStyle.Render(params.Task) - return badge + "\n" + content + return badge + "\n\n" + content }