on main help sign in
fix(noninteractive): actually use models to generate titles (#2372)

Prior to this, non-interactive titles would simply be the prompt, which could be multiple lines and would include data piped in. This revision also removes the "non-interactive:" title prefix as it's irrelevant. Non-interactive sessions can be picked up in the TUI and are treated no different than interactive sessions.

commit2dacfbd90c237d269d2f42b4cfc9880a54c72857 authorChristian Rocha <christian@rocha.is> dateMon 9 Mar 2026, 08:00 (7 months ago) parentec8c8dd
2 files changed+5−16
internal/agent/agent.go+4−4 internal/app/app.go+1−12
internal/agent/agent.go+4−4
@@ -44,7 +44,7 @@ import (
4444)
4545
4646const (
47− defaultSessionName = "Untitled Session"
47+ DefaultSessionName = "Untitled Session"
4848
4949 // Constants for auto-summarization thresholds
5050 largeContextWindowThreshold = 200_000
@@ -822,7 +822,7 @@ func (a *sessionAgent) generateTitle(ctx context.Context, sessionID string, user
822822 // Welp, the large model didn't work either. Use the default
823823 // session name and return.
824824 slog.Error("Error generating title with large model", "err", err)
825− saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, defaultSessionName, 0, 0, 0)
825+ saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, DefaultSessionName, 0, 0, 0)
826826 if saveErr != nil {
827827 slog.Error("Failed to save session title and usage", "error", saveErr)
828828 }
@@ -834,7 +834,7 @@ func (a *sessionAgent) generateTitle(ctx context.Context, sessionID string, user
834834 // Actually, we didn't get a response so we can't. Use the default
835835 // session name and return.
836836 slog.Error("Response is nil; can't generate title")
837− saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, defaultSessionName, 0, 0, 0)
837+ saveErr := a.sessions.UpdateTitleAndUsage(ctx, sessionID, DefaultSessionName, 0, 0, 0)
838838 if saveErr != nil {
839839 slog.Error("Failed to save session title and usage", "error", saveErr)
840840 }
@@ -849,7 +849,7 @@ func (a *sessionAgent) generateTitle(ctx context.Context, sessionID string, user
849849 title = thinkTagRegex.ReplaceAllString(title, "")
850850
851851 title = strings.TrimSpace(title)
852− title = cmp.Or(title, defaultSessionName)
852+ title = cmp.Or(title, DefaultSessionName)
853853
854854 // Calculate usage and cost.
855855 var openrouterCost *float64
internal/app/app.go+1−12
@@ -213,18 +213,7 @@ func (app *App) RunNonInteractive(ctx context.Context, output io.Writer, prompt,
213213
214214 defer stopSpinner()
215215
216− const maxPromptLengthForTitle = 100
217− const titlePrefix = "Non-interactive: "
218− var titleSuffix string
219−
220− if len(prompt) > maxPromptLengthForTitle {
221− titleSuffix = prompt[:maxPromptLengthForTitle] + "..."
222− } else {
223− titleSuffix = prompt
224− }
225− title := titlePrefix + titleSuffix
226−
227− sess, err := app.Sessions.Create(ctx, title)
216+ sess, err := app.Sessions.Create(ctx, agent.DefaultSessionName)
228217 if err != nil {
229218 return fmt.Errorf("failed to create session for non-interactive mode: %w", err)
230219 }