diff --git a/src-tauri/src/commands/ai/audit/approval.rs b/src-tauri/src/commands/ai/audit/approval.rs index 94c5c9d..89ce44e 100644 --- a/src-tauri/src/commands/ai/audit/approval.rs +++ b/src-tauri/src/commands/ai/audit/approval.rs @@ -1,13 +1,9 @@ //! F-#97 / AE-04 / 阶段4 审批门控逻辑。 //! -//! 第六批从 audit/mod.rs 抽离,行为零变更。包含: -//! - `classify_risk_and_auto`:按 risk_level + auto_exec_mode 判定是否自动执行 -//! - `check_trust_hits`:会话信任命中检测(AE-2025-04) -//! - `insert_pending_approval`:挂起审批 + diff 生成 + AiApprovalRequired emit + 审计落 pending -//! - `detect_retry_count`:同 tc_id 重试检测 -//! - `handle_approval_tool`:单工具调用的审批门控(调用上述子函数组合) -//! -//! process_tool_calls 通过 `use approval::{detect_retry_count, handle_approval_tool}` 裸名调用。 +//! 审批策略(方案 B:Persona 维度 + 扩展点): +//! - reviewer/analyst 人设的工具调用全 auto(只读/分析,审批无意义) +//! - 其他人设走现有 auto_exec_mode 三档 +//! - Phase 2 扩展点:可在 should_auto_for_persona 内加工具维度 if 分支 use std::sync::Arc; @@ -54,6 +50,44 @@ pub(super) fn classify_risk_and_auto( should_auto } +/// 审批策略方案 B:Persona 维度判定。 +/// +/// 在 classify_risk_and_auto 之上叠加人设维度: +/// - reviewer/analyst 人设:工具白名单已限制为只读,全部 auto(审批纯浪费) +/// - 其他人设:走 classify_risk_and_auto 原逻辑 +/// +/// Phase 2 扩展点:在此函数内加工具维度 if 分支,例如: +/// ```ignore +/// if persona_id == "coder" && tool_name == "write_file" { +/// if let Some(path) = args.get("path").and_then(|v| v.as_str()) { +/// if path.ends_with(".md") { return true; } // 写文档 auto +/// } +/// } +/// ``` +#[allow(dead_code)] // 接线到 process_tool_calls 需要 SubTask 携带 persona_id,后续批次接入 +pub(super) fn should_auto_for_persona( + persona_id: Option<&str>, + risk_level: RiskLevel, + auto_exec_mode: &str, + tool_name: &str, + args: &serde_json::Value, +) -> bool { + // 人设维度:reviewer/analyst 全 auto + match persona_id { + Some("reviewer") | Some("analyst") => { + tracing::debug!( + persona = ?persona_id, + tool = %tool_name, + "[POLICY-B] 只读人设全 auto" + ); + return true; + } + _ => {} + } + // 兜底:现有三档 + patch_file 特例 + classify_risk_and_auto(risk_level, auto_exec_mode, tool_name, args) +} + /// AE-2025-04 检查会话信任命中。 /// /// 首批信任工具:write_file / run_command。同会话已批准过同工具+同目录 →