Skip to content

Commit f8df1b6

Browse files
committed
refactor(td): 偿还 TD-21-C/24-B/24-C 与 clippy 存量清零(TD-22-A)
1 parent 5cddb95 commit f8df1b6

21 files changed

Lines changed: 361 additions & 324 deletions

‎app/src-tauri/src/ai_guardrails_tests.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ fn quota_consumes_until_limit() {
2121
fn quota_resets_on_new_day() {
2222
// Arrange:配额 2,首日耗尽
2323
let mut quota = DailyQuota::new(2);
24-
assert!(quota.try_consume(86_400 * 1));
25-
assert!(quota.try_consume(86_400 * 1));
26-
assert!(!quota.try_consume(86_400 * 1));
24+
assert!(quota.try_consume(86_400));
25+
assert!(quota.try_consume(86_400));
26+
assert!(!quota.try_consume(86_400));
2727
// Act:次日
2828
assert!(quota.try_consume(86_400 * 2), "跨日应重置配额");
2929
assert_eq!(quota.usage(), (1, 2));

‎app/src-tauri/src/ai_note_enrich_tests.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ fn kind_as_str_matches_kebab_case() {
3636
#[test]
3737
fn fallback_never_empty() {
3838
let p = NoteEnrichPrompt::fallback();
39-
assert!(!p.build_system(&AiEnrichKind::all().to_vec()).is_empty());
39+
assert!(!p.build_system(AiEnrichKind::all().as_ref()).is_empty());
4040
}

‎app/src-tauri/src/ai_settings_tests.rs‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,16 @@ fn save_load_roundtrip() {
4646
// 持久化 roundtrip:enabled/authorized/端点/模型/阈值/记住选择全保真
4747
let path = tmp_settings_file("roundtrip.json");
4848
let _ = std::fs::remove_file(&path);
49-
let mut s = AiSettings::default();
50-
s.enabled = true;
51-
s.authorized = true;
52-
s.base_url = "https://example.com/v1".to_string();
53-
s.model = "acme/model-1".to_string();
54-
s.low_balance_threshold = 5.0;
55-
s.remember_cost_choice = true;
56-
// v0.12.0 M5:vision 画面理解默认关——持久化 roundtrip 保真
57-
s.vision_refine_enabled = true;
49+
let s = AiSettings {
50+
enabled: true,
51+
authorized: true,
52+
base_url: "https://example.com/v1".to_string(),
53+
model: "acme/model-1".to_string(),
54+
low_balance_threshold: 5.0,
55+
remember_cost_choice: true,
56+
// v0.12.0 M5:vision 画面理解默认关——持久化 roundtrip 保真
57+
vision_refine_enabled: true,
58+
};
5859
s.save(&path).expect("保存成功");
5960
let loaded = AiSettings::load(&path);
6061
assert_eq!(loaded, s);

‎app/src-tauri/src/audio_event_filter_tests.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn synth_speech(sample_rate: u32, dur_secs: f32, amp: f32) -> Vec<f32> {
4444
}
4545
i += blen;
4646
let glen = gap.min(n - i);
47-
out.extend(std::iter::repeat(0.0f32).take(glen));
47+
out.extend(std::iter::repeat_n(0.0f32, glen));
4848
i += glen;
4949
}
5050
out

‎app/src-tauri/src/commands_ai_enrich.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ fn run_enrich_task(st: AppState, task_id: u64, note_id: i64, selected: Vec<AiEnr
278278
let client = AiClient::from_settings_with_store(
279279
&settings,
280280
crate::commands_ai_providers::resolve_default_provider_key(&st)
281-
.map_err(|e| AiTaskFailure::Other(e))?,
281+
.map_err(AiTaskFailure::Other)?,
282282
&store,
283283
);
284284
let adapter = AiNoteEnrichAdapter::new(client.clone());

‎app/src-tauri/src/commands_knowledge_core.rs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ pub fn list_knowledge_models(state: State<'_, AppState>, system_id: i64) -> Resu
149149
/// @side-effect v0.14 C3:成功后广播 knowledge:links-changed——跨页即时同步
150150
/// (笔记页挂接 → 体系页引用区/图谱即时刷新,spec §3.3 refreshToken 机制)。
151151
#[tauri::command]
152+
// @ai-context: Tauri command 接口签名固定(注入 app/state + 8 个业务参数——
153+
// clippy too_many_arguments 允许:接口契约不因 lint 改形参分拆)
154+
#[allow(clippy::too_many_arguments)]
152155
pub fn link_knowledge_target(
153156
app: AppHandle,
154157
state: State<'_, AppState>,

‎app/src-tauri/src/db_graph_tests.rs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,6 @@ fn combined_snapshot_mixes_all_edge_types() {
325325
assert_eq!(snap.edges.iter().filter(|e| e.edge_type == "link").count(), 1);
326326
assert_eq!(snap.edges.iter().filter(|e| e.edge_type == "trace").count(), 1);
327327
assert_eq!(snap.edges.iter().filter(|e| e.edge_type == "belong").count(), 2);
328-
assert_eq!(snap.edges.iter().filter(|e| e.edge_type == "trace").next().expect("t").source, format!("note:{n1}"));
329-
assert_eq!(snap.edges.iter().filter(|e| e.edge_type == "trace").next().expect("t2").target, format!("note:{n2}"));
328+
assert_eq!(snap.edges.iter().find(|e| e.edge_type == "trace").expect("t").source, format!("note:{n1}"));
329+
assert_eq!(snap.edges.iter().find(|e| e.edge_type == "trace").expect("t2").target, format!("note:{n2}"));
330330
}

‎app/src-tauri/src/db_session_events.rs‎

Lines changed: 64 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -27,70 +27,72 @@ impl Db {
2727
/// 前台切换基线(低频、practice_segments 对齐锚点)不被
2828
/// 高频写放大误删(2h 会话 ≈ 数百条高频,远未触发守卫)。
2929
pub fn add_event(&self, new: &NewSessionEvent) -> Result<SessionEvent> {
30-
let conn = self.conn.lock().expect("db lock poisoned");
31-
conn.execute("BEGIN TRANSACTION", [])?;
32-
let result = (|| -> Result<SessionEvent> {
33-
// 容量守卫:超预算先删最旧(同一事务,防写放大无限增长)
34-
if crate::session_events::over_budget(self.count_events_locked(&conn, new.session_id)?) {
35-
// 优先删高频噪声事件(可重建信号;基线/行为事件保留)
36-
let deleted = conn.execute(
37-
"DELETE FROM session_events WHERE id IN (
38-
SELECT id FROM session_events
39-
WHERE session_id = ?1
40-
AND kind IN ('frame_switch', 'long_silence', 'volume_surge')
41-
ORDER BY timestamp_ms ASC LIMIT 1
42-
)",
43-
params![new.session_id],
44-
)?;
45-
if deleted == 0 {
46-
// 无高频可删(异常会话全为基线/行为事件)→ 回退删最旧整体
47-
conn.execute(
30+
self.with_conn(|conn| {
31+
conn.execute("BEGIN TRANSACTION", [])?;
32+
let result = (|| -> Result<SessionEvent> {
33+
// 容量守卫:超预算先删最旧(同一事务,防写放大无限增长)
34+
if crate::session_events::over_budget(self.count_events_locked(conn, new.session_id)?) {
35+
// 优先删高频噪声事件(可重建信号;基线/行为事件保留)
36+
let deleted = conn.execute(
4837
"DELETE FROM session_events WHERE id IN (
49-
SELECT id FROM session_events WHERE session_id = ?1 ORDER BY timestamp_ms ASC LIMIT 1
38+
SELECT id FROM session_events
39+
WHERE session_id = ?1
40+
AND kind IN ('frame_switch', 'long_silence', 'volume_surge')
41+
ORDER BY timestamp_ms ASC LIMIT 1
5042
)",
5143
params![new.session_id],
5244
)?;
45+
if deleted == 0 {
46+
// 无高频可删(异常会话全为基线/行为事件)→ 回退删最旧整体
47+
conn.execute(
48+
"DELETE FROM session_events WHERE id IN (
49+
SELECT id FROM session_events WHERE session_id = ?1 ORDER BY timestamp_ms ASC LIMIT 1
50+
)",
51+
params![new.session_id],
52+
)?;
53+
}
54+
}
55+
conn.execute(
56+
"INSERT INTO session_events (session_id, kind, timestamp_ms, payload_json)
57+
VALUES (?1, ?2, ?3, ?4)",
58+
params![
59+
new.session_id,
60+
new.kind.as_str(),
61+
new.timestamp_ms as i64,
62+
new.payload.to_string(),
63+
],
64+
)?;
65+
Ok(SessionEvent {
66+
id: conn.last_insert_rowid(),
67+
session_id: new.session_id,
68+
kind: new.kind,
69+
timestamp_ms: new.timestamp_ms,
70+
payload: new.payload.clone(),
71+
})
72+
})();
73+
match result {
74+
Ok(e) => {
75+
conn.execute("COMMIT", [])?;
76+
Ok(e)
77+
}
78+
Err(e) => {
79+
let _ = conn.execute("ROLLBACK", []);
80+
Err(e)
5381
}
5482
}
55-
conn.execute(
56-
"INSERT INTO session_events (session_id, kind, timestamp_ms, payload_json)
57-
VALUES (?1, ?2, ?3, ?4)",
58-
params![
59-
new.session_id,
60-
new.kind.as_str(),
61-
new.timestamp_ms as i64,
62-
new.payload.to_string(),
63-
],
64-
)?;
65-
Ok(SessionEvent {
66-
id: conn.last_insert_rowid(),
67-
session_id: new.session_id,
68-
kind: new.kind,
69-
timestamp_ms: new.timestamp_ms,
70-
payload: new.payload.clone(),
71-
})
72-
})();
73-
match result {
74-
Ok(e) => {
75-
conn.execute("COMMIT", [])?;
76-
Ok(e)
77-
}
78-
Err(e) => {
79-
let _ = conn.execute("ROLLBACK", []);
80-
Err(e)
81-
}
82-
}
83+
})
8384
}
8485

8586
/// 列出会话全部信号事件(按时间轴升序;消费端过滤类型)。
8687
pub fn list_events(&self, session_id: i64) -> Result<Vec<SessionEvent>> {
87-
let conn = self.conn.lock().expect("db lock poisoned");
88-
let mut stmt = conn.prepare(
89-
"SELECT id, session_id, kind, timestamp_ms, payload_json
90-
FROM session_events WHERE session_id = ?1 ORDER BY timestamp_ms ASC",
91-
)?;
92-
let rows = stmt.query_map(params![session_id], row_to_event)?;
93-
rows.collect::<rusqlite::Result<Vec<_>>>().map_err(Into::into)
88+
self.with_conn(|conn| {
89+
let mut stmt = conn.prepare(
90+
"SELECT id, session_id, kind, timestamp_ms, payload_json
91+
FROM session_events WHERE session_id = ?1 ORDER BY timestamp_ms ASC",
92+
)?;
93+
let rows = stmt.query_map(params![session_id], row_to_event)?;
94+
rows.collect::<rusqlite::Result<Vec<_>>>().map_err(Into::into)
95+
})
9496
}
9597

9698
/// 按类型列出事件(章节检测等消费端按需过滤)。
@@ -99,13 +101,14 @@ impl Db {
99101
/// 登记豁免 dead_code(V1.0 周报聚合同样需要)。
100102
#[allow(dead_code)]
101103
pub fn list_events_by_kind(&self, session_id: i64, kind: EventKind) -> Result<Vec<SessionEvent>> {
102-
let conn = self.conn.lock().expect("db lock poisoned");
103-
let mut stmt = conn.prepare(
104-
"SELECT id, session_id, kind, timestamp_ms, payload_json
105-
FROM session_events WHERE session_id = ?1 AND kind = ?2 ORDER BY timestamp_ms ASC",
106-
)?;
107-
let rows = stmt.query_map(params![session_id, kind.as_str()], row_to_event)?;
108-
rows.collect::<rusqlite::Result<Vec<_>>>().map_err(Into::into)
104+
self.with_conn(|conn| {
105+
let mut stmt = conn.prepare(
106+
"SELECT id, session_id, kind, timestamp_ms, payload_json
107+
FROM session_events WHERE session_id = ?1 AND kind = ?2 ORDER BY timestamp_ms ASC",
108+
)?;
109+
let rows = stmt.query_map(params![session_id, kind.as_str()], row_to_event)?;
110+
rows.collect::<rusqlite::Result<Vec<_>>>().map_err(Into::into)
111+
})
109112
}
110113

111114
/// 会话事件计数(容量守卫内部用;锁已持有)。

0 commit comments

Comments
 (0)