新增: 审批超时后端兜底,覆盖重启恢复场景

前端早已有审批超时定时器(AdvancedSection.vue 0/5/15/30/60 分钟
可配置),负责会话内运行的审批超时检测。但重启后前端定时器丢失,
恢复的 pending_approvals(经 audit/restore.rs 从 DB 重建)无人
计时,会永久卡死会话。

本次补充后端兜底机制:
- PendingApproval 新增 created_at 字段(SystemTime),记录创建时刻
- 新增 agentic/approval_timeout.rs,在 try_continue_agent_loop
  入口检测超时,自动取消并写入审计(rejected)
- AppState 新增 approval_timeout_minutes 字段 + 启动从 KV 恢复
- IPC 新增 ai_get_approval_timeout / ai_set_approval_timeout
- KV 复用前端 df-approval-timeout key(值为毫秒),保持单一真相源

同时更新 todo.md / 待决策.md,把已实现项标记为完成。
This commit is contained in:
2026-06-28 18:16:34 +08:00
parent 3fac0a618d
commit b923d700fd
11 changed files with 279 additions and 57 deletions

View File

@@ -79,6 +79,9 @@ pub async fn restore_pending_approvals(state: &AppState) {
// 阶段4:重启恢复的审批 retry_count=0(恢复语义即"待用户首次决策",非重试)。
// 即便审计表已有 pending 记录,恢复后用户审批执行属首次正常执行,不断路。
retry_count: 0,
// 恢复审批 created_at=重启时刻(无原挂起时间记录,按当前系统时间计)。
// 超时取消计数仍从此刻起,避免恢复后立即被误判超时。
created_at: Some(std::time::SystemTime::now()),
},
);
}
@@ -133,6 +136,7 @@ mod tests_f09_batch8_restore {
kind: ApprovalKind::Risk { diff: None },
// 阶段4:恢复的审批 retry_count=0(首次用户决策,非重试)。
retry_count: 0,
created_at: None,
},
);
}