修复: checkpoint 参数化 + 压缩 permit 死锁降级 + 密钥归一化 + SSE CRLF/多字节
This commit is contained in:
@@ -323,6 +323,40 @@ impl AiToolExecutionRepo {
|
||||
// AiConversationRepo 的整体更新已由 impl_repo! 宏统一生成的 update_full 提供。
|
||||
|
||||
impl AiConversationRepo {
|
||||
/// 写入对话版本化快照 checkpoint(INSERT OR IGNORE,同 id 已存在则跳过)。
|
||||
///
|
||||
/// 参数化绑定(替代原调用方的 format! 拼 SQL + execute_batch),防 snapshot 含引号/
|
||||
/// 特殊字符致注入或损坏。列对齐 conversation_checkpoints(id, conv_id, snapshot,
|
||||
/// token_total, created_at)。
|
||||
pub async fn insert_checkpoint(
|
||||
&self,
|
||||
id: &str,
|
||||
conv_id: &str,
|
||||
snapshot: &str,
|
||||
token_total: i64,
|
||||
created_at: &str,
|
||||
) -> Result<()> {
|
||||
let conn = self.conn.clone();
|
||||
let id = id.to_string();
|
||||
let conv_id = conv_id.to_string();
|
||||
let snapshot = snapshot.to_string();
|
||||
let created_at = created_at.to_string();
|
||||
let _ = tokio::task::spawn_blocking(move || {
|
||||
let guard = conn.blocking_lock();
|
||||
guard
|
||||
.execute(
|
||||
"INSERT OR IGNORE INTO conversation_checkpoints \
|
||||
(id, conv_id, snapshot, token_total, created_at) \
|
||||
VALUES (?1, ?2, ?3, ?4, ?5)",
|
||||
params![id, conv_id, snapshot, token_total, created_at],
|
||||
)
|
||||
.map_err(storage_err)
|
||||
})
|
||||
.await
|
||||
.map_err(storage_err)??;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// 清空对话消息内容(保留 conversation 记录本身,只清 messages JSON + 清零 token 计数)
|
||||
///
|
||||
/// "清空对话"语义:对话壳保留(侧栏仍可见,可继续在该对话内聊),仅清空历史消息。
|
||||
|
||||
Reference in New Issue
Block a user