@@ -111,8 +111,18 @@ func (br baseRenderer) unmarshalParams(input string, target any) error {
111111 return json.Unmarshal([]byte(input), target)
112112}
113113
114+// makeHeader builds the tool call header with status icon and parameters for a nested tool call.
115+func (br baseRenderer) makeNestedHeader(v *toolCallCmp, tool string, width int, params ...string) string {
116+ t := styles.CurrentTheme()
117+ tool = t.S().Base.Foreground(t.FgHalfMuted).Render(tool) + " "
118+ return tool + renderParamList(true, width-lipgloss.Width(tool), params...)
119+}
120+
114121// makeHeader builds "<Tool>: param (key=value)" and truncates as needed.
115122func (br baseRenderer) makeHeader(v *toolCallCmp, tool string, width int, params ...string) string {
123+ if v.isNested {
124+ return br.makeNestedHeader(v, tool, width, params...)
125+ }
116126 t := styles.CurrentTheme()
117127 icon := t.S().Base.Foreground(t.GreenDark).Render(styles.ToolPending)
118128 if v.result.ToolCallID != "" {
@@ -125,8 +135,8 @@ func (br baseRenderer) makeHeader(v *toolCallCmp, tool string, width int, params
125135 icon = t.S().Muted.Render(styles.ToolPending)
126136 }
127137 tool = t.S().Base.Foreground(t.Blue).Render(tool)
128− prefix := fmt.Sprintf("%s %s: ", icon, tool)
129− return prefix + renderParamList(width-lipgloss.Width(prefix), params...)
138+ prefix := fmt.Sprintf("%s %s ", icon, tool)
139+ return prefix + renderParamList(false, width-lipgloss.Width(prefix), params...)
130140}
131141
132142// renderError provides consistent error rendering
@@ -260,8 +270,10 @@ func (er editRenderer) Render(v *toolCallCmp) string {
260270 formatter := core.DiffFormatter().
261271 Before(fsext.PrettyPath(params.FilePath), meta.OldContent).
262272 After(fsext.PrettyPath(params.FilePath), meta.NewContent).
263− Split().
264273 Width(v.textWidth() - 2) // -2 for padding
274+ if v.textWidth() > 120 {
275+ formatter = formatter.Split()
276+ }
265277 return formatter.String()
266278 })
267279}
@@ -475,25 +487,45 @@ type agentRenderer struct {
475487 baseRenderer
476488}
477489
490+func RoundedEnumerator(children tree.Children, index int) string {
491+ if children.Length()-1 == index {
492+ return " ╰──"
493+ }
494+ return " ├──"
495+}
496+
478497// Render displays agent task parameters and result content
479498func (tr agentRenderer) Render(v *toolCallCmp) string {
499+ t := styles.CurrentTheme()
480500 var params agent.AgentParams
481501 if err := tr.unmarshalParams(v.call.Input, ¶ms); err != nil {
482502 return tr.renderError(v, "Invalid task parameters")
483503 }
484504 prompt := params.Prompt
485505 prompt = strings.ReplaceAll(prompt, "\n", " ")
486− args := newParamBuilder().addMain(prompt).build()
487506
488− header := tr.makeHeader(v, "Task", v.textWidth(), args...)
489− t := tree.Root(header)
507+ header := tr.makeHeader(v, "Agent", v.textWidth())
508+ taskTag := t.S().Base.Padding(0, 1).MarginLeft(1).Background(t.BlueLight).Foreground(t.White).Render("Task")
509+ remainingWidth := v.textWidth() - lipgloss.Width(header) - lipgloss.Width(taskTag) - 2 // -2 for padding
510+ prompt = t.S().Muted.Width(remainingWidth).Render(prompt)
511+ header = lipgloss.JoinVertical(
512+ lipgloss.Left,
513+ header,
514+ "",
515+ lipgloss.JoinHorizontal(
516+ lipgloss.Left,
517+ taskTag,
518+ " ",
519+ prompt,
520+ ),
521+ )
522+ childTools := tree.Root(header)
490523
491524 for _, call := range v.nestedToolCalls {
492− t.Child(call.View())
525+ childTools.Child(call.View())
493526 }
494−
495527 parts := []string{
496− t.Enumerator(tree.RoundedEnumerator).String(),
528+ childTools.Enumerator(RoundedEnumerator).String(),
497529 }
498530 if v.result.ToolCallID == "" {
499531 v.spinning = true
@@ -516,7 +548,8 @@ func (tr agentRenderer) Render(v *toolCallCmp) string {
516548}
517549
518550// renderParamList renders params, params[0] (params[1]=params[2] ....)
519−func renderParamList(paramsWidth int, params ...string) string {
551+func renderParamList(nested bool, paramsWidth int, params ...string) string {
552+ t := styles.CurrentTheme()
520553 if len(params) == 0 {
521554 return ""
522555 }
@@ -526,7 +559,10 @@ func renderParamList(paramsWidth int, params ...string) string {
526559 }
527560
528561 if len(params) == 1 {
529− return mainParam
562+ if nested {
563+ return t.S().Muted.Render(mainParam)
564+ }
565+ return t.S().Subtle.Render(mainParam)
530566 }
531567 otherParams := params[1:]
532568 // create pairs of key/value
@@ -547,15 +583,21 @@ func renderParamList(paramsWidth int, params ...string) string {
547583 partsRendered := strings.Join(parts, ", ")
548584 remainingWidth := paramsWidth - lipgloss.Width(partsRendered) - 3 // count for " ()"
549585 if remainingWidth < 30 {
586+ if nested {
587+ return t.S().Muted.Render(mainParam)
588+ }
550589 // No space for the params, just show the main
551− return mainParam
590+ return t.S().Subtle.Render(mainParam)
552591 }
553592
554593 if len(parts) > 0 {
555594 mainParam = fmt.Sprintf("%s (%s)", mainParam, strings.Join(parts, ", "))
556595 }
557596
558− return ansi.Truncate(mainParam, paramsWidth, "...")
597+ if nested {
598+ return t.S().Muted.Render(ansi.Truncate(mainParam, paramsWidth, "..."))
599+ }
600+ return t.S().Subtle.Render(ansi.Truncate(mainParam, paramsWidth, "..."))
559601}
560602
561603// earlyState returns immediately‑rendered error/cancelled/ongoing states.
@@ -580,7 +622,7 @@ func earlyState(header string, v *toolCallCmp) (string, bool) {
580622func joinHeaderBody(header, body string) string {
581623 t := styles.CurrentTheme()
582624 body = t.S().Base.PaddingLeft(2).Render(body)
583− return lipgloss.JoinVertical(lipgloss.Left, header, body, "")
625+ return lipgloss.JoinVertical(lipgloss.Left, header, "", body, "")
584626}
585627
586628func renderPlainContent(v *toolCallCmp, content string) string {
@@ -600,46 +642,56 @@ func renderPlainContent(v *toolCallCmp, content string) string {
600642 }
601643 out = append(out, t.S().Muted.
602644 Width(width).
603− Background(t.BgSubtle).
645+ Background(t.BgBaseLighter).
604646 Render(ln))
605647 }
606648
607649 if len(lines) > responseContextHeight {
608650 out = append(out, t.S().Muted.
609− Background(t.BgSubtle).
651+ Background(t.BgBaseLighter).
610652 Width(width).
611653 Render(fmt.Sprintf("... (%d lines)", len(lines)-responseContextHeight)))
612654 }
613655 return strings.Join(out, "\n")
614656}
615657
658+func pad(v any, width int) string {
659+ s := fmt.Sprintf("%v", v)
660+ w := ansi.StringWidth(s)
661+ if w >= width {
662+ return s
663+ }
664+ return strings.Repeat(" ", width-w) + s
665+}
666+
616667func renderCodeContent(v *toolCallCmp, path, content string, offset int) string {
617668 t := styles.CurrentTheme()
618669 truncated := truncateHeight(content, responseContextHeight)
619670
620− highlighted, _ := highlight.SyntaxHighlight(truncated, path, t.BgSubtle)
671+ highlighted, _ := highlight.SyntaxHighlight(truncated, path, t.BgBase)
621672 lines := strings.Split(highlighted, "\n")
622673
623674 if len(strings.Split(content, "\n")) > responseContextHeight {
624675 lines = append(lines, t.S().Muted.
625− Background(t.BgSubtle).
626− Width(v.textWidth()-2).
627− Render(fmt.Sprintf("... (%d lines)", len(strings.Split(content, "\n"))-responseContextHeight)))
676+ Background(t.BgBase).
677+ Render(fmt.Sprintf(" …(%d lines)", len(strings.Split(content, "\n"))-responseContextHeight)))
628678 }
629679
680+ maxLineNumber := len(lines) + offset
681+ padding := lipgloss.Width(fmt.Sprintf("%d", maxLineNumber))
630682 for i, ln := range lines {
631− num := t.S().Muted.
632− Background(t.BgSubtle).
633− PaddingLeft(4).
634− PaddingRight(2).
635− Render(fmt.Sprintf("%d", i+1+offset))
636− w := v.textWidth() - 2 - lipgloss.Width(num) // -2 for left padding
683+ num := t.S().Base.
684+ Foreground(t.FgMuted).
685+ Background(t.BgBase).
686+ PaddingRight(1).
687+ PaddingLeft(1).
688+ Render(pad(i+1+offset, padding))
689+ w := v.textWidth() - 10 - lipgloss.Width(num) // -4 for left padding
637690 lines[i] = lipgloss.JoinHorizontal(lipgloss.Left,
638691 num,
639692 t.S().Base.
640− Width(w).
641− Background(t.BgSubtle).
642− Render(v.fit(ln, w)))
693+ PaddingLeft(1).
694+ Render(v.fit(ln, w-1)))
643695 }
644696 return lipgloss.JoinVertical(lipgloss.Left, lines...)
645697}
@@ -648,7 +700,7 @@ func (v *toolCallCmp) renderToolError() string {
648700 t := styles.CurrentTheme()
649701 err := strings.ReplaceAll(v.result.Content, "\n", " ")
650702 err = fmt.Sprintf("Error: %s", err)
651− return t.S().Base.Foreground(t.Error).Render(v.fit(err, v.textWidth()))
703+ return t.S().Base.Foreground(t.Error).Render(v.fit(err, v.textWidth()-2))
652704}
653705
654706func truncateHeight(s string, h int) string {
@@ -662,7 +714,7 @@ func truncateHeight(s string, h int) string {
662714func prettifyToolName(name string) string {
663715 switch name {
664716 case agent.AgentToolName:
665− return "Task"
717+ return "Agent"
666718 case tools.BashToolName:
667719 return "Bash"
668720 case tools.EditToolName: