Commit Graph
3199 Commits
Author SHA1 Message Date
Dominik Jain e6e25d3f86 Report project activation errors to the client in the system prompt
SerenaAgent now tracks an initial/startup project activation error and appends it
to the system prompt, instead of the failure being visible only in the log.
This applies both to a failed activation of an explicitly given project and to a
failed --project-from-cwd auto-detection.

Also fix the --project-from-cwd help text, which falsely promised a fallback to the CWD
Resolves #1773
2026-07-29 17:39:06 +02:00
Dominik Jain a61765ecc8 Fix: Serena PyPI version check triggered by callback on main thread could delay agent startup
Closes #1774
2026-07-29 15:24:22 +02:00
Dominik Jain 21f4b3fe58 Add section on trusted projects 2026-07-29 13:53:03 +02:00
Dominik Jain 466960b12f Remove unmaintainable parts of security documentation 2026-07-29 13:13:06 +02:00
Kyle HutchinsonandClaude Sonnet 5 32308a871c Fix: get_diagnostics_for_file crashed with SolidLSPException for any Ansible file with at least one finding
`ansible-language-server` doesn't implement `textDocument/documentSymbol`
and the request used to map diagnostics onto owning symbols just threw. `AnsibleLanguageServer` now
overrides that request to return `None` directly, so diagnostics fall back to being grouped under
the file-level path #1758

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 01:47:27 +02:00
Dominik Jain 6c1c965370 find_symbol: Change tool description to improve tool search results
in clients that load tools dynamically
2026-07-28 17:50:22 +02:00
Dominik Jain 9a9d07e83d Improve system prompt (OOP principles, etc.) 2026-07-27 13:41:00 +02:00
Bortlesboat 026b007bb8 fix(hooks): accept raw control characters in payloads 2026-07-26 18:47:18 +02:00
xormania 31aef83786 Docs: correct stale references in the language-addition guide
Four items in .serena/memories/adding_new_language_support_guide.md are
wrong against the current source. Two are references that no longer
resolve:

- the subprocess helper lives at solidlsp.util.subprocess_util and is a
  module-level function, not a method on a class; the guide named
  solidlsp.utils.subprocess_utils, which does not exist
- pytest markers are declared under [tool.pytest.ini_options].markers in
  pyproject.toml; there is no pytest.ini in the repository

and two are formatting defects:

- the Documentation section used "### 5" while every other step uses
  "## Step N:", so it nested under Step 4 in rendered output
- a stray double colon in the "Implementation Pointers" label

Promoting Documentation to a top-level step also completes the Overview
list, which stopped at four.

Step 5 gains src/serena/resources/project.template.yml, which the
checklist omitted even though a new language server has to appear in its
commented list. The instruction uses `uv run` because the script imports
solidlsp and fails under an ambient interpreter, and it notes the
trailing spaces the script pads each line with, which the committed list
does not carry.
2026-07-26 15:09:54 +02:00
xormania 7d08146436 Docs: add the language servers missing from the supported-language lists
Several backends that are registered and tested were absent from the
user-facing lists: six from the README (pascal, qml, rego, systemverilog,
terraform, vue), six from the Language Support docs page (matlab,
powershell, rego, systemverilog, terraform, toml), and two from the
commented language-server list in the project template
(python_basedpyright, qml).

The drift is long-standing and runs in both directions: matlab,
powershell and toml reached the README but never the docs page; pascal,
vue and qml reached the docs page but never the README; terraform, rego
and systemverilog reached neither, the oldest of them since 2025-07-06.
The two template omissions are the most recent, from #1705 and #1635.
The guide's Documentation step does ask for the README and the docs page,
so most of this was missed rather than unspecified; it does not mention
the project template at all.

The setup notes on the new docs-page entries name the versions Serena
actually pins, taken from the corresponding language-server modules:
MATLAB extension 1.3.9, PowerShell Editor Services 4.4.0 and
PSScriptAnalyzer 1.25.0, Verible v0.0-4051-g9fdb4057, terraform-ls
0.36.5, and Taplo 0.10.0. The PowerShell entry mentions both automatic
installations, since enabling that backend also runs Save-Module against
the user's configured PowerShell repository.

The new Regal link points at open-policy-agent/regal, the current
canonical repository; StyraInc/regal still redirects there, and the
adapter and the CI workflow have not been changed.

The template block is refreshed from scripts/print_language_list.py,
which is why its column widths change: python_basedpyright is longer than
any identifier the previous list contained. The pointer directly below it
still named the Language enum, renamed to LanguageServerId in d2cf18dd.
2026-07-26 11:40:23 +02:00
Dr. Dominik Jain 66b34dc8eb Merge pull request #1750 from AmirF194/fix/1490-kls-pdeathsig
fix(ls): don't orphan the language server process when Serena is killed
2026-07-26 11:38:33 +02:00
Dominik Jain aeb73c789d Move changelog entries to their proper place, rewording 2026-07-26 11:34:42 +02:00
Amir Fathi 06b47d064a Merge branch 'main' into fix/1490-kls-pdeathsig 2026-07-26 02:24:58 +00:00
Youcef Hanaia 34342a9d00 Chore: Replace subprocess.run with subprocess_run util function (#1754) 2026-07-25 20:56:08 +02:00
Dominik Jain 33b042ad06 Add script for visualising the memory graph of a project 2026-07-24 22:30:05 +02:00
Dominik Jain 68884f1190 Add callout on security advisories 2026-07-24 19:07:43 +02:00
Dominik Jain cbc7f286b3 Refactoring: Fully internalise the pdeathsig machinery into LanguageServerSubprocessLauncher 2026-07-24 18:19:03 +02:00
Amir Fathi ce685c8979 fix(ls): reify the pdeathsig launch ritual into LanguageServerSubprocessLauncher
The previous fix for #1490 depended on four fragments being combined
correctly by hand at the _start() call site: convert_shell_cmd's exec
prefix, the preexec_fn registration, routing through
popen_preserving_pdeathsig, and the Linux/own-session condition.
Nothing enforced their co-occurrence.

Reify "launch a subprocess whose lifecycle is tied to the parent
process (on Linux)" as LanguageServerSubprocessLauncher, a lazily
constructed singleton with a single public method:

    launch(process_launch_info: ProcessLaunchInfo, start_new_session: bool) -> Popen[bytes]

Internalizes the libc/prctl preexec_fn, the exec prefixing, the
platform/own-session gate, and the dedicated long-lived spawner
thread (created lazily, only for own-session launches on Linux). The
singleton is required because the spawner thread it owns must be the
one thread in the process performing pdeathsig-registering fork()
calls; launch() takes start_new_session per call so the instance
itself carries no configuration state.

convert_shell_cmd loses the use_exec flag it gained for this fix: its
other callers (solidlsp.language_servers.common, serena.agent) never
used it, and it is invalid on Windows. The exec prefix now lives
entirely inside the launcher, applied to convert_shell_cmd's plain
output, so it can never be requested without the machinery it depends
on.

StdioLanguageServer._start() now calls
LanguageServerSubprocessLauncher.instance().launch(...) instead of
assembling the four fragments itself.

Adapted test/solidlsp/test_pdeathsig.py: the two existing end-to-end
regression tests (short-lived calling thread, SIGKILLed driver) are
unchanged in behavior since they exercise _start()/start() end-to-end
and now transparently go through the new launcher. Added three
targeted tests: convert_shell_cmd's reverted signature, the
launcher's singleton identity, and that its spawner thread is not
created for a non-own-session launch.
2026-07-24 14:05:26 +00:00
Dominik Jain 140ffaf3ff Fix: Tool calls exceeding the timeout blocked the task executor indefinitely;
tasks are now cancelled on timeout and the executor recovers

Previously, Tool.apply_ex issued its task without a timeout, so a hung tool
would block the TaskExecutor's dispatcher thread forever: the caller received
a TimeoutError after tool_timeout, but no further tasks were ever processed.

Changes:
- Tool.apply_ex now passes the configured tool timeout to issue_task, bounding
  the dispatcher's wait as well as the caller's.
- TaskExecutor.Task.result gained cancel_on_timeout (default True): on timeout,
  the task is cancelled, preventing execution of tasks still waiting in the
  queue and discarding the result of tasks already running.
- Task.wait_until_done no longer takes a timeout parameter; it uses the task's
  own timeout and returns whether the task completed. The dispatcher logs a
  warning and continues with the next task if the timeout was reached.
- TaskExecutor.execute_task now propagates its timeout to result() instead of
  waiting indefinitely, thus also benefiting from cancel-on-timeout.
- Corrected the docstring of Task.result to match the actual semantics.
2026-07-24 13:23:06 +02:00
Amir Fathi 81d19bdd27 fix(ls): keep the PDEATHSIG registration alive across the calling thread's own exit
Tool calls and language server startup dispatch Popen() onto a short-lived
thread (e.g. LanguageServerManager's per-server StartLSThread), which
terminates moments after Popen() returns. PR_SET_PDEATHSIG ties its
registration to that specific calling thread, not the process, so the
language server received SIGTERM and died within milliseconds of a normal
startup on Linux CI, independent of any real SIGKILL scenario.

Route Popen() calls that set preexec_fn=set_pdeathsig_on_parent_exit through
one dedicated, permanently-running daemon thread instead, so the registration
stays tied to a thread that only ever dies alongside the whole process. Added
a regression test that starts a language server on a short-lived thread and
checks it survives past that thread's exit.
2026-07-24 01:00:41 +00:00
Tyce Herrman d86fd6c0c8 Support nixd ls_path and config_path 2026-07-24 02:22:23 +02:00
Amir Fathi 61ca9ba5de TypeScript: make the tsserver progress-start grace configurable, raise the default
find_referencing_symbols/request_references could return incomplete results on
large TypeScript projects. _wait_for_indexing_start_or_completion waits only
_INDEXING_START_GRACE_S (hardcoded 2.0s) for tsserver to *start* emitting
$/progress after opening files; if nothing has appeared by then, it assumes no
indexing is needed and proceeds immediately. On a large project, tsserver can
take longer than that just to resolve the project graph before it even creates
the first progress token, so the first cross-file reference query can race a
project that is still loading.

Every caller of _wait_for_indexing_start_or_completion (the base TypeScript
path and the Svelte companion) always calls expect_indexing() first, so the
"no progress observed" branch is reached specifically when indexing is already
expected; it cannot distinguish "nothing to do" from "not started yet",
because the two look identical from the client for as long as tsserver stays
quiet. That ambiguity cannot be resolved from client-observable signals alone,
so this makes the grace an ls_specific_settings knob (`indexing_start_grace`),
the same way indexing_timeout and server_ready_timeout already are, and raises
the default from 2.0s to 5.0s.

Fixes #1586
2026-07-24 00:27:36 +02:00
Amir Fathi 3ac66bb8c1 fix(ls): don't orphan the language server process when Serena is killed
On Linux, a SIGKILLed Serena (or an OOM kill, or a crash) leaves its language server process
running: it is launched in its own session so our graceful-shutdown code can clean up the whole
tree, but that code never runs if Serena itself dies uncleanly, and no signal from our process
group reaches a detached session either.

Fix via prctl(PR_SET_PDEATHSIG) at spawn time. Since the process runs under shell=True, the
registration alone only protects the intermediate shell; prefixing the command with `exec` makes
the shell replace itself with the language server so the same PID (and PDEATHSIG registration)
carries through.

Fixes #1490
2026-07-23 22:12:44 +00:00
Dr. Dominik Jain 05468d9685 Merge pull request #1734 from arimu1/fix/1732-glob-match-single-asterisk
fix(util): ensure bare * and ? in non-** glob patterns do not match /
2026-07-23 23:32:54 +02:00
Dominik Jain 5b5f8332ce Add subprocess_run util function (to replace direct calls of subprocess.run) 2026-07-23 23:13:09 +02:00
Dominik Jain ad2598e9f3 Move helper functions into GlobMatcher 2026-07-23 22:48:27 +02:00
Dominik Jain 954d8554fd Make GlobMatcher with cached regex patterns the only glob matching mechanism 2026-07-23 22:48:27 +02:00
Dominik Jain 7033e90306 Unify glob matching to always use regex translation 2026-07-23 15:28:48 +02:00
Dominik Jain 33125287dc Remove obsolete glob pattern support in search_text, removing duplicate glob translation 2026-07-23 14:33:06 +02:00
Dominik Jain 5e8662b283 JetBrainsFindSymbolTool: Disallow wildcard-only search, delegating to overview tool if file
Resolves oraios/serena-jetbrains-plugin-public#8
2026-07-23 13:50:38 +02:00
arimu1 52cf8552a0 test(util): update exclude glob to data/*.log for slash-aware matching
Bare `*.log` no longer crosses `/` after #1732, so the exclude glob in
the search_files parametrization is anchored to data/ to keep excluding
data/b.log. Matches the repo convention that `**` is required to cross
directory boundaries (see test_search_files_glob_patterns).
2026-07-23 12:22:05 +07:00
arimu1 70d32f2453 fix(util): ensure bare * and ? in non-** glob patterns do not match / (#1732) 2026-07-23 12:22:05 +07:00
Tyce Herrman ac256f3630 Fix project CLI language server aliases 2026-07-23 01:35:39 +02:00
Dr. Dominik Jain 5e745aabf5 Merge pull request #1739 from oraios/refactor-language-enum
Refactoring: Language vs language server semantics
2026-07-22 21:44:27 +02:00
Dominik Jain 4f8f9b3fc8 Refactoring: Rename ProjectConfig.languages to language_servers 2026-07-22 21:41:00 +02:00
Dominik Jain d2cf18ddcb Refactoring: Rename Language to LanguageServerId
This resolves a long-standing naming issue in Serena & SolidLSP.
2026-07-22 20:55:36 +02:00
Dr. Dominik Jain ef0e218fb1 Allow language server priorities to be configured in serena_config.yml (#1736) 2026-07-22 17:26:56 +02:00
xormania 9debf7742a Add Grok Build support (context, setup, native hooks)
Adds first-class support for xAI's Grok Build CLI, following the
existing client-integration pattern (Claude Code, CodeBuddy, Codex):

- grok context: single-project, shaped like claude-code.yml, with the
  file-tool exclusions appropriate for a CLI agent that has its own
  read/edit/shell tools. structured_tool_output is left at the auto
  default (as in the codex and codebuddy contexts); claude-code's
  explicit false is a Claude-Code-specific bug workaround that is not
  carried over.
- serena setup grok: registers Serena as a user-scoped MCP server via
  "grok mcp add" after detecting a compatible grok CLI.
- serena-hooks --client=grok: Grok-native PreToolUse output
  ({decision, reason}) instead of the Claude-style hookSpecificOutput
  envelope; grep/read detection extended to Grok's tool names and
  shell payloads (target_file/targetFile path keys, non-string command
  values handled defensively). The payload-parsing refinements live in
  the remind hook's client-agnostic parsing and apply to all hook
  clients: a non-string command value previously raised, and
  target_file/targetFile paths were not recognized.
- Docs (030_clients.md #grok), unit tests for setup/hooks/context, and
  scripts/live_test_grok.py - a zero-inference, state-preserving live
  smoke test against a real grok installation (documented in
  CONTRIBUTING.md). Its M5 check verifies the structured-output wire
  shape: the grok context (auto default) serves an output schema and
  structuredContent for string-returning tools, while the claude-code
  context (explicit false workaround) serves plain text only.
2026-07-21 21:18:16 +02:00
Tyce Herrman 96ee9b65e2 Add BasedPyright as alternative LSP for Python (#1705) 2026-07-21 20:11:32 +02:00
Dominik Jain 2c10e25c97 Set version to v1.6.2.dev0 2026-07-21 17:34:25 +02:00
Dominik Jain bcac0969fb Release v1.6.1 2026-07-21 17:34:25 +02:00
Dominik Jain 4c82b2bf19 Dashboard: indicate when a newer Serena version is available 2026-07-21 14:51:32 +02:00
Dr. Dominik Jain 4903da5ac0 Merge pull request #1524 from BinarySo1o/fix/ts-coverage-dirname-ignore
TypeScript: stop hard-ignoring source directories named `coverage`
2026-07-21 13:30:50 +02:00
Dr. Dominik Jain 0c96c39a90 Merge branch 'main' into fix/ts-coverage-dirname-ignore 2026-07-21 13:29:54 +02:00
Dr. Dominik Jain 9b710a7193 Merge pull request #1731 from oraios/fup-ls-file-system-sync
F'up: LS file system sync
2026-07-21 13:27:42 +02:00
Dominik Jain 4cf2bf04e4 Document tool file sync requirements, adding missing sync call in RenameSymbolTool 2026-07-21 13:10:21 +02:00
Dominik Jain 574110fc28 Initialise file change notifier (establishing baseline) upon construction 2026-07-21 13:10:21 +02:00
Dominik Jain ba7cdffc02 FindReferencingSymbolsTool: Limit file system sync to the necessary case
(i.e. no full symbol search), adding tests that specifically test the tool path
2026-07-21 13:10:21 +02:00
Dr. Dominik Jain 690904098e Merge pull request #1728 from arimu1/fix/1724-content-modified-retry
Retry LSP ContentModified (-32801) errors instead of failing hard
2026-07-21 12:54:16 +02:00
Dominik Jain a9c72f93e4 Fix: Order of ignore patterns passed to language servers was not respected
Resolves #1729
2026-07-21 12:52:53 +02:00