wip: refactoring tui

This commit is contained in:
adamdottv 2025-06-11 12:05:54 -05:00
parent 8a2f370eda
commit 3c82fb6818
No known key found for this signature in database
GPG key ID: 9CB48779AF150E75

View file

@ -48,7 +48,7 @@ func toMarkdown(content string, width int) string {
return strings.TrimSuffix(content, "\n")
}
type markdownRenderer struct {
type blockRenderer struct {
align *lipgloss.Position
borderColor *lipgloss.AdaptiveColor
fullWidth bool
@ -56,41 +56,41 @@ type markdownRenderer struct {
paddingBottom int
}
type markdownRenderingOption func(*markdownRenderer)
type renderingOption func(*blockRenderer)
func WithFullWidth() markdownRenderingOption {
return func(c *markdownRenderer) {
func WithFullWidth() renderingOption {
return func(c *blockRenderer) {
c.fullWidth = true
}
}
func WithAlign(align lipgloss.Position) markdownRenderingOption {
return func(c *markdownRenderer) {
func WithAlign(align lipgloss.Position) renderingOption {
return func(c *blockRenderer) {
c.align = &align
}
}
func WithBorderColor(color lipgloss.AdaptiveColor) markdownRenderingOption {
return func(c *markdownRenderer) {
func WithBorderColor(color lipgloss.AdaptiveColor) renderingOption {
return func(c *blockRenderer) {
c.borderColor = &color
}
}
func WithPaddingTop(padding int) markdownRenderingOption {
return func(c *markdownRenderer) {
func WithPaddingTop(padding int) renderingOption {
return func(c *blockRenderer) {
c.paddingTop = padding
}
}
func WithPaddingBottom(padding int) markdownRenderingOption {
return func(c *markdownRenderer) {
func WithPaddingBottom(padding int) renderingOption {
return func(c *blockRenderer) {
c.paddingBottom = padding
}
}
func renderMarkdown(content string, options ...markdownRenderingOption) string {
func renderContentBlock(content string, options ...renderingOption) string {
t := theme.CurrentTheme()
renderer := &markdownRenderer{
renderer := &blockRenderer{
fullWidth: false,
}
for _, option := range options {
@ -200,12 +200,12 @@ func renderText(message client.MessageInfo, text string, author string) string {
switch message.Role {
case client.User:
return renderMarkdown(content,
return renderContentBlock(content,
WithAlign(lipgloss.Right),
WithBorderColor(t.Secondary()),
)
case client.Assistant:
return renderMarkdown(content,
return renderContentBlock(content,
WithAlign(lipgloss.Left),
WithBorderColor(t.Primary()),
)
@ -329,8 +329,16 @@ func renderToolInvocation(
stdout := metadata["stdout"].(string)
body = fmt.Sprintf("```console\n> %s\n%s```", command, stdout)
body = toMarkdown(body, innerWidth)
body = renderMarkdown(body, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
body = renderContentBlock(body, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
}
case "opencode_webfetch":
title = fmt.Sprintf("Fetching: %s %s", toolArgs, elapsed)
format := toolArgsMap["format"].(string)
body = truncateHeight(body, 10)
if format == "html" || format == "markdown" {
body = toMarkdown(body, innerWidth)
}
body = renderContentBlock(body, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
case "opencode_todowrite":
title = fmt.Sprintf("Planning... %s", elapsed)
if finished && metadata["todos"] != nil {
@ -349,13 +357,13 @@ func renderToolInvocation(
}
}
body = toMarkdown(body, innerWidth)
body = renderMarkdown(body, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
body = renderContentBlock(body, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
}
default:
toolName := renderToolName(toolCall.ToolName)
title = fmt.Sprintf("%s: %s %s", toolName, toolArgs, elapsed)
body = truncateHeight(body, 10)
body = renderMarkdown(body, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
body = renderContentBlock(body, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
}
content := style.Render(title)
@ -438,7 +446,7 @@ func renderFile(filename string, content string, options ...fileRenderingOption)
// }
// content = strings.Join(truncated, "\n")
return renderMarkdown(content, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
return renderContentBlock(content, WithFullWidth(), WithPaddingTop(1), WithPaddingBottom(1))
}
func renderToolAction(name string) string {