diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 585af8e83..c67d811d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,8 +20,10 @@ jobs: - name: Install protoc run: sudo apt-get update && sudo apt-get install -y protobuf-compiler + # Toolchain pinned to match rust-toolchain.toml — bump both together. - uses: dtolnay/rust-toolchain@stable with: + toolchain: 1.97.1 components: clippy - uses: Swatinem/rust-cache@v2 @@ -40,6 +42,7 @@ jobs: - uses: dtolnay/rust-toolchain@stable with: + toolchain: 1.97.1 components: rustfmt - name: cargo fmt @@ -55,6 +58,8 @@ jobs: run: sudo apt-get update && sudo apt-get install -y protobuf-compiler - uses: dtolnay/rust-toolchain@stable + with: + toolchain: 1.97.1 - uses: Swatinem/rust-cache@v2 diff --git a/Cargo.lock b/Cargo.lock index 66afb6e99..ef4e572ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2916,9 +2916,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" [[package]] name = "euclid" diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 000000000..7e0489b1e --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,5 @@ +# Pinned so local builds and CI compile with the same rustc/clippy. +# CI reads this version via .github/workflows/ci.yml — bump both together. +[toolchain] +channel = "1.97.1" +components = ["clippy", "rustfmt"] diff --git a/src/api/activity.rs b/src/api/activity.rs index 1ae48bb46..17d73662f 100644 --- a/src/api/activity.rs +++ b/src/api/activity.rs @@ -256,7 +256,7 @@ pub(super) async fn get_activity( let mut days: HashMap = HashMap::new(); - for (_agent_id, pool) in pools.iter() { + for pool in pools.values() { query_count( pool, "conversation_messages", diff --git a/src/api/channels.rs b/src/api/channels.rs index 8d0645d8f..0e1838abe 100644 --- a/src/api/channels.rs +++ b/src/api/channels.rs @@ -197,7 +197,7 @@ pub(super) async fn channel_messages( let limit = query.limit.min(100); let fetch_limit = limit + 1; - for (_agent_id, pool) in pools.iter() { + for pool in pools.values() { let logger = ProcessRunLogger::new(pool.clone()); match logger .load_channel_timeline(&query.channel_id, fetch_limit, query.before.as_deref()) @@ -424,7 +424,7 @@ pub(super) async fn cancel_process( // Fallback for detached workers (for example after restart): no live // channel state exists, but the DB row is still marked running. let pools = state.agent_pools.load(); - for (_agent_id, pool) in pools.iter() { + for pool in pools.values() { let logger = ProcessRunLogger::new(pool.clone()); match logger.cancel_running_detached_worker(worker_id).await { Ok(true) => { diff --git a/src/api/workers.rs b/src/api/workers.rs index 9ca0dc0ff..991628994 100644 --- a/src/api/workers.rs +++ b/src/api/workers.rs @@ -150,7 +150,7 @@ pub(super) async fn list_workers( let live_statuses = { let blocks = state.channel_status_blocks.read().await; let mut map = std::collections::HashMap::new(); - for (_channel_id, status_block) in blocks.iter() { + for status_block in blocks.values() { let block = status_block.read().await; for worker in &block.active_workers { map.insert( diff --git a/src/llm/model.rs b/src/llm/model.rs index deba032ce..de7ffbb4e 100644 --- a/src/llm/model.rs +++ b/src/llm/model.rs @@ -2318,12 +2318,9 @@ fn completion_choice_to_streaming_choices( } fn extract_sse_block(buffer: &mut String) -> Option { - let (block_end, separator_len) = if let Some(index) = buffer.find("\n\n") { - (index, 2) - } else if let Some(index) = buffer.find("\r\n\r\n") { - (index, 4) - } else { - return None; + let (block_end, separator_len) = match buffer.find("\n\n") { + Some(index) => (index, 2), + None => (buffer.find("\r\n\r\n")?, 4), }; let block = buffer[..block_end].to_string(); diff --git a/src/tasks/store.rs b/src/tasks/store.rs index 6378da948..b1e2c5c41 100644 --- a/src/tasks/store.rs +++ b/src/tasks/store.rs @@ -766,7 +766,7 @@ fn task_from_row(row: sqlx::sqlite::SqliteRow) -> Result { .try_get::, _>("worker_id") .ok() .flatten() - .and_then(|value| if value.is_empty() { None } else { Some(value) }), + .filter(|value| !value.is_empty()), created_by: row .try_get("created_by") .context("failed to read task created_by")?, diff --git a/src/tools/spawn_worker.rs b/src/tools/spawn_worker.rs index d54299867..37d5304f9 100644 --- a/src/tools/spawn_worker.rs +++ b/src/tools/spawn_worker.rs @@ -516,7 +516,7 @@ impl Tool for DetachedSpawnWorkerTool { .working_memory .emit( crate::memory::WorkingMemoryEventType::WorkerSpawned, - format!("Worker spawned (cortex): {}", &args.task), + format!("Worker spawned (cortex): {}", args.task), ) .importance(0.5) .record();