Agent @ picker shows untitled “New Chat” for existing conversations

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

Cursor IDE → Agent chat → @ picker (reference/attach prior chats).

When referencing prior agent chats via @ inside Agent mode, many entries appear as untitled “New Chat” even though the conversations exist and have substantial history.

This is not (primarily) the main Past chats sidebar in my case — the issue shows up in the @ chat picker when trying to find and attach a previous thread.

A. Stale entries after transcript deletion (secondary)
When transcript folders are removed outside Cursor’s in-app delete, metadata can remain and still appear in the @ picker as an untitled “New Chat” even though the conversation is gone or broken.

B. Long agent chats never get auto-titled

  • Real conversations can remain with name: null/empty in composer.composerHeaders, so the @ chat picker shows “New Chat” instead of a generated title. Many of mine are also isArchived: true, which makes them harder to distinguish among identical labels.

  • Manual DB edits did not stick while the app was open (see Additional Context).

Expected: @ picker lists prior chats with recognizable auto-generated titles; deleted chats disappear.
Actual: @ picker shows multiple identical “New Chat” rows; hard to find the right thread; some may be stale after transcript deletion.

Steps to Reproduce

  1. macOS — open a workspace in Cursor Agent mode and run several long multi-turn agent chats.
  2. In a new Agent chat, type @ and open the chat/conversation picker to reference a prior thread.
  3. Observe multiple entries labeled “New Chat” despite real conversation history.
  4. (Optional) Quit Cursor, manually delete one ~/.cursor/projects/<workspace-id>/agent-transcripts/{composerId}/ folder, reopen, repeat step 2 — an untitled “New Chat” may still appear.

Operating System

MacOS

Version Information

Version: 3.8.2
VS Code Extension API: 1.105.1
Commit: b89e482a59f84f55a982a0e6fa6b2399a1430860
Date: 2026-06-16T01:49:35.480Z
Layout: editor
Build Type: Stable
Release Track: Nightly
Electron: 40.10.3
Chromium: 144.0.7559.236
Node.js: 24.15.0
V8: 14.4.258.32-electron.0
xterm.js: 6.1.0-beta.256
OS: Darwin arm64 27.0.0

Additional Information

Storage split (for debugging):
Cursor appears to keep at least three separate stores that are not reconciled:

  • Sidebar metadata: SQLite key composer.composerHeadersallComposers[] (fields observed: composerId, name, subtitle, isArchived, workspaceIdentifier)
  • Conversation payload: SQLite cursorDiskKVcomposerData:{composerId}
  • Agent transcript files: ~/.cursor/projects/<workspace-id>/agent-transcripts/{composerId}/{composerId}.jsonl

Observed on one macOS project workspace:

  • ~18 prior chats available when using @ in Agent mode
  • Most appear as untitled “New Chat” despite real history (many archived)
  • Main sidebar: Past chats may show proper titles for recent threads; the @ picker is where the problem is visible for me.

Local workaround attempted (advanced, not recommended): I tried editing local Cursor state (composer.composerHeaders) to backfill titles from .jsonl. Changes did not persist while Cursor was running (SQLITE_BUSY: database is locked in main.log).

Does this stop you from using Cursor

No - Cursor works, but with this issue

Hi Fernando!

The short version: “New Chat” in the @ picker is the intended fallback for any past chat that has no stored title. The picker lists the transcript files on disk and pulls each title from your chat metadata. When a chat has no title stored (older or imported chats that never got auto-named, or transcripts left behind when a chat is removed outside Cursor), it shows “New Chat” instead of a raw ID. So the unreconciled-stores behavior you’re seeing is mostly working as designed, not a server-side issue. The sidebar looks cleaner because it surfaces recent (auto-named) chats, while the picker also lists older/archived ones - which is where the untitled rows collect.

A few things that should help:

  • Auto-titles are generated from your first message in a chat. Chats that predate that, or where it never ran, stay untitled. To give any chat a stable, recognizable title that shows up in the picker, right-click the chat (tab or in the chat list) → Rename. That’s the supported way to set a title, and it persists.
  • Editing composer.composerHeaders directly won’t work while Cursor is open - the database is locked (that’s the SQLITE_BUSY you saw), so changes don’t stick. Renaming in-app is the reliable path.
  • For the stale entries after deleting transcript folders by hand: the picker’s file list is cached and only refreshes when the number of chats changes, so a full quit-and-reopen is the most reliable way to clear out entries you removed on disk. Going forward, using Cursor’s in-app delete (rather than removing folders manually) keeps the metadata and transcripts in sync.