feat: add configurable project_serena_folder_location setting
Add a new `project_serena_folder_location` setting to `serena_config.yml` that allows configuring where the per-project `.serena` data folder (memories, caches) is stored, with `$projectDir` and `$projectFolderName` placeholder support (default: `$projectDir/.serena`, preserving current behavior).
Resolves#1123
Co-authored-by: Dominik Jain <dominik.jain@oraios-ai.de>
When multiple MCP servers start within the same second, they derive the
same log filename from datetime_tag() (second-level precision only).
Both then open the file with mode='w', causing one server's logs to be
truncated and all subsequent output to be interleaved.
Appending os.getpid() to the filename guarantees uniqueness across
concurrent processes regardless of timing.
* Apply in FSharpLanguageServer and CSharpLanguageServer
* CSharpLanguageServer: Disabled auto-install of .NET (does not work reliably)
and remove corresponding test
* Remove TestFSharpLanguageServerSetup
Marksman returns all headings (h1-h6) with SymbolKind.String (15), which
causes them to be treated as low-level symbols and filtered out of
get_symbols_overview results.
Override request_document_symbols in Marksman to remap SymbolKind.String
to SymbolKind.Namespace, which is semantically appropriate for headings
(named sections containing other content) and ensures they appear in
symbol overviews.
The server allows arbitrary tools to be called remotely,
spawning language servers dynamically for each requested project.
This implements #1086 for LSP users.
These tools allow to query information from other projects (without activation)
by allowing tools to be executed in the respective project context.
LSP tools are not supported, as this would require language servers to be
spawned and managed, but when using the JetBrains backend, symbolic
access is fully supported for all projects, for which an IDE is open.
This thus implements #1086 for users of the JetBrains language backend.
The tools are optional. Mode 'query-projects' enables them.
Modes could not activate optional tools, because optional tools were not in the base toolset.
Base toolset computation was fully refactored, now considering all initial modes in the sense
that their inclusions are definitely part of the base toolset.
Dynamic mode changes after agent creation are still subject to the constraint that they
can essentially only disable tools; while they can technically also enable tools,
enabling is not effective unless the tools were also in the exposed toolset (as clients
otherwise cannot "see" them).
Fixes#1105