Detailed changes
@@ -151,12 +151,12 @@ func cappedMessageWidth(availableWidth int) int {
return min(availableWidth-messageLeftPaddingTotal, maxTextWidth)
}
-// GetMessageItems extracts [MessageItem]s from a [message.Message]. It returns
-// all parts of the message as [MessageItem]s.
+// ExtractMessageItems extracts [MessageItem]s from a [message.Message]. It
+// returns all parts of the message as [MessageItem]s.
//
// For assistant messages with tool calls, pass a toolResults map to link results.
// Use BuildToolResultMap to create this map from all messages in a session.
-func GetMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[string]message.ToolResult) []MessageItem {
+func ExtractMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[string]message.ToolResult) []MessageItem {
switch msg.Role {
case message.User:
return []MessageItem{NewUserMessageItem(sty, msg)}
@@ -170,7 +170,7 @@ func GetMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[s
if tr, ok := toolResults[tc.ID]; ok {
result = &tr
}
- items = append(items, GetToolMessageItem(
+ items = append(items, NewToolMessageItem(
sty,
tc,
result,
@@ -182,30 +182,15 @@ func GetMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[s
return []MessageItem{}
}
-// GetToolRenderer returns the appropriate ToolRenderFunc for a given tool call.
+// ToolRenderer returns the appropriate [ToolRenderFunc] for a given tool call.
// this should be used for nested tools as well.
-func GetToolRenderer(tc message.ToolCall) ToolRenderFunc {
- renderFunc := DefaultToolRenderer
+func ToolRenderer(tc message.ToolCall) ToolRenderFunc {
switch tc.Name {
case tools.BashToolName:
- renderFunc = BashToolRenderer
+ return BashToolRenderer
+ default:
+ return DefaultToolRenderer
}
- return renderFunc
-}
-
-// GetToolMessageItem creates a MessageItem for a tool call and its result.
-func GetToolMessageItem(sty *styles.Styles, tc message.ToolCall, result *message.ToolResult, canceled bool) MessageItem {
- // we only do full width for diffs (as far as I know)
- cappedWidth := tc.Name != tools.EditToolName && tc.Name != tools.MultiEditToolName
-
- return NewToolMessageItem(
- sty,
- GetToolRenderer(tc),
- tc,
- result,
- canceled,
- cappedWidth,
- )
}
// shouldRenderAssistantMessage determines if an assistant message should be rendered
@@ -6,6 +6,7 @@ import (
tea "charm.land/bubbletea/v2"
"charm.land/lipgloss/v2"
+ "github.com/charmbracelet/crush/internal/agent/tools"
"github.com/charmbracelet/crush/internal/message"
"github.com/charmbracelet/crush/internal/ui/anim"
"github.com/charmbracelet/crush/internal/ui/styles"
@@ -91,18 +92,18 @@ type ToolMessageItem struct {
// NewToolMessageItem creates a new tool message item with the given renderFunc.
func NewToolMessageItem(
sty *styles.Styles,
- renderFunc ToolRenderFunc,
toolCall message.ToolCall,
result *message.ToolResult,
canceled bool,
- hasCappedWidth bool,
) *ToolMessageItem {
+ // we only do full width for diffs (as far as I know)
+ hasCappedWidth := toolCall.Name != tools.EditToolName && toolCall.Name != tools.MultiEditToolName
t := &ToolMessageItem{
highlightableMessageItem: defaultHighlighter(sty),
cachedMessageItem: &cachedMessageItem{},
focusableMessageItem: &focusableMessageItem{},
sty: sty,
- renderFunc: renderFunc,
+ renderFunc: ToolRenderer(toolCall),
toolCall: toolCall,
result: result,
canceled: canceled,
@@ -245,8 +245,8 @@ func (m *Chat) ClearMessages() {
m.ClearMouse()
}
-// GetMessageItem returns the message item at the given id.
-func (m *Chat) GetMessageItem(id string) chat.MessageItem {
+// MessageItem returns the message item with the given ID, or nil if not found.
+func (m *Chat) MessageItem(id string) chat.MessageItem {
idx, ok := m.idInxMap[id]
if !ok {
return nil
@@ -380,7 +380,7 @@ func (m *UI) setSessionMessages(msgs []message.Message) tea.Cmd {
// Add messages to chat with linked tool results
items := make([]chat.MessageItem, 0, len(msgs)*2)
for _, msg := range msgPtrs {
- items = append(items, chat.GetMessageItems(m.com.Styles, msg, toolResultMap)...)
+ items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap)...)
}
// If the user switches between sessions while the agent is working we want
@@ -407,7 +407,7 @@ func (m *UI) appendSessionMessage(msg message.Message) tea.Cmd {
var cmds []tea.Cmd
switch msg.Role {
case message.User, message.Assistant:
- items := chat.GetMessageItems(m.com.Styles, &msg, nil)
+ items := chat.ExtractMessageItems(m.com.Styles, &msg, nil)
for _, item := range items {
if animatable, ok := item.(chat.Animatable); ok {
if cmd := animatable.StartAnimation(); cmd != nil {
@@ -421,7 +421,7 @@ func (m *UI) appendSessionMessage(msg message.Message) tea.Cmd {
}
case message.Tool:
for _, tr := range msg.ToolResults() {
- toolItem := m.chat.GetMessageItem(tr.ToolCallID)
+ toolItem := m.chat.MessageItem(tr.ToolCallID)
if toolItem == nil {
// we should have an item!
continue
@@ -439,7 +439,7 @@ func (m *UI) appendSessionMessage(msg message.Message) tea.Cmd {
// that is why we need to handle creating/updating each tool call message too
func (m *UI) updateSessionMessage(msg message.Message) tea.Cmd {
var cmds []tea.Cmd
- existingItem := m.chat.GetMessageItem(msg.ID)
+ existingItem := m.chat.MessageItem(msg.ID)
if existingItem == nil || msg.Role != message.Assistant {
return nil
}
@@ -450,7 +450,7 @@ func (m *UI) updateSessionMessage(msg message.Message) tea.Cmd {
var items []chat.MessageItem
for _, tc := range msg.ToolCalls() {
- existingToolItem := m.chat.GetMessageItem(tc.ID)
+ existingToolItem := m.chat.MessageItem(tc.ID)
if toolItem, ok := existingToolItem.(*chat.ToolMessageItem); ok {
existingToolCall := toolItem.ToolCall()
// only update if finished state changed or input changed
@@ -460,7 +460,7 @@ func (m *UI) updateSessionMessage(msg message.Message) tea.Cmd {
}
}
if existingToolItem == nil {
- items = append(items, chat.GetToolMessageItem(m.com.Styles, tc, nil, false))
+ items = append(items, chat.NewToolMessageItem(m.com.Styles, tc, nil, false))
}
}