diff options
Diffstat (limited to 'packages/tui')
| -rw-r--r-- | packages/tui/internal/app/app.go | 3 | ||||
| -rw-r--r-- | packages/tui/internal/components/chat/editor.go | 3 | ||||
| -rw-r--r-- | packages/tui/internal/components/chat/messages.go | 6 | ||||
| -rw-r--r-- | packages/tui/internal/tui/tui.go | 38 |
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 |
