on main help sign in
refactor(ui): add references tool (#1940)
8ebe914Kujtim Hoxha
internal/ui/chat/references.gonew file+63
@@ -0,0 +1,63 @@
1+package chat
2+
3+import (
4+ "encoding/json"
5+
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"
10+)
11+
12+// ReferencesToolMessageItem is a message item that represents a references tool call.
13+type ReferencesToolMessageItem struct {
14+ *baseToolMessageItem
15+}
16+
17+var _ ToolMessageItem = (*ReferencesToolMessageItem)(nil)
18+
19+// NewReferencesToolMessageItem creates a new [ReferencesToolMessageItem].
20+func NewReferencesToolMessageItem(
21+ sty *styles.Styles,
22+ toolCall message.ToolCall,
23+ result *message.ToolResult,
24+ canceled bool,
25+) ToolMessageItem {
26+ return newBaseToolMessageItem(sty, toolCall, result, &ReferencesToolRenderContext{}, canceled)
27+}
28+
29+// ReferencesToolRenderContext renders references tool messages.
30+type ReferencesToolRenderContext struct{}
31+
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)
37+ }
38+
39+ var params tools.ReferencesParams
40+ _ = json.Unmarshal([]byte(opts.ToolCall.Input), &params)
41+
42+ toolParams := []string{params.Symbol}
43+ if params.Path != "" {
44+ toolParams = append(toolParams, "path", fsext.PrettyPath(params.Path))
45+ }
46+
47+ header := toolHeader(sty, opts.Status, "Find References", cappedWidth, opts.Compact, toolParams...)
48+ if opts.Compact {
49+ return header
50+ }
51+
52+ if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
53+ return joinToolParts(header, earlyState)
54+ }
55+
56+ if opts.HasEmptyResult() {
57+ return header
58+ }
59+
60+ bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
61+ body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
62+ return joinToolParts(header, body)
63+}
internal/ui/chat/tools.go+2
@@ -242,6 +242,8 @@ func NewToolMessageItem(
242 item = NewWebSearchToolMessageItem(sty, toolCall, result, canceled)
242 item = NewWebSearchToolMessageItem(sty, toolCall, result, canceled)
243 case tools.TodosToolName:
243 case tools.TodosToolName:
244 item = NewTodosToolMessageItem(sty, toolCall, result, canceled)
244 item = NewTodosToolMessageItem(sty, toolCall, result, canceled)
245+ case tools.ReferencesToolName:
246+ item = NewReferencesToolMessageItem(sty, toolCall, result, canceled)
245 default:
247 default:
246 if strings.HasPrefix(toolCall.Name, "mcp_") {
248 if strings.HasPrefix(toolCall.Name, "mcp_") {
247 item = NewMCPToolMessageItem(sty, toolCall, result, canceled)
249 item = NewMCPToolMessageItem(sty, toolCall, result, canceled)