Skip to content

fix(acp): extend permission request timeout to 30 minutes#1942

Merged
piorpua merged 1 commit intomainfrom
fix/issue-1884
Mar 30, 2026
Merged

fix(acp): extend permission request timeout to 30 minutes#1942
piorpua merged 1 commit intomainfrom
fix/issue-1884

Conversation

@kaizhou-lab
Copy link
Copy Markdown
Collaborator

Summary

  • Increase ACP permission request timeout from 70 seconds to 30 minutes
  • Increase Codex permission request timeout from 30 seconds to 30 minutes
  • Fix session timeout resume after permission pause: reset startTime so the full timeout budget restarts instead of immediately expiring when pause duration exceeded timeout

Related Issues

Closes #1884

Test Plan

  • Unit tests for permission timeout duration (ACP + Codex)
  • Unit test for session timeout resume after permission pause
  • Type check passes
  • Lint and format pass

The previous permission timeouts (70s for ACP, 30s for Codex) were too
short for real-world usage where users step away from authorization
prompts. This caused auto-rejections and "internal error" when users
returned and tried to approve.

Changes:
- Increase ACP permission timeout from 70s to 30min
- Increase Codex permission timeout from 30s to 30min
- Fix session timeout resume after permission pause: reset startTime
  so the full timeout budget restarts instead of immediately expiring

Closes #1884
@piorpua
Copy link
Copy Markdown
Contributor

piorpua commented Mar 30, 2026

Code Review:fix(acp): extend permission request timeout to 30 minutes (#1942)

变更概述

本 PR 将 ACP 和 Codex 的权限请求超时时间从 70s/30s 延长至 30 分钟(1,800,000ms),避免用户短暂离开时 permission prompt 被自动拒绝。同时修复了 AcpConnection.resumeRequestTimeout() 中的一个 bug:原实现在 permission pause 期间超出超时预算时会立即触发超时,新实现重置 startTimepromptOriginTime,让完整超时预算在 resume 后重新开始计时。


方案评估

结论:✅ 方案合理

三处变更各自独立且相互配合。延长 permission 超时时间解决了明确的 UX 问题;resumeRequestTimeout 的重置逻辑与 resetSessionPromptTimeouts(第 598 行)的已有模式一致,且与 promptKeepalive 的 wall-clock 边界检查 (now - r.promptOriginTime < r.timeoutDuration) 正确协作——每次 permission resume 后 keepalive 都能在完整的新窗口内继续工作。两层超时机制(AcpAgent 的 permission 超时 vs AcpConnection 的 session/prompt 超时)职责清晰,无混淆。


问题清单

🔵 LOW — permission timeout 测试未覆盖真实生产代码路径

文件tests/unit/acpTimeout.test.ts,第 190–230 行;tests/unit/codexPermissionTimeout.test.ts,第 19–51 行

问题代码

// 手动模拟超时逻辑,未调用真实的 handlePermissionRequest / waitForPermission
const timeoutFn = () => {
  if (pendingPermissions.has(requestId)) {
    pendingPermissions.delete(requestId);
    rejectFn(new Error('Permission request timed out'));
  }
};
const timer = setTimeout(timeoutFn, 1800000);

问题说明:两个 permission timeout 测试均未调用 handlePermissionRequest() / waitForPermission() 生产方法,而是在测试内部手动重建了相同的超时逻辑。这意味着若生产代码中的超时值被误改回 70000ms/30000ms,这两个测试仍会通过,无法作为回归保护。

对比之下,resumeRequestTimeout 测试正确地通过 (conn as any).pauseRequestTimeout(1) / (conn as any).resumeRequestTimeout(1) 调用了真实的私有方法,质量更高。

建议:可直接调用生产方法并用 fake timers 验证其行为:

// AcpAgent permission timeout — 直接调用生产方法
it('should NOT auto-reject permission requests within 30 minutes', async () => {
  const { agent } = makeAgent();
  // 伪造一个权限请求并让 handlePermissionRequest 内部逻辑运行
  const permPromise = (agent as any).handlePermissionRequest(mockData);
  vi.advanceTimersByTime(1799999);
  // 还未超时,promise 应仍 pending
  expect((agent as any).pendingPermissions.size).toBeGreaterThan(0);
  vi.advanceTimersByTime(1);
  await expect(permPromise).rejects.toThrow('Permission request timed out');
});

汇总

# 严重级别 文件 问题
1 🔵 LOW tests/unit/acpTimeout.test.ts:190+ permission timeout 测试未调用真实生产方法
2 🔵 LOW tests/unit/codexPermissionTimeout.test.ts:19+ 同上(Codex 版本)

结论

批准合并 — 无阻塞性问题

逻辑正确,方案与现有架构一致,生产代码修改均有测试覆盖(resume 行为测试质量高)。两个 LOW 测试质量问题不影响合并,建议在后续迭代中改进。


本报告由本地 pr-review skill 生成,包含完整项目上下文,无截断限制。

@piorpua
Copy link
Copy Markdown
Contributor

piorpua commented Mar 30, 2026

✅ 已自动 review,无阻塞性问题,正在触发自动合并。

@piorpua piorpua merged commit fb9e124 into main Mar 30, 2026
17 checks passed
@piorpua piorpua deleted the fix/issue-1884 branch March 30, 2026 11:57
@piorpua piorpua added bot:done Auto-merged by bot and removed bot:reviewing Review in progress (mutex) labels Mar 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot:done Auto-merged by bot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: 在助手模式下codex,选择授权后,会内部错误 无法继续,除非手动 继续

2 participants