@@ -35,13 +35,14 @@ type GlobToolRenderContext struct{}
36// RenderTool implements the [ToolRenderer] interface.
36// RenderTool implements the [ToolRenderer] interface.
37func (g *GlobToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
37func (g *GlobToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
38+ cappedWidth := cappedMessageWidth(width)
38 if opts.IsPending() {
39 if opts.IsPending() {
39 return pendingTool(sty, "Glob", opts.Anim)
40 return pendingTool(sty, "Glob", opts.Anim)
42 var params tools.GlobParams
43 var params tools.GlobParams
43 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
44 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
44− return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, width)
45+ return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, cappedWidth)
47 toolParams := []string{params.Pattern}
48 toolParams := []string{params.Pattern}
@@ -49,12 +50,12 @@ func (g *GlobToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *
49 toolParams = append(toolParams, "path", params.Path)
50 toolParams = append(toolParams, "path", params.Path)
52− header := toolHeader(sty, opts.Status, "Glob", width, opts.Compact, toolParams...)
53+ header := toolHeader(sty, opts.Status, "Glob", cappedWidth, opts.Compact, toolParams...)
53 if opts.Compact {
54 if opts.Compact {
54 return header
55 return header
57− if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
58+ if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
58 return joinToolParts(header, earlyState)
59 return joinToolParts(header, earlyState)
@@ -62,7 +63,7 @@ func (g *GlobToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *
62 return header
63 return header
65− bodyWidth := width - toolBodyLeftPaddingTotal
66+ bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
66 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
67 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
67 return joinToolParts(header, body)
68 return joinToolParts(header, body)
@@ -93,13 +94,14 @@ type GrepToolRenderContext struct{}
94// RenderTool implements the [ToolRenderer] interface.
95// RenderTool implements the [ToolRenderer] interface.
95func (g *GrepToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
96func (g *GrepToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
97+ cappedWidth := cappedMessageWidth(width)
96 if opts.IsPending() {
98 if opts.IsPending() {
97 return pendingTool(sty, "Grep", opts.Anim)
99 return pendingTool(sty, "Grep", opts.Anim)
100 var params tools.GrepParams
102 var params tools.GrepParams
101 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
103 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
102− return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, width)
104+ return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, cappedWidth)
105 toolParams := []string{params.Pattern}
107 toolParams := []string{params.Pattern}
@@ -113,12 +115,12 @@ func (g *GrepToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *
113 toolParams = append(toolParams, "literal", "true")
115 toolParams = append(toolParams, "literal", "true")
116− header := toolHeader(sty, opts.Status, "Grep", width, opts.Compact, toolParams...)
118+ header := toolHeader(sty, opts.Status, "Grep", cappedWidth, opts.Compact, toolParams...)
117 if opts.Compact {
119 if opts.Compact {
118 return header
120 return header
121− if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
123+ if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
122 return joinToolParts(header, earlyState)
124 return joinToolParts(header, earlyState)
@@ -126,7 +128,7 @@ func (g *GrepToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *
126 return header
128 return header
129− bodyWidth := width - toolBodyLeftPaddingTotal
131+ bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
130 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
132 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
131 return joinToolParts(header, body)
133 return joinToolParts(header, body)
@@ -157,13 +159,14 @@ type LSToolRenderContext struct{}
158// RenderTool implements the [ToolRenderer] interface.
160// RenderTool implements the [ToolRenderer] interface.
159func (l *LSToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
161func (l *LSToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
162+ cappedWidth := cappedMessageWidth(width)
160 if opts.IsPending() {
163 if opts.IsPending() {
161 return pendingTool(sty, "List", opts.Anim)
164 return pendingTool(sty, "List", opts.Anim)
164 var params tools.LSParams
167 var params tools.LSParams
165 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
168 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
166− return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, width)
169+ return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, cappedWidth)
169 path := params.Path
172 path := params.Path
@@ -172,12 +175,12 @@ func (l *LSToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *To
173 path = fsext.PrettyPath(path)
176 path = fsext.PrettyPath(path)
175− header := toolHeader(sty, opts.Status, "List", width, opts.Compact, path)
178+ header := toolHeader(sty, opts.Status, "List", cappedWidth, opts.Compact, path)
176 if opts.Compact {
179 if opts.Compact {
177 return header
180 return header
180− if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
183+ if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
181 return joinToolParts(header, earlyState)
184 return joinToolParts(header, earlyState)
@@ -185,7 +188,7 @@ func (l *LSToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *To
185 return header
188 return header
188− bodyWidth := width - toolBodyLeftPaddingTotal
191+ bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
189 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
192 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
190 return joinToolParts(header, body)
193 return joinToolParts(header, body)
@@ -216,13 +219,14 @@ type SourcegraphToolRenderContext struct{}
217// RenderTool implements the [ToolRenderer] interface.
220// RenderTool implements the [ToolRenderer] interface.
218func (s *SourcegraphToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
221func (s *SourcegraphToolRenderContext) RenderTool(sty *styles.Styles, width int, opts *ToolRenderOpts) string {
222+ cappedWidth := cappedMessageWidth(width)
219 if opts.IsPending() {
223 if opts.IsPending() {
220 return pendingTool(sty, "Sourcegraph", opts.Anim)
224 return pendingTool(sty, "Sourcegraph", opts.Anim)
223 var params tools.SourcegraphParams
227 var params tools.SourcegraphParams
224 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
228 if err := json.Unmarshal([]byte(opts.ToolCall.Input), ¶ms); err != nil {
225− return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, width)
229+ return toolErrorContent(sty, &message.ToolResult{Content: "Invalid parameters"}, cappedWidth)
228 toolParams := []string{params.Query}
232 toolParams := []string{params.Query}
@@ -233,12 +237,12 @@ func (s *SourcegraphToolRenderContext) RenderTool(sty *styles.Styles, width int,
233 toolParams = append(toolParams, "context", formatNonZero(params.ContextWindow))
237 toolParams = append(toolParams, "context", formatNonZero(params.ContextWindow))
236− header := toolHeader(sty, opts.Status, "Sourcegraph", width, opts.Compact, toolParams...)
240+ header := toolHeader(sty, opts.Status, "Sourcegraph", cappedWidth, opts.Compact, toolParams...)
237 if opts.Compact {
241 if opts.Compact {
238 return header
242 return header
241− if earlyState, ok := toolEarlyStateContent(sty, opts, width); ok {
245+ if earlyState, ok := toolEarlyStateContent(sty, opts, cappedWidth); ok {
242 return joinToolParts(header, earlyState)
246 return joinToolParts(header, earlyState)
@@ -246,7 +250,7 @@ func (s *SourcegraphToolRenderContext) RenderTool(sty *styles.Styles, width int,
246 return header
250 return header
249− bodyWidth := width - toolBodyLeftPaddingTotal
253+ bodyWidth := cappedWidth - toolBodyLeftPaddingTotal
250 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
254 body := sty.Tool.Body.Render(toolOutputPlainContent(sty, opts.Result.Content, bodyWidth, opts.ExpandedContent))
251 return joinToolParts(header, body)
255 return joinToolParts(header, body)