summaryrefslogtreecommitdiffhomepage
path: root/packages/tui
diff options
context:
space:
mode:
Diffstat (limited to 'packages/tui')
-rw-r--r--packages/tui/internal/app/app.go3
-rw-r--r--packages/tui/internal/components/chat/editor.go3
-rw-r--r--packages/tui/internal/components/chat/messages.go6
-rw-r--r--packages/tui/internal/tui/tui.go38
4 files changed, 48 insertions, 2 deletions
diff --git a/packages/tui/internal/app/app.go b/packages/tui/internal/app/app.go
index 4b333a93c..85b21165c 100644
--- a/packages/tui/internal/app/app.go
+++ b/packages/tui/internal/app/app.go
@@ -653,6 +653,9 @@ func getDefaultModel(
}
func (a *App) IsBusy() bool {
+ if a.Session.Time.Compacting > 0 {
+ return true
+ }
if len(a.Messages) == 0 {
return false
}
diff --git a/packages/tui/internal/components/chat/editor.go b/packages/tui/internal/components/chat/editor.go
index 907734a12..121993927 100644
--- a/packages/tui/internal/components/chat/editor.go
+++ b/packages/tui/internal/components/chat/editor.go
@@ -385,6 +385,9 @@ func (m *editorComponent) Content() string {
} else if m.app.IsBusy() {
keyText := m.getInterruptKeyText()
status := "working"
+ if m.app.Session.Time.Compacting > 0 {
+ status = "compacting"
+ }
if m.app.CurrentPermission.ID != "" {
status = "waiting for permission"
}
diff --git a/packages/tui/internal/components/chat/messages.go b/packages/tui/internal/components/chat/messages.go
index 053d538a4..8e36d99c1 100644
--- a/packages/tui/internal/components/chat/messages.go
+++ b/packages/tui/internal/components/chat/messages.go
@@ -365,6 +365,9 @@ func (m *messagesComponent) renderView() tea.Cmd {
lastAssistantMessage := "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
for _, msg := range slices.Backward(m.app.Messages) {
if assistant, ok := msg.Info.(opencode.AssistantMessage); ok {
+ if assistant.Time.Completed > 0 {
+ break
+ }
lastAssistantMessage = assistant.ID
break
}
@@ -475,6 +478,9 @@ func (m *messagesComponent) renderView() tea.Cmd {
}
case opencode.AssistantMessage:
+ if casted.Summary {
+ continue
+ }
if casted.ID == m.app.Session.Revert.MessageID {
reverted = true
revertedMessageCount = 1
diff --git a/packages/tui/internal/tui/tui.go b/packages/tui/internal/tui/tui.go
index 62a647a14..69d023315 100644
--- a/packages/tui/internal/tui/tui.go
+++ b/packages/tui/internal/tui/tui.go
@@ -592,10 +592,40 @@ func (a Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
if matchIndex == -1 {
- a.app.Messages = append(a.app.Messages, app.Message{
+ // Extract the new message ID
+ var newMessageID string
+ switch casted := msg.Properties.Info.AsUnion().(type) {
+ case opencode.UserMessage:
+ newMessageID = casted.ID
+ case opencode.AssistantMessage:
+ newMessageID = casted.ID
+ }
+
+ // Find the correct insertion index by scanning backwards
+ // Most messages are added to the end, so start from the end
+ insertIndex := len(a.app.Messages)
+ for i := len(a.app.Messages) - 1; i >= 0; i-- {
+ var existingID string
+ switch casted := a.app.Messages[i].Info.(type) {
+ case opencode.UserMessage:
+ existingID = casted.ID
+ case opencode.AssistantMessage:
+ existingID = casted.ID
+ }
+ if existingID < newMessageID {
+ insertIndex = i + 1
+ break
+ }
+ }
+
+ // Create the new message
+ newMessage := app.Message{
Info: msg.Properties.Info.AsUnion(),
Parts: []opencode.PartUnion{},
- })
+ }
+
+ // Insert at the correct position
+ a.app.Messages = append(a.app.Messages[:insertIndex], append([]app.Message{newMessage}, a.app.Messages[insertIndex:]...)...)
}
}
case opencode.EventListResponseEventPermissionUpdated:
@@ -627,6 +657,10 @@ func (a Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
slog.Error("Server error", "name", err.Name, "message", err.Data.Message)
return a, toast.NewErrorToast(err.Data.Message, toast.WithTitle(string(err.Name)))
}
+ case opencode.EventListResponseEventSessionCompacted:
+ if msg.Properties.SessionID == a.app.Session.ID {
+ return a, toast.NewSuccessToast("Session compacted successfully")
+ }
case tea.WindowSizeMsg:
msg.Height -= 2 // Make space for the status bar
a.width, a.height = msg.Width, msg.Height