diff --git a/.gitignore b/.gitignore
index 54466f5..49e5cdb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/target
+.serena/*
diff --git a/.serena/project.yml b/.serena/project.yml
index 3f99291..1c8ae68 100644
--- a/.serena/project.yml
+++ b/.serena/project.yml
@@ -3,18 +3,16 @@ project_name: "code-mcp"
# list of languages for which language servers are started; choose from:
-# al ansible bash clojure cpp
-# cpp_ccls crystal csharp csharp_omnisharp dart
-# elixir elm erlang fortran fsharp
-# go groovy haskell haxe hlsl
-# java json julia kotlin lean4
-# lua luau markdown matlab msl
-# nix ocaml pascal perl php
-# php_phpactor powershell python python_jedi python_ty
-# r rego ruby ruby_solargraph rust
-# scala solidity swift systemverilog terraform
-# toml typescript typescript_vts vue yaml
-# zig
+# al bash clojure cpp csharp
+# csharp_omnisharp dart elixir elm erlang
+# fortran fsharp go groovy haskell
+# haxe java julia kotlin lua
+# markdown
+# matlab nix pascal perl php
+# php_phpactor powershell python python_jedi r
+# rego ruby ruby_solargraph rust scala
+# swift terraform toml typescript typescript_vts
+# vue yaml zig
# (This list may be outdated. For the current list, see values of Language enum here:
# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py
# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
@@ -68,27 +66,61 @@ read_only: false
# list of tool names to exclude.
# This extends the existing exclusions (e.g. from the global configuration)
-# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html
+#
+# Below is the complete list of tools for convenience.
+# To make sure you have the latest list of tools, and to view their descriptions,
+# execute `uv run scripts/print_tool_overview.py`.
+#
+# * `activate_project`: Activates a project based on the project name or path.
+# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
+# * `create_text_file`: Creates/overwrites a file in the project directory.
+# * `delete_memory`: Delete a memory file. Should only happen if a user asks for it explicitly,
+# for example by saying that the information retrieved from a memory file is no longer correct
+# or no longer relevant for the project.
+# * `edit_memory`: Replaces content matching a regular expression in a memory.
+# * `execute_shell_command`: Executes a shell command.
+# * `find_file`: Finds files in the given relative paths
+# * `find_referencing_symbols`: Finds symbols that reference the given symbol using the language server backend
+# * `find_symbol`: Performs a global (or local) search using the language server backend.
+# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
+# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
+# * `initial_instructions`: Provides instructions Serena usage (i.e. the 'Serena Instructions Manual')
+# for clients that do not read the initial instructions when the MCP server is connected.
+# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
+# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
+# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
+# * `list_memories`: List available memories. Any memory can be read using the `read_memory` tool.
+# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
+# * `read_file`: Reads a file within the project directory.
+# * `read_memory`: Read the content of a memory file. This tool should only be used if the information
+# is relevant to the current task. You can infer whether the information
+# is relevant from the memory file name.
+# You should not read the same memory file multiple times in the same conversation.
+# * `rename_memory`: Renames or moves a memory. Moving between project and global scope is supported
+# (e.g., renaming "global/foo" to "bar" moves it from global to project scope).
+# * `rename_symbol`: Renames a symbol throughout the codebase using language server refactoring capabilities.
+# For JB, we use a separate tool.
+# * `replace_content`: Replaces content in a file (optionally using regular expressions).
+# * `replace_symbol_body`: Replaces the full definition of a symbol using the language server backend.
+# * `safe_delete_symbol`:
+# * `search_for_pattern`: Performs a search for a pattern in the project.
+# * `write_memory`: Write some information (utf-8-encoded) about this project that can be useful for future tasks to a memory in md format.
+# The memory name should be meaningful.
excluded_tools: []
# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default).
# This extends the existing inclusions (e.g. from the global configuration).
-# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html
included_optional_tools: []
# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
# This cannot be combined with non-empty excluded_tools or included_optional_tools.
-# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html
fixed_tools: []
-# list of mode names that are to be activated by default, overriding the setting in the global configuration.
-# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes.
-# If the setting is undefined/empty, the default_modes from the global configuration (serena_config.yml) apply.
+# list of mode names that are to be activated by default.
+# The full set of modes to be activated is base_modes + default_modes.
+# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply.
# Otherwise, this overrides the setting from the global configuration (serena_config.yml).
-# Therefore, you can set this to [] if you do not want the default modes defined in the global config to apply
-# for this project.
# This setting can, in turn, be overridden by CLI parameters (--mode).
-# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes
default_modes:
# list of mode names to be activated additionally for this project, e.g. ["query-projects"]
@@ -128,3 +160,11 @@ ignored_memory_patterns: []
# - ../sibling-package
# - ../shared-lib
additional_workspace_folders: []
+
+# list of mode names to that are always to be included in the set of active modes
+# The full set of modes to be activated is base_modes + default_modes.
+# If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply.
+# Otherwise, this setting overrides the global configuration.
+# Set this to [] to disable base modes for this project.
+# Set this to a list of mode names to always include the respective modes for this project.
+base_modes:
diff --git a/src/tools/common.rs b/src/tools/common.rs
index 4bbe52c..8ddbb9d 100644
--- a/src/tools/common.rs
+++ b/src/tools/common.rs
@@ -4,7 +4,6 @@
use super::options::GrepOptions;
use ignore::WalkBuilder;
use std::path::Path;
-use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::mpsc::Receiver;
use std::sync::Mutex;
@@ -42,22 +41,7 @@ pub(crate) fn extension_matches(path: &Path, extensions: &[String]) -> bool {
.is_some_and(|e| extensions.iter().any(|w| w == e))
}
-/// Collect shared error state into the final `ToolResponse` metadata fields.
-pub(crate) fn error_metadata(
- entry_errors: &AtomicUsize,
- search_errors: &AtomicUsize,
- first_entry_err: &Mutex