优化: aichat 打磨收尾(切换信任保留 + save并发串行 + 后台授权守卫 + 分离窗口失效 + 气泡截图复制)

This commit is contained in:
lxy
2026-08-08 21:08:25 +08:00
parent 65c0f6b2b6
commit 6ba6daf188
14 changed files with 196 additions and 27 deletions
+18 -1
View File
@@ -196,7 +196,7 @@ pub(crate) async fn save_conversation(
// 超时即放弃本次 save,下次 loop 轮次会重新落库,幂等覆盖无副作用)。
if let Err(_elapsed) = tokio::time::timeout(
Duration::from_secs(SAVE_CONVERSATION_TIMEOUT_SECS),
save_conversation_inner(session_arc, db, conv_id, usage, model, touch_updated_at),
save_conversation_serialized(session_arc, db, conv_id, usage, model, touch_updated_at),
)
.await
{
@@ -208,6 +208,23 @@ pub(crate) async fn save_conversation(
}
}
/// 按 conv 串行化 save(取 per-conv 锁后执行 inner;tokio Mutex lock 可取消,超时放弃不持锁)。
async fn save_conversation_serialized(
session_arc: &Arc<Mutex<AiSession>>,
db: &Arc<Database>,
conv_id: &str,
usage: Option<&df_ai::provider::TokenUsage>,
model: Option<&str>,
touch_updated_at: bool,
) {
let save_lock = {
let mut session = session_arc.lock().await;
session.save_lock(conv_id)
};
let _save_guard = save_lock.lock().await;
save_conversation_inner(session_arc, db, conv_id, usage, model, touch_updated_at).await;
}
/// save_conversation 内部实现(无超时,由外层 save_conversation 包 timeout 调用)。
async fn save_conversation_inner(
session_arc: &Arc<Mutex<AiSession>>,