on main help sign in
fix(app): fix goroutine leak, shutdown context, and model matching (#2298)

- Add missing return after error send in RunNonInteractive goroutine - Use context.WithoutCancel for shutdown to preserve tracing context - Use strings.EqualFold for case-insensitive model matching - Preserve LSP ConnectedAt across state transitions

commitdcc67b784556c01570fd7cb73020dc7fbd7a884e authorhuaiyuWangh <34158348+huaiyuWangh@users.noreply.github.com> dateWed 25 Feb 2026, 01:02 (8 months ago) parent57a09a1
3 files changed+6−3
internal/app/app.go+2−1 internal/app/lsp_events.go+2 internal/app/provider.go+2−2
internal/app/app.go+2−1
@@ -246,6 +246,7 @@ func (app *App) RunNonInteractive(ctx context.Context, output io.Writer, prompt,
246246 done <- response{
247247 err: fmt.Errorf("failed to start agent processing stream: %w", err),
248248 }
249+ return
249250 }
250251 done <- response{
251252 result: result,
@@ -551,7 +552,7 @@ func (app *App) Shutdown() {
551552 var wg sync.WaitGroup
552553
553554 // Shared shutdown context for all timeout-bounded cleanup.
554− shutdownCtx, cancel := context.WithTimeout(app.globalCtx, 5*time.Second)
555+ shutdownCtx, cancel := context.WithTimeout(context.WithoutCancel(app.globalCtx), 5*time.Second)
555556 defer cancel()
556557
557558 // Send exit event
internal/app/lsp_events.go+2
@@ -67,6 +67,8 @@ func updateLSPState(name string, state lsp.ServerState, err error, client *lsp.C
6767 }
6868 if state == lsp.StateReady {
6969 info.ConnectedAt = time.Now()
70+ } else if existing, ok := lspStates.Get(name); ok {
71+ info.ConnectedAt = existing.ConnectedAt
7072 }
7173 lspStates.Set(name, info)
7274
internal/app/provider.go+2−2
@@ -70,8 +70,8 @@ func findModels(providers map[string]config.ProviderConfig, largeModel, smallMod
7070}
7171
7272func filter(modelFilter, providerFilter, model, provider string) bool {
73− return modelFilter != "" && model == modelFilter &&
74− (providerFilter == "" || provider == providerFilter)
73+ return modelFilter != "" && strings.EqualFold(model, modelFilter) &&
74+ (providerFilter == "" || strings.EqualFold(provider, providerFilter))
7575}
7676
7777// Validate and return a single match.