Cursor 重启后聊天 / Composer 记录不见了

重开 Cursor 对话列表空了、只剩最近一条、或一直卡在 Loading Chat。多半是 workspace hash 变了、升级迁移出错,或 state.vscdb 损坏。怎么恢复 + 长期怎么防。

一下午都在 Cursor 的 Agent/Composer 里来回迭代,退出,第二天早上一开——对话列表空了。或者只剩今天那条,昨天那场深聊没了;又或者每条都卡在 Loading Chat 上一直转。有时候不用完全退出,Reload Window 一下就触发了。

最快的办法:先退出 Cursor,再用 File -> Open Recent 从项目原来那个完整绝对路径重新打开。绝大多数「丢」掉的历史其实没删,只是被绑在一个 workspace hash 上,而文件夹一旦移动、重新 clone、或者创建时间戳变了,这个 hash 就跟着变。如果这样还回不来,数据基本上也还在磁盘的 state.vscdb 里,按下面的步骤能找回来。

Cursor 的聊天历史是存在本地 SQLite 里的,不在云上。截至 2026 年 6 月(Cursor 3.7),没有内置的跨设备聊天同步——这一直是个呼声很高的 feature request,但并不是一个已经上线的设置。所以某条线程在这台机器上没了,恢复只能在这台机器的磁盘上做,靠「重新同步」是没用的。

Cursor 到底把聊天历史存在哪(截至 2026 年 6 月)

磁盘上一共三个位置,而且在整个 3.x 版本里挪过,所以三个都要查:

存储路径(macOS)存什么
全局库~/Library/Application Support/Cursor/User/globalStorage/state.vscdb大部分聊天 / Agent 数据:composerData:*(线程头:标题、时间戳)和 bubbleId:*(单条消息)
Workspace 库~/Library/Application Support/Cursor/User/workspaceStorage/<hash>/state.vscdb每个 workspace 指向全局库的链接;以及驱动侧边栏列表的 composer.composerHeaders key
Agent 记录~/.cursor/projects/<project-slug>/agent-transcripts/较新版本 Agent 按 run 写出的纯文本记录文件;即使侧边栏空了也能直接读

Linux 上前两个在 ~/.config/Cursor/User/... 下,Windows 在 %APPDATA%\Cursor\User\... 下。~/.cursor/projects/ 这个目录三个平台一样,都在你的 home 目录下。

agent-transcripts 这个目录是近期最重要的变化:哪怕应用里列表啥都没显示,你的 prompt 和 agent 的回复往往还以可读文件的形式留在那里。在你认定「真没了」之前,先去看这个目录。

常见原因

按命中率从高到低。

1. workspace hash 变了(文件夹移动、改名、重新 clone 或还原)

Cursor 用一个 workspace hash 给存储分桶,这个 hash 由文件夹的绝对路径算出来,某些情况下还掺了创建时间戳。把文件夹挪个位置、改个名、重新 git clone、从备份还原、或者网络盘重挂——Cursor 都会算出一个 hash,建一个空的新 workspace,旧聊天就被孤立在旧 hash 下面了。东西没删。

怎么判断File -> Open Recent 选回原始路径。线程回来了——就是它。如果文件夹确实搬走了,看 Step 3(把旧 workspace 重新关联回来)。

2. 版本升级时存储迁移出了岔子

升级时 Cursor 会迁移 SQLite schema。某些 3.x 升级会让旧线程显示成 Chat Too Old - this chat was created in an older version of Cursor and is no longer supportedConversation has corrupted data,或者无限 Loading Chat 转圈。新建的对话能用,旧的浮不出来。

怎么判断Cursor -> About(macOS)或 Help -> About 看版本。如果是自动升级之后历史立刻没了,并且看到上面任意一条原文——那是迁移问题,不是你操作错了。

3. 硬关导致 state.vscdb 损坏

线程正写到一半时 force-quit,可能让 SQLite WAL 留在 Cursor 恢复不了的状态。下次启动它就退而求其次建个新库,而不是直接打不开报错。

怎么判断:退出 Cursor 后,到 workspace 或全局存储目录里看有没有残留的 state.vscdb-shm / state.vscdb-wal,或者一个 state.vscdb.backup / state.vscdb-corrupted 同名兄弟文件。

4. 线程被孤立成 null workspace

有个已知故障会让 composerData 行原封不动(标题、正文都对),但它们的 workspace 关联被置成了 null,结果数据明明在那儿,侧边栏却一条都不显示。

怎么判断:跑 Step 4 里的 SQLite 查询。如果能查到 composerData:* 这些 key,但侧边栏是空的,那数据还在,只是没被关联上。

5. 有人为了腾磁盘把全局 state.vscdb 删了

globalStorage/state.vscdb 能涨到好几个 GB。网上那种「直接删了它」的建议是破坏性的:删完之后每一个项目都会永远卡在 Loading Chat,因为各个 workspace 库还指向已经不存在的线程 ID。

怎么判断:最近是不是有人(或某个「清理」脚本)删了或清空了那个文件?如果是,从备份还原;一旦没了,应用里没有任何恢复手段。

6. 撞上单 workspace 的体量行为

重度使用的 workspace 会攒下成千上万条 bubble。Cursor 不会激进删除,但超大或超旧的线程可能渲染成被截断、或加载失败,而新的都没事。

怎么判断:如果只有最旧、最大的线程出问题,最近的都完整——那是体量问题,不是整体丢失。

开始前

  • 先在空窗口里开新对话。新写入可能盖掉能恢复的备份,或者顶掉当前 workspace 的状态。
  • 动任何存储文件前先完全退出 Cursor(Cmd+Q / File -> Exit)。Cursor 开着改 SQLite 会把恢复机会也毁掉。
  • 改任何东西之前先备份:
cp -r ~/Library/Application\ Support/Cursor/User/globalStorage ~/Desktop/cursor-globalStorage-backup
cp -r ~/.cursor/projects ~/Desktop/cursor-projects-backup

需要收集的信息

  • Cursor 版本(Cursor -> About)。
  • OS,以及上表里那几个确切路径。
  • 今天的 workspace 路径 vs 创建历史那会儿的路径。
  • 屏幕上的确切字串(如果有):Chat Too OldLoading ChatConversation has corrupted data
  • globalStorage/state.vscdb 和对应 workspaceStorage/<hash>/state.vscdb 的文件大小。
  • ~/.cursor/projects/<slug>/agent-transcripts/ 里有没有文件。

一步一步修复

Step 1:开回原来那个 workspace

File -> Open Recent,选项目的原始绝对路径,要精确(大小写都算)。历史回来——你只是开到别的 workspace 去了。以后把规范路径加书签。这一步能解决最常见的那种情况。

Step 2:直接读 agent 记录

如果侧边栏空了、但你只是要内容,先看这里:

ls -la ~/.cursor/projects/
ls -la ~/.cursor/projects/<your-project-slug>/agent-transcripts/

每个文件就是某一次 agent run 的可读记录。哪怕应用里的列表坏了,这里往往是一份完整的「你和 agent 都干了啥」的记录。先把要的内容拷出来,再去做风险更高的库操作。

Step 3:文件夹搬过之后把旧 workspace 关联回来

如果文件夹挪了或重新 clone 了,旧聊天就在旧 workspace hash 下面。把候选都列出来,找数据最多(state.vscdb 最大)的那个:

du -sh ~/Library/Application\ Support/Cursor/User/workspaceStorage/*/state.vscdb | sort -h

社区工具 cursor-chat-recovery 能自动把旧的(有数据的)workspace 和新的(空的)配上。Cursor 完全退出后:

curl -fsSL https://raw.githubusercontent.com/cpeoples/cursor-chat-recovery/main/cursor-chat-recovery.sh -o cursor-chat-recovery.sh
bash cursor-chat-recovery.sh --list my-project-name
# 真写之前先预览
bash cursor-chat-recovery.sh --dry-run --restore <source-index> <target-index> my-project-name
# 确认无误再实跑
bash cursor-chat-recovery.sh --restore <source-index> <target-index> my-project-name

跑完之后,从恢复所针对的那个确切路径重新打开项目。Windows 用户需要 Git Bash 或 WSL,PowerShell/CMD 跑不了这个脚本。

Step 4:自己查 SQLite 库

不想跑脚本的话,手动确认数据在不在。Cursor 退出状态下:

cd ~/Library/Application\ Support/Cursor/User/globalStorage/
sqlite3 state.vscdb "SELECT COUNT(*) FROM cursorDiskKV WHERE key LIKE 'composerData:%';"
sqlite3 state.vscdb "SELECT key FROM cursorDiskKV WHERE key LIKE 'composerData:%' LIMIT 20;"

如果是更老的版本把聊天存在 ItemTable 里,试:

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

有任何匹配行就说明数据在磁盘上。可以把某个 value 导出来看看:

sqlite3 state.vscdb "SELECT value FROM cursorDiskKV WHERE key = '<composerData:...>';" > thread.json

如果你查到一堆有内容的 composerData:* 行、但侧边栏是空的,那就是 null-workspace 孤立这种情况(原因 4):内容是安全的,只是 Cursor 不肯把它列出来。

Step 5:从 backup 文件恢复

如果你找到 state.vscdb.backupstate.vscdb-corrupted 同名兄弟文件,把当前文件挪开、把 backup 顶上去。在对应目录里(workspace 或全局):

cp state.vscdb state.vscdb.broken
mv state.vscdb.backup state.vscdb

重启 Cursor 看侧边栏。对原因 3(损坏)以及原因 5(全局库被删但有备份)来说,这是最干净的修法。

Step 6:处理「Chat Too Old」/「Loading Chat」迁移问题

迁移失败(原因 2)这种,数据通常完好,只是某一个 key 把列表卡住了。因为 state.vscdb 是 SQLite,你可以只精准清掉那个侧边栏列表 key,而不动设置、扩展、或线程本身。Cursor 退出后,在出问题的 workspaceStorage/<hash>/ 目录里:

cp state.vscdb state.vscdb.bak
sqlite3 state.vscdb "DELETE FROM ItemTable WHERE key = 'composer.composerHeaders';"

重启 Cursor。它会从底层的 composerData/bubbleId 行重建列表头。如果没用,把刚才那个 .bak 还回去,往下走。

Step 7:兜底——重建 + 开 ticket

要是怎么都浮不出线程,退出 Cursor,把全局库挪开强制一次干净重建(旧的留着当备份):

mv ~/Library/Application\ Support/Cursor/User/globalStorage/state.vscdb \
   ~/Library/Application\ Support/Cursor/User/globalStorage/state.vscdb.bak

重启;大项目索引要几分钟。然后去 Cursor 论坛 或应用内反馈提报,带上版本、确切错误字串、前面查到的文件大小、以及 agent-transcripts/ 里有没有数据。确认恢复之前所有 .bak 文件都先留着。

怎么验证修好了

  • 打开恢复后的 workspace,对比线程标题和你记得的一致。
  • 点进一条旧线程,确认对话完整、没被截断、也没卡在 Loading Chat
  • 退出再重开 Cursor 一次,确认历史扛得住重启。
  • 把现在全局库的大小和备份比一下,确认没有悄悄少行。

长期预防

  • Cmd+Q(macOS)或 File -> Exit 退出;尽量别 force-kill——它就是 WAL 损坏的常见元凶。
  • 用稳定的绝对路径。有了 Composer/Agent 历史之后,别移动、改名、或重新 clone 那个文件夹,workspace hash 会变。
  • 千万别为了腾磁盘删 globalStorage/state.vscdb——它会把每个项目的聊天列表都搞废。
  • 不可替代的重要线程,导出一份:打开线程 → 三点菜单 → Export 存成 Markdown。
  • 留着 ~/.cursor/projects/.../agent-transcripts/ 那些文件,它们是你最可读的保命备份。
  • 想要真正的跨机器衔接(截至 2026 年 6 月 Cursor 原生还没有),用社区同步 CLI(比如 cursaves,把记录推到一个私有 git 仓库),或者用 Time Machine / rsync 备份 globalStorage/~/.cursor/projects/

容易踩的坑

  • 还没查 workspace 路径或 transcripts,就先在空窗口开了新对话。新写入可能盖掉能恢复的备份。
  • Cursor 开着改 state.vscdb,一定要先退出。
  • 听信磁盘清理建议删掉全局 state.vscdb——这是最具破坏性的一步,会让每个项目都卡在 Loading Chat
  • 以为聊天在云上。它只在本地,没有原生同步可以重拉。
  • 项目用到一半改文件夹名或挪位置,hash 一变,活跃线程立刻从侧边栏消失。
  • Reload Window 当无副作用操作。它会重新 init 状态,有时会暴露一个陈旧或空的存储路径。

常见问答

  • Cursor 聊天历史到底存哪? 3.7 里一共三处:globalStorage/state.vscdb(大头)、workspaceStorage/<hash>/state.vscdb(每个 workspace 的链接,以及那个 composer.composerHeaders 列表 key)、还有 ~/.cursor/projects/<slug>/agent-transcripts/ 下的纯文本记录文件。macOS 上前两个在 ~/Library/Application Support/Cursor/User/ 下,Linux 在 ~/.config/Cursor/User/,Windows 在 %APPDATA%\Cursor\User\
  • 聊天历史会同步到我的 Cursor 账号吗? 不会。截至 2026 年 6 月 Cursor 没有内置的跨设备聊天同步,这是个高票 feature request、不是设置。历史只在每台机器本地,所以要在丢失的那台机器上恢复。
  • 升级后聊天显示「Chat Too Old」或一直「Loading Chat」,是丢了吗? 通常没丢。那是迁移 / 列表头问题。试 Step 6(清 composer.composerHeaders);composerData/bubbleId 这些行一般是完好的。
  • 我为了省磁盘删了 globalStorage/state.vscdb,现在全都「Loading Chat」,能撤销吗? 只能从备份还原那个文件(Time Machine、rsync、或你自己的拷贝)。没备份就没法恢复——这正是删它如此危险的原因。
  • 同一个项目通过 symlink 或重新 clone 的副本打开,会共享历史吗? 不会。workspace hash 不一样,两份独立存储。要么从原始路径打开,要么用 Step 3 的恢复工具重新关联。
  • 能单独导出一条对话吗? 能——打开线程,点三点菜单,选 Export 存成 Markdown。任何丢不起的对话都先这么导一份。

相关

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