1. ls_process.py: swapped values in error message — was reporting
"read {expected} of {actual}" instead of "read {actual} of {expected}"
2. common.py: check=True made the returncode != 0 branch unreachable
(CalledProcessError raised before it). Removed check=True so the
warning logs execute before raising the exception explicitly.
3. ls_utils.py: dotnet version error message listed "4, 6, 7, 8" but
the code also checks for version 9. Added 9 to the message.
Add four new ls_specific_settings for Java: jdtls_xmx, jdtls_xms,
intellicode_xmx, and intellicode_xms, allowing users to tune heap
sizes for the JDTLS server process and the IntelliCode embedded JVM
independently via serena_config.yml.
* Clearly differentiate between raw and high-level symbol types
* Remove the catch-all type GenericDocumentSymbol
* Introduce RawDocumentSymbol alias for the raw LS types
* Introduce method _normalize_symbol_name to support name transformation
* Apply in CSharpLanguageServer, fixing old override of request_document_symbols
not accounting for overload handling (invalidating high-level cache accordingly)
* Apply in ALLanguageServer
Problem
Saving cache every 10 files causes extremely slow indexing on large projects because save_all_caches() is an expensive operation. On a large project it gets triggered thousands of times during indexing, making the whole process take hours instead of minutes.
Fix
Switch from a file-count-based trigger (every 10 files) to a time-based trigger (every 30 seconds). This keeps cache saves infrequent enough to not hurt performance, while still preserving progress regularly in case indexing is interrupted.
* Improved symbol retrieval tool responses
1. FindSymbol (LS and JB) now has max_matches. Both tools now perform grouping like other symbol retrieval tools
2. When a result exceeds max_answer_chars, the caller may pass a shortened message. This is used in references and overview tools
* Progressive shortening for tool results that exceed max_answer_chars
Change _limit_length to accept an optional list of closures instead of
a single shortened_result string. Each closure produces a progressively
shorter version of the result, tried in order until one fits. The last
closure is assumed to always fit and is used unconditionally.
* Extended grouper
More flexible grouping logic was needed to achieve the above results. Grouper also no longer
mutates the input (using deepcopy)
---------
Co-authored-by: Dominik Jain <dominik.jain@oraios-ai.de>
* Use deterministic workspace dir for EclipseJDTLS to enable cache reuse
Replace uuid.uuid4().hex with a hash of the project path for the JDTLS
workspace directory. This allows the workspace cache (project index,
shared index, configuration) to be reused across server restarts instead
of rebuilding from scratch each time.
The random UUID was inherited from microsoft/multilspy (a research/testing
library where ephemeral workspaces made sense), but for Serena's use case
— long-lived projects with repeated restarts — deterministic workspace
paths significantly reduce startup time, especially for large Java projects.
* Fix import sort order for ruff lint
Black dependency created a dependabot warning and couldn't be bumped since it collided with pathspec dependencies. Since ruff can also format, black is not needed. But we now have these small format changes, mostly in test files