77
88 "github.com/charmbracelet/bubbles/v2/spinner"
99 tea "github.com/charmbracelet/bubbletea/v2"
10- "github.com/charmbracelet/glamour /v2"
10+ "github.com/charmbracelet/lipgloss /v2"
1111
12+ "github.com/docker/cagent/pkg/tui/components/markdown"
1213 "github.com/docker/cagent/pkg/tui/core/layout"
1314 "github.com/docker/cagent/pkg/tui/styles"
1415 "github.com/docker/cagent/pkg/tui/types"
@@ -23,23 +24,21 @@ type Model interface {
2324
2425// messageModel implements Model
2526type messageModel struct {
26- message * types.Message
27- renderer * glamour.TermRenderer
28- width int
29- height int
30- focused bool
31- spinner spinner.Model
27+ message * types.Message
28+ width int
29+ height int
30+ focused bool
31+ spinner spinner.Model
3232}
3333
3434// New creates a new message view
35- func New (msg * types.Message , renderer * glamour. TermRenderer ) Model {
35+ func New (msg * types.Message ) * messageModel {
3636 return & messageModel {
37- message : msg ,
38- width : 80 , // Default width
39- height : 1 , // Will be calculated
40- focused : false ,
41- spinner : spinner .New (spinner .WithSpinner (spinner .Points )),
42- renderer : renderer ,
37+ message : msg ,
38+ width : 80 , // Default width
39+ height : 1 , // Will be calculated
40+ focused : false ,
41+ spinner : spinner .New (spinner .WithSpinner (spinner .Points )),
4342 }
4443}
4544
@@ -73,26 +72,26 @@ func (mv *messageModel) View() string {
7372 return mv .Render (mv .width )
7473}
7574
76- // MessageView specific methods
77-
7875// Render renders the message view content
79- func (mv * messageModel ) Render (int ) string {
76+ func (mv * messageModel ) Render (width int ) string {
8077 msg := mv .message
8178 switch msg .Type {
8279 case types .MessageTypeSpinner :
8380 return mv .spinner .View ()
8481 case types .MessageTypeUser :
85- if rendered , err := mv .renderer .Render ("> " + msg .Content ); err == nil {
86- return strings .TrimRight (rendered , "\n \r \t " )
82+ s := lipgloss .NewStyle ().PaddingLeft (1 ).BorderLeft (true ).BorderStyle (lipgloss .ThickBorder ())
83+ if rendered , err := markdown .NewRenderer (width - len (s .Render ("" ))).Render (msg .Content ); err == nil {
84+ return s .Render (strings .TrimRight (rendered , "\n \r \t " ))
8785 }
86+
8887 return msg .Content
8988 case types .MessageTypeAssistant :
9089 if msg .Content == "" {
9190 return mv .spinner .View ()
9291 }
9392
9493 text := senderPrefix (msg .Sender ) + msg .Content
95- rendered , err := mv . renderer .Render (text )
94+ rendered , err := markdown . NewRenderer ( width ) .Render (text )
9695 if err != nil {
9796 return text
9897 }
@@ -104,15 +103,15 @@ func (mv *messageModel) Render(int) string {
104103 }
105104 text := "Thinking: " + senderPrefix (msg .Sender ) + msg .Content
106105 // Render through the markdown renderer to ensure proper wrapping to width
107- rendered , err := mv . renderer .Render (text )
106+ rendered , err := markdown . NewRenderer ( width ) .Render (text )
108107 if err != nil {
109108 return styles .MutedStyle .Italic (true ).Render (text )
110109 }
111110 // Strip ANSI from inner rendering so muted style fully applies
112111 clean := stripANSI (strings .TrimRight (rendered , "\n \r \t " ))
113112 return styles .MutedStyle .Italic (true ).Render (clean )
114113 case types .MessageTypeShellOutput :
115- if rendered , err := mv . renderer .Render (fmt .Sprintf ("```console\n %s\n ```" , msg .Content )); err == nil {
114+ if rendered , err := markdown . NewRenderer ( width ) .Render (fmt .Sprintf ("```console\n %s\n ```" , msg .Content )); err == nil {
116115 return strings .TrimRight (rendered , "\n \r \t " )
117116 }
118117 return msg .Content
0 commit comments