Add Wolfram Language support via official LSPServer paclet - #1108
Conversation
2297821 to
1228465
Compare
fee8b1c to
d165272
Compare
420a0ba to
016ccbe
Compare
ee32c5e to
ebe7646
Compare
|
@p135246 this is still a draft. Will you finalise this or shall we close it? |
|
Hey @opcode81, I will give it a last vibecoding push now and let's see :-) |
a3e78c9 to
392a303
Compare
There was a problem hiding this comment.
Pull request overview
Adds first-class Wolfram Language (.wl, .wls) support to Serena/SolidLSP by integrating the official WolframResearch LSPServer paclet (via WolframKernel over stdio), plus corresponding tests, docs, and changelog updates.
Changes:
- Introduce
WolframLanguageServerimplementation with kernel discovery (PATH /WOLFRAM_PATH/ common install locations) and stdio launch command. - Register
LanguageServerId.WOLFRAMwith filename matching for.wl/.wlsand LS class factory wiring. - Add Wolfram integration test repo + pytest suite and surface Wolfram support in docs/README/CHANGELOG.
Reviewed changes
Copilot reviewed 10 out of 11 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
src/solidlsp/language_servers/wolfram_language_server.py |
New Wolfram Language server integration and kernel discovery/launch logic. |
src/solidlsp/ls_config.py |
Adds LanguageServerId.WOLFRAM, file matcher for .wl/.wls, and LS class mapping. |
test/conftest.py |
Adds Wolfram gating logic to disable tests when WolframKernel is unavailable. |
test/solidlsp/wolfram/test_wolfram_basic.py |
Adds basic Wolfram symbols + within-file and cross-file references tests. |
test/solidlsp/wolfram/__init__.py |
Initializes Wolfram test package. |
test/resources/repos/wolfram/test_repo/main.wl |
Wolfram fixture repo main file for symbols/references tests. |
test/resources/repos/wolfram/test_repo/lib/helper.wl |
Wolfram fixture helper file for cross-file references tests. |
pyproject.toml |
Adds wolfram pytest marker. |
README.md |
Adds Wolfram Language to supported language list. |
docs/01-about/020_programming-languages.md |
Documents Wolfram Language support and prerequisites. |
CHANGELOG.md |
Notes Wolfram Language support and requirements. |
392a303 to
637bcd1
Compare
637bcd1 to
1770ac3
Compare
|
Addressed the Copilot review in the latest push:
🤖 Generated with Claude Code |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 11 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
test/conftest.py:485
- The Wolfram test enablement check only looks at PATH + macOS .app locations, so tests will be incorrectly skipped on Linux/Windows when WolframKernel is installed in a common location but not on PATH. This diverges from the actual server discovery logic and can hide regressions on those platforms.
# Disable Wolfram tests if WolframKernel is not available (checked with the same
# discovery logic used by the language server itself)
from solidlsp.language_servers.wolfram_language_server import _find_wolfram_kernel
try:
|
Addressed the second review round:
🤖 Generated with Claude Code |
1770ac3 to
667fd0a
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 11 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
CHANGELOG.md:20
- CHANGELOG claims Wolfram Language support includes “semantic highlighting”, but the WolframLanguageServer client capabilities added in this PR don’t advertise any semanticTokens support (see
WolframLanguageServer._create_base_initialize_params), so this feature claim appears unsupported/inaccurate.
within-file references, hover documentation, and formatting.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 10 out of 11 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
test/solidlsp/wolfram/test_wolfram_basic.py:50
SolidLanguageServer.request_references()sendstextDocument/referenceswithincludeDeclaration: False(seesolidlsp/ls.py), so the definition site is not guaranteed to be returned. This test currently requires the definition line (2) to be present, which will fail on servers that follow the spec strictly.
assert ("main.wl", 2) in reference_lines, f"Expected the definition site among references, got {reference_lines}"
assert ("main.wl", 10) in reference_lines, f"Expected the call site among references, got {reference_lines}"
667fd0a to
062d8a2
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 11 out of 12 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
test/solidlsp/wolfram/test_wolfram_basic.py:50
SolidLanguageServer.request_references()sendsincludeDeclaration=False(see src/solidlsp/ls.py:1622-1628), so the declaration/definition location should not be asserted as part of the references list here. This test will be brittle (and likely fail) if the server respectsincludeDeclaration.
Adjust the assertion to only require the non-declaration call site reference.
# 'calculateSum' is defined on line 2 of main.wl and called on line 10 (0-based)
references = language_server.request_references("main.wl", line=2, column=0)
reference_lines = {(ref["relativePath"], ref["range"]["start"]["line"]) for ref in references}
assert ("main.wl", 2) in reference_lines, f"Expected the definition site among references, got {reference_lines}"
assert ("main.wl", 10) in reference_lines, f"Expected the call site among references, got {reference_lines}"
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 11 out of 12 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (3)
test/solidlsp/wolfram/test_wolfram_basic.py:50
- This test assumes the reference results include the declaration/definition site, but
SolidLanguageServer.request_references()sendsincludeDeclaration=False(see src/solidlsp/ls.py), so depending on server behavior this assertion can be wrong/flaky. Prefer asserting only non-declaration usages (e.g. query from the call site and assert the call site is returned).
references = language_server.request_references("main.wl", line=2, column=0)
reference_lines = {(ref["relativePath"], ref["range"]["start"]["line"]) for ref in references}
assert ("main.wl", 2) in reference_lines, f"Expected the definition site among references, got {reference_lines}"
assert ("main.wl", 10) in reference_lines, f"Expected the call site among references, got {reference_lines}"
src/solidlsp/ls_config.py:191
- The WOLFRAM enum docstring says to configure
ls_pathinls_specific_settings, but elsewhere (and in the error message) the key isls_specific_settings.wolfram. Aligning this avoids confusing users configuring Wolfram.
Set WOLFRAM_PATH environment variable or configure ls_path in ls_specific_settings.
test/conftest.py:484
- This check uses
_find_wolfram_kernel()which currently considersWOLFRAM_PATH, PATH, and common install locations, but notls_specific_settings.wolfram.ls_path. The comment claiming it uses “the same discovery logic used by the language server itself” is therefore slightly inaccurate; clarify the comment to match what’s actually checked.
# Disable Wolfram tests if WolframKernel is not available (checked with the same
# discovery logic used by the language server itself)
from solidlsp.language_servers.wolfram_language_server import _find_wolfram_kernel
|
Shall we merge or close @opcode81? The Wolfram LSP is not that strong yet (no crossfile references), but I've been using it anyway... |
AmirF194
left a comment
There was a problem hiding this comment.
is_ignored_dirname (src/solidlsp/language_servers/wolfram_language_server.py:53-59) matches Documentation and FrontEnd against any path component, not just the Wolfram installation layout. Verified on this PR's HEAD (41894ec):
obj = object.__new__(WolframLanguageServer)
obj.is_ignored_dirname("Documentation") # True
obj.is_ignored_dirname("FrontEnd") # Trueshould_ignore_path in ls.py checks every directory component of a file's path against this, so a .wl file under a user's own Documentation/ or FrontEnd/ folder (both plausible project directory names, unlike the Mathematica-specific .Wolfram/SystemFiles) would be silently skipped from indexing, with no error.
Every other is_ignored_dirname override in this codebase (csharp: bin/obj/packages, elm: elm-stuff, haskell: dist-newstyle, etc.) sticks to build-tool or vendor-specific names that are unlikely to collide with a user's own source tree. Would it work to scope this to the actual bundled-app locations instead (for example checking that the matched dir sits under the resolved kernel's installation path), or drop Documentation/FrontEnd if they were only meant as a defensive guess?
|
Thanks for the input @AmirF194 . Yes, these are very generic directory names - do they have some fixed meaning in wolfram projects? If they usually do carry mathematica files, why would you want to exclude them from indexing? And if they don't carry mathematica files, there's no need to exclude them @p135246 we can merge this after the ignored dir names issue is resolved, some wolfram support is better than no wolfram support at all. |
Adds support for Wolfram Language (.wl, .wls files) using the official WolframResearch LSPServer paclet, which communicates via stdio. Requires Wolfram Mathematica 13.0+ or Wolfram Engine 12.1+. The WolframKernel is located via WOLFRAM_PATH, the system PATH, common install locations, or ls_path in ls_specific_settings. Includes language server implementation, test repo, test suite (skipped gracefully when WolframKernel is unavailable), and documentation updates. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
41894ec to
1704cdb
Compare
These names are too generic and can match real user directories.
.Wolfram and SystemFiles never appear inside a project repo in practice; Documentation/FrontEnd were too generic. Falls back to Serena's shared default ignore list.
|
Thanks for your contribution |
* Allow project prompt to use templating * Use sandboxed environment for jinja2 template rendering This prevents attackers from exploiting jinja's code execution mechanisms via custom prompts (e.g. mode inclusion from local file) * feat: add Deno language server support Add a Deno language server backed by the Deno CLI's built-in `deno lsp`, serving TypeScript/JavaScript in Deno projects. Unlike the plain typescript-language-server it understands Deno module resolution (npm:/jsr:/https: imports) and the `Deno.*` global namespace. It is experimental and must be selected explicitly via `language_servers: [deno]`; it overlaps the TypeScript server on file extensions, so it is not auto-detected. Requires the `deno` CLI on PATH. Tests run in CI: the `deno` marker joins the other-langs batch, which now installs Deno via denoland/setup-deno. Off-CI and wherever the CLI is absent they skip through the central conftest guard, following the existing pattern for toolchain-gated language servers. Hover is covered explicitly, including hover on a `Deno.*` global, which is the capability this server adds over the TypeScript one. * Add more concrete instructions on test strategy in system prompt * Clean up memories and move system prompt info to critical_info memory * Merge pull request oraios#1820 from yhheolab-oss/fix/project-server-active-project-race fix(project_server): serialize access to the process-wide active project * fix(java): remove unused IntelliCode integration * feat(kotlin): update language server to 262.9593.0 (oraios#1811) * feat(kotlin): update language server to 262.9593.0 Note: download URL structure differs depending on version --------- Co-authored-by: Dominik Jain <dominik.jain@oraios-ai.de> * Scala: answer Metals' build-import prompt (oraios#1769) * scala: answer Metals' build-import prompt Metals asks, via window/showMessageRequest, whether to import a workspace it has not seen before. Serena registered no handler, so the request came back `method 'window/showMessageRequest' not handled on client` and Metals logged "Unexpected error initializing server" and gave up. No build server, no build target, and every cross-file query answered by the fallback presentation compiler — which cannot see past the file it is given. A client cannot decline the question instead: Metals' `disableShowMessageRequest` is server-side configuration, and its no-op fallback answers "Not now", which imports nothing either. Answering is the only route to a build. So answer the three prompts that lead to a build server, and dismiss anything else with `null` — a prompt we do not recognise is one whose consequences we cannot judge, and two of Metals' others offer to kill a process and to open a window. "Don't show again" is never chosen; Metals persists that in the project's own state. Since answering yes lets Metals run the project's build tool, `ls_specific_settings.scala.auto_import_build: false` declines instead. * scala: name the build-tool choice as a gap, and test the setting `Messages.ChooseBuildTool` ("Multiple build definitions found. Which would you like to use?") offers the build tools' own executable names, and precedes the import prompt wherever a workspace holds more than one kind of build. It is dismissed like anything else unrecognised, so such a workspace is still not imported — a deliberate choice, since picking one is a guess of a different order, but one the comment and the setup guide should admit to rather than claim every prompt on the path is answered. Also: cover the route from `ls_specific_settings` to `auto_import_build`, which nothing exercised, and correct the `ImportBuildChanges` message in the fixtures, which had the notification variant's trailing full stop rather than the request's own text. * ci: exclude JDTLS workspaces from cache * Enclose sub-prompts in tags * Allow project initial prompt & newly activated dynamic mode prompts to use templating/variables Add helper method _format_prompt_tag * Improve project activation message * ProjectServer: Use general headless mode config overrides * Support embed_memory function in prompt templates Apply it in Serena's own project prompt * Minor refactoring: Rename _format_prompt to _render_prompt, adding docstring * Add documentation on prompt templating in Serena * ci: attach provenance and SBOM attestations to the published image (oraios#1775) * Bump pillow from 12.2.0 to 12.3.0 in the uv group across 1 directory Bumps the uv group with 1 update in the / directory: [pillow](https://github.com/python-pillow/Pillow). Updates `pillow` from 12.2.0 to 12.3.0 - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](python-pillow/Pillow@12.2.0...12.3.0) --- updated-dependencies: - dependency-name: pillow dependency-version: 12.3.0 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] <support@github.com> * Add Nextflow language server support (oraios#1815) The Nextflow language server schedules a debounced (1s) AST update on every didOpen/didChange, and LanguageService.references is the only request that does not await it -- documentSymbol, codeLens, documentLink and semanticTokensFull all do. A references request issued inside that window races the recompile of the file it asks about and can return an empty list, which is what the macOS CI runner hit. Send a documentSymbol request for the same file first, which blocks server-side until the pending update has been applied. Also compare reference paths using the platform separator in the tests, since relativePath is OS-native and the hardcoded forward slashes failed on Windows. * Test speed optimization, svelte: remove unused dependencies (oraios#1707) * Scala: give Metals the build roots rather than the repository root (oraios#1767) Metals serves one build per workspace folder, and Serena sends only the repository root. Where the builds live below the root, Metals falls back to its own search (BuildTools.searchForBuildTool), which looks one level down and takes the *first* match — so in a monorepo every build but that one is served with no build target, and cross-file references silently come back empty. Detect the build roots instead and send them all, one Metals service each. `ls_specific_settings.scala.project_roots` names them explicitly where the detection guesses wrong, `project_root_scan_depth` bounds the search. The configured `ls_workspace_folders` are not usable for this: they are about what SolidLSP indexes and are shared by every language server of a project, so in a polyglot monorepo no single value suits both Metals and, say, tsserver. Where the repository root is itself a build root, nothing changes. * feat: add Gleam language support via the Gleam compiler's bundled `gleam lsp` (oraios#1765) * chore(deps): bump the uv group across 1 directory with 5 updates Bumps the uv group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [cryptography](https://github.com/pyca/cryptography) | `48.0.1` | `50.0.0` | | [pyasn1](https://github.com/pyasn1/pyasn1) | `0.6.3` | `0.6.4` | | [gitpython](https://github.com/gitpython-developers/GitPython) | `3.1.46` | `3.1.58` | | [h2](https://github.com/python-hyper/h2) | `4.3.0` | `4.4.1` | | [setuptools](https://github.com/pypa/setuptools) | `82.0.1` | `83.0.0` | Updates `cryptography` from 48.0.1 to 50.0.0 - [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst) - [Commits](pyca/cryptography@48.0.1...50.0.0) Updates `pyasn1` from 0.6.3 to 0.6.4 - [Release notes](https://github.com/pyasn1/pyasn1/releases) - [Changelog](https://github.com/pyasn1/pyasn1/blob/main/CHANGES.rst) - [Commits](pyasn1/pyasn1@v0.6.3...v0.6.4) Updates `gitpython` from 3.1.46 to 3.1.58 - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](gitpython-developers/GitPython@3.1.46...3.1.58) Updates `h2` from 4.3.0 to 4.4.1 - [Changelog](https://github.com/python-hyper/h2/blob/master/CHANGELOG.rst) - [Commits](python-hyper/h2@v4.3.0...v4.4.1) Updates `setuptools` from 82.0.1 to 83.0.0 - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](pypa/setuptools@v82.0.1...v83.0.0) --- updated-dependencies: - dependency-name: cryptography dependency-version: 50.0.0 dependency-type: direct:production dependency-group: uv - dependency-name: pyasn1 dependency-version: 0.6.4 dependency-type: direct:production dependency-group: uv - dependency-name: gitpython dependency-version: 3.1.58 dependency-type: indirect dependency-group: uv - dependency-name: h2 dependency-version: 4.4.1 dependency-type: indirect dependency-group: uv - dependency-name: setuptools dependency-version: 83.0.0 dependency-type: indirect dependency-group: uv ... Signed-off-by: dependabot[bot] <support@github.com> * Improve instructions on prompt templates, adding link to new docs section Improve other docstrings in templates and add missing key `fixed_tools` * Improve tray manager handling, particularly on macOS oraios#1825 * On shutdown, message tray manager before lengthy project shutdown * When dead ports are found, explicitly update the menu * Force the Nextflow server's deferred workspace scan before finding references (oraios#1832) The Nextflow language server does not scan the workspace when it says it does. `LanguageService.initialize` -- which the "Initializing" progress notification we wait for wraps -- only marks the workspace as unscanned and clears the AST cache. The scan itself happens in `LanguageService.update0`, behind a 1s debounce, and only on a round that finds no pending file change; a round that does find one re-defers it via `updateLater`. The first `didOpen` of a session therefore pushes the scan out by at least one further round, so a references request issued right after it sees an AST cache holding nothing but the file it just opened and answers with an empty list. Force the scan rather than waiting for it. `completion` is one of the two requests that call `updateNow` before consulting their provider, and `DebouncingExecutor.executeNow` cancels the pending debounce and runs the update synchronously on the request thread, so the response is not sent until that round has finished. Two rounds suffice whatever the workspace size: the first drains the pending file changes -- which is what re-defers the scan -- and the second finds nothing pending, so it compiles the whole workspace before replying. Polling the workspace symbol index instead would be unsound: `LanguageService.symbol` neither awaits the update nor holds the monitor that `update` synchronises on. On a generated 1050-file workspace, polling it made the server raise `java.util.ConcurrentModificationException` from inside the scan, non-deterministically (6, 3 and 0 times across three runs). The existing cross-file reference test did not catch the empty results because the `language_server` fixture is module-scoped: earlier tests in the class had already opened main.nf and forced the server to compile it, so the assertion passed for a reason that does not hold in a real session. Run alone, it failed. The added test starts its own server and opens nothing but the defining file. Verified on the 1050-file workspace, where the symbol has exactly 100 references: without the fix 0 are found, with it all 100, in 2.5s. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> * fix(gitignore): escape directory names before interpolating into pattern position (oraios#1809) * fix(gitignore): escape directory names before interpolating into pattern position GitignoreParser rescopes patterns from nested .gitignore files by prefixing the containing directory's relative path, but interpolates that path into pattern position without escaping it. A directory whose name contains a gitignore metacharacter (*, ?, [, ], !, #) is then read as glob syntax instead of a literal name, so a directory like a stray "***" venv can turn a scoped pattern into one matching most or all of the project. Fixes oraios#1806 * fix(gitignore): build patterns with '/' only, never os.sep/os.path.join The escaping added in the prior commit inserts literal backslash escape characters before pattern metacharacters. On Windows, os.sep is also backslash, so os.path.join(rel_dir_pattern, line) mixed path-separator backslashes with escape backslashes, and the pre-existing trailing `.replace(os.sep, "/")` normalization step then converted ALL of them indiscriminately -- turning an escaped 'a\[1\]' into 'a/[1/]', which no longer matches the literal directory name. Verified with ntpath (Windows path semantics) on this Linux session: simulating a Windows relpath through the old os.sep/os.path.join/replace chain produces 'a/[1/]/mod.py', which pathspec does not match against 'a[1]/mod.py'; the new '/'-only construction produces 'a\[1\]/mod.py', which matches. Fixed by normalizing rel_dir to '/' immediately and joining every pattern component with a literal '/', removing the now-unneeded (and on Windows actively harmful) blanket separator replace. Also marks the two directory-creation regression tests that use '*'/'?' literally in a directory name as Windows-skipped (those characters are illegal in Windows filenames, so the directories cannot be created there -- a platform limitation of the test, not the fix), and adds a pure-function test for _escape_gitignore_path_component so the '*'/'?' escaping logic still has cross-platform coverage. Found via this PR's own Windows CI run (jobs 91787560091/91787560092/91787560183 on run 30843966565), which failed test_gitignore_dir_name_with_metachars_anchored_pattern with an assertion failure (not the OSError the other two tests hit), before any maintainer had looked at the PR. * Add Wolfram Language support via official LSPServer paclet (oraios#1108) Adds support for Wolfram Language (.wl, .wls files) using the official WolframResearch LSPServer paclet, which communicates via stdio. Requires Wolfram Mathematica 13.0+ or Wolfram Engine 12.1+. The WolframKernel is located via WOLFRAM_PATH, the system PATH, common install locations, or ls_path in ls_specific_settings. Includes language server implementation, test repo, test suite (skipped gracefully when WolframKernel is unavailable), and documentation updates. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Improve project health-check : Disable symbol groupers, remove flawed pattern search test Resolves oraios#1826 * Use <code> tag for commands in news * Add 'Security' section to changelog * Add news item for v1.7.0 release * Fix: LSP process-group cleanup no longer requires process-table enumeration An independently-started LSP process is already its own POSIX process group leader (start_new_session=True), so cleanup can signal that known group directly via os.killpg instead of walking the tree with psutil.Process.children(recursive=True), which requires system-wide process-table enumeration that can be denied even for processes we started and own (oraios#1818). * CI: cache npm dependencies for web test fixtures (oraios#1698) * SolidLSP: admit Struct, Interface and Constant symbols as reference containers (oraios#1831) find_referencing_symbols degraded to file-level attribution for any reference located inside a Go struct body, interface body or const group: request_containing_symbol found no admissible container, so request_referencing_symbols logged "Could not find containing symbol ... Returning file symbol instead" and fell back to the file symbol, losing the answer the tool exists to give. Root cause: the candidate-container filter admitted only Python's container kinds {Method, Function, Class} (plus Variable via the one-liner-exempt path). The language server is not at fault: hierarchicalDocumentSymbolSupport is declared and the DocumentSymbol tree is complete, but Go structs arrive as SymbolKind.Struct, interfaces as Interface and const-group members as Constant - none of which were admitted, so every candidate was rejected. Fix, mirroring the existing structure of the filter: - Struct and Interface join the multi-line container whitelist, - Constant joins Variable on the one-liner-exempt path (const-group members are one-liners by nature, exactly like the module-level variables that path already serves). The Python suite shows no attribution change (test/solidlsp/python/test_symbol_retrieval.py: 80 passed). Languages whose containers use the added kinds (e.g. Rust and C structs, TypeScript interfaces) get the same admission; verified for Go and Python only. Regression coverage: new Go fixture containment_sample.go with a const-iota group, a struct field and an interface method all referencing a named type; four tests assert containing-symbol and referencing-symbol attribution, and all four fail against the pre-change ls.py (verified). Full go-marker suite: 21 passed, 1 skipped. * Introduce ManagedSubprocess to encapsulate subprocess lifecycle management The knowledge that a process launched with start_new_session=True is its own group leader (and thus that its PGID equals its PID) was previously held by StdioLanguageServer, i.e. the consumer had to know how the launcher works in order to terminate the process correctly. ManagedSubprocess now owns the process group ID alongside the Popen instance, deriving it at construction time, and provides the termination logic; the launcher returns instances of it. StdioLanguageServer merely holds one and accesses the process through its interface. LanguageServerSubprocessLauncher now returns ManagedSubprocess instances and is renamed to ManagedSubprocessLauncher accordingly. * Update news item * Improve identification of container/low-level symbols (oraios#1834) This affects results returned for request_containing_symbol, some tests were adjusted accordingly. * Release v1.7.0 * Set version to v1.7.1.dev0 * Update docstring of web_dashboard_interface * Merge pull request oraios#1847 from merlinorg/scala-document-project-root-settings docs: document the three Scala settings the configuration page omitted --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Dominik Jain <dominik.jain@oraios-ai.de> Co-authored-by: shiersa <25566715+shiersa@users.noreply.github.com> Co-authored-by: yhheolab-oss <yh.heo.lab@gmail.com> Co-authored-by: Tyce Herrman <Tyce.Herrman@pm.me> Co-authored-by: Merlin Hughes <merlin@merlin.org> Co-authored-by: Kobi Hikri <kobi.hikri@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Michael Panchenko <35432522+MischaPanch@users.noreply.github.com> Co-authored-by: Evangelos Karatzas <32259775+vagkaratzas@users.noreply.github.com> Co-authored-by: xor <127287135+xormania@users.noreply.github.com> Co-authored-by: weiconghe <46336277+weiconghe@users.noreply.github.com> Co-authored-by: Claude Opus 5 <noreply@anthropic.com> Co-authored-by: Amir Fathi <amirfathi.me@gmail.com> Co-authored-by: Pavel Hajek <p135246@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

Adds support for Wolfram Language (
.wl,.wlsfiles) using the official WolframResearch LSPServer paclet, which is bundled with Wolfram installations and communicates via stdio.Requirements: Wolfram Mathematica 13.0+ or Wolfram Engine 12.1+. The WolframKernel executable is discovered via
ls_pathinls_specific_settings.wolfram, theWOLFRAM_PATHenvironment variable, the system PATH, or common install locations. If no kernel is found, server startup fails with an actionable error message, and the test suite skips gracefully (using the same discovery logic).Changes:
WolframLanguageServerfollowing the currentDependencyProviderpattern (analogous to QML/MATLAB)WOLFRAMentry inLanguageServerId(file matcher for.wl/.wls, LS class factory)wolframpytest markerKnown limitation: the LSPServer paclet computes
textDocument/referencesper document — cross-file references are not supported by the server. This is noted in the docs and the test module.Verified locally against Wolfram 14: integration tests pass (live LSP communication), and an end-to-end check through the MCP server (
get_symbols_overview,find_symbol,find_referencing_symbols,get_diagnostics_for_file) works on a real Wolfram project.poe format,poe lint, andpoe type-checkare clean.🤖 Generated with Claude Code