Cursor 重启后聊天 / Composer 记录全没了

关掉 Cursor 重开,对话列表空了或只剩最近一条。多半是存储损坏、同步出错、workspace 不一致。怎么恢复 + 长期怎么防。

一下午都在 Composer 里来回迭代,晚上关掉 Cursor,第二天早上一打开——对话列表空了。或者只剩今天的一条,昨天那条深聊就这么没了。有时甚至不用完全退出,reload 一次窗口就丢。Cursor 的聊天历史存在你用户目录下的本地 SQLite 里;丢的话几乎都是这几种原因之一:Composer 历史是按 workspace 区分的,你开错了文件夹;硬关导致 SQLite 文件损坏;账号同步把线程拉到云上拉出错;或者清理任务为了控制磁盘悄悄裁掉了旧对话。能不能恢复看情况,但预防是非常便宜的。

常见原因

按命中率从高到低。

1. Composer 历史按 workspace 分,你开错了文件夹

Composer 对话和创建它的 workspace 绑定。打开了同级目录或不同的 worktree,前一个 workspace 的历史就看不到——没删,只是 out of scope。

怎么判断:File → Open Recent → 切回原来那个目录。线程都回来了——就是它。

2. SQLite 历史文件损坏

硬关(Composer 正在写的时候 force quit)会让 SQLite WAL 留在 Cursor 恢复不了的状态。下次启动就直接建新库,不报错。

怎么判断:看 ~/Library/Application Support/Cursor/User/workspaceStorage/<hash>/state.vscdb(macOS)里有没有残留 state.vscdb-shmstate.vscdb-wal。出现 .backup 文件也是强信号。

3. 账号同步偷偷搬动了线程

Cursor 的「Sync chat history」会在设备之间搬线程。一次坏的同步可能从另一台机器拉数据、把本地线程盖住。

怎么判断:Settings → Account → Sync chat history → 关掉、重启,看本地线程回不回来。回来后再开。

4. 撞到本地历史保留上限

Cursor 每个 workspace 存的对话有上限(最近版本是 100-200 条)。超了之后旧的会被静默裁掉。

怎么判断:数一下当前线程数。正好在上限附近、丢的恰好是最旧的——就是它。

5. 项目从不同的绝对路径打开了

Composer 用 workspace hash 给存储分桶,hash 包含绝对路径。symlink、网络盘重挂、~/Projects 变成 /Users/you/Projects——都会生成新 hash,对应一份空历史。

怎么判断:对比今天和昨天标题栏里的路径。哪怕只是表面差异都会把存储劈开。

6. Cursor 升级时迁移存储漏了一些

偶尔大版本升级会迁移存储 schema,漏掉一些。少见,但 major 版本时确实发生过。

怎么判断:Help → About 看版本。去 changelog 里搜 storage migration 这条。

开始前

  • 别在空的 Composer 里开新对话——新写入可能盖掉能恢复的备份。
  • 弄清楚丢失历史的那个 workspace 确切路径。
  • 动存储文件前先完全退出 Cursor,正在写的时候去碰会把恢复机会也毁了。

需要收集的信息

  • Cursor 版本(Help → About)。
  • OS 和用户数据目录路径。
  • 准确的 workspace 路径(今天的 vs 创建历史的那个)。
  • 「Sync chat history」是不是开着。
  • ~/Library/Application Support/Cursor/User/workspaceStorage/ 下的文件(Linux: ~/.config/Cursor/User/...,Windows: %APPDATA%\Cursor\User\...)。
  • 丢失线程大概数量和时间范围。

一步一步修复

Step 1:开回原来那个 workspace

File → Open Recent,选项目的原始路径,精确点。历史回来——就是开错文件夹了。以后把规范路径加书签。

Step 2:toggle 同步重新拉

Settings → Account → Sync chat history → 关、重启、开、再重启。强制重拉一次。云上有的丢线程会回来,从没同步过的不会。

Step 3:到磁盘上看 workspaceStorage

完全退出 Cursor。列目录:

ls -la ~/Library/Application\ Support/Cursor/User/workspaceStorage/

每个子目录是一个 workspace hash。你项目对应的那个里会有 state.vscdb。文件几 KB 以上一般有数据;接近 0 就是空的。

Step 4:从 backup 文件恢复

如果看到 state.vscdb.backupstate.vscdb-corrupted,先把现在的 state.vscdb 留一份(以防万一),然后把 backup 改名成 state.vscdb 再启动 Cursor:

cd ~/Library/Application\ Support/Cursor/User/workspaceStorage/<hash>/
cp state.vscdb state.vscdb.broken
mv state.vscdb.backup state.vscdb

Step 5:打开 SQLite 看看里面

没 backup 的话,库里可能也还有数据。Cursor 退出状态下:

sqlite3 state.vscdb "SELECT key FROM ItemTable WHERE key LIKE '%composer%' OR key LIKE '%chat%';"

有匹配 key 就说明数据还在。把 value 导成 JSON,然后开 Cursor 看它能不能识别。

Step 6:globalStorage 也查一下

部分聊天元数据在 ~/Library/Application Support/Cursor/User/globalStorage/。找 cursor.aichat.* 目录。把过期的那个挪走再重启,能逼 Cursor 从更健康的源头重建。

Step 7:兜底——开 support ticket

数据是在 Pro 账号 + 同步开着的情况下丢的,Cursor support 有时能从云快照恢复。带上版本、workspace 路径、大致日期、Step 3 里看到的文件大小。

怎么验证修好了

  • 打开恢复后的 workspace,对比线程标题和你记得的一致。
  • 点进一条旧线程,确认对话完整、没截断。
  • 重启 Cursor 一次,历史扛得住重启。
  • 同步开关切一轮,没线程丢失。

长期预防

  • 退 Cursor 用 Cmd+Q(macOS)或 File → Exit,能避免 force-kill 就避免。
  • 跨设备用就把「Sync chat history」开着——这是你的远端备份。
  • 项目用稳定的绝对路径,有 Composer 历史之后就别挪文件夹了。
  • 不可替代的重要对话,导出一份:点线程 → Export → 存成 Markdown。
  • 定期用 Time Machine 或 rsync 备份 ~/Library/Application Support/Cursor/User/workspaceStorage/

容易踩的坑

  • 空窗口里先开新对话再去查 workspace 路径,新写入可能盖备份。
  • Cursor 开着改 SQLite 库,一定要先退出。
  • 以为云同步啥都有。同步只覆盖开启之后的;之前的可能根本没上传。
  • 项目用到一半改文件夹名,workspace hash 一变,活跃线程立刻从侧边栏消失。
  • 把「Reload Window」当无副作用操作。它会重新 init 状态、有时会把陈旧路径暴露出来。

常见问答

  • Cursor 聊天到底存哪? macOS:~/Library/Application Support/Cursor/User/workspaceStorage/<hash>/state.vscdb。Linux 和 Windows 在各自的 per-user app 目录下镜像。
  • 会同步到 Cursor 账号吗? 只在你打开「Sync chat history」之后才会。即使开了,超大对话可能被延迟或裁掉。
  • 能单独导出一条对话吗? 能——打开线程,点三点菜单 → Export。
  • 同一个项目通过 symlink 打开会和真实路径共享历史吗? 不会,workspace hash 不一样,两份独立存储。
  • 保留上限大概多少? 0.46 大约每 workspace 100-200 条。重度用户要把重要的导出来。

相关

标签: #Cursor #composer #排查 #排查