on main help sign in
refactor(chat): rename GetMessageItems to ExtractMessageItems and GetToolRenderer to ToolRenderer
commit2cccd515a848a5df0d9dffea3c3f5f037752c07b authorAyman Bagabas <ayman.bagabas@gmail.com> dateThu 18 Dec 2025, 13:24 (1 year ago) parent39b2070
4 files changed+21−35
internal/ui/chat/messages.go+9−24 internal/ui/chat/tools.go+4−3 internal/ui/model/chat.go+2−2 internal/ui/model/ui.go+6−6
internal/ui/chat/messages.go+9−24
@@ -151,12 +151,12 @@ func cappedMessageWidth(availableWidth int) int {
151151 return min(availableWidth-messageLeftPaddingTotal, maxTextWidth)
152152}
153153
154−// GetMessageItems extracts [MessageItem]s from a [message.Message]. It returns
155−// all parts of the message as [MessageItem]s.
154+// ExtractMessageItems extracts [MessageItem]s from a [message.Message]. It
155+// returns all parts of the message as [MessageItem]s.
156156//
157157// For assistant messages with tool calls, pass a toolResults map to link results.
158158// Use BuildToolResultMap to create this map from all messages in a session.
159−func GetMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[string]message.ToolResult) []MessageItem {
159+func ExtractMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[string]message.ToolResult) []MessageItem {
160160 switch msg.Role {
161161 case message.User:
162162 return []MessageItem{NewUserMessageItem(sty, msg)}
@@ -170,7 +170,7 @@ func GetMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[s
170170 if tr, ok := toolResults[tc.ID]; ok {
171171 result = &tr
172172 }
173− items = append(items, GetToolMessageItem(
173+ items = append(items, NewToolMessageItem(
174174 sty,
175175 tc,
176176 result,
@@ -182,30 +182,15 @@ func GetMessageItems(sty *styles.Styles, msg *message.Message, toolResults map[s
182182 return []MessageItem{}
183183}
184184
185−// GetToolRenderer returns the appropriate ToolRenderFunc for a given tool call.
185+// ToolRenderer returns the appropriate [ToolRenderFunc] for a given tool call.
186186// this should be used for nested tools as well.
187−func GetToolRenderer(tc message.ToolCall) ToolRenderFunc {
188− renderFunc := DefaultToolRenderer
187+func ToolRenderer(tc message.ToolCall) ToolRenderFunc {
189188 switch tc.Name {
190189 case tools.BashToolName:
191− renderFunc = BashToolRenderer
190+ return BashToolRenderer
191+ default:
192+ return DefaultToolRenderer
192193 }
193− return renderFunc
194−}
195−
196−// GetToolMessageItem creates a MessageItem for a tool call and its result.
197−func GetToolMessageItem(sty *styles.Styles, tc message.ToolCall, result *message.ToolResult, canceled bool) MessageItem {
198− // we only do full width for diffs (as far as I know)
199− cappedWidth := tc.Name != tools.EditToolName && tc.Name != tools.MultiEditToolName
200−
201− return NewToolMessageItem(
202− sty,
203− GetToolRenderer(tc),
204− tc,
205− result,
206− canceled,
207− cappedWidth,
208− )
209194}
210195
211196// shouldRenderAssistantMessage determines if an assistant message should be rendered
internal/ui/chat/tools.go+4−3
@@ -6,6 +6,7 @@ import (
66
77 tea "charm.land/bubbletea/v2"
88 "charm.land/lipgloss/v2"
9+ "github.com/charmbracelet/crush/internal/agent/tools"
910 "github.com/charmbracelet/crush/internal/message"
1011 "github.com/charmbracelet/crush/internal/ui/anim"
1112 "github.com/charmbracelet/crush/internal/ui/styles"
@@ -91,18 +92,18 @@ type ToolMessageItem struct {
9192// NewToolMessageItem creates a new tool message item with the given renderFunc.
9293func NewToolMessageItem(
9394 sty *styles.Styles,
94− renderFunc ToolRenderFunc,
9595 toolCall message.ToolCall,
9696 result *message.ToolResult,
9797 canceled bool,
98− hasCappedWidth bool,
9998) *ToolMessageItem {
99+ // we only do full width for diffs (as far as I know)
100+ hasCappedWidth := toolCall.Name != tools.EditToolName && toolCall.Name != tools.MultiEditToolName
100101 t := &ToolMessageItem{
101102 highlightableMessageItem: defaultHighlighter(sty),
102103 cachedMessageItem: &cachedMessageItem{},
103104 focusableMessageItem: &focusableMessageItem{},
104105 sty: sty,
105− renderFunc: renderFunc,
106+ renderFunc: ToolRenderer(toolCall),
106107 toolCall: toolCall,
107108 result: result,
108109 canceled: canceled,
internal/ui/model/chat.go+2−2
@@ -245,8 +245,8 @@ func (m *Chat) ClearMessages() {
245245 m.ClearMouse()
246246}
247247
248−// GetMessageItem returns the message item at the given id.
249−func (m *Chat) GetMessageItem(id string) chat.MessageItem {
248+// MessageItem returns the message item with the given ID, or nil if not found.
249+func (m *Chat) MessageItem(id string) chat.MessageItem {
250250 idx, ok := m.idInxMap[id]
251251 if !ok {
252252 return nil
internal/ui/model/ui.go+6−6
@@ -380,7 +380,7 @@ func (m *UI) setSessionMessages(msgs []message.Message) tea.Cmd {
380380 // Add messages to chat with linked tool results
381381 items := make([]chat.MessageItem, 0, len(msgs)*2)
382382 for _, msg := range msgPtrs {
383− items = append(items, chat.GetMessageItems(m.com.Styles, msg, toolResultMap)...)
383+ items = append(items, chat.ExtractMessageItems(m.com.Styles, msg, toolResultMap)...)
384384 }
385385
386386 // 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 {
407407 var cmds []tea.Cmd
408408 switch msg.Role {
409409 case message.User, message.Assistant:
410− items := chat.GetMessageItems(m.com.Styles, &msg, nil)
410+ items := chat.ExtractMessageItems(m.com.Styles, &msg, nil)
411411 for _, item := range items {
412412 if animatable, ok := item.(chat.Animatable); ok {
413413 if cmd := animatable.StartAnimation(); cmd != nil {
@@ -421,7 +421,7 @@ func (m *UI) appendSessionMessage(msg message.Message) tea.Cmd {
421421 }
422422 case message.Tool:
423423 for _, tr := range msg.ToolResults() {
424− toolItem := m.chat.GetMessageItem(tr.ToolCallID)
424+ toolItem := m.chat.MessageItem(tr.ToolCallID)
425425 if toolItem == nil {
426426 // we should have an item!
427427 continue
@@ -439,7 +439,7 @@ func (m *UI) appendSessionMessage(msg message.Message) tea.Cmd {
439439// that is why we need to handle creating/updating each tool call message too
440440func (m *UI) updateSessionMessage(msg message.Message) tea.Cmd {
441441 var cmds []tea.Cmd
442− existingItem := m.chat.GetMessageItem(msg.ID)
442+ existingItem := m.chat.MessageItem(msg.ID)
443443 if existingItem == nil || msg.Role != message.Assistant {
444444 return nil
445445 }
@@ -450,7 +450,7 @@ func (m *UI) updateSessionMessage(msg message.Message) tea.Cmd {
450450
451451 var items []chat.MessageItem
452452 for _, tc := range msg.ToolCalls() {
453− existingToolItem := m.chat.GetMessageItem(tc.ID)
453+ existingToolItem := m.chat.MessageItem(tc.ID)
454454 if toolItem, ok := existingToolItem.(*chat.ToolMessageItem); ok {
455455 existingToolCall := toolItem.ToolCall()
456456 // only update if finished state changed or input changed
@@ -460,7 +460,7 @@ func (m *UI) updateSessionMessage(msg message.Message) tea.Cmd {
460460 }
461461 }
462462 if existingToolItem == nil {
463− items = append(items, chat.GetToolMessageItem(m.com.Styles, tc, nil, false))
463+ items = append(items, chat.NewToolMessageItem(m.com.Styles, tc, nil, false))
464464 }
465465 }
466466