Cursor Agent 模式工具调用卡 pending

agent 模式下某次 tool call 一直转圈——多半是 shell 命令卡在等输入、网络被防火墙挡了、或者权限弹窗你没看见。

Cursor 的 agent 跑一次 tool call 后界面一直转圈,永远不结束。“Stop” 按钮按了没反应,chat 卡死,发新消息也只能排在那个死掉的 call 后面。转圈背后通常是三件事之一:一条在等你输入但你看不见的 shell 命令、一个被防火墙或 VPN 挡住的网络请求、一个滚过去你没注意到的权限弹窗。

这三种情况都不是”等久一点”能解决的。本文带你定位问题,再用最干净的方式打破死锁、不丢 chat 历史。

常见原因

1. shell 命令在等交互式输入

agent 跑了 git rebase -inpm initgh auth login 这类会弹提示的命令。agent 模式没有 TTY 提供交互输入,进程就一直挂在那。

如何判断:打开真正的 terminal,ps aux | grep <command>——如果进程在那里、状态是 S+、父进程是 Cursor,就是它卡住了。

2. tool call 被网络挡住了

agent 调了 WebSearchfetch 去访问一个你 VPN、防火墙或公司代理挡掉的域名。请求既不完成也不报错,就坐着不动。

如何判断:打开 Cursor 的开发者工具(Help > Toggle Developer Tools)> Network。pending 的请求挂在一个你访问不到的域名上。

3. 权限弹窗被略过或没注意到

agent 跑 shell 命令前会弹询问。你滚走了或不小心点到外面,agent 就在等一个永远不来的决定。

如何判断:把 chat 滚到最底——是不是有一个灰着的 “Approve / Reject” 按钮你忘了点?

4. 长命令(build / install)本来就要好几分钟

npm install 在空 node_modules 上要 3-5 分钟。cargo build --release 大 crate 要 10 分钟以上。agent UI 只显示 “running”,没有进度条。

如何判断:打开真正的 terminal 跑同样的命令——也要 5 分钟的话,agent 不是卡住,只是慢。

5. Cursor 进程真的挂了

agent 模式 bug、内存泄漏、或者 Electron renderer 锁死。Stop 按钮没反应,CPU 平 0%(活着的进程怎么也有点活动)。

如何判断:活动监视器 / 任务管理器——Cursor helper 进程 0% CPU 且没 I/O,多半是挂了。

6. tool call 服务端超时了但 UI 没更新

后端在 60 或 120 秒后把这次 call 超时了,但前端没收到关闭事件。call 实际上已经失败了,UI 还显示 pending。

如何判断:Help > Toggle Developer Tools > Console,看有没有没冒上来的 “timeout” 或 “abort” 报错。

动手前先确认

  • 记下卡住的是哪种 tool call(terminal、file edit、web search、MCP)——修法不同。
  • 别反复点 Stop;能管用一下就管用,反复点没意义。
  • 记一下 chat URL / ID,方便修好后回到原地。

需要收集的信息

  • chat 里看到的精确 tool call 名字和参数。
  • 转圈大概多久了。
  • Cursor 版本(Cursor > About)。
  • 当前有没有 VPN / 代理 / 防火墙。
  • macOS / Linux 下 ps aux | grep -i cursor 的输出,或 Windows 的任务管理器。
  • Help > Toggle Developer Tools > Console 的报错。

一步步修复

Step 1:先看是哪类 tool call 卡住

chat 里把 pending 的 tool call 展开。常见类型:

  • run_terminal_cmd——在 Cursor 集成 terminal 里跑的 shell 命令。
  • web_search / fetch_url——网络请求。
  • edit_file / read_file——文件系统操作。
  • mcp_<name>——Model Context Protocol 工具。

每种卡住的模式不同。

Step 2:terminal 命令卡住时,杀掉底层进程

macOS / Linux:

ps aux | grep -E "node|npm|cargo|git" | grep -v grep
kill -TERM <pid>
# 5 秒内 TERM 没用就:
kill -KILL <pid>

Windows:

Get-Process | Where-Object {$_.ProcessName -match "node|npm|cargo"} | Stop-Process

底层进程死了之后,Cursor 一般 30 秒内收到关闭事件,spinner 就消失了。

Step 3:网络调用卡住时,先验通联再绕开

打开真正的 terminal:

curl -v https://api.cursor.sh/ 2>&1 | head -20
curl -v https://api.openai.com/ 2>&1 | head -20

任何一个挂住或失败:

  1. 暂时关掉 VPN 再试。
  2. 看公司代理:echo $HTTP_PROXY $HTTPS_PROXY
  3. 把 Cursor 用的域名加进防火墙白名单:*.cursor.shapi.anthropic.comapi.openai.com

Step 4:不丢 chat 重载窗口

Cursor 菜单 > Developer > Reload Window(Cmd/Ctrl+R)。这会重启 renderer,但磁盘上的 chat 历史还在。pending 的 tool call 会被清掉,你可以重试。

如果 Reload Window 也挂:

  1. 强制退出 Cursor。
  2. 重新打开 Cursor。
  3. 打开同一个项目;chat 侧边栏应该还能看到之前的对话。

Step 5:关掉有问题的 MCP server

如果卡的是 mcp_<name> 工具,问题可能在 MCP server 本身:

# 找 MCP 配置
cat ~/.cursor/mcp.json

把可疑的 server 注释掉,重启 Cursor 重试。最常见的祸根是每次 call 都 spawn 一个子进程但没设超时的 MCP server。

Step 6:长命令改后台跑,别让 agent 一直等

你明知道要几分钟的命令(npm installcargo build),在 prompt 里就直接告诉 agent 用后台模式:

Run `npm install` in the background and check back in 60 seconds.
Do not block on the install output.

agent 模式 terminal call 支持 run_in_background: true,不会等命令跑完才继续。

验证

  • 开新 chat 重跑同一个 prompt——应该顺利完成。
  • 跑一个明确很快的 tool call(ls、简单 read)确认 tool call 整体在工作。
  • Help > Toggle Developer Tools > Console 输出干净,没有挂着的 promise。
  • 如果卡的是某个 MCP server,用 mcp-debug 或等价工具单独测试它。

长期预防

  • 永远别让 agent 跑交互式命令(git rebase -ivimnano、不带 -ynpm init),用非交互替代。
  • 长命令从一开始就配 run_in_background: true
  • 每次给 prompt 后留意一下 Approve / Reject 面板——你不回应,agent 就静默等你。
  • 自己写的 MCP server 加 5 分钟超时;默认无限超时是最常见的卡死原因。
  • 每月升级一次 Cursor;agent 模式的 timeout / cancel 类 bug 一直在修。

常见坑

  • tool call 还 pending 就把 chat 标签关了——底层进程还在跑,可能锁死下一个 chat。
  • 没先杀子进程就强退 Cursor;遗留的 node / npm 进程会霸占端口、影响下次启动。
  • 并行开多个 agent chat;两边碰到同一个文件时 tool call 队列会死锁。
  • 给一个权限然后离开——agent 后面可能还有要确认的步骤还在等你。
  • 网络切换后 VPN 隐式自动重连;agent 的 HTTP keep-alive 还绑在已经死掉的路径上。

FAQ

Q:Cursor 本身有 tool call 超时吗? A:网络调用有(一般 120 秒);terminal 命令没有全局超时,必须你自己杀。

Q:Reload Window 会丢 chat 吗? A:不会——chat 按项目持久化到磁盘。Reload Window 只重启 renderer。

Q:能看到 agent 实际跑了什么命令吗? A:能——chat 里点 tool call 的标题就能展开参数和 stdout。

Q:Stop 按钮为什么有时按了没反应? A:Stop 通知的是”模型停止生成”,不是底层 tool 进程。卡住的 shell 命令不会响应 Stop,必须你去杀进程。

相关阅读

标签: #Cursor #ide #排查