diff --git a/ecc2/Cargo.lock b/ecc2/Cargo.lock index 48d10bec..4a14db27 100644 --- a/ecc2/Cargo.lock +++ b/ecc2/Cargo.lock @@ -8,18 +8,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - [[package]] name = "aho-corasick" version = "1.1.4" @@ -802,15 +790,6 @@ dependencies = [ "url", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] - [[package]] name = "hashbrown" version = "0.15.5" @@ -844,11 +823,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.9.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "a5081f264ed7adee96ea4b4778b6bb9da0a7228b084587aa3bd3ff05da7c5a3b" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.17.1", ] [[package]] @@ -1167,9 +1146,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.30.1" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +checksum = "f6c19a05435c21ac299d71b6a9c13db3e3f47c520517d58990a462a1397a61db" dependencies = [ "cc", "pkg-config", @@ -1833,10 +1812,20 @@ dependencies = [ ] [[package]] -name = "rusqlite" -version = "0.32.1" +name = "rsqlite-vfs" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +checksum = "c51c9ae4df8a7fba42103df5c621fa3c37eccf3a3c650879e90fc48b11cc192c" +dependencies = [ + "hashbrown 0.16.1", + "thiserror 2.0.18", +] + +[[package]] +name = "rusqlite" +version = "0.40.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11438310b19e3109b6446c33d1ed5e889428cf2e278407bc7896bc4aaea43323" dependencies = [ "bitflags 2.13.0", "fallible-iterator", @@ -1844,6 +1833,7 @@ dependencies = [ "hashlink", "libsqlite3-sys", "smallvec", + "sqlite-wasm-rs", ] [[package]] @@ -2075,6 +2065,18 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "sqlite-wasm-rs" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3efc0da82635d7e1ced0053bbbfa8c7ab9645d0bf36ceb4f7127bb85315d75" +dependencies = [ + "cc", + "js-sys", + "rsqlite-vfs", + "wasm-bindgen", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -3065,26 +3067,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zerocopy" -version = "0.8.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "zerofrom" version = "0.1.6" diff --git a/ecc2/Cargo.toml b/ecc2/Cargo.toml index 4e512506..a3bdbe8b 100644 --- a/ecc2/Cargo.toml +++ b/ecc2/Cargo.toml @@ -20,7 +20,7 @@ crossterm = "0.29" tokio = { version = "1", features = ["full"] } # State store -rusqlite = { version = "0.32", features = ["bundled"] } +rusqlite = { version = "0.40", features = ["bundled"] } # Git integration git2 = { version = "0.20", features = ["ssh"] } diff --git a/ecc2/src/session/store.rs b/ecc2/src/session/store.rs index 21c1bd5d..03075d59 100644 --- a/ecc2/src/session/store.rs +++ b/ecc2/src/session/store.rs @@ -1025,7 +1025,7 @@ impl StateStore { profile.permission_mode, add_dirs_json, profile.max_budget_usd, - profile.token_budget, + profile.token_budget.map(|tokens| tokens as i64), profile.append_system_prompt, ], )?; @@ -1062,7 +1062,9 @@ impl StateStore { permission_mode: row.get(4)?, add_dirs: serde_json::from_str(&add_dirs_json).unwrap_or_default(), max_budget_usd: row.get(6)?, - token_budget: row.get(7)?, + token_budget: row + .get::<_, Option>(7)? + .map(|tokens| tokens as u64), append_system_prompt: row.get(8)?, agent: None, }) @@ -1568,12 +1570,12 @@ impl StateStore { updated_at = ?8 WHERE id = ?9", rusqlite::params![ - metrics.input_tokens, - metrics.output_tokens, - metrics.tokens_used, - metrics.tool_calls, + metrics.input_tokens as i64, + metrics.output_tokens as i64, + metrics.tokens_used as i64, + metrics.tool_calls as i64, metrics.files_changed, - metrics.duration_secs, + metrics.duration_secs as i64, metrics.cost_usd, chrono::Utc::now().to_rfc3339(), session_id, @@ -1596,7 +1598,7 @@ impl StateStore { row.get::<_, String>(1)?, row.get::<_, String>(2)?, row.get::<_, String>(3)?, - row.get::<_, u64>(4)?, + row.get::<_, i64>(4)? as u64, )) })? .collect::, _>>()?; @@ -1626,7 +1628,7 @@ impl StateStore { if duration_secs != current_duration { self.conn.execute( "UPDATE sessions SET duration_secs = ?1 WHERE id = ?2", - rusqlite::params![duration_secs, session_id], + rusqlite::params![duration_secs as i64, session_id], )?; } } @@ -1706,11 +1708,11 @@ impl StateStore { cost_usd = ?4 WHERE id = ?5", rusqlite::params![ - aggregate.input_tokens, - aggregate.output_tokens, + aggregate.input_tokens as i64, + aggregate.output_tokens as i64, aggregate .input_tokens - .saturating_add(aggregate.output_tokens), + .saturating_add(aggregate.output_tokens) as i64, aggregate.cost_usd, session_id, ], @@ -1871,7 +1873,7 @@ impl StateStore { row.input_params_json, row.output_summary, trigger_summary, - row.duration_ms, + row.duration_ms as i64, risk_score, timestamp, file_paths_json, @@ -2135,12 +2137,12 @@ impl StateStore { }) .with_timezone(&chrono::Utc), metrics: SessionMetrics { - input_tokens: row.get(11)?, - output_tokens: row.get(12)?, - tokens_used: row.get(13)?, - tool_calls: row.get(14)?, + input_tokens: row.get::<_, i64>(11)? as u64, + output_tokens: row.get::<_, i64>(12)? as u64, + tokens_used: row.get::<_, i64>(13)? as u64, + tool_calls: row.get::<_, i64>(14)? as u64, files_changed: row.get(15)?, - duration_secs: row.get(16)?, + duration_secs: row.get::<_, i64>(16)? as u64, cost_usd: row.get(17)?, }, }) @@ -3813,7 +3815,7 @@ impl StateStore { input_params_json, output_summary, trigger_summary, - duration_ms, + duration_ms as i64, risk_score, timestamp, ], @@ -3842,11 +3844,11 @@ impl StateStore { let page = page.max(1); let offset = (page - 1) * page_size; - let total: u64 = self.conn.query_row( + let total = self.conn.query_row( "SELECT COUNT(*) FROM tool_log WHERE session_id = ?1", rusqlite::params![session_id], - |row| row.get(0), - )?; + |row| row.get::<_, i64>(0), + )? as u64; let mut stmt = self.conn.prepare( "SELECT id, session_id, tool_name, input_summary, input_params_json, output_summary, trigger_summary, duration_ms, risk_score, timestamp @@ -3857,7 +3859,9 @@ impl StateStore { )?; let entries = stmt - .query_map(rusqlite::params![session_id, page_size, offset], |row| { + .query_map( + rusqlite::params![session_id, page_size as i64, offset as i64], + |row| { Ok(ToolLogEntry { id: row.get(0)?, session_id: row.get(1)?, @@ -3868,7 +3872,7 @@ impl StateStore { .unwrap_or_else(|| "{}".to_string()), output_summary: row.get::<_, Option>(5)?.unwrap_or_default(), trigger_summary: row.get::<_, Option>(6)?.unwrap_or_default(), - duration_ms: row.get::<_, Option>(7)?.unwrap_or_default(), + duration_ms: row.get::<_, Option>(7)?.unwrap_or_default() as u64, risk_score: row.get::<_, Option>(8)?.unwrap_or_default(), timestamp: row.get(9)?, }) @@ -3903,7 +3907,7 @@ impl StateStore { .unwrap_or_else(|| "{}".to_string()), output_summary: row.get::<_, Option>(5)?.unwrap_or_default(), trigger_summary: row.get::<_, Option>(6)?.unwrap_or_default(), - duration_ms: row.get::<_, Option>(7)?.unwrap_or_default(), + duration_ms: row.get::<_, Option>(7)?.unwrap_or_default() as u64, risk_score: row.get::<_, Option>(8)?.unwrap_or_default(), timestamp: row.get(9)?, }) @@ -6629,7 +6633,7 @@ mod tests { "{}", "updated file", "context graph", - 0u64, + 0i64, 0.0f64, "2026-04-10T00:01:00Z", "[\"src/backfill.rs\"]",