@@ -0,0 +1,63 @@
6+ "github.com/charmbracelet/crush/internal/agent/tools"
7+ "github.com/charmbracelet/crush/internal/fsext"
8+ "github.com/charmbracelet/crush/internal/message"
9+ "github.com/charmbracelet/crush/internal/ui/styles"
12+// ReferencesToolMessageItem is a message item that represents a references tool call.
13+type ReferencesToolMessageItem struct {
17+var _ ToolMessageItem = (*ReferencesToolMessageItem)(nil)
19+// NewReferencesToolMessageItem creates a new [ReferencesToolMessageItem].
20+func NewReferencesToolMessageItem(
22+ toolCall message.ToolCall,
23+ result *message.ToolResult,
26+ return newBaseToolMessageItem(sty, toolCall, result, &ReferencesToolRenderContext{}, canceled)
29+// ReferencesToolRenderContext renders references tool messages.
30+type ReferencesToolRenderContext struct{}
32+// RenderTool implements the [ToolRenderer] interface.
33+func (r *ReferencesToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
34+ cappedWidth := cappedMessageWidth(width)
35+ if opts.IsPending() {
36+ return pendingTool(sty, "Find References", opts.Anim)
39+ var params tools.ReferencesParams
40+ _ = json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms)
42+ toolParams := []string{params.Symbol}
43+ if params.Path != "" {
44+ toolParams = append(toolParams, "path", fsext.PrettyPath(params.Path))
47+ header := toolHeader(sty, opts.Status, "Find References", cappedWidth, opts.Compact, toolParams...)
52+ if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
53+ return joinToolParts(header, earlyState)
56+ if opts.HasEmptyResult() {
60+ bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
61+ body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
62+ return joinToolParts(header, body)