feat: 后台服务模式 + 日志滚动 + 修复 llm_usage 表兼容性

- 新增 logger.rs(tracing-appender,日滚日志,.data/logs/)
- service 子命令:等同 listen --llm 但日志同时写入文件
- systemd/ias.service 单元文件
- 迁移 0007:ALTER TABLE llm_usage ADD COLUMN IF NOT EXISTS
  修复与 iPet 旧表的结构冲突
- ias usage 命令可正常查询 Token 统计
- 日志滚动保留 7 天,自动删除旧文件
This commit is contained in:
2026-06-01 17:45:17 +08:00
parent b9de3665d9
commit 00002e4740
13 changed files with 341 additions and 45 deletions
+35
View File
@@ -191,3 +191,38 @@ pub async fn query_llm_usage_stats(
Ok(row)
}
// ─── 会话摘要 ───
/// 保存一条摘要到数据库
pub async fn save_summary(
pool: &PgPool,
user_id: &str,
text: &str,
reason: &str,
message_count: i32,
) -> Result<(), String> {
sqlx::query(
"INSERT INTO session_summaries (user_id, summary_text, reason, message_count) VALUES ($1, $2, $3, $4)",
)
.bind(user_id)
.bind(text)
.bind(reason)
.bind(message_count)
.execute(pool)
.await
.map_err(|e| format!("保存摘要失败: {}", e))?;
Ok(())
}
/// 加载最近的摘要(用于 read_summaries 工具)
pub async fn load_summaries(pool: &PgPool, limit: i64) -> Result<Vec<String>, String> {
let rows = sqlx::query_as::<_, (String,)>(
"SELECT summary_text FROM session_summaries ORDER BY created_at DESC LIMIT $1",
)
.bind(limit)
.fetch_all(pool)
.await
.map_err(|e| format!("查询摘要失败: {}", e))?;
Ok(rows.into_iter().map(|(t,)| t).collect())
}