Skip to content

Add Wolfram Language support via official LSPServer paclet - #1108

Merged
opcode81 merged 4 commits into
oraios:mainfrom
p135246:add-wolfram-language-support
Aug 9, 2026
Merged

Add Wolfram Language support via official LSPServer paclet#1108
opcode81 merged 4 commits into
oraios:mainfrom
p135246:add-wolfram-language-support

Conversation

@p135246

@p135246 p135246 commented Mar 1, 2026

Copy link
Copy Markdown
Contributor

Adds support for Wolfram Language (.wl, .wls files) 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_path in ls_specific_settings.wolfram, the WOLFRAM_PATH environment 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:

  • WolframLanguageServer following the current DependencyProvider pattern (analogous to QML/MATLAB)
  • WOLFRAM entry in LanguageServerId (file matcher for .wl/.wls, LS class factory)
  • Test repo and test suite (document symbols incl. subdirectories, within-file references), wolfram pytest marker
  • Docs: README language list, language support page, CHANGELOG

Known limitation: the LSPServer paclet computes textDocument/references per 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, and poe type-check are clean.

🤖 Generated with Claude Code

@p135246
p135246 force-pushed the add-wolfram-language-support branch from 2297821 to 1228465 Compare March 1, 2026 01:32
@opcode81
opcode81 force-pushed the main branch 4 times, most recently from fee8b1c to d165272 Compare April 6, 2026 21:08
@MischaPanch
MischaPanch force-pushed the main branch 2 times, most recently from 420a0ba to 016ccbe Compare May 26, 2026 11:45
@MischaPanch
MischaPanch force-pushed the main branch 6 times, most recently from ee32c5e to ebe7646 Compare June 28, 2026 20:38
@opcode81

Copy link
Copy Markdown
Contributor

@p135246 this is still a draft. Will you finalise this or shall we close it?

@p135246

p135246 commented Jul 24, 2026

Copy link
Copy Markdown
Contributor Author

Hey @opcode81, I will give it a last vibecoding push now and let's see :-)

@p135246
p135246 force-pushed the add-wolfram-language-support branch from a3e78c9 to 392a303 Compare July 25, 2026 00:22
Copilot AI review requested due to automatic review settings July 25, 2026 00:22

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 WolframLanguageServer implementation with kernel discovery (PATH / WOLFRAM_PATH / common install locations) and stdio launch command.
  • Register LanguageServerId.WOLFRAM with filename matching for .wl/.wls and 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.

Comment thread test/conftest.py Outdated
Comment thread test/solidlsp/wolfram/test_wolfram_basic.py Outdated
Comment thread test/solidlsp/wolfram/test_wolfram_basic.py Outdated
Copilot AI review requested due to automatic review settings July 25, 2026 00:36
@p135246
p135246 force-pushed the add-wolfram-language-support branch from 392a303 to 637bcd1 Compare July 25, 2026 00:36
@p135246
p135246 force-pushed the add-wolfram-language-support branch from 637bcd1 to 1770ac3 Compare July 25, 2026 00:38
@p135246

p135246 commented Jul 25, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the Copilot review in the latest push:

  1. conftest skip logic — now reuses the language server's own _find_wolfram_kernel() discovery helper instead of duplicating a subset of the search paths, so test gating matches runtime behavior (including WOLFRAM_PATH and Linux/Windows locations).
  2. Within-file references test — the assertion now requires both the definition site and the call site, matching the comment.
  3. Cross-file references test — removed. Verified against a live kernel that the LSPServer paclet computes textDocument/references per document only (cross-file references are not supported by the server), so the test could never validate what its name claimed. The limitation is now noted in the test module, the docs page, and the CHANGELOG entry.

🤖 Generated with Claude Code

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

Comment thread CHANGELOG.md Outdated
Comment thread test/solidlsp/wolfram/test_wolfram_basic.py
Copilot AI review requested due to automatic review settings July 25, 2026 00:42
@p135246

p135246 commented Jul 25, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the second review round:

  1. "semantic highlighting" in CHANGELOG — removed; the initialize params indeed do not advertise semanticTokens.
  2. Explicit negative test — added test_wolfram_no_cross_file_references, asserting that references for a symbol defined in lib/helper.wl and called in main.wl stay within lib/helper.wl. If a future LSPServer version adds cross-file support, this test will fail and prompt a documentation update. The PR description was already updated to state within-file-only references.

🤖 Generated with Claude Code

@p135246
p135246 force-pushed the add-wolfram-language-support branch from 1770ac3 to 667fd0a Compare July 25, 2026 00:44

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot AI review requested due to automatic review settings July 25, 2026 00:46

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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() sends textDocument/references with includeDeclaration: False (see solidlsp/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}"

@p135246
p135246 marked this pull request as ready for review July 25, 2026 01:07
@p135246

p135246 commented Jul 25, 2026

Copy link
Copy Markdown
Contributor Author
image

Copilot AI review requested due to automatic review settings July 28, 2026 12:01
@p135246
p135246 force-pushed the add-wolfram-language-support branch from 667fd0a to 062d8a2 Compare July 28, 2026 12:01

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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() sends includeDeclaration=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 respects includeDeclaration.

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}"

Comment thread test/solidlsp/wolfram/test_wolfram_basic.py
Comment thread test/resources/repos/wolfram/test_repo/lib/helper.wl
Copilot AI review requested due to automatic review settings July 30, 2026 13:39

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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() sends includeDeclaration=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_path in ls_specific_settings, but elsewhere (and in the error message) the key is ls_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 considers WOLFRAM_PATH, PATH, and common install locations, but not ls_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

@p135246

p135246 commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

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 AmirF194 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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")       # True

should_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?

@MischaPanch

Copy link
Copy Markdown
Member

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.

p135246 and others added 2 commits August 8, 2026 22:10
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>
@p135246
p135246 force-pushed the add-wolfram-language-support branch from 41894ec to 1704cdb Compare August 8, 2026 22:26
p135246 added 2 commits August 9, 2026 00:29
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.
@opcode81
opcode81 merged commit 1b45989 into oraios:main Aug 9, 2026
24 checks passed
@opcode81

opcode81 commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Thanks for your contribution

AcidicSoil added a commit to AcidicSoil/serena that referenced this pull request Aug 12, 2026
* 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants