Skip to content

Commit 5e6c516

Browse files
committed
Add the agent directly
Signed-off-by: David Gageot <david.gageot@docker.com>
1 parent 4aaf4dc commit 5e6c516

6 files changed

Lines changed: 34 additions & 30 deletions

File tree

internal/app/app.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/docker/cagent/pkg/runtime"
99
"github.com/docker/cagent/pkg/session"
10+
"github.com/docker/cagent/pkg/team"
1011
)
1112

1213
type App struct {
@@ -31,8 +32,8 @@ func (a *App) FirstMessage() *string {
3132
return a.firstMessage
3233
}
3334

34-
func (a *App) ToolDisplayName(ctx context.Context, toolName string) string {
35-
return a.runtime.CurrentAgent().ToolDisplayName(ctx, toolName)
35+
func (a *App) Team() *team.Team {
36+
return a.runtime.Team()
3637
}
3738

3839
// Run one agent loop

internal/tui/components/messages/messages.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/docker/cagent/internal/tui/core"
1818
"github.com/docker/cagent/internal/tui/core/layout"
1919
"github.com/docker/cagent/internal/tui/types"
20+
"github.com/docker/cagent/pkg/tools"
2021
)
2122

2223
// Model represents a chat message list component
@@ -30,8 +31,8 @@ type Model interface {
3031
AddErrorMessage(content string) tea.Cmd
3132
AddAssistantMessage() tea.Cmd
3233
AddSeparatorMessage() tea.Cmd
33-
AddOrUpdateToolCall(toolName, toolCallID, arguments string, status types.ToolStatus) tea.Cmd
34-
AddToolResult(toolName, toolCallID, result string, status types.ToolStatus) tea.Cmd
34+
AddOrUpdateToolCall(agentName string, toolCall tools.ToolCall, status types.ToolStatus) tea.Cmd
35+
AddToolResult(toolCall tools.ToolCall, result string, status types.ToolStatus) tea.Cmd
3536
AppendToLastMessage(agentName string, content string) tea.Cmd
3637
ClearMessages()
3738
ScrollToBottom() tea.Cmd
@@ -545,14 +546,14 @@ func (m *model) AddSeparatorMessage() tea.Cmd {
545546
}
546547

547548
// AddOrUpdateToolCall adds a tool call or updates existing one with the given status
548-
func (m *model) AddOrUpdateToolCall(toolName, toolCallID, arguments string, status types.ToolStatus) tea.Cmd {
549+
func (m *model) AddOrUpdateToolCall(agentName string, toolCall tools.ToolCall, status types.ToolStatus) tea.Cmd {
549550
// First try to update existing tool by ID
550551
for i := len(m.messages) - 1; i >= 0; i-- {
551552
msg := &m.messages[i]
552-
if msg.ToolCallID == toolCallID {
553+
if msg.ToolCall.ID == toolCall.ID {
553554
msg.ToolStatus = status
554-
if arguments != "" {
555-
msg.Arguments = arguments
555+
if toolCall.Function.Arguments != "" {
556+
msg.ToolCall.Function.Arguments = toolCall.Function.Arguments
556557
}
557558
// Update the corresponding view
558559
view := m.createToolCallView(msg)
@@ -567,10 +568,9 @@ func (m *model) AddOrUpdateToolCall(toolName, toolCallID, arguments string, stat
567568
// Create new tool call
568569
msg := types.Message{
569570
Type: types.MessageTypeToolCall,
570-
ToolName: toolName,
571-
ToolCallID: toolCallID,
571+
Sender: agentName,
572+
ToolCall: toolCall,
572573
ToolStatus: status,
573-
Arguments: arguments,
574574
}
575575
m.messages = append(m.messages, msg)
576576

@@ -581,10 +581,10 @@ func (m *model) AddOrUpdateToolCall(toolName, toolCallID, arguments string, stat
581581
}
582582

583583
// AddToolResult adds tool result to the most recent matching tool call
584-
func (m *model) AddToolResult(_, toolCallID, result string, status types.ToolStatus) tea.Cmd {
584+
func (m *model) AddToolResult(toolCall tools.ToolCall, result string, status types.ToolStatus) tea.Cmd {
585585
for i := len(m.messages) - 1; i >= 0; i-- {
586586
msg := &m.messages[i]
587-
if msg.ToolCallID == toolCallID {
587+
if msg.ToolCall.ID == toolCall.ID {
588588
msg.Content = result
589589
msg.ToolStatus = status
590590
// Update the corresponding view

internal/tui/components/tool/tool.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,14 @@ func (mv *toolModel) Render(width int) string {
129129
spinnerText = " " + mv.spinner.View()
130130
}
131131

132-
displayName := mv.app.ToolDisplayName(context.TODO(), msg.ToolName)
132+
// Ask the tool what's its display name
133+
team := mv.app.Team()
134+
agent := team.Agent(msg.Sender)
135+
displayName := agent.ToolDisplayName(context.TODO(), msg.ToolCall.Function.Name)
133136
content := fmt.Sprintf("%s %s%s", icon, styles.HighlightStyle.Render(displayName), spinnerText)
134137

135-
if msg.Arguments != "" {
136-
lines := wrapLines(msg.Arguments, mv.width-2)
138+
if msg.ToolCall.Function.Arguments != "" {
139+
lines := wrapLines(msg.ToolCall.Function.Arguments, mv.width-2)
137140
argsViewport := viewport.New(viewport.WithWidth(mv.width), viewport.WithHeight(len(lines)))
138141
argsViewport.SetContent(styles.MutedStyle.Render(strings.Join(lines, "\n")))
139142
argsViewport.GotoBottom()

internal/tui/dialog/tool_confirmation.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/docker/cagent/internal/app"
1414
"github.com/docker/cagent/internal/tui/components/todo"
1515
"github.com/docker/cagent/internal/tui/core"
16+
"github.com/docker/cagent/pkg/tools"
1617
)
1718

1819
// ToolConfirmationResponse represents the user's response to tool confirmation
@@ -55,10 +56,10 @@ func defaultToolConfirmationKeyMap() toolConfirmationKeyMap {
5556
}
5657

5758
// NewToolConfirmationDialog creates a new tool confirmation dialog
58-
func NewToolConfirmationDialog(toolName, arguments string, appInstance *app.App) Dialog {
59+
func NewToolConfirmationDialog(toolCall tools.ToolCall, appInstance *app.App) Dialog {
5960
return &toolConfirmationDialog{
60-
toolName: toolName,
61-
arguments: arguments,
61+
toolName: toolCall.Function.Name,
62+
arguments: toolCall.Function.Arguments,
6263
app: appInstance,
6364
keyMap: defaultToolConfirmationKeyMap(),
6465
}

internal/tui/page/chat/chat.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,21 +217,21 @@ func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
217217
case *runtime.PartialToolCallEvent:
218218
// When we first receive a tool call, show it immediately in pending state
219219
spinnerCmd := p.setWorking(true)
220-
cmd := p.messages.AddOrUpdateToolCall(msg.ToolCall.Function.Name, msg.ToolCall.ID, msg.ToolCall.Function.Arguments, types.ToolStatusPending)
220+
cmd := p.messages.AddOrUpdateToolCall(msg.AgentName, msg.ToolCall, types.ToolStatusPending)
221221
return p, tea.Batch(cmd, p.messages.ScrollToBottom(), spinnerCmd)
222222
case *runtime.ToolCallConfirmationEvent:
223223
spinnerCmd := p.setWorking(false) // Stop working indicator during confirmation
224-
cmd := p.messages.AddOrUpdateToolCall(msg.ToolCall.Function.Name, msg.ToolCall.ID, msg.ToolCall.Function.Arguments, types.ToolStatusConfirmation)
224+
cmd := p.messages.AddOrUpdateToolCall(msg.AgentName, msg.ToolCall, types.ToolStatusConfirmation)
225225

226226
// Open tool confirmation dialog
227227
dialogCmd := core.CmdHandler(dialog.OpenDialogMsg{
228-
Model: dialog.NewToolConfirmationDialog(msg.ToolCall.Function.Name, msg.ToolCall.Function.Arguments, p.app),
228+
Model: dialog.NewToolConfirmationDialog(msg.ToolCall, p.app),
229229
})
230230

231231
return p, tea.Batch(cmd, p.messages.ScrollToBottom(), spinnerCmd, dialogCmd)
232232
case *runtime.ToolCallEvent:
233233
spinnerCmd := p.setWorking(true)
234-
cmd := p.messages.AddOrUpdateToolCall(msg.ToolCall.Function.Name, msg.ToolCall.ID, msg.ToolCall.Function.Arguments, types.ToolStatusRunning)
234+
cmd := p.messages.AddOrUpdateToolCall(msg.AgentName, msg.ToolCall, types.ToolStatusRunning)
235235

236236
// Check if this is a todo-related tool call and update sidebar
237237
toolName := msg.ToolCall.Function.Name
@@ -246,7 +246,7 @@ func (p *chatPage) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
246246
return p, tea.Batch(cmd, p.messages.ScrollToBottom(), spinnerCmd)
247247
case *runtime.ToolCallResponseEvent:
248248
spinnerCmd := p.setWorking(true)
249-
cmd := p.messages.AddToolResult(msg.ToolCall.Function.Name, msg.ToolCall.ID, msg.Response, types.ToolStatusCompleted)
249+
cmd := p.messages.AddToolResult(msg.ToolCall, msg.Response, types.ToolStatusCompleted)
250250
return p, tea.Batch(cmd, p.messages.ScrollToBottom(), spinnerCmd)
251251
}
252252

internal/tui/types/types.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package types
22

3+
import "github.com/docker/cagent/pkg/tools"
4+
35
// MessageType represents different types of messages
46
type MessageType int
57

@@ -27,10 +29,7 @@ const (
2729
type Message struct {
2830
Type MessageType
2931
Content string
30-
Sender string // Agent name for assistant messages
31-
ToolName string // Tool name for tool messages
32-
ToolCallID string // Tool call ID for precise identification
33-
ToolStatus ToolStatus // Status for tool calls
34-
Arguments string // Arguments for tool calls
35-
Timestamp int64
32+
Sender string // Agent name for assistant messages
33+
ToolCall tools.ToolCall // Associated tool call for tool messages
34+
ToolStatus ToolStatus // Status for tool calls
3635
}

0 commit comments

Comments
 (0)