Skip to content

fix: idle timeout 忽略 Hook 阻塞时间 & Banner 增加终止按钮#247

Merged
ErlichLiu merged 1 commit intomainfrom
fix/idle-timeout-hook-aware
Apr 12, 2026
Merged

fix: idle timeout 忽略 Hook 阻塞时间 & Banner 增加终止按钮#247
ErlichLiu merged 1 commit intomainfrom
fix/idle-timeout-hook-aware

Conversation

@ErlichLiu
Copy link
Copy Markdown
Owner

Summary

  • idle timeout Hook 感知:120s idle timeout 在权限审批、AskUserQuestion、ExitPlanMode 等 Hook 等待用户响应期间暂停计时,避免误判为连接挂起触发重试
  • Banner 终止按钮:AskUserBanner 和 ExitPlanModeBanner 底部增加"终止"按钮,解决这两个 Banner 替换输入区域后用户无法中止会话的问题

背景

PR #237 引入的 120s idle timeout 没有考虑 Hook 阻塞时间。lastActivityAt 只在 SDK 事件到达时更新,而 Hook 阻塞期间 SDK generator 被挂起无法产生事件,导致用户在弹窗上停留超过 120s 后会话被强制重试。

实现

后端(agent-orchestrator.ts)

  • sendMessage() 闭包内新增 hookPending 布尔变量
  • 三个阻塞 Hook(ExitPlanMode、AskUserQuestion、acceptEdits)用 try/finally 包裹设置状态
  • idle watcher 检测到 hookPending === true 时重置计时器并跳过超时判定

前端(AskUserBanner.tsx、ExitPlanModeBanner.tsx)

  • 两个 Banner 底部 footer 各增加红色"终止"按钮(Square 图标)
  • 点击后清理 Jotai atom pending request + 调用 stopAgent(sessionId)
  • PermissionBanner 无需改动(不替换输入区域,停止按钮仍可用)

Test plan

  • acceptEdits 模式下触发工具调用,等待 >120s 后点击允许,验证不会触发重试
  • AskUserQuestion 弹窗等待 >120s 后回答,验证不会触发重试
  • 正常 SDK 挂起场景(无 Hook 阻塞),验证 120s 后仍能正确触发重试
  • AskUserBanner 显示时点击"终止"按钮,验证会话正常终止
  • ExitPlanModeBanner 显示时点击"终止"按钮,验证会话正常终止

🤖 Generated with Claude Code

- 120s idle timeout 现在会在权限审批、AskUserQuestion、ExitPlanMode 等 Hook
  等待用户响应期间暂停计时,避免误判为连接挂起触发重试
- AskUserBanner 和 ExitPlanModeBanner 底部增加"终止"按钮,解决这两个 Banner
  替换输入区域后用户无法中止会话的问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@ErlichLiu ErlichLiu merged commit 8b62986 into main Apr 12, 2026
ErlichLiu added a commit that referenced this pull request Apr 12, 2026
…aware"

This reverts commit 8b62986, reversing
changes made to 7039a86.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant