优化: AI Chat 体验全面升级(图标/审批/目标提取/窗口管理)

- AI 入口图标:灯泡→星花 sparkles+发光,与灵感入口区分
- 目标提取根本性改造:用户消息规则→工具调用推理(infer_goal_from_tool_calls)
  - Vec<String>→Vec<GoalEntry>(text+status),active→completed 状态流转
  - 多条/轮提取,system_prompt 仅注入 active 目标
  - 代码拆分到 helpers.rs(解决 brace 嵌套致 pub(crate) 不可见)
- 审批修复:patch_file 全档位自动放行,批量审批防抖,乐观更新竞态保护
- 审批通知浮层:全局右上角 ApprovalOverlay,窗口遮挡时可见
- 设置导入导出移除:价值低占用空间,跨设备同步建议复制 SQLite
- 分离窗口默认置顶+置顶状态持久化(刷新后保持)
- header 菜单聚合:清空/压缩上下文收入 ... popout
- LLM 文字重叠防御:delta 重复检测+丢弃
- 置顶图标:星→大头针 pushpin
- 文档/注释更新:过期 Vec<String>/chat.rs 提取描述修正
This commit is contained in:
lxy
2026-07-03 13:07:03 +08:00
parent aa0701a2ea
commit 0dfaeb0f5b
26 changed files with 929 additions and 753 deletions
+9 -10
View File
@@ -34,20 +34,19 @@ pub(super) fn classify_risk_and_auto(
tool_name: &str,
args: &serde_json::Value,
) -> bool {
let mut should_auto = match risk_level {
let _ = args; // 预留扩展点(未来可加路径白名单/文件类型等维度)
// patch_file 是 AI 编码主力工具,改文件是 AI Coding 的工作常态。
// 原本“小改动(≤5 行)豁免、大改动审批”的设计在实际使用中频繁打断 AI 工作流
// (AI 改文件往往远超 5 行),且文件已写入会落 audit 表可追溯,审批价值低。
// 决策:patch_file 全档位自动放行(low/medium/all 均不审批),与 read_file 同级处理。
if tool_name == "patch_file" {
return true;
}
match risk_level {
RiskLevel::Low => true,
RiskLevel::Medium => auto_exec_mode == "medium" || auto_exec_mode == "all",
RiskLevel::High => auto_exec_mode == "all",
};
// C-260627patch_file 小改动(≤5 行)自动放行,不阻塞 AI 工作流
if !should_auto && tool_name == "patch_file" {
if let Some(text) = args.get("new_text").and_then(|v| v.as_str()) {
if text.lines().count() <= 5 {
should_auto = true;
}
}
}
should_auto
}
/// 审批策略方案 B:Persona 维度判定。
+19
View File
@@ -325,6 +325,25 @@ pub(crate) async fn process_tool_calls(
.ok()
.flatten()
.unwrap_or_else(|| "low".to_string());
// F-#97 诊断:用户报「选 all 仍审批」时辅助定位 KV 是否真落库。
// df-ai-trace-approve 开关控制(默认开)。常见误以为已生效但实际未点确认按钮致 KV 未落。
let trace_on = app_handle
.state::<crate::state::AppState>()
.settings
.get("df-ai-trace-approve")
.await
.ok()
.flatten()
.map(|v| v == "true" || v == "1")
.unwrap_or(true);
if trace_on {
tracing::info!(
conv_id = %conv_id,
auto_exec_mode = %auto_exec_mode,
drafts_count = drafts.len(),
"[ai] 审批判定读取的自动执行模式"
);
}
// trust_hits 收集:AE-04 会话信任命中(同会话已批准同类操作),真实执行但移到锁外 spawn
// (对齐 Low risk 不持锁模式)。命中时此处只 emit toast + 收集,不 .await execute。
let mut trust_hits: Vec<(ToolCallDraft, serde_json::Value, String, RiskLevel)> = Vec::new();