From d10d7ff3309e7816ef31031945d848b7f1de7784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Thu, 2 Jul 2026 00:20:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E:=20=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E7=AD=96=E7=95=A5Persona=E7=BB=B4=E5=BA=A6(reviewer/analyst?= =?UTF-8?q?=E5=85=A8auto+=E6=89=A9=E5=B1=95=E7=82=B9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - should_auto_for_persona: 叠加在 classify_risk_and_auto 之上的人设维度判定 - reviewer/analyst 人设工具调用全 auto(只读工具审批无意义) - 预留 Phase 2 工具维度扩展点(函数内加 if 分支即可) - 零编译警告 --- src-tauri/src/commands/ai/audit/approval.rs | 50 +++++++++++++++++---- 1 file changed, 42 insertions(+), 8 deletions(-) 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。同会话已批准过同工具+同目录 →