diff options
| author | Timo Clasen <[email protected]> | 2025-07-08 22:37:25 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-08 15:37:25 -0500 |
| commit | 1e07384364d6ec42239f8fdebcffc66f340c3761 (patch) | |
| tree | 4d90b925f5d2aa5e87fabff0c72cd3a1d67af441 /packages/tui | |
| parent | 4c4739c422edd0b43275b38aa1a031a0626f995d (diff) | |
| download | opencode-1e07384364d6ec42239f8fdebcffc66f340c3761.tar.gz opencode-1e07384364d6ec42239f8fdebcffc66f340c3761.zip | |
fix: make compact command interruptible (#691)
Co-authored-by: GitHub Action <[email protected]>
Diffstat (limited to 'packages/tui')
| -rw-r--r-- | packages/tui/internal/app/app.go | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/packages/tui/internal/app/app.go b/packages/tui/internal/app/app.go index b7911b56e..83934343e 100644 --- a/packages/tui/internal/app/app.go +++ b/packages/tui/internal/app/app.go @@ -35,6 +35,7 @@ type App struct { Commands commands.CommandRegistry InitialModel *string InitialPrompt *string + compactCancel context.CancelFunc } type SessionSelectedMsg = *opencode.Session @@ -306,13 +307,26 @@ func (a *App) InitializeProject(ctx context.Context) tea.Cmd { } func (a *App) CompactSession(ctx context.Context) tea.Cmd { + if a.compactCancel != nil { + a.compactCancel() + } + + compactCtx, cancel := context.WithCancel(ctx) + a.compactCancel = cancel + go func() { - _, err := a.Client.Session.Summarize(ctx, a.Session.ID, opencode.SessionSummarizeParams{ + defer func() { + a.compactCancel = nil + }() + + _, err := a.Client.Session.Summarize(compactCtx, a.Session.ID, opencode.SessionSummarizeParams{ ProviderID: opencode.F(a.Provider.ID), ModelID: opencode.F(a.Model.ID), }) if err != nil { - slog.Error("Failed to compact session", "error", err) + if compactCtx.Err() != context.Canceled { + slog.Error("Failed to compact session", "error", err) + } } }() return nil @@ -415,6 +429,12 @@ func (a *App) SendChatMessage( } func (a *App) Cancel(ctx context.Context, sessionID string) error { + // Cancel any running compact operation + if a.compactCancel != nil { + a.compactCancel() + a.compactCancel = nil + } + _, err := a.Client.Session.Abort(ctx, sessionID) if err != nil { slog.Error("Failed to cancel session", "error", err) |
