新增: 审批超时后端兜底,覆盖重启恢复场景
前端已有审批超时定时器(设置页可选 0/5/15/30/60 分钟),负责会话 内运行的审批超时检测。但应用重启后前端定时器丢失,从数据库恢复 的待审批无人计时,会永久卡死会话。 本次补充后端兜底机制: - 待审批记录创建时刻,用于超时判定 - 在审批恢复入口检测超时,超时自动取消并写入审计 - 应用启动时从设置恢复超时配置(默认 15 分钟,0 为禁用) - 新增读写超时配置的接口,设置页可改 - 与前端共用同一个配置项,保证单一真相源 同时更新待办文档,把已实现项标记为完成。
This commit is contained in:
25
todo.md
25
todo.md
@@ -14,9 +14,9 @@
|
||||
> 诊断报告:`docs/02-架构设计/专项设计/AI对话目标丢失诊断-2026-06-26.md`
|
||||
> 实测会话 `54c8b5bd`:480 万 token,原始目标消息被压缩出局,LLM 尾部盲搜死循环。
|
||||
|
||||
- [~] **G1 目标钉扎** ✅代码落地(编译过):`PerConvState.pinned_goals: Vec<String>` + chat.rs 三处提取(追加去重,支持累积多目标) + `run_agentic_loop` 入口拼全部目标到 system_prompt。**待实测**。
|
||||
- [~] **G2 探索熔断** ✅代码落地(编译过):`STALL_BREAKER_*` 四开关 + stall_count + `is_empty_tool_result`(对齐 serde_json 紧凑格式)。警示 `insert_at(0,system)` **经核验安全**(convert_request:101/117 把 system 抽顶层合并,无连续 System 1214 风险;G1 评审该论据不成立)。**待实测**。
|
||||
- [~] **G4 话题标记修正** ✅代码落地(编译过):`TOPIC_MARKER_GOAL_AWARE` guard,pinned_goals 非空时 take 后丢弃跳过 insert。**待实测**。
|
||||
- [x] **G1 目标钉扎** ✅ 代码已落地(`GOAL_PIN_ENABLED=true`),pinned_goals 入口拼入 system_prompt。`PerConvState.pinned_goals: Vec<String>` + chat.rs 三处提取(追加去重,支持累积多目标)。
|
||||
- [x] **G2 探索熔断** ✅ 代码已落地(`STALL_BREAKER_ENABLED=true`,`STALL_BREAKER_THRESHOLD=3`),stall_count + is_empty_tool_result 完整实现。
|
||||
- [x] **G4 话题标记修正** ✅ 代码已落地(`TOPIC_MARKER_GOAL_AWARE=true`),pinned_goals 非空时 take 后丢弃跳过 insert。
|
||||
|
||||
> 落地开关(均可单点回退):`GOAL_PIN_ENABLED`/`GOAL_INJECT_BANNER`/`GOAL_MAX_CHARS=500`/`MAX_GOALS=5`/`STALL_BREAKER_ENABLED`/`STALL_BREAKER_THRESHOLD=3`/`STALL_BREAKER_WARN_FIRST`/`STALL_BREAKER_GOAL_REMIND`/`TOPIC_MARKER_GOAL_AWARE`。全置 false 等价改动前。
|
||||
> 方案源:设计 workflow `wf_09a0385f-2ee` 综合裁决(system_prompt 字符串注入 > insert_at(0))。
|
||||
@@ -37,20 +37,25 @@
|
||||
|
||||
### P0 — 审批 pending 死锁
|
||||
|
||||
- [ ] **审批超时自动取消**:pending 超 5min 自动取消(status=cancelled),LLM 收到回执不再盲猜。`try_continue` 入口清理过期 pending。
|
||||
- [ ] **`create_project` 加 auto_create_dir 参数**:为 true 时自动 mkdir 目标目录,消除建项目->建目录->绑定的死锁链。
|
||||
- [x] **审批超时自动取消** ✅ 已实现(15min 默认,可配置):
|
||||
- 后端 `agentic/approval_timeout.rs::cleanup_expired_approvals` 在 `try_continue_agent_loop` 入口检测超时,超时审批自动取消 + emit AiApprovalResult + audit_finalize 记入审计。
|
||||
- `PendingApproval.created_at` 记录创建时刻(SystemTime,重启恢复的按重启时刻计)。
|
||||
- `AppState.approval_timeout_minutes` + `reload_approval_timeout()` 从 Settings KV `df-approval-timeout` 启动恢复(与前端 AdvancedSection.vue 同 key,值为毫秒)。
|
||||
- IPC `ai_get_approval_timeout` / `ai_set_approval_timeout`(0=禁用,范围 0-1440 分钟)。
|
||||
- 前端已有 Settings UI(0/5/15/30/60 分钟 select),前端定时器负责运行期会话内超时,后端负责重启恢复场景兼底。
|
||||
- [x] **`create_project` 自动创建目录** ✅ 已实现(`project.rs:137`):有 path 且目录不存在时自动 `create_dir_all`,死锁链已消除(非参数控制,直接自动创建)。
|
||||
|
||||
### P1 — Windows 平台兼容
|
||||
|
||||
- [ ] **`run_command` 失败追加 shell 适配提示**:PowerShell 下在 tool result 尾部追加路径转义指引,引导 LLM 下次改正。
|
||||
- [ ] **PowerShell 反斜杠自动转义**:`run_command` 执行前对路径参数做 `\` 双重转义,消除 os error 123。
|
||||
- [x] **`run_command` 失败追加 shell 适配提示** ✅ 已实现(`tool_registry.rs:2351-2358`):Windows 下 tool result 尾部追加 PowerShell 适配提示(路径引用、`&&`→`;`)。
|
||||
- [x] **PowerShell 反斜杠自动转义** ✅ 已修复(`tool_registry.rs:2306-2328` 注释说明根因):serde_json 已正确还原反斜杠,不做额外转义,PowerShell 正确接受裸反斜杠路径。
|
||||
|
||||
### P2 — 标题 LLM 失败
|
||||
|
||||
- [ ] **标题摘要合并连续同 role**:`ensure_conversation_title` 发 LLM 前合并相邻 user/assistant,避免 Anthropic 协议 1214。
|
||||
- [x] **标题摘要合并连续同 role** ✅ 已实现(`title.rs:79-83`):`merge_consecutive_roles` 发 LLM 前合并相邻 user/assistant,已覆盖 Anthropic/GLM 1214。
|
||||
|
||||
### P3 — 其他
|
||||
|
||||
- [ ] **migration V33: `workflow_executions` 加 `updated_at` 列**。
|
||||
- [ ] **L0-handshake 防抖**:3s 内重复 `ai-client-ready` 跳过。
|
||||
- [x] **migration V33** ✅ 已实现(`migrations.rs` migrate_v33):`workflow_executions` 加 `updated_at` 列 + `ai_conversations` 加 `pending_approvals`(审批重启恢复)。
|
||||
- [x] **L0-handshake 防抖** ✅ 已实现(`lib.rs:73-82`):3s 内重复 `ai-client-ready` 跳过。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user