Display generation model in message header and other tweaks
Adjusted `ctrl+t` in chat view to toggle `showDetails` which toggles the display of system messages, message metadata (generation model), and tool call details Modified message selection update logic to skip messages that aren't shown
This commit is contained in:
@@ -16,14 +16,19 @@ import (
|
||||
|
||||
// styles
|
||||
var (
|
||||
boldStyle = lipgloss.NewStyle().Bold(true)
|
||||
faintStyle = lipgloss.NewStyle().Faint(true)
|
||||
boldFaintStyle = lipgloss.NewStyle().Faint(true).Bold(true)
|
||||
|
||||
messageHeadingStyle = lipgloss.NewStyle().
|
||||
MarginTop(1).
|
||||
MarginBottom(1).
|
||||
Bold(true)
|
||||
MarginBottom(1)
|
||||
|
||||
userStyle = lipgloss.NewStyle().Faint(true).Foreground(lipgloss.Color("10"))
|
||||
userStyle = boldFaintStyle.Foreground(lipgloss.Color("10"))
|
||||
|
||||
assistantStyle = lipgloss.NewStyle().Faint(true).Foreground(lipgloss.Color("12"))
|
||||
assistantStyle = boldFaintStyle.Foreground(lipgloss.Color("12"))
|
||||
|
||||
systemStyle = boldStyle.Foreground(lipgloss.Color("8"))
|
||||
|
||||
messageStyle = lipgloss.NewStyle().
|
||||
PaddingLeft(2).
|
||||
@@ -40,13 +45,10 @@ var (
|
||||
)
|
||||
|
||||
func (m *Model) renderMessageHeading(i int, message *api.Message) string {
|
||||
icon := ""
|
||||
friendly := message.Role.FriendlyRole()
|
||||
style := lipgloss.NewStyle().Faint(true).Bold(true)
|
||||
style := systemStyle
|
||||
|
||||
switch message.Role {
|
||||
case api.MessageRoleSystem:
|
||||
icon = "⚙️"
|
||||
case api.MessageRoleUser:
|
||||
style = userStyle
|
||||
case api.MessageRoleAssistant:
|
||||
@@ -54,16 +56,19 @@ func (m *Model) renderMessageHeading(i int, message *api.Message) string {
|
||||
case api.MessageRoleToolCall:
|
||||
style = assistantStyle
|
||||
friendly = api.MessageRoleAssistant.FriendlyRole()
|
||||
case api.MessageRoleSystem:
|
||||
case api.MessageRoleToolResult:
|
||||
icon = "🔧"
|
||||
}
|
||||
|
||||
user := style.Render(icon + friendly)
|
||||
user := style.Render(friendly)
|
||||
|
||||
var prefix string
|
||||
var suffix string
|
||||
var prefix, suffix string
|
||||
|
||||
faint := lipgloss.NewStyle().Faint(true)
|
||||
if i == m.selectedMessage {
|
||||
prefix = "> "
|
||||
} else {
|
||||
prefix = " "
|
||||
}
|
||||
|
||||
if i == 0 && len(m.App.RootMessages) > 1 && m.App.Conversation.SelectedRootID != nil {
|
||||
selectedRootIndex := 0
|
||||
@@ -73,7 +78,7 @@ func (m *Model) renderMessageHeading(i int, message *api.Message) string {
|
||||
break
|
||||
}
|
||||
}
|
||||
suffix += faint.Render(fmt.Sprintf(" <%d/%d>", selectedRootIndex+1, len(m.App.RootMessages)))
|
||||
suffix += faintStyle.Render(fmt.Sprintf(" <%d/%d>", selectedRootIndex+1, len(m.App.RootMessages)))
|
||||
}
|
||||
if i > 0 && len(m.App.Messages[i-1].Replies) > 1 {
|
||||
// Find the selected reply index
|
||||
@@ -84,20 +89,22 @@ func (m *Model) renderMessageHeading(i int, message *api.Message) string {
|
||||
break
|
||||
}
|
||||
}
|
||||
suffix += faint.Render(fmt.Sprintf(" <%d/%d>", selectedReplyIndex+1, len(m.App.Messages[i-1].Replies)))
|
||||
}
|
||||
|
||||
if i == m.selectedMessage {
|
||||
prefix = "> "
|
||||
} else {
|
||||
prefix = " "
|
||||
suffix += faintStyle.Render(fmt.Sprintf(" <%d/%d>", selectedReplyIndex+1, len(m.App.Messages[i-1].Replies)))
|
||||
}
|
||||
|
||||
if message.ID == 0 {
|
||||
suffix += faint.Render(" (not saved)")
|
||||
suffix += faintStyle.Render(" (not saved)")
|
||||
}
|
||||
|
||||
return messageHeadingStyle.Render(prefix + user + suffix)
|
||||
heading := prefix + user + suffix
|
||||
|
||||
if message.Metadata.GenerationModel != nil && m.showDetails {
|
||||
heading += faintStyle.Render(
|
||||
fmt.Sprintf(" | %s", *message.Metadata.GenerationModel),
|
||||
)
|
||||
}
|
||||
|
||||
return messageHeadingStyle.Render(heading)
|
||||
}
|
||||
|
||||
// renderMessages renders the message at the given index as it should be shown
|
||||
@@ -143,7 +150,7 @@ func (m *Model) renderMessage(i int) string {
|
||||
|
||||
var toolResults []renderedResult
|
||||
for _, result := range msg.ToolResults {
|
||||
if m.showToolResults {
|
||||
if m.showDetails {
|
||||
var jsonResult interface{}
|
||||
err := json.Unmarshal([]byte(result.Result), &jsonResult)
|
||||
if err != nil {
|
||||
@@ -206,6 +213,10 @@ func (m *Model) conversationMessagesView() string {
|
||||
for i, message := range m.App.Messages {
|
||||
m.messageOffsets[i] = lineCnt
|
||||
|
||||
if !m.showDetails && message.Role.IsSystem() {
|
||||
continue
|
||||
}
|
||||
|
||||
heading := m.renderMessageHeading(i, &message)
|
||||
sb.WriteString(heading)
|
||||
sb.WriteString("\n")
|
||||
@@ -221,6 +232,9 @@ func (m *Model) conversationMessagesView() string {
|
||||
if m.state == pendingResponse && m.App.Messages[len(m.App.Messages)-1].Role != api.MessageRoleAssistant {
|
||||
heading := m.renderMessageHeading(-1, &api.Message{
|
||||
Role: api.MessageRoleAssistant,
|
||||
Metadata: api.MessageMeta {
|
||||
GenerationModel: &m.App.Model,
|
||||
},
|
||||
})
|
||||
sb.WriteString(heading)
|
||||
sb.WriteString("\n")
|
||||
|
||||
Reference in New Issue
Block a user