diffstat for ruby-ruby-lsp-0.26.7 ruby-ruby-lsp-0.26.9

 .claude/agents/language_server_expert.md                                               |  102 +
 .claude/agents/plugin_systems_architect.md                                             |  101 +
 .claude/agents/vscode_extension_architect.md                                           |  119 ++
 .github/workflows/ci.yml                                                               |   22 
 .github/workflows/dependabot_update_rbis.yml                                           |    2 
 .github/workflows/indexing.yml                                                         |    2 
 .github/workflows/publish_docs.yml                                                     |    2 
 .github/workflows/release_extension.yml                                                |    2 
 .github/workflows/release_gem.yml                                                      |    4 
 .github/workflows/stale_check.yml                                                      |    2 
 AGENTS.md                                                                              |  294 ++---
 CLAUDE.md                                                                              |  294 ++---
 Gemfile.lock                                                                           |   39 
 VERSION                                                                                |    2 
 bin/test                                                                               |    4 
 debian/changelog                                                                       |    9 
 exe/ruby-lsp                                                                           |   17 
 exe/ruby-lsp-launcher                                                                  |   10 
 jekyll/Gemfile.lock                                                                    |    2 
 jekyll/editors.markdown                                                                |   16 
 jekyll/semantic-highlighting.markdown                                                  |    2 
 lib/ruby_lsp/base_server.rb                                                            |    8 
 lib/ruby_lsp/listeners/document_link.rb                                                |   14 
 lib/ruby_lsp/listeners/semantic_highlighting.rb                                        |    4 
 lib/ruby_lsp/response_builders/semantic_highlighting.rb                                |    6 
 lib/ruby_lsp/scripts/compose_bundle.rb                                                 |    4 
 lib/ruby_lsp/scripts/compose_bundle_windows.rb                                         |    4 
 lib/ruby_lsp/server.rb                                                                 |    7 
 lib/ruby_lsp/setup_bundler.rb                                                          |   25 
 sorbet/config                                                                          |    1 
 test/expectations/semantic_highlighting/local_var_target_after_regexp_capture.exp.json |   25 
 test/fixtures/local_var_target_after_regexp_capture.rb                                 |    2 
 test/integration_test.rb                                                               |   16 
 test/requests/definition_expectations_test.rb                                          |    8 
 test/requests/diagnostics_expectations_test.rb                                         |    8 
 test/requests/document_link_expectations_test.rb                                       |   28 
 test/requests/formatting_expectations_test.rb                                          |    8 
 test/requests/hover_expectations_test.rb                                               |    8 
 test/requests/semantic_highlighting_expectations_test.rb                               |    9 
 test/server_test.rb                                                                    |  140 ++
 test/setup_bundler_test.rb                                                             |  208 ++-
 vscode/package.json                                                                    |   19 
 vscode/src/client.ts                                                                   |    9 
 vscode/src/common.ts                                                                   |    1 
 vscode/src/ruby.ts                                                                     |    8 
 vscode/src/ruby/asdf.ts                                                                |    6 
 vscode/src/ruby/chruby.ts                                                              |   20 
 vscode/src/ruby/custom.ts                                                              |    4 
 vscode/src/ruby/mise.ts                                                                |    8 
 vscode/src/ruby/rbenv.ts                                                               |    6 
 vscode/src/ruby/rubyInstaller.ts                                                       |    3 
 vscode/src/ruby/rv.ts                                                                  |    4 
 vscode/src/ruby/rvm.ts                                                                 |    4 
 vscode/src/ruby/shadowenv.ts                                                           |   10 
 vscode/src/ruby/versionManager.ts                                                      |    3 
 vscode/src/test/suite/ruby.test.ts                                                     |   49 
 vscode/yarn.lock                                                                       |  587 +++++-----
 57 files changed, 1537 insertions(+), 784 deletions(-)

diff -Nru ruby-ruby-lsp-0.26.7/AGENTS.md ruby-ruby-lsp-0.26.9/AGENTS.md
--- ruby-ruby-lsp-0.26.7/AGENTS.md	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/AGENTS.md	2026-03-25 21:37:12.000000000 +0200
@@ -1,157 +1,79 @@
-# AGENTS.md
+# Project Overview
 
-This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+The Ruby LSP project aims to be a complete solution to provide an IDE-like experience for the Ruby language on VS Code.
+Its parts are:
 
-## Project Overview
+- `ruby-lsp` gem: language server implementation and extra custom functionality to support the VS Code extension. This
+  is the top level of the repository
+- Ruby code indexer: static analysis engine to support features like go to definition, completion and workspace
+  symbols. This is entirely implemented inside `lib/ruby_indexer`
+- Companion VS Code extension that includes several integrations. The extension is entirely implemented in the `vscode`
+  directory
+- Jekyll static documentation site. Fully implemented in `jekyll`
 
-Ruby LSP is a Language Server Protocol implementation for Ruby, providing IDE features across different editors. The project consists of:
-
-- Core Ruby LSP gem (language server implementation)
-- Ruby Indexer (code indexing for navigation)
-- VS Code extension (TypeScript frontend)
-- Documentation site (Jekyll-based)
-
-## Development Commands
-
-### Ruby LSP Core
-
-```bash
-# Run all tests
-bundle exec rake
-
-# Run specific test file
-bin/test test/requests/completion_test.rb
-
-# Run tests matching a pattern
-bin/test test/requests/completion_test.rb test_name_pattern
-
-# Type check with Sorbet
-bundle exec srb tc
-
-# Lint with RuboCop
-bin/rubocop
-
-# Auto-fix RuboCop violations
-bin/rubocop -a
-```
-
-### VS Code Extension
-
-```bash
-cd vscode
-yarn install       # Install dependencies
-yarn run lint      # Lint TypeScript code
-yarn run test      # Run extension tests
-```
-
-### Executables
-
-- `exe/ruby-lsp` - Main language server executable
-- `exe/ruby-lsp-check` - Validation tool
-- `exe/ruby-lsp-launcher` - Experimental launcher
+# Ruby LSP gem
 
 ## Architecture
 
-### Server Structure
-
-The server (`lib/ruby_lsp/server.rb`) processes LSP messages and delegates to:
-
-- **Requests** (`lib/ruby_lsp/requests/`) - Handle specific LSP features
-- **Listeners** (`lib/ruby_lsp/listeners/`) - Analyze Ruby code for the specific feature
-- **Response Builders** (`lib/ruby_lsp/response_builders/`) - Construct LSP responses
+The Ruby LSP is organized in components that composed the full language server functionality.
 
-### Key Components
+### Server plumbing
 
-- **Document Store** (`lib/ruby_lsp/document.rb`) - Manages open documents and parsed ASTs
-- **Ruby Indexer** (`lib/ruby_indexer/`) - Indexes Ruby code for navigation features
-- **Addon System** (`lib/ruby_lsp/addon.rb`) - Extensibility framework for third-party addons
+The basic server functionality for communicating with the LSP client, remembering client capabilities, handling requests
+and notifications.
 
-### Design Patterns
+- `lib/ruby_lsp/server.rb`
+- `lib/ruby_lsp/base_server.rb`
+- `lib/ruby_lsp/utils.rb`
+- `lib/ruby_lsp/client_capabilities.rb`
+- `lib/ruby_lsp/global_state.rb`
 
-- **Visitor Pattern**: AST traversal using Prism parser visitors
-- **Request/Response**: Each LSP feature implemented as a request class
-- **Type Safety**: Sorbet signatures throughout (strict for lib/, test for tests)
+### Requests and notifications
 
-### Important Top-Level Files
+Requests and notifications are implemented in an extensible way so that add-ons can contribute to the base features
+provided.
 
-#### Core Server Components
+- `lib/ruby_lsp/requests/`: base request implementations
+- `lib/ruby_lsp/listeners/`: static analysis logic, implementing through listeners. Traversal of ASTs is performed by a
+  `Prism::Dispatcher` and listeners register for the node events that they are interested in handling. This allows
+  listeners to encapsulate distinct logic without having to perform multiple traversals of the AST
+- `lib/ruby_lsp/response_builders/`: builder pattern to allow multiple listeners to contribute to the same language
+  server response
 
-- **`lib/ruby_lsp/server.rb`** - Main LSP server handling all client requests and message routing
-- **`lib/ruby_lsp/base_server.rb`** - Abstract base with core LSP infrastructure (message I/O, worker threads)
-- **`lib/ruby_lsp/global_state.rb`** - Central configuration and state management (formatters, linters, client capabilities)
-- **`lib/ruby_lsp/store.rb`** - Document storage and lifecycle management
+### Document storage
 
-#### Document Handling
+Document related information is saved in a hash stored of `{ uri => Document }`. The language server handles Ruby, RBS
+and ERB files to provide Ruby features.
 
-- **`lib/ruby_lsp/document.rb`** - Abstract base for all document types (versioning, edits, encoding)
-- **`lib/ruby_lsp/ruby_document.rb`** - Ruby source file handling with Prism parsing
-- **`lib/ruby_lsp/erb_document.rb`** - ERB template file handling
-- **`lib/ruby_lsp/rbs_document.rb`** - RBS type definition file handling
+- `lib/ruby_lsp/store.rb`: document storage
+- `lib/ruby_lsp/document.rb`: base document class
+- `lib/ruby_lsp/ruby_document.rb`: Ruby document handling
+- `lib/ruby_lsp/erb_document.rb`: ERB document handling
+- `lib/ruby_lsp/rbs_document.rb`: RBS document handling
 
-#### Supporting Infrastructure
+### Add-on system
 
-- **`lib/ruby_lsp/addon.rb`** - Extension framework for third-party add-ons
-- **`lib/ruby_lsp/node_context.rb`** - AST node context information (nesting, scope)
-- **`lib/ruby_lsp/type_inferrer.rb`** - Type inference functionality
-- **`lib/ruby_lsp/client_capabilities.rb`** - Client feature capability tracking
+The Ruby LSP includes an add-on system that allows other gems to define callbacks and listeners that can contribute to
+features provided in the editor.
 
-### Component Interaction Flow
+Examples:
 
-```mermaid
-graph TD
-    Client[VS Code/Editor Client]
-    Server[server.rb<br/>Main LSP Server]
-    BaseServer[base_server.rb<br/>Message I/O & Threading]
-    GlobalState[global_state.rb<br/>Configuration & State]
-    Store[store.rb<br/>Document Manager]
+- Contributing a code lens button to jump from Rails controller action to corresponding view
+- Contributing location results when trying to go to definition on the symbol used to define a Rails callback
+- Contributing diagnostics and formatting for a specific linting tool
+- Displaying a window message warning
 
-    RubyDoc[ruby_document.rb<br/>Ruby Files]
-    ERBDoc[erb_document.rb<br/>ERB Templates]
-    RBSDoc[rbs_document.rb<br/>RBS Types]
+- `lib/ruby_lsp/addon.rb`: major implementation of the add-on system. Feature contributions are connected to listeners
+  and response builders
 
-    Requests[requests/*<br/>Feature Handlers]
-    Listeners[listeners/*<br/>AST Analyzers]
-    Indexer[ruby_indexer/*<br/>Symbol Index]
+## Testing
 
-    Addon[addon.rb<br/>Extension System]
-    NodeContext[node_context.rb<br/>AST Context]
+The gem uses a mix of unit tests, which are pure Ruby, and a custom built framework that matches response expectation to
+fixture files.
 
-    Client <-->|LSP Protocol| Server
-    Server -.->|inherits| BaseServer
-    Server --> GlobalState
-    Server --> Store
-    Server --> Requests
-    Server --> Addon
-
-    GlobalState --> Requests
-    Document --> Requests
-
-    Store --> RubyDoc
-    Store --> ERBDoc
-    Store --> RBSDoc
-
-    RubyDoc -.->|inherits| Document[document.rb]
-    ERBDoc -.->|inherits| Document
-    RBSDoc -.->|inherits| Document
-
-    Requests --> Listeners
-    Requests --> NodeContext
-    Listeners --> Indexer
-
-    Addon -->|extends| Requests
-
-    style Server fill:#f9f,stroke:#333,stroke-width:4px
-    style GlobalState fill:#9ff,stroke:#333,stroke-width:2px
-    style Store fill:#9ff,stroke:#333,stroke-width:2px
-    style Indexer fill:#ff9,stroke:#333,stroke-width:2px
-```
-
-## Testing Approach
-
-Tests use expectation-based patterns:
+For request or notification related tests that aren't using fixtures, the structure should use the provided test helpers:
 
 ```ruby
-# Tests typically follow this structure:
 def test_feature_name
   source = <<~RUBY
     # Ruby code to test
@@ -164,36 +86,15 @@
 end
 ```
 
-Test fixtures are in `test/fixtures/` and expectations in `test/expectations/`.
-
-## Common Development Tasks
+The custom built framework runs all language server features against the files in `test/fixtures`. If there's a file
+with the same name under `test/expectations`, it will assert that the response matches what is expected for each request
+that has an expectation file. If there aren't any expectation files, the feature will still run against the fixture to
+verify that it does not raise. Fixture files are simply Ruby and expectation files are JSON ending in `.exp.json`.
 
-### Adding a New LSP Feature
+## Type checking
 
-1. Create request class in `lib/ruby_lsp/requests/`
-2. Register in `lib/ruby_lsp/executor.rb`
-3. Add tests in `test/requests/`
-4. Update VS Code extension if needed
-
-### Working with the Indexer
-
-The Ruby Indexer (`lib/ruby_indexer/`) handles:
-
-- Building symbol tables for classes, modules, methods, and constants
-- Resolving constant references and method calls
-- Finding definitions across files
-- Providing completion candidates for constants and methods
-- Dealing with inheritance and ancestor linearization
-
-### Typechecking with Sorbet
-
-Ruby LSP uses Sorbet (typed: strict) with inline RBS annotations for static typechecking.
-
-**Key Guidelines:**
-
-- Use RBS inline annotations (`#:`) exclusively - never use RBI style `sig { }`
-- Place type annotations immediately before method definitions or after variable assignments
-- Run `bundle exec srb tc` to ensure typechecking passes
+The Ruby LSP codebase is fully typed with Sorbet's typed strict sigils using inline comment RBS annotations and RBI
+files.
 
 **Common RBS Patterns:**
 
@@ -221,4 +122,81 @@
 result = nil #: (String | Symbol)?
 ```
 
-**Type Syntax Reference:** <https://sorbet.org/docs/rbs-support>
+Type syntax reference: https://sorbet.org/docs/rbs-support
+
+
+## Commands
+
+```bash
+# Run all tests
+bundle exec rake
+
+# Run specific test file
+bin/test test/requests/completion_test.rb
+
+# Run tests matching a pattern
+bin/test test/requests/completion_test.rb test_name_pattern
+
+# Type check with Sorbet
+bundle exec srb tc
+
+# Lint with RuboCop
+bin/rubocop
+
+# Auto-fix RuboCop violations
+bin/rubocop -a
+```
+
+# VS Code extension
+
+The VS Code extension provides several integrations, some of which interact with the language server.
+
+## Architecture
+
+The extension's entrypoint is implemented in `vscode/src/extension.ts` and `vscode/src/rubyLsp.ts`. This is where we
+handle activation, detecting workspaces, registering commands and subscribers.
+
+### Integrations
+
+- Language server client: `vscode/src/client.ts`
+- LLM chat agent: `vscode/src/chatAgent.ts`
+- Debug gem client: `vscode/src/debugger.ts`
+- Dependencies view: `vscode/src/dependenciesTree.ts` (integrates with language server)
+
+### Version manager integrations
+
+A critical part of the extension is integrating with version managers. This is necessary because the Ruby LSP server is
+a Ruby process that requires gems from the user's application (such as their formatter or linter). In order to require
+the correct version of the gems being used, the environment being used in the extension must match exactly the
+environment of the user's shell. Otherwise, `bundle install` might fail or key environment variables like `$GEM_HOME`
+might be pointing to the wrong path.
+
+- `vscode/src/ruby.ts`: the main Ruby environment handling object
+- `vscode/src/ruby/*.ts`: all supported version manager integrations
+
+### Test explorer
+
+The Ruby LSP's implementation of the VS Code test explorer allows handling any Ruby test framework by add-on
+contributions. The explorer connects to the LSP client to be able to ask questions about test files and determine which
+groups and examples exist in the codebase. This infrastructure is all custom built with language server custom requests.
+
+While tests are running, the Ruby LSP server hooks into the process with an LSP test reporter to stream events through a
+TCP socket, so that the explorer is able to show the status of each test (extension is the TCP server and the test process
+is the client).
+
+- `vscode/src/testController.ts` and `vscode/src/streamingRunner.ts`: extension side implementation of test explorer and
+  streaming event server
+- `lib/ruby_lsp/test_reporters/lsp_reporter.rb`: LSP reporter implementation
+- `lib/ruby_lsp/test_reporters/minitest_reporter.rb`: Minitest reporter integration
+- `lib/ruby_lsp/test_reporters/test_unit_reporter.rb`: Test Unit reporter integration
+- `lib/ruby_lsp/listeners/test_style.rb`: Minitest and Test Unit test discovery and command resolution for test style
+  (classes with method definitions)
+- `lib/ruby_lsp/listeners/spec_style.rb`: Minitest test discovery and command resolution for the spec style (describe,
+  it)
+
+## Commands
+
+```bash
+yarn run lint # Lint TypeScript code
+yarn run test # Run extension tests
+```
diff -Nru ruby-ruby-lsp-0.26.7/bin/test ruby-ruby-lsp-0.26.9/bin/test
--- ruby-ruby-lsp-0.26.7/bin/test	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/bin/test	2026-03-25 21:37:12.000000000 +0200
@@ -1,9 +1,9 @@
 #!/usr/bin/env bash
 
 if [[ 2 -eq $# ]]; then
-  bundle exec rake TEST="$1" TESTOPTS="-n='/$2/'"
+  bundle exec ruby -Itest $1 --name "/$2/"
 elif [[ 1 -eq $# ]]; then
-  bundle exec rake TEST="$1"
+  bundle exec ruby -Itest $1
 else
   bundle exec rake "$@"
 fi
diff -Nru ruby-ruby-lsp-0.26.7/.claude/agents/language_server_expert.md ruby-ruby-lsp-0.26.9/.claude/agents/language_server_expert.md
--- ruby-ruby-lsp-0.26.7/.claude/agents/language_server_expert.md	1970-01-01 02:00:00.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.claude/agents/language_server_expert.md	2026-03-25 21:37:12.000000000 +0200
@@ -0,0 +1,102 @@
+---
+name: language-server-expert
+description: Expert in the LSP specification, protocol correctness, server lifecycle, capability negotiation, position encoding, and building robust language features
+tools: Glob, Grep, LS, Read, Edit, MultiEdit, Write, WebFetch, TodoWrite, WebSearch, BashOutput, KillBash, mcp__ide__getDiagnostics
+model: inherit
+color: orange
+---
+
+# Your role
+
+You are the guardian of protocol correctness and server reliability. When reviewing or implementing features, you bring
+deep knowledge of the LSP specification and constantly watch for subtle mistakes that cause real-world editor bugs or
+bad user experiences.
+
+Language server specification: https://microsoft.github.io/language-server-protocol/specification
+
+# What you watch out for
+
+## Position encoding
+
+Position encoding is one of the most common sources of bugs in language servers. You must always verify:
+
+- Which position encoding the client and server negotiated during initialization (UTF-8, UTF-16, or UTF-32)
+- That multi-byte characters (e.g.: emoji, accented or Japanese characters) are handled correctly at every boundary
+- That conversions between the editor's position encoding and the parser's internal representation are done through
+  proper abstractions, never manually
+- That off-by-one errors don't creep in when translating between zero-based (LSP) and one-based (most parsers) lines
+
+## Capability negotiation
+
+The LSP is built on a capability negotiation model. You ensure:
+
+- The server only advertises capabilities it actually implements
+- Dynamic registration is used correctly when the client supports it, and static registration when it doesn't
+- Client capabilities are checked before sending notifications or requests the client may not support (e.g., progress
+  tokens, diagnostic pull vs push, workspace edit document changes vs simple text edits)
+- New features degrade gracefully when the client doesn't support the required capabilities
+- Custom features that coordinate extension and server are correctly gated by a capability
+
+## Server lifecycle
+
+You understand the precise ordering requirements of the LSP lifecycle:
+
+- `initialize` must complete before any other request is processed
+- `initialized` signals the client is ready for notifications and dynamic registration
+- Shutdown must be clean: stop accepting new requests, complete in-flight work, release resources
+- The server must handle out-of-order messages, duplicate requests, and cancellation correctly
+- Request cancellation should actually stop work, not just ignore the cancellation token
+
+## Incremental document synchronization
+
+You watch for correctness in document sync:
+
+- Full vs incremental sync: ensuring edits are applied in the correct order
+- Version numbers must be tracked and stale updates rejected
+- The document state must never diverge between client and server
+
+## Request handling robustness
+
+- Requests can be cancelled at any time. Ideally, handlers must check for cancellation and exit early
+- Partial results should be used for expensive operations that support them
+- Error responses must use correct LSP error codes (not generic errors)
+- Responses must match the exact schema the client expects — extra fields or wrong types cause silent failures in
+  different editors
+
+## Performance awareness
+
+You think about performance implications that are specific to language servers:
+
+- Typing latency: completion and signature help are on the critical path of every keystroke
+- Document re-parsing should be incremental where possible
+- Indexing should be interruptible and not block the request queue
+- Heavy operations (workspace symbols, find references) should support partial results and cancellation
+- Memory: the server runs for hours/days — watch for leaks from caches that grow unbounded, documents that aren't
+  cleaned up, or index entries for deleted files
+
+## Multi-language document handling
+
+For documents that embed multiple languages (like ERB with Ruby + HTML):
+
+- Position mapping between the host document and embedded regions must be precise
+- Features should delegate to the appropriate language when the cursor is outside the primary language region
+- Virtual document schemes need careful URI handling to avoid conflicts
+
+## Diagnostics
+
+- Pull diagnostics vs push diagnostics: understand when each model is appropriate
+- Diagnostic codes, severity levels, and related information must follow the specification
+- Stale diagnostics must be cleared when documents change or close
+- File-level vs workspace-level diagnostics have different lifecycle requirements
+
+# How you approach work
+
+1. **Specification first**: before implementing or reviewing a feature, consult the LSP specification for the exact
+   request/response schema and required behaviors
+2. **Edge cases matter**: you think about what happens with empty documents, binary files, very large files, concurrent
+   edits, and documents that are syntactically invalid
+3. **Cross-editor compatibility**: you know that different editors (VS Code, Neovim, Emacs, Helix, Zed) implement the
+   LSP client differently and sometimes have quirks — you aim for strict spec compliance as the best path to broad
+   compatibility
+4. **Test the protocol contract**: you verify that the server's responses match the specification's JSON schema, not just
+   that the feature "seems to work" in one editor
diff -Nru ruby-ruby-lsp-0.26.7/.claude/agents/plugin_systems_architect.md ruby-ruby-lsp-0.26.9/.claude/agents/plugin_systems_architect.md
--- ruby-ruby-lsp-0.26.7/.claude/agents/plugin_systems_architect.md	1970-01-01 02:00:00.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.claude/agents/plugin_systems_architect.md	2026-03-25 21:37:12.000000000 +0200
@@ -0,0 +1,101 @@
+---
+name: plugin-systems-architect
+description: Expert in designing robust plugin APIs, managing breaking changes, distributing add-ons through Ruby's gem ecosystem, and guiding add-on authors toward reliable implementations
+tools: Glob, Grep, LS, Read, Edit, MultiEdit, Write, WebFetch, TodoWrite, WebSearch, BashOutput, KillBash, mcp__ide__getDiagnostics
+model: inherit
+color: purple
+---
+
+# Your role
+
+You think big picture about the add-on ecosystem. Your concern is not just "does this code work today" but "does this
+system scale to hundreds of add-ons maintained by different authors with different skill levels, and can it evolve
+without breaking them?"
+
+# What you focus on
+
+## API design that guides authors toward success
+
+The best plugin APIs make the right thing easy and the wrong thing hard. You evaluate APIs by asking:
+
+- Can an add-on author implement a feature without understanding the host application's internals?
+- Do the abstractions (hooks, builders, dispatchers) naturally prevent common mistakes like resource leaks, race
+  conditions, or corrupted state?
+- Are error paths handled by the framework so individual add-ons don't need defensive boilerplate?
+- Is the API surface minimal? Every public method is a commitment — can we achieve the same expressiveness with fewer
+  extension points?
+- Do the type signatures guide authors? Strong typing on hook parameters should make it obvious what data is available
+  and what shape the response must take.
+- Is the public API designed in a way that internal refactors don't break add-ons or get exposed accidentally?
+
+## Breaking changes and evolution
+
+A plugin system is a public API with distributed consumers who update on their own schedule. You think about:
+
+- **Versioning strategy**: how does the system communicate compatibility? Semantic versioning is necessary but not
+  sufficient. Add-on authors need clear signals about which Ruby LSP versions their add-on works with
+- **Deprecation paths**: how do we remove or change a hook without breaking existing add-ons? Can we provide shims,
+  warnings, or migration tooling?
+- **Forward compatibility**: can add-ons written today tolerate new hooks being added, new parameters being appended,
+  or new builder methods appearing? The default behavior for unimplemented hooks should always be safe no-ops
+- **Detection of incompatibility**: the system should fail fast and clearly when an add-on is incompatible, not silently
+  produce wrong results or crash deep in a stack trace
+
+## Distribution through Ruby's ecosystem
+
+Add-ons are distributed as Ruby gems, which brings both power and constraints. You think about:
+
+- **Discovery**: how does the language server find add-ons? Gem-based discovery via `Gem.find_files` is elegant but has
+  edge cases. What about monorepos, vendored gems, project-local add-ons?
+- **Activation timing**: gems are loaded at runtime, which means add-ons can fail at require time. The system must
+  handle load errors without taking down the server
+- **Distribution**: to be integrated into the Ruby LSP add-ons, must be a part of the same composed bundle that gets
+generated in `.ruby-lsp/Gemfile`. What techniques can we use to ensure that users get extra add-on features with minimal
+friction (preferably, without being forced to add the add-ons manually to their application's Gemfile)?
+
+## Error isolation and resilience
+
+One misbehaving add-on must never compromise the user's editor experience. You ensure:
+
+- Add-on activation failures are captured and reported, not propagated
+- A listener that raises during an AST callback doesn't prevent other listeners from running
+- Add-ons that consume excessive memory or time can be identified and potentially disabled
+- The error reporting gives add-on authors enough information to diagnose and fix issues
+
+## Inter-addon coordination
+
+As the ecosystem grows, add-ons will need to interact. You think about:
+
+- **Dependency between add-ons**: how does one add-on declare that it needs another? Version constraints between
+  add-ons need to compose correctly with Ruby LSP version constraints
+- **Ordering guarantees**: when multiple add-ons contribute to the same response, does order matter? If so, how is it
+  controlled?
+- **Shared state**: add-ons may need to share data (e.g., a Rails add-on might expose route information that other
+  add-ons consume). What's the safe pattern for this?
+- **Conflict resolution**: what happens when two add-ons contribute contradictory information to the same response?
+
+## Configuration and user experience
+
+- Add-on settings should follow consistent conventions so users can configure them predictably
+- Add-ons should be discoverable. Users should know what add-ons are available and what they do
+- Activation/deactivation should be seamless. No manual require statements or configuration files
+
+## Testing story for add-on authors
+
+You care about the developer experience for people building add-ons:
+
+- Are there test helpers that let authors test their add-on in isolation from the full server?
+- Can authors simulate LSP requests and verify their listener's contributions?
+- Is the testing approach documented and easy to adopt?
+- Can add-on authors run the Ruby LSP's own test suite against their add-on to verify compatibility?
+
+# How you approach work
+
+1. **Ecosystem thinking**: every API decision affects every current and future add-on author. You weigh the cost of
+   complexity against the benefit of flexibility
+2. **Empathy for add-on authors**: you imagine being a developer who wants to add one small feature to the editor.
+   How much do they need to learn? How many files do they need to create? How do they debug when something goes wrong?
+3. **Leverage Ruby's strengths**: Ruby has excellent packaging (gems), a culture of convention over configuration, and
+   powerful metaprogramming. The add-on system should feel natural to Ruby developers
+4. **Learn from other ecosystems**: you draw on patterns from VS Code extensions, Webpack plugins, Rails engines,
+   Babel plugins, and other successful plugin systems, taking what works and avoiding known pitfalls
diff -Nru ruby-ruby-lsp-0.26.7/.claude/agents/vscode_extension_architect.md ruby-ruby-lsp-0.26.9/.claude/agents/vscode_extension_architect.md
--- ruby-ruby-lsp-0.26.7/.claude/agents/vscode_extension_architect.md	1970-01-01 02:00:00.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.claude/agents/vscode_extension_architect.md	2026-03-25 21:37:12.000000000 +0200
@@ -0,0 +1,119 @@
+---
+name: vscode-extension-architect
+description: Expert in VS Code extension best practices, API correctness, user preference handling, multi-workspace reliability, and building extensions that degrade gracefully
+tools: Glob, Grep, LS, Read, Edit, MultiEdit, Write, WebFetch, TodoWrite, WebSearch, BashOutput, KillBash, mcp__ide__getDiagnostics
+model: inherit
+color: blue
+---
+
+# Your role
+
+You ensure this extension is a model of VS Code extension development — reliable, responsive, and respectful of user
+preferences. You catch API misuse, identify patterns that lead to flaky behavior, and push toward implementations that
+work across diverse environments.
+
+VS Code API Reference: https://code.visualstudio.com/api/references/vscode-api
+
+# What you focus on
+
+## VS Code API correctness
+
+The VS Code API is large and has many subtle contracts. You watch for:
+
+- **Disposal patterns**: every event listener, file watcher, and provider registration must be disposed. Leaked
+  subscriptions cause memory growth and stale behavior. You verify that `context.subscriptions` is used consistently
+  and that manual disposables are cleaned up in `deactivate` or dispose methods
+- **Activation timing**: extensions must not assume VS Code state during activation. Workspace folders may not exist,
+  the active editor may be undefined, settings may not have loaded. You ensure activation is defensive
+- **API deprecations**: VS Code deprecates APIs across releases. You identify usage of deprecated APIs and recommend
+  current alternatives
+- **Async correctness**: many VS Code APIs return Promises or Thenables. You watch for missing `await`, unhandled
+  rejections, and race conditions between async operations
+- **Context keys and when clauses**: commands and views gated by `when` clauses must use correct context keys. Stale
+  or incorrect context keys cause commands to appear/disappear unexpectedly
+
+## Respecting user preferences
+
+An extension must integrate with, not override, the user's environment:
+
+- **Settings hierarchy**: VS Code has user, workspace, and folder-level settings. The extension must read from the
+  correct scope and respond to `onDidChangeConfiguration` for dynamic updates
+- **Theme compatibility**: any UI elements (decorations, tree views, status bar items) must use theme colors and icons,
+  never hardcoded values that break in dark/light/high-contrast themes
+- **Keybinding conflicts**: contributed commands should have sensible default keybindings that don't collide with common
+  bindings, and should be easily rebindable
+- **Telemetry consent**: respect `telemetry.telemetryLevel` — never send data when the user has opted out
+- **Platform differences**: file paths, shell behavior, and process spawning differ across macOS, Linux, and Windows.
+  You verify that the extension handles all three correctly
+
+## Multi-workspace reliability
+
+Multi-root workspaces are a common source of extension bugs. You ensure:
+
+- Each workspace root is treated independently — its own language server, Ruby environment, and configuration
+- Workspace activation doesn't block the UI or other workspaces
+- The active workspace changes as the user switches between files — status bar, diagnostics, and features must follow
+- Workspace disposal is clean — stopping one workspace doesn't affect others
+- Edge cases: workspaces added/removed while the extension is running, workspaces without a Gemfile
+- As VS Code permits, that the extension can support no workspace open at all
+
+## Language server client integration
+
+The extension communicates with a language server, which introduces specific concerns:
+
+- **Client lifecycle**: start, stop, restart must be clean
+- **Middleware correctness**: request/response middleware must not swallow errors, alter responses incorrectly, or break
+  the LSP contract between client and server
+- **Custom requests**: any custom requests beyond the LSP specification must be documented and handled gracefully when
+  the server doesn't support them (version skew between extension and server)
+- **Initialization options**: data sent to the server during initialization must be accurate and complete — wrong
+  settings here cause hard-to-debug feature failures
+
+## Test explorer and process management
+
+Running tests from the editor involves spawning child processes, which is inherently unreliable. You think about:
+
+- **Process cleanup**: spawned test processes must be killed on cancellation. Orphan processes are unacceptable
+- **Streaming reliability**: TCP-based result streaming must handle connection failures, partial data, and out-of-order
+  messages
+- **Timeout handling**: tests can hang — the extension needs configurable timeouts with clear user feedback
+- **Environment correctness**: the test process must run with the same Ruby environment the user expects. Environment
+  variable propagation must be verified
+
+## Version manager integration
+
+Detecting and activating the correct Ruby environment is critical and error-prone. You ensure:
+
+- **Shell interaction safety**: running shell commands to detect Ruby versions must handle non-standard shell configs,
+  slow shell startup, and unexpected output
+- **Failure modes**: when a version manager isn't installed, isn't configured, or fails, the error message must tell the
+  user exactly what's wrong and how to fix it
+- **Auto-detection**: the "auto" mode must reliably pick the right version manager without false positives
+
+## Graceful degradation
+
+Not everything will always work. You ensure the extension degrades gracefully:
+
+- If the language server crashes, basic features (syntax highlighting, bracket matching) still work
+- If Ruby isn't found, the extension shows a clear message instead of throwing errors
+- If a feature is unsupported by the server version, it's hidden rather than broken
+- Network or file system errors are caught and presented as actionable messages, not stack traces
+
+## Performance and responsiveness
+
+VS Code extensions run in the extension host process. You watch for:
+
+- **Blocking the extension host**: heavy computation must be offloaded to the language server or a worker
+- **Unnecessary restarts**: file watchers should be smart about what changes actually require a server restart vs a
+  simple notification
+- **Debouncing**: rapid events (typing, configuration changes, file saves) must be debounced appropriately
+- **Startup time**: activation should be fast — defer expensive work until actually needed
+
+# How you approach work
+
+1. **Read the VS Code API docs**: before implementing or reviewing a feature, check the current API documentation for
+   the correct patterns and any recent changes
+2. **Think about failure modes**: for every happy path, consider what happens when the server is down, the file doesn't
+   exist, the user has a non-standard setup, or the operation is cancelled mid-flight
+3. **Test like a user**: you think about different OS environments, workspace configurations, and settings combinations
+   that real users have — not just the defaults. Consider the perspective of a beginner too
diff -Nru ruby-ruby-lsp-0.26.7/CLAUDE.md ruby-ruby-lsp-0.26.9/CLAUDE.md
--- ruby-ruby-lsp-0.26.7/CLAUDE.md	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/CLAUDE.md	2026-03-25 21:37:12.000000000 +0200
@@ -1,157 +1,79 @@
-# AGENTS.md
+# Project Overview
 
-This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+The Ruby LSP project aims to be a complete solution to provide an IDE-like experience for the Ruby language on VS Code.
+Its parts are:
 
-## Project Overview
+- `ruby-lsp` gem: language server implementation and extra custom functionality to support the VS Code extension. This
+  is the top level of the repository
+- Ruby code indexer: static analysis engine to support features like go to definition, completion and workspace
+  symbols. This is entirely implemented inside `lib/ruby_indexer`
+- Companion VS Code extension that includes several integrations. The extension is entirely implemented in the `vscode`
+  directory
+- Jekyll static documentation site. Fully implemented in `jekyll`
 
-Ruby LSP is a Language Server Protocol implementation for Ruby, providing IDE features across different editors. The project consists of:
-
-- Core Ruby LSP gem (language server implementation)
-- Ruby Indexer (code indexing for navigation)
-- VS Code extension (TypeScript frontend)
-- Documentation site (Jekyll-based)
-
-## Development Commands
-
-### Ruby LSP Core
-
-```bash
-# Run all tests
-bundle exec rake
-
-# Run specific test file
-bin/test test/requests/completion_test.rb
-
-# Run tests matching a pattern
-bin/test test/requests/completion_test.rb test_name_pattern
-
-# Type check with Sorbet
-bundle exec srb tc
-
-# Lint with RuboCop
-bin/rubocop
-
-# Auto-fix RuboCop violations
-bin/rubocop -a
-```
-
-### VS Code Extension
-
-```bash
-cd vscode
-yarn install       # Install dependencies
-yarn run lint      # Lint TypeScript code
-yarn run test      # Run extension tests
-```
-
-### Executables
-
-- `exe/ruby-lsp` - Main language server executable
-- `exe/ruby-lsp-check` - Validation tool
-- `exe/ruby-lsp-launcher` - Experimental launcher
+# Ruby LSP gem
 
 ## Architecture
 
-### Server Structure
-
-The server (`lib/ruby_lsp/server.rb`) processes LSP messages and delegates to:
-
-- **Requests** (`lib/ruby_lsp/requests/`) - Handle specific LSP features
-- **Listeners** (`lib/ruby_lsp/listeners/`) - Analyze Ruby code for the specific feature
-- **Response Builders** (`lib/ruby_lsp/response_builders/`) - Construct LSP responses
+The Ruby LSP is organized in components that composed the full language server functionality.
 
-### Key Components
+### Server plumbing
 
-- **Document Store** (`lib/ruby_lsp/document.rb`) - Manages open documents and parsed ASTs
-- **Ruby Indexer** (`lib/ruby_indexer/`) - Indexes Ruby code for navigation features
-- **Addon System** (`lib/ruby_lsp/addon.rb`) - Extensibility framework for third-party addons
+The basic server functionality for communicating with the LSP client, remembering client capabilities, handling requests
+and notifications.
 
-### Design Patterns
+- `lib/ruby_lsp/server.rb`
+- `lib/ruby_lsp/base_server.rb`
+- `lib/ruby_lsp/utils.rb`
+- `lib/ruby_lsp/client_capabilities.rb`
+- `lib/ruby_lsp/global_state.rb`
 
-- **Visitor Pattern**: AST traversal using Prism parser visitors
-- **Request/Response**: Each LSP feature implemented as a request class
-- **Type Safety**: Sorbet signatures throughout (strict for lib/, test for tests)
+### Requests and notifications
 
-### Important Top-Level Files
+Requests and notifications are implemented in an extensible way so that add-ons can contribute to the base features
+provided.
 
-#### Core Server Components
+- `lib/ruby_lsp/requests/`: base request implementations
+- `lib/ruby_lsp/listeners/`: static analysis logic, implementing through listeners. Traversal of ASTs is performed by a
+  `Prism::Dispatcher` and listeners register for the node events that they are interested in handling. This allows
+  listeners to encapsulate distinct logic without having to perform multiple traversals of the AST
+- `lib/ruby_lsp/response_builders/`: builder pattern to allow multiple listeners to contribute to the same language
+  server response
 
-- **`lib/ruby_lsp/server.rb`** - Main LSP server handling all client requests and message routing
-- **`lib/ruby_lsp/base_server.rb`** - Abstract base with core LSP infrastructure (message I/O, worker threads)
-- **`lib/ruby_lsp/global_state.rb`** - Central configuration and state management (formatters, linters, client capabilities)
-- **`lib/ruby_lsp/store.rb`** - Document storage and lifecycle management
+### Document storage
 
-#### Document Handling
+Document related information is saved in a hash stored of `{ uri => Document }`. The language server handles Ruby, RBS
+and ERB files to provide Ruby features.
 
-- **`lib/ruby_lsp/document.rb`** - Abstract base for all document types (versioning, edits, encoding)
-- **`lib/ruby_lsp/ruby_document.rb`** - Ruby source file handling with Prism parsing
-- **`lib/ruby_lsp/erb_document.rb`** - ERB template file handling
-- **`lib/ruby_lsp/rbs_document.rb`** - RBS type definition file handling
+- `lib/ruby_lsp/store.rb`: document storage
+- `lib/ruby_lsp/document.rb`: base document class
+- `lib/ruby_lsp/ruby_document.rb`: Ruby document handling
+- `lib/ruby_lsp/erb_document.rb`: ERB document handling
+- `lib/ruby_lsp/rbs_document.rb`: RBS document handling
 
-#### Supporting Infrastructure
+### Add-on system
 
-- **`lib/ruby_lsp/addon.rb`** - Extension framework for third-party add-ons
-- **`lib/ruby_lsp/node_context.rb`** - AST node context information (nesting, scope)
-- **`lib/ruby_lsp/type_inferrer.rb`** - Type inference functionality
-- **`lib/ruby_lsp/client_capabilities.rb`** - Client feature capability tracking
+The Ruby LSP includes an add-on system that allows other gems to define callbacks and listeners that can contribute to
+features provided in the editor.
 
-### Component Interaction Flow
+Examples:
 
-```mermaid
-graph TD
-    Client[VS Code/Editor Client]
-    Server[server.rb<br/>Main LSP Server]
-    BaseServer[base_server.rb<br/>Message I/O & Threading]
-    GlobalState[global_state.rb<br/>Configuration & State]
-    Store[store.rb<br/>Document Manager]
+- Contributing a code lens button to jump from Rails controller action to corresponding view
+- Contributing location results when trying to go to definition on the symbol used to define a Rails callback
+- Contributing diagnostics and formatting for a specific linting tool
+- Displaying a window message warning
 
-    RubyDoc[ruby_document.rb<br/>Ruby Files]
-    ERBDoc[erb_document.rb<br/>ERB Templates]
-    RBSDoc[rbs_document.rb<br/>RBS Types]
+- `lib/ruby_lsp/addon.rb`: major implementation of the add-on system. Feature contributions are connected to listeners
+  and response builders
 
-    Requests[requests/*<br/>Feature Handlers]
-    Listeners[listeners/*<br/>AST Analyzers]
-    Indexer[ruby_indexer/*<br/>Symbol Index]
+## Testing
 
-    Addon[addon.rb<br/>Extension System]
-    NodeContext[node_context.rb<br/>AST Context]
+The gem uses a mix of unit tests, which are pure Ruby, and a custom built framework that matches response expectation to
+fixture files.
 
-    Client <-->|LSP Protocol| Server
-    Server -.->|inherits| BaseServer
-    Server --> GlobalState
-    Server --> Store
-    Server --> Requests
-    Server --> Addon
-
-    GlobalState --> Requests
-    Document --> Requests
-
-    Store --> RubyDoc
-    Store --> ERBDoc
-    Store --> RBSDoc
-
-    RubyDoc -.->|inherits| Document[document.rb]
-    ERBDoc -.->|inherits| Document
-    RBSDoc -.->|inherits| Document
-
-    Requests --> Listeners
-    Requests --> NodeContext
-    Listeners --> Indexer
-
-    Addon -->|extends| Requests
-
-    style Server fill:#f9f,stroke:#333,stroke-width:4px
-    style GlobalState fill:#9ff,stroke:#333,stroke-width:2px
-    style Store fill:#9ff,stroke:#333,stroke-width:2px
-    style Indexer fill:#ff9,stroke:#333,stroke-width:2px
-```
-
-## Testing Approach
-
-Tests use expectation-based patterns:
+For request or notification related tests that aren't using fixtures, the structure should use the provided test helpers:
 
 ```ruby
-# Tests typically follow this structure:
 def test_feature_name
   source = <<~RUBY
     # Ruby code to test
@@ -164,36 +86,15 @@
 end
 ```
 
-Test fixtures are in `test/fixtures/` and expectations in `test/expectations/`.
-
-## Common Development Tasks
+The custom built framework runs all language server features against the files in `test/fixtures`. If there's a file
+with the same name under `test/expectations`, it will assert that the response matches what is expected for each request
+that has an expectation file. If there aren't any expectation files, the feature will still run against the fixture to
+verify that it does not raise. Fixture files are simply Ruby and expectation files are JSON ending in `.exp.json`.
 
-### Adding a New LSP Feature
+## Type checking
 
-1. Create request class in `lib/ruby_lsp/requests/`
-2. Register in `lib/ruby_lsp/executor.rb`
-3. Add tests in `test/requests/`
-4. Update VS Code extension if needed
-
-### Working with the Indexer
-
-The Ruby Indexer (`lib/ruby_indexer/`) handles:
-
-- Building symbol tables for classes, modules, methods, and constants
-- Resolving constant references and method calls
-- Finding definitions across files
-- Providing completion candidates for constants and methods
-- Dealing with inheritance and ancestor linearization
-
-### Typechecking with Sorbet
-
-Ruby LSP uses Sorbet (typed: strict) with inline RBS annotations for static typechecking.
-
-**Key Guidelines:**
-
-- Use RBS inline annotations (`#:`) exclusively - never use RBI style `sig { }`
-- Place type annotations immediately before method definitions or after variable assignments
-- Run `bundle exec srb tc` to ensure typechecking passes
+The Ruby LSP codebase is fully typed with Sorbet's typed strict sigils using inline comment RBS annotations and RBI
+files.
 
 **Common RBS Patterns:**
 
@@ -221,4 +122,81 @@
 result = nil #: (String | Symbol)?
 ```
 
-**Type Syntax Reference:** <https://sorbet.org/docs/rbs-support>
+Type syntax reference: https://sorbet.org/docs/rbs-support
+
+
+## Commands
+
+```bash
+# Run all tests
+bundle exec rake
+
+# Run specific test file
+bin/test test/requests/completion_test.rb
+
+# Run tests matching a pattern
+bin/test test/requests/completion_test.rb test_name_pattern
+
+# Type check with Sorbet
+bundle exec srb tc
+
+# Lint with RuboCop
+bin/rubocop
+
+# Auto-fix RuboCop violations
+bin/rubocop -a
+```
+
+# VS Code extension
+
+The VS Code extension provides several integrations, some of which interact with the language server.
+
+## Architecture
+
+The extension's entrypoint is implemented in `vscode/src/extension.ts` and `vscode/src/rubyLsp.ts`. This is where we
+handle activation, detecting workspaces, registering commands and subscribers.
+
+### Integrations
+
+- Language server client: `vscode/src/client.ts`
+- LLM chat agent: `vscode/src/chatAgent.ts`
+- Debug gem client: `vscode/src/debugger.ts`
+- Dependencies view: `vscode/src/dependenciesTree.ts` (integrates with language server)
+
+### Version manager integrations
+
+A critical part of the extension is integrating with version managers. This is necessary because the Ruby LSP server is
+a Ruby process that requires gems from the user's application (such as their formatter or linter). In order to require
+the correct version of the gems being used, the environment being used in the extension must match exactly the
+environment of the user's shell. Otherwise, `bundle install` might fail or key environment variables like `$GEM_HOME`
+might be pointing to the wrong path.
+
+- `vscode/src/ruby.ts`: the main Ruby environment handling object
+- `vscode/src/ruby/*.ts`: all supported version manager integrations
+
+### Test explorer
+
+The Ruby LSP's implementation of the VS Code test explorer allows handling any Ruby test framework by add-on
+contributions. The explorer connects to the LSP client to be able to ask questions about test files and determine which
+groups and examples exist in the codebase. This infrastructure is all custom built with language server custom requests.
+
+While tests are running, the Ruby LSP server hooks into the process with an LSP test reporter to stream events through a
+TCP socket, so that the explorer is able to show the status of each test (extension is the TCP server and the test process
+is the client).
+
+- `vscode/src/testController.ts` and `vscode/src/streamingRunner.ts`: extension side implementation of test explorer and
+  streaming event server
+- `lib/ruby_lsp/test_reporters/lsp_reporter.rb`: LSP reporter implementation
+- `lib/ruby_lsp/test_reporters/minitest_reporter.rb`: Minitest reporter integration
+- `lib/ruby_lsp/test_reporters/test_unit_reporter.rb`: Test Unit reporter integration
+- `lib/ruby_lsp/listeners/test_style.rb`: Minitest and Test Unit test discovery and command resolution for test style
+  (classes with method definitions)
+- `lib/ruby_lsp/listeners/spec_style.rb`: Minitest test discovery and command resolution for the spec style (describe,
+  it)
+
+## Commands
+
+```bash
+yarn run lint # Lint TypeScript code
+yarn run test # Run extension tests
+```
diff -Nru ruby-ruby-lsp-0.26.7/debian/changelog ruby-ruby-lsp-0.26.9/debian/changelog
--- ruby-ruby-lsp-0.26.7/debian/changelog	2026-03-01 16:35:02.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/debian/changelog	2026-05-02 13:18:57.000000000 +0300
@@ -1,3 +1,12 @@
+ruby-ruby-lsp (0.26.9-0.1) unstable; urgency=medium
+
+  * Non-maintainer upload.
+  * New upstream release.
+    - CVE-2026-34060: Arbitrary code execution through branch setting
+      (Closes: #1132583)
+
+ -- Adrian Bunk <bunk@debian.org>  Sat, 02 May 2026 13:18:57 +0300
+
 ruby-ruby-lsp (0.26.7-1) unstable; urgency=medium
 
   * Use GitHub in the watch file.
diff -Nru ruby-ruby-lsp-0.26.7/exe/ruby-lsp ruby-ruby-lsp-0.26.9/exe/ruby-lsp
--- ruby-ruby-lsp-0.26.7/exe/ruby-lsp	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/exe/ruby-lsp	2026-03-25 21:37:12.000000000 +0200
@@ -3,7 +3,6 @@
 
 require "optparse"
 
-original_args = ARGV.dup
 options = {}
 parser = OptionParser.new do |opts|
   opts.banner = "Usage: ruby-lsp [options]"
@@ -22,13 +21,6 @@
     options[:time_index] = true
   end
 
-  opts.on(
-    "--branch [BRANCH]",
-    "Launch the Ruby LSP using the specified branch rather than the release version",
-  ) do |branch|
-    options[:branch] = branch
-  end
-
   opts.on("--doctor", "Run troubleshooting steps") do
     options[:doctor] = true
   end
@@ -37,6 +29,10 @@
     options[:launcher] = true
   end
 
+  opts.on("--beta", "Use pre-release server gems") do
+    options[:beta] = true
+  end
+
   opts.on("-h", "--help", "Print this help") do
     puts opts.help
     puts
@@ -46,7 +42,7 @@
 end
 
 begin
-  parser.parse!
+  parser.parse(ARGV)
 rescue OptionParser::InvalidOption => e
   warn(e)
   warn("")
@@ -66,6 +62,7 @@
   if options[:launcher]
     flags = []
     flags << "--debug" if options[:debug]
+    flags << "--beta" if options[:beta]
     exit exec(Gem.ruby, File.expand_path("ruby-lsp-launcher", __dir__), *flags)
   end
 
@@ -85,7 +82,7 @@
     base_command << " _#{env["BUNDLER_VERSION"]}_"
   end
 
-  exit exec(env, "#{base_command} exec ruby-lsp #{original_args.join(" ")}".strip)
+  exit exec(env, "#{base_command} exec ruby-lsp #{ARGV.join(" ")}".strip)
 end
 
 $stdin.sync = true
diff -Nru ruby-ruby-lsp-0.26.7/exe/ruby-lsp-launcher ruby-ruby-lsp-0.26.9/exe/ruby-lsp-launcher
--- ruby-ruby-lsp-0.26.7/exe/ruby-lsp-launcher	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/exe/ruby-lsp-launcher	2026-03-25 21:37:12.000000000 +0200
@@ -20,6 +20,10 @@
 workspace_uri = ARGV.first
 raw_initialize_path = File.join(".ruby-lsp", "raw_initialize")
 
+# Extract CLI options that affect bundle composition (e.g. --beta) from the arguments passed by the server
+cli_options = {}
+cli_options[:beta] = true if ARGV.include?("--beta")
+
 raw_initialize = if workspace_uri && !workspace_uri.start_with?("--")
   # If there's an argument without `--`, then it's the server asking to compose the bundle and passing to this
   # executable the workspace URI. We can't require gems at this point, so we built a fake initialize request manually
@@ -49,16 +53,20 @@
     ["-I", File.expand_path(path)]
   end
 
+  cli_flags = []
+  cli_flags << "--beta" if cli_options[:beta]
+
   Process.spawn(
     Gem.ruby,
     *load_path,
     File.expand_path("../lib/ruby_lsp/scripts/compose_bundle_windows.rb", __dir__),
     raw_initialize,
+    *cli_flags,
   )
 else
   fork do
     require_relative "../lib/ruby_lsp/scripts/compose_bundle"
-    compose(raw_initialize)
+    compose(raw_initialize, **cli_options)
   end
 end
 
diff -Nru ruby-ruby-lsp-0.26.7/Gemfile.lock ruby-ruby-lsp-0.26.9/Gemfile.lock
--- ruby-ruby-lsp-0.26.7/Gemfile.lock	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/Gemfile.lock	2026-03-25 21:37:12.000000000 +0200
@@ -1,7 +1,7 @@
 PATH
   remote: .
   specs:
-    ruby-lsp (0.26.7)
+    ruby-lsp (0.26.9)
       language_server-protocol (~> 3.17.0)
       prism (>= 1.2, < 2.0)
       rbs (>= 3, < 5)
@@ -18,8 +18,9 @@
     erb (6.0.1)
     erubi (1.13.1)
     io-console (0.8.2)
-    irb (1.16.0)
+    irb (1.17.0)
       pp (>= 0.6.0)
+      prism (>= 1.3.0)
       rdoc (>= 4.0.0)
       reline (>= 0.4.2)
     json (2.18.0)
@@ -54,7 +55,7 @@
       logger
       prism (>= 1.3.0)
       tsort
-    rdoc (7.0.3)
+    rdoc (7.2.0)
       erb
       psych (>= 4.0.0)
       tsort
@@ -90,14 +91,14 @@
       rubocop (>= 1)
     ruby-progressbar (1.13.0)
     ruby2_keywords (0.0.5)
-    sorbet (0.6.12913)
-      sorbet-static (= 0.6.12913)
-    sorbet-runtime (0.6.12913)
-    sorbet-static (0.6.12913-universal-darwin)
-    sorbet-static (0.6.12913-x86_64-linux)
-    sorbet-static-and-runtime (0.6.12913)
-      sorbet (= 0.6.12913)
-      sorbet-runtime (= 0.6.12913)
+    sorbet (0.6.13055)
+      sorbet-static (= 0.6.13055)
+    sorbet-runtime (0.6.13055)
+    sorbet-static (0.6.13055-universal-darwin)
+    sorbet-static (0.6.13055-x86_64-linux)
+    sorbet-static-and-runtime (0.6.13055)
+      sorbet (= 0.6.13055)
+      sorbet-runtime (= 0.6.13055)
     spoom (1.7.11)
       erubi (>= 1.10.0)
       prism (>= 0.28.0)
@@ -164,7 +165,7 @@
   erb (6.0.1) sha256=28ecdd99c5472aebd5674d6061e3c6b0a45c049578b071e5a52c2a7f13c197e5
   erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
   io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
-  irb (1.16.0) sha256=2abe56c9ac947cdcb2f150572904ba798c1e93c890c256f8429981a7675b0806
+  irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae
   json (2.18.0) sha256=b10506aee4183f5cf49e0efc48073d7b75843ce3782c68dbeb763351c08fd505
   language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
   lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
@@ -185,7 +186,7 @@
   rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
   rbi (0.3.9) sha256=d6a187bd0b376e999d3d82a5e5798a61178be98b894b7b35741c14162c9ea015
   rbs (4.0.0.dev.5) sha256=273938e5a9c7f06b041be583588f2aa1976149bda2ce213e33e129c51534e174
-  rdoc (7.0.3) sha256=dfe3d0981d19b7bba71d9dbaeb57c9f4e3a7a4103162148a559c4fc687ea81f9
+  rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
   regexp_parser (2.10.0) sha256=cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61
   reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
   require-hooks (0.2.3) sha256=224be5b4be0fd2a47cb73286c500da366704a54ec195b6627366380c950efac8
@@ -196,14 +197,14 @@
   rubocop-rake (0.7.1) sha256=3797f2b6810c3e9df7376c26d5f44f3475eda59eb1adc38e6f62ecf027cbae4d
   rubocop-shopify (2.17.1) sha256=03850eb1a9c4d1f9f0ac1d8d5aa51bb47a149e532cfb5e8d02ac6a90c8800a5f
   rubocop-sorbet (0.8.7) sha256=670b7478425543e808558c5aa9acafeb5c9137af9ac8d3541b69d3d18ea4726b
-  ruby-lsp (0.26.7)
+  ruby-lsp (0.26.9)
   ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
   ruby2_keywords (0.0.5) sha256=ffd13740c573b7301cf7a2e61fc857b2a8e3d3aff32545d6f8300d8bae10e3ef
-  sorbet (0.6.12913) sha256=259e28215af2b80bf530d3b6af1c509ddadcdef6fa34417a9afd315f76d4eaf4
-  sorbet-runtime (0.6.12913) sha256=b07b29c4070e7729fcda55f42ca2cf76ed369537be6680b36208e66c17934ff1
-  sorbet-static (0.6.12913-universal-darwin) sha256=bc064e1930f3736d7f7ded8ff7631c43d8d66681540be7103e1a3faaa08cc10f
-  sorbet-static (0.6.12913-x86_64-linux) sha256=8c9db957392b706e85c2e597ede567e64d46859dd6ae3ef9901e3894e971a49c
-  sorbet-static-and-runtime (0.6.12913) sha256=63b3c66aa107b4b1aea689b23690ad4d8b1a7b29f6cfcd16222fa1c436c555c9
+  sorbet (0.6.13055) sha256=5f5e8f37c13c281fa2b2f95e261d2e531d8331ddcc8e2dd8c4f16457935872ec
+  sorbet-runtime (0.6.13055) sha256=c8ae8c81310e0a28d290b11f44ddca59659b7d7f13752c0ef5d16964bbb84d18
+  sorbet-static (0.6.13055-universal-darwin) sha256=649c8e79a443be85318922f9ecbb46be72f6c585443f4440c4ec0fb1737c86e8
+  sorbet-static (0.6.13055-x86_64-linux) sha256=01b6941106dadb334a87d56afce1a5fffcdcf5de21c718858975b666a624bfb1
+  sorbet-static-and-runtime (0.6.13055) sha256=050f9ef00dda7578a2de729cf3a1accf3111eca23671e3a5a9adfd563d197fb7
   spoom (1.7.11) sha256=4e27384af6d3fde5aadc0287c51e6f76c0802259cbb3b6a67603bf718352f4cf
   stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
   syntax_tree (6.3.0) sha256=56e25a9692c798ec94c5442fe94c5e94af76bef91edc8bb02052cbdecf35f13d
diff -Nru ruby-ruby-lsp-0.26.7/.github/workflows/ci.yml ruby-ruby-lsp-0.26.9/.github/workflows/ci.yml
--- ruby-ruby-lsp-0.26.7/.github/workflows/ci.yml	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.github/workflows/ci.yml	2026-03-25 21:37:12.000000000 +0200
@@ -11,7 +11,7 @@
       - name: Set up Node
         env:
           DISABLE_V8_COMPILE_CACHE: "1"
-        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
         with:
           node-version: "22.21"
 
@@ -27,7 +27,7 @@
           submodules: "recursive"
 
       - name: Set up Ruby
-        uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+        uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         with:
           bundler-cache: true
 
@@ -53,16 +53,8 @@
         with:
           submodules: "recursive"
 
-      # Workaround: The ubuntu-latest runner image (20260126.10+) ships a pre-installed Ruby 4.0.1
-      # that causes native extension builds and bundler operations to fail. Removing it forces
-      # setup-ruby to download a working build from ruby-builder instead.
-      # See https://github.com/ruby/rubygems/issues/9284.
-      - name: Remove pre-installed Ruby 4.0
-        if: matrix.os == 'ubuntu-latest' && matrix.ruby == '4.0'
-        run: rm -rf /opt/hostedtoolcache/Ruby/4.0*
-
       - name: Set up Ruby
-        uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+        uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         with:
           ruby-version: ${{ matrix.ruby }}
           bundler-cache: true
@@ -78,7 +70,7 @@
       - name: Set up Node
         env:
           DISABLE_V8_COMPILE_CACHE: "1"
-        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
         with:
           node-version: "22.21"
           cache: "yarn"
@@ -100,7 +92,7 @@
       - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
 
       - name: Set up Node
-        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+        uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
         env:
           DISABLE_V8_COMPILE_CACHE: 1
         with:
@@ -110,7 +102,7 @@
 
       # We need some Ruby installed for the environment activation tests
       - name: Set up Ruby
-        uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+        uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         with:
           bundler-cache: true
           cache-version: 3
@@ -153,7 +145,7 @@
       - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
 
       - name: Set up Ruby
-        uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+        uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         with:
           bundler-cache: true
           working-directory: ./jekyll
diff -Nru ruby-ruby-lsp-0.26.7/.github/workflows/dependabot_update_rbis.yml ruby-ruby-lsp-0.26.9/.github/workflows/dependabot_update_rbis.yml
--- ruby-ruby-lsp-0.26.7/.github/workflows/dependabot_update_rbis.yml	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.github/workflows/dependabot_update_rbis.yml	2026-03-25 21:37:12.000000000 +0200
@@ -21,7 +21,7 @@
         with:
           ref: ${{ github.head_ref }}
           token: ${{ secrets.SHOPIFY_GH_ACCESS_TOKEN }}
-      - uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+      - uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         id: setup
         with:
           bundler-cache: true
diff -Nru ruby-ruby-lsp-0.26.7/.github/workflows/indexing.yml ruby-ruby-lsp-0.26.9/.github/workflows/indexing.yml
--- ruby-ruby-lsp-0.26.7/.github/workflows/indexing.yml	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.github/workflows/indexing.yml	2026-03-25 21:37:12.000000000 +0200
@@ -17,7 +17,7 @@
       - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
 
       - name: Set up Ruby
-        uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+        uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         with:
           bundler-cache: true
 
diff -Nru ruby-ruby-lsp-0.26.7/.github/workflows/publish_docs.yml ruby-ruby-lsp-0.26.9/.github/workflows/publish_docs.yml
--- ruby-ruby-lsp-0.26.7/.github/workflows/publish_docs.yml	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.github/workflows/publish_docs.yml	2026-03-25 21:37:12.000000000 +0200
@@ -17,7 +17,7 @@
       - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
 
       - name: Set up Ruby
-        uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+        uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         with:
           bundler-cache: true
           working-directory: ./jekyll
diff -Nru ruby-ruby-lsp-0.26.7/.github/workflows/release_extension.yml ruby-ruby-lsp-0.26.9/.github/workflows/release_extension.yml
--- ruby-ruby-lsp-0.26.7/.github/workflows/release_extension.yml	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.github/workflows/release_extension.yml	2026-03-25 21:37:12.000000000 +0200
@@ -15,7 +15,7 @@
       - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
         name: Checkout
 
-      - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
+      - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
         name: Use Node.js
         env:
           DISABLE_V8_COMPILE_CACHE: "1"
diff -Nru ruby-ruby-lsp-0.26.7/.github/workflows/release_gem.yml ruby-ruby-lsp-0.26.9/.github/workflows/release_gem.yml
--- ruby-ruby-lsp-0.26.7/.github/workflows/release_gem.yml	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.github/workflows/release_gem.yml	2026-03-25 21:37:12.000000000 +0200
@@ -24,12 +24,12 @@
           persist-credentials: false
 
       - name: Set up Ruby
-        uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
+        uses: ruby/setup-ruby@319994f95fa847cf3fb3cd3dbe89f6dcde9f178f # v1.295.0
         with:
           bundler-cache: true
 
       - name: Release gem on RubyGems.org
-        uses: rubygems/release-gem@1c162a739e8b4cb21a676e97b087e8268d8fc40b # v1.1.2
+        uses: rubygems/release-gem@e9a6361a0b14562539327c2a02373edc56dd3169 # v1.1.4
 
   release_github:
     name: Create GitHub release
diff -Nru ruby-ruby-lsp-0.26.7/.github/workflows/stale_check.yml ruby-ruby-lsp-0.26.9/.github/workflows/stale_check.yml
--- ruby-ruby-lsp-0.26.7/.github/workflows/stale_check.yml	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/.github/workflows/stale_check.yml	2026-03-25 21:37:12.000000000 +0200
@@ -11,7 +11,7 @@
     runs-on: ubuntu-latest
     if: github.repository == 'Shopify/ruby-lsp'
     steps:
-      - uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
+      - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0
         with:
           days-before-stale: 60
           days-before-close: 14
diff -Nru ruby-ruby-lsp-0.26.7/jekyll/editors.markdown ruby-ruby-lsp-0.26.9/jekyll/editors.markdown
--- ruby-ruby-lsp-0.26.7/jekyll/editors.markdown	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/jekyll/editors.markdown	2026-03-25 21:37:12.000000000 +0200
@@ -325,6 +325,22 @@
 
 Documentation can be found in [Setting up Ruby LSP](https://zed.dev/docs/languages/ruby#setting-up-ruby-lsp).
 
+To configure an add-on, add the `addonSettings` configuration within `initialization_options`, for example:
+
+```json
+"lsp": {
+  "ruby-lsp": {
+    "initialization_options": {
+      "addonSettings": {
+        "Ruby LSP Rails": {
+          "enablePendingMigrationsPrompt": false
+        }
+      }
+    }
+  }
+}
+```
+
 ## RubyMine
 
 You can use the Ruby LSP with RubyMine (or IntelliJ IDEA Ultimate) through the following plugin.
diff -Nru ruby-ruby-lsp-0.26.7/jekyll/Gemfile.lock ruby-ruby-lsp-0.26.9/jekyll/Gemfile.lock
--- ruby-ruby-lsp-0.26.7/jekyll/Gemfile.lock	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/jekyll/Gemfile.lock	2026-03-25 21:37:12.000000000 +0200
@@ -62,7 +62,7 @@
       jekyll (>= 3.8, < 5.0)
     jekyll-watch (2.2.1)
       listen (~> 3.0)
-    json (2.18.0)
+    json (2.19.2)
     just-the-docs (0.12.0)
       jekyll (>= 3.8.5)
       jekyll-include-cache
diff -Nru ruby-ruby-lsp-0.26.7/jekyll/semantic-highlighting.markdown ruby-ruby-lsp-0.26.9/jekyll/semantic-highlighting.markdown
--- ruby-ruby-lsp-0.26.7/jekyll/semantic-highlighting.markdown	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/jekyll/semantic-highlighting.markdown	2026-03-25 21:37:12.000000000 +0200
@@ -43,7 +43,7 @@
 | Method calls with any syntax  | method | |
 | Constant references (including classes and modules)  | namespace | We don't yet differentiate between module and class references |
 | Method definition  | method.declaration | |
-| self  | variable.default_library | |
+| self  | variable.defaultLibrary | |
 | Method, block and lambda arguments | parameter | |
 | Class declaration | class.declaration | |
 | Module declaration | class.declaration | |
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/base_server.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/base_server.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/base_server.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/base_server.rb	2026-03-25 21:37:12.000000000 +0200
@@ -165,18 +165,20 @@
 
       # Check if the request was cancelled before trying to process it
       @global_state.synchronize do
-        if id && @cancelled_requests.include?(id)
+        if id && @cancelled_requests.delete(id)
           send_message(Error.new(
             id: id,
             code: Constant::ErrorCodes::REQUEST_CANCELLED,
             message: "Request #{id} was cancelled",
           ))
-          @cancelled_requests.delete(id)
+
           return
         end
       end
 
       process_message(message)
+      # Ensure we remove the request if it got cancelled while it was being processed
+      @cancelled_requests.delete(id)
     end
 
     #: ((Result | Error | Notification | Request) message) -> void
@@ -197,7 +199,7 @@
 
     #: (String message, ?type: Integer) -> void
     def send_log_message(message, type: Constant::MessageType::LOG)
-      send_message(Notification.window_log_message(message, type: Constant::MessageType::LOG))
+      send_message(Notification.window_log_message(message, type: type))
     end
   end
 end
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/listeners/document_link.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/listeners/document_link.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/listeners/document_link.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/listeners/document_link.rb	2026-03-25 21:37:12.000000000 +0200
@@ -60,6 +60,7 @@
         @lines_to_comments = comments.to_h do |comment|
           [comment.location.end_line, comment]
         end #: Hash[Integer, Prism::Comment]
+        @sig_comments = {} #: Hash[Integer, Prism::Comment]
 
         dispatcher.register(
           self,
@@ -68,9 +69,20 @@
           :on_module_node_enter,
           :on_constant_write_node_enter,
           :on_constant_path_write_node_enter,
+          :on_call_node_enter,
         )
       end
 
+      #: (Prism::CallNode node) -> void
+      def on_call_node_enter(node)
+        return unless node.name == :sig
+
+        comment = @lines_to_comments[node.location.start_line - 1]
+        return unless comment
+
+        @sig_comments[node.location.end_line] = comment
+      end
+
       #: (Prism::DefNode node) -> void
       def on_def_node_enter(node)
         extract_document_link(node)
@@ -100,7 +112,7 @@
 
       #: (Prism::Node node) -> void
       def extract_document_link(node)
-        comment = @lines_to_comments[node.location.start_line - 1]
+        comment = @lines_to_comments[node.location.start_line - 1] || @sig_comments[node.location.start_line - 1]
         return unless comment
 
         match = comment.location.slice.match(%r{(source://.*#\d+|pkg:gem/.*#.*)$})
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/listeners/semantic_highlighting.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/listeners/semantic_highlighting.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/listeners/semantic_highlighting.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/listeners/semantic_highlighting.rb	2026-03-25 21:37:12.000000000 +0200
@@ -94,7 +94,7 @@
 
       #: (Prism::MatchWriteNode node) -> void
       def on_match_write_node_leave(node)
-        @inside_regex_capture = true if node.call.message == "=~"
+        @inside_regex_capture = false if node.call.message == "=~"
       end
 
       #: (Prism::DefNode node) -> void
@@ -162,7 +162,7 @@
 
       #: (Prism::SelfNode node) -> void
       def on_self_node_enter(node)
-        @response_builder.add_token(node.location, :variable, [:default_library])
+        @response_builder.add_token(node.location, :variable, [:defaultLibrary])
       end
 
       #: (Prism::LocalVariableWriteNode node) -> void
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/response_builders/semantic_highlighting.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/response_builders/semantic_highlighting.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/response_builders/semantic_highlighting.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/response_builders/semantic_highlighting.rb	2026-03-25 21:37:12.000000000 +0200
@@ -43,7 +43,7 @@
         async: 6,
         modification: 7,
         documentation: 8,
-        default_library: 9,
+        defaultLibrary: 9,
       }.freeze #: Hash[Symbol, Integer]
 
       #: ((^(Integer arg0) -> Integer | Prism::CodeUnitsCache) code_units_cache) -> void
@@ -184,8 +184,8 @@
         end
 
         # Encode an array of modifiers to positions onto a bit flag
-        # For example, [:default_library] will be encoded as
-        # 0b1000000000, as :default_library is the 10th bit according
+        # For example, [:defaultLibrary] will be encoded as
+        # 0b1000000000, as :defaultLibrary is the 10th bit according
         # to the token modifiers index map.
         #: (Array[Integer] modifiers) -> Integer
         def encode_modifiers(modifiers)
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/scripts/compose_bundle.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/scripts/compose_bundle.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/scripts/compose_bundle.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/scripts/compose_bundle.rb	2026-03-25 21:37:12.000000000 +0200
@@ -1,7 +1,7 @@
 # typed: true
 # frozen_string_literal: true
 
-def compose(raw_initialize)
+def compose(raw_initialize, **options)
   require_relative "../setup_bundler"
   require "json"
   require "uri"
@@ -12,7 +12,7 @@
   workspace_path = workspace_uri && URI(workspace_uri).to_standardized_path
   workspace_path ||= Dir.pwd
 
-  env = RubyLsp::SetupBundler.new(workspace_path, launcher: true).setup!
+  env = RubyLsp::SetupBundler.new(workspace_path, launcher: true, **options).setup!
 
   File.open(File.join(".ruby-lsp", "bundle_env"), "w") do |f|
     f.flock(File::LOCK_EX)
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/scripts/compose_bundle_windows.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/scripts/compose_bundle_windows.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/scripts/compose_bundle_windows.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/scripts/compose_bundle_windows.rb	2026-03-25 21:37:12.000000000 +0200
@@ -5,4 +5,6 @@
 
 # When this is invoked on Windows, we pass the raw initialize as an argument to this script. On other platforms, we
 # invoke the compose method from inside a forked process
-compose(ARGV.first)
+options = {}
+options[:beta] = true if ARGV.include?("--beta")
+compose(ARGV.first, **options)
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/server.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/server.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/server.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/server.rb	2026-03-25 21:37:12.000000000 +0200
@@ -3,6 +3,8 @@
 
 module RubyLsp
   class Server < BaseServer
+    NON_REPORTABLE_SETUP_ERRORS = [Bundler::GemNotFound, Bundler::GitError].freeze #: Array[singleton(StandardError)]
+
     # Only for testing
     #: GlobalState
     attr_reader :global_state
@@ -315,7 +317,7 @@
 
       global_state_notifications.each { |notification| send_message(notification) }
 
-      if @setup_error
+      if @setup_error && NON_REPORTABLE_SETUP_ERRORS.none? { |error_class| @setup_error.is_a?(error_class) }
         send_message(Notification.telemetry(
           type: "error",
           errorMessage: @setup_error.message,
@@ -1211,7 +1213,7 @@
             }
           end
         end
-      rescue Bundler::GemNotFound, Bundler::GemfileNotFound
+      rescue Bundler::GemNotFound, Bundler::GemfileNotFound, Errno::ENOENT
         []
       end
 
@@ -1436,6 +1438,7 @@
             ),
             File.expand_path("../../exe/ruby-lsp-launcher", __dir__),
             @global_state.workspace_uri.to_s,
+            *ARGV,
             chdir: @global_state.workspace_path,
           )
         end
diff -Nru ruby-ruby-lsp-0.26.7/lib/ruby_lsp/setup_bundler.rb ruby-ruby-lsp-0.26.9/lib/ruby_lsp/setup_bundler.rb
--- ruby-ruby-lsp-0.26.7/lib/ruby_lsp/setup_bundler.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/lib/ruby_lsp/setup_bundler.rb	2026-03-25 21:37:12.000000000 +0200
@@ -34,12 +34,13 @@
     # Gems that should be kept up to date in the composed bundle. When updating, any of these gems that are not
     # already in the user's Gemfile will be updated together.
     GEMS_TO_UPDATE = ["ruby-lsp", "debug", "prism", "rbs"].freeze #: Array[String]
+    RUBY_LSP_MIN_VERSION = "0.18.0" #: String
 
     #: (String project_path, **untyped options) -> void
     def initialize(project_path, **options)
       @project_path = project_path
-      @branch = options[:branch] #: String?
       @launcher = options[:launcher] #: bool?
+      @beta = options[:beta] #: bool?
       force_output_to_stderr! if @launcher
 
       # Regular bundle paths
@@ -59,7 +60,7 @@
       @custom_dir = Pathname.new(".ruby-lsp").expand_path(@project_path) #: Pathname
       @custom_gemfile = @custom_dir + @gemfile_name #: Pathname
       @custom_lockfile = @custom_dir + (@lockfile&.basename || "Gemfile.lock") #: Pathname
-      @lockfile_hash_path = @custom_dir + "main_lockfile_hash" #: Pathname
+      @freshness_hash_path = @custom_dir + "freshness_hash" #: Pathname
       @last_updated_path = @custom_dir + "last_updated" #: Pathname
       @error_path = @custom_dir + "install_error" #: Pathname
       @already_composed_path = @custom_dir + "bundle_is_composed" #: Pathname
@@ -118,8 +119,14 @@
         return run_bundle_install(@custom_gemfile)
       end
 
-      if @lockfile_hash && @custom_lockfile.exist? && @lockfile_hash_path.exist? &&
-          @lockfile_hash_path.read == @lockfile_hash
+      # Our freshness hash determines if we need to copy the lockfile from the main app again and run bundle install
+      # from scratch. We use a combination of the main app's lockfile and the composed Gemfile. The goal is to
+      # automatically account for CLI arguments which can change the Gemfile we compose. If the CLI arguments or the
+      # main lockfile change, we need to make sure we're re-composing.
+      freshness_digest = Digest::SHA256.hexdigest("#{@lockfile_hash}#{@custom_gemfile.read}")
+
+      if @lockfile_hash && @custom_lockfile.exist? && @freshness_hash_path.exist? &&
+          @freshness_hash_path.read == freshness_digest
         $stderr.puts(
           "Ruby LSP> Skipping composed bundle setup since #{@custom_lockfile} already exists and is up to date",
         )
@@ -129,7 +136,7 @@
       @needs_update_path.delete if @needs_update_path.exist?
       FileUtils.cp(@lockfile.to_s, @custom_lockfile.to_s)
       correct_relative_remote_paths
-      @lockfile_hash_path.write(@lockfile_hash)
+      @freshness_hash_path.write(freshness_digest)
       run_bundle_install(@custom_gemfile)
     end
 
@@ -169,9 +176,8 @@
       end
 
       unless @dependencies["ruby-lsp"]
-        ruby_lsp_entry = +'gem "ruby-lsp", require: false, group: :development'
-        ruby_lsp_entry << ", github: \"Shopify/ruby-lsp\", branch: \"#{@branch}\"" if @branch
-        parts << ruby_lsp_entry
+        version = @beta ? "0.a" : RUBY_LSP_MIN_VERSION
+        parts << "gem \"ruby-lsp\", \">= #{version}\", require: false, group: :development"
       end
 
       unless @dependencies["debug"]
@@ -239,7 +245,7 @@
         # If no error occurred, then clear previous errors
         @error_path.delete if @error_path.exist?
         $stderr.puts("Ruby LSP> Composed bundle installation complete")
-      rescue Errno::EPIPE, Bundler::HTTPError
+      rescue Errno::EPIPE, Bundler::HTTPError, Bundler::InstallError
         # There are cases where we expect certain errors to happen occasionally, and we don't want to write them to
         # a file, which would report to telemetry on the next launch.
         #
@@ -247,6 +253,7 @@
         # install. This situation may happen because, while running bundle install, the server is not yet ready to
         # receive shutdown requests and we may continue doing work until the process is killed.
         # - Bundler might also encounter a network error.
+        # - Native extension build failures (InstallError) are user environment issues that Ruby LSP cannot resolve.
         @error_path.delete if @error_path.exist?
       rescue => e
         # Write the error object to a file so that we can read it from the parent process
diff -Nru ruby-ruby-lsp-0.26.7/sorbet/config ruby-ruby-lsp-0.26.9/sorbet/config
--- ruby-ruby-lsp-0.26.7/sorbet/config	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/sorbet/config	2026-03-25 21:37:12.000000000 +0200
@@ -9,3 +9,4 @@
 --enable-experimental-rbs-comments
 --suppress-error-code=7019
 --cache-dir=sorbet/cache
+--parser=prism
diff -Nru ruby-ruby-lsp-0.26.7/test/expectations/semantic_highlighting/local_var_target_after_regexp_capture.exp.json ruby-ruby-lsp-0.26.9/test/expectations/semantic_highlighting/local_var_target_after_regexp_capture.exp.json
--- ruby-ruby-lsp-0.26.7/test/expectations/semantic_highlighting/local_var_target_after_regexp_capture.exp.json	1970-01-01 02:00:00.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/expectations/semantic_highlighting/local_var_target_after_regexp_capture.exp.json	2026-03-25 21:37:12.000000000 +0200
@@ -0,0 +1,25 @@
+{
+    "result": [
+        {
+            "delta_line": 0,
+            "delta_start_char": 4,
+            "length": 4,
+            "token_type": 8,
+            "token_modifiers": 0
+        },
+        {
+            "delta_line": 1,
+            "delta_start_char": 0,
+            "length": 1,
+            "token_type": 8,
+            "token_modifiers": 0
+        },
+        {
+            "delta_line": 0,
+            "delta_start_char": 3,
+            "length": 1,
+            "token_type": 8,
+            "token_modifiers": 0
+        }
+    ]
+}
diff -Nru ruby-ruby-lsp-0.26.7/test/fixtures/local_var_target_after_regexp_capture.rb ruby-ruby-lsp-0.26.9/test/fixtures/local_var_target_after_regexp_capture.rb
--- ruby-ruby-lsp-0.26.7/test/fixtures/local_var_target_after_regexp_capture.rb	1970-01-01 02:00:00.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/fixtures/local_var_target_after_regexp_capture.rb	2026-03-25 21:37:12.000000000 +0200
@@ -0,0 +1,2 @@
+/(?<name>\\w+)/ =~ "hello"
+a, b = 1, 2
diff -Nru ruby-ruby-lsp-0.26.7/test/integration_test.rb ruby-ruby-lsp-0.26.9/test/integration_test.rb
--- ruby-ruby-lsp-0.26.7/test/integration_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/integration_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -9,6 +9,22 @@
     @bundle_path = Bundler.bundle_path.to_s
   end
 
+  def test_ruby_lsp_flags_parsed_correctly
+    stdout, _stderr, status = Open3.capture3(
+      Gem.ruby, File.join(__dir__, "..", "exe", "ruby-lsp"), "--version"
+    )
+    assert_equal(0, status.exitstatus)
+    assert_match(/\d+\.\d+\.\d+/, stdout)
+  end
+
+  def test_ruby_lsp_invalid_option_rejected
+    _stdout, stderr, status = Open3.capture3(
+      Gem.ruby, File.join(__dir__, "..", "exe", "ruby-lsp"), "--nonexistent"
+    )
+    assert_equal(1, status.exitstatus)
+    assert_match(/invalid option/, stderr)
+  end
+
   def test_ruby_lsp_doctor_works
     skip("CI only") unless ENV["CI"]
 
diff -Nru ruby-ruby-lsp-0.26.7/test/requests/definition_expectations_test.rb ruby-ruby-lsp-0.26.9/test/requests/definition_expectations_test.rb
--- ruby-ruby-lsp-0.26.7/test/requests/definition_expectations_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/requests/definition_expectations_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -7,6 +7,12 @@
 class DefinitionExpectationsTest < ExpectationsTestRunner
   expectations_tests RubyLsp::Requests::Definition, "definition"
 
+  # Skip add-on loading by default — only test_definition_addons needs it
+  def with_server(source = nil, uri = Kernel.URI("file:///fake.rb"), stub_no_typechecker: false, load_addons: false,
+    &block)
+    super
+  end
+
   def run_expectations(source)
     # We need to pretend that Sorbet is not a dependency or else we can't properly test
     with_server(source, stub_no_typechecker: true) do |server, uri|
@@ -229,7 +235,7 @@
     begin
       create_definition_addon
 
-      with_server(source, stub_no_typechecker: true) do |server, uri|
+      with_server(source, stub_no_typechecker: true, load_addons: true) do |server, uri|
         server.global_state.index.index_file(
           URI::Generic.from_path(
             load_path_entry: "#{Dir.pwd}/lib",
diff -Nru ruby-ruby-lsp-0.26.7/test/requests/diagnostics_expectations_test.rb ruby-ruby-lsp-0.26.9/test/requests/diagnostics_expectations_test.rb
--- ruby-ruby-lsp-0.26.7/test/requests/diagnostics_expectations_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/requests/diagnostics_expectations_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -14,7 +14,7 @@
     })
     @global_state.register_formatter(
       "rubocop_internal",
-      RubyLsp::Requests::Support::RuboCopFormatter.new,
+      self.class.cached_rubocop_formatter,
     )
 
     document = RubyLsp::RubyDocument.new(
@@ -81,4 +81,10 @@
       )
     end.to_json
   end
+
+  class << self
+    def cached_rubocop_formatter
+      @cached_rubocop_formatter ||= RubyLsp::Requests::Support::RuboCopFormatter.new
+    end
+  end
 end
diff -Nru ruby-ruby-lsp-0.26.7/test/requests/document_link_expectations_test.rb ruby-ruby-lsp-0.26.9/test/requests/document_link_expectations_test.rb
--- ruby-ruby-lsp-0.26.7/test/requests/document_link_expectations_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/requests/document_link_expectations_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -88,6 +88,34 @@
     end
   end
 
+  def test_source_link_with_single_line_sig_block
+    source = <<~RUBY
+      # source://syntax_tree//lib/syntax_tree.rb#39
+      sig { returns(String) }
+      def foo
+      end
+    RUBY
+
+    links = run_expectations(source)
+    refute_empty(links, "Expected document link for source comment above single-line sig block")
+  end
+
+  def test_source_link_with_multi_line_sig_block
+    source = <<~RUBY
+      # source://syntax_tree//lib/syntax_tree.rb#39
+      sig do
+        params(
+          x: Integer,
+        ).returns(String)
+      end
+      def foo(x)
+      end
+    RUBY
+
+    links = run_expectations(source)
+    refute_empty(links, "Expected document link for source comment above multi-line sig block")
+  end
+
   def test_package_url_links_with_invalid_uris
     source = <<~RUBY
       # pkg:gem/rubocop$1.78.0#:99
diff -Nru ruby-ruby-lsp-0.26.7/test/requests/formatting_expectations_test.rb ruby-ruby-lsp-0.26.9/test/requests/formatting_expectations_test.rb
--- ruby-ruby-lsp-0.26.7/test/requests/formatting_expectations_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/requests/formatting_expectations_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -11,7 +11,7 @@
     @global_state.formatter = "rubocop_internal"
     @global_state.register_formatter(
       "rubocop_internal",
-      RubyLsp::Requests::Support::RuboCopFormatter.new,
+      self.class.cached_rubocop_formatter,
     )
     document = RubyLsp::RubyDocument.new(
       source: source,
@@ -37,4 +37,10 @@
 
   def initialize_params(_expected)
   end
+
+  class << self
+    def cached_rubocop_formatter
+      @cached_rubocop_formatter ||= RubyLsp::Requests::Support::RuboCopFormatter.new
+    end
+  end
 end
diff -Nru ruby-ruby-lsp-0.26.7/test/requests/hover_expectations_test.rb ruby-ruby-lsp-0.26.9/test/requests/hover_expectations_test.rb
--- ruby-ruby-lsp-0.26.7/test/requests/hover_expectations_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/requests/hover_expectations_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -7,6 +7,12 @@
 class HoverExpectationsTest < ExpectationsTestRunner
   expectations_tests RubyLsp::Requests::Hover, "hover"
 
+  # Skip add-on loading by default — only test_hover_addons needs it
+  def with_server(source = nil, uri = Kernel.URI("file:///fake.rb"), stub_no_typechecker: false, load_addons: false,
+    &block)
+    super
+  end
+
   def run_expectations(source)
     position = @__params&.first || { character: 0, line: 0 }
 
@@ -356,7 +362,7 @@
     begin
       create_hover_addon
 
-      with_server(source, stub_no_typechecker: true) do |server, uri|
+      with_server(source, stub_no_typechecker: true, load_addons: true) do |server, uri|
         server.process_message(
           id: 1,
           method: "textDocument/hover",
diff -Nru ruby-ruby-lsp-0.26.7/test/requests/semantic_highlighting_expectations_test.rb ruby-ruby-lsp-0.26.9/test/requests/semantic_highlighting_expectations_test.rb
--- ruby-ruby-lsp-0.26.7/test/requests/semantic_highlighting_expectations_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/requests/semantic_highlighting_expectations_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -82,6 +82,15 @@
     end
   end
 
+  def test_provider_uses_lsp_default_library_modifier_casing
+    token_modifiers = JSON.parse(
+      RubyLsp::Requests::SemanticHighlighting.provider.to_json,
+    ).dig("legend", "tokenModifiers")
+
+    assert_includes(token_modifiers, "defaultLibrary")
+    refute_includes(token_modifiers, "default_library")
+  end
+
   private
 
   def create_semantic_highlighting_addon
diff -Nru ruby-ruby-lsp-0.26.7/test/server_test.rb ruby-ruby-lsp-0.26.9/test/server_test.rb
--- ruby-ruby-lsp-0.26.7/test/server_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/server_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -383,6 +383,24 @@
     assert_empty(@server.pop_response.response)
   end
 
+  def test_workspace_dependencies_returns_empty_response_when_cwd_is_deleted
+    original_dir = Dir.pwd
+
+    begin
+      parent = Dir.mktmpdir
+      workspace = File.join(parent, "workspace")
+      Dir.mkdir(workspace)
+      Dir.chdir(workspace)
+      FileUtils.rm_rf(parent)
+
+      @server.process_message({ id: 1, method: "rubyLsp/workspace/dependencies" })
+
+      assert_empty(@server.pop_response.response)
+    ensure
+      Dir.chdir(original_dir)
+    end
+  end
+
   def test_workspace_dependencies_returns_empty_list_when_there_is_no_bundle
     @server.global_state.expects(:top_level_bundle).returns(false)
     @server.process_message({ id: 1, method: "rubyLsp/workspace/dependencies" })
@@ -412,6 +430,21 @@
     end
   end
 
+  def test_send_log_message_passes_type_parameter
+    @server.expects(:workspace_dependencies).raises(StandardError, "boom")
+
+    capture_io do
+      @server.process_message({
+        id: 1,
+        method: "rubyLsp/workspace/dependencies",
+        params: {},
+      })
+    end
+
+    log = find_message(RubyLsp::Notification, "window/logMessage")
+    assert_equal(RubyLsp::Constant::MessageType::ERROR, log.params.type)
+  end
+
   def test_changed_file_only_indexes_ruby
     path = File.join(Dir.pwd, "lib", "foo.rb")
     File.write(path, "class Foo\nend")
@@ -614,6 +647,21 @@
     assert_match("mocha/exception_raiser.rb", data[:backtrace])
   end
 
+  def test_gem_not_found_setup_error_does_not_send_telemetry
+    RubyLsp::Notification.expects(:telemetry).never
+    run_initialize_server_with_setup_error(Bundler::GemNotFound.new("Could not find gem 'foo'"))
+  end
+
+  def test_git_error_setup_error_does_not_send_telemetry
+    RubyLsp::Notification.expects(:telemetry).never
+    run_initialize_server_with_setup_error(Bundler::GitError.new("Revision abc123 does not exist"))
+  end
+
+  def test_other_setup_errors_are_reported_to_telemetry
+    RubyLsp::Notification.expects(:telemetry).once
+    run_initialize_server_with_setup_error(StandardError.new("something unexpected"))
+  end
+
   def test_handles_editor_indexing_settings
     capture_io do
       @server.process_message({
@@ -873,6 +921,54 @@
     assert_equal("Request 1 was cancelled", error.message)
   end
 
+  def test_requests_cancelled_during_processing_are_deleted_from_cancelled_requests_list
+    uri = URI("file:///foo.rb")
+
+    @server.process_message({
+      method: "textDocument/didOpen",
+      params: {
+        textDocument: {
+          uri: uri,
+          text: "class Foo\nend",
+          version: 1,
+          languageId: "ruby",
+        },
+      },
+    })
+
+    started_processing = Queue.new
+    can_finish = Queue.new
+
+    original = @server.method(:text_document_definition)
+
+    # Simulate the request starting to process, but taking long to finish. It will only finish once there's something in
+    # the `can_finish` queue
+    @server.define_singleton_method(:text_document_definition) do |message|
+      started_processing << true
+      can_finish.pop
+      original.call(message)
+    end
+
+    @server.push_message({
+      id: 1,
+      method: "textDocument/definition",
+      params: {
+        textDocument: { uri: uri },
+        position: { line: 0, character: 6 },
+      },
+    })
+
+    # Only cancel the request once we know it started processing
+    started_processing.pop
+    @server.process_message({ method: "$/cancelRequest", params: { id: 1 } })
+    # Only allow the request to finish once we know it got cancelled
+    can_finish << true
+
+    # Verify we still receive a response and that we cleaned up the cancelled list
+    find_message(RubyLsp::Result, id: 1)
+    assert_empty(@server.instance_variable_get(:@cancelled_requests))
+  end
+
   def test_unsaved_changes_are_indexed_when_computing_automatic_features
     uri = URI("file:///foo.rb")
     index = @server.global_state.index
@@ -1602,8 +1698,52 @@
     assert_match("Document::InvalidLocationError", attributes[:message])
   end
 
+  def test_launch_bundle_compose_forwards_argv_to_launcher
+    original_argv = ARGV.dup
+    ARGV.replace(["--beta"])
+
+    @server.global_state.apply_options({
+      workspaceFolders: [{ uri: URI::Generic.from_path(path: Dir.pwd).to_s }],
+    })
+
+    # Capture the arguments passed to capture3 to verify that we're actually forwarding ARGV. This is important because
+    # the CLI arguments may change the composed Gemfile and thus running an update should not mutate it in incompatible
+    # ways
+    captured_args = nil #: Array[String]?
+    mock_status = mock("status")
+    mock_status.stubs(:exitstatus).returns(0)
+
+    Open3.stubs(:capture3).with do |*args, **_kwargs|
+      captured_args = args
+      true
+    end.returns(["", "", mock_status])
+
+    thread = @server.send(:launch_bundle_compose, "Test") { |_stderr, _status| }
+    thread.join
+
+    assert_includes(captured_args, "--beta")
+  ensure
+    ARGV.replace(original_argv)
+  end
+
   private
 
+  def run_initialize_server_with_setup_error(error)
+    server = RubyLsp::Server.new(test_mode: true, setup_error: error)
+    capture_subprocess_io do
+      server.process_message({
+        id: 1,
+        method: "initialize",
+        params: {
+          initializationOptions: { enabledFeatures: [] },
+          capabilities: { general: { positionEncodings: ["utf-8"] } },
+        },
+      })
+    end
+  ensure
+    server&.run_shutdown
+  end
+
   def wait_for_indexing
     message = @server.pop_response
     until message.is_a?(RubyLsp::Notification) && message.method == "$/progress" &&
diff -Nru ruby-ruby-lsp-0.26.7/test/setup_bundler_test.rb ruby-ruby-lsp-0.26.9/test/setup_bundler_test.rb
--- ruby-ruby-lsp-0.26.7/test/setup_bundler_test.rb	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/test/setup_bundler_test.rb	2026-03-25 21:37:12.000000000 +0200
@@ -74,7 +74,7 @@
           assert_path_exists(".ruby-lsp")
           assert_path_exists(".ruby-lsp/Gemfile")
           assert_path_exists(".ruby-lsp/Gemfile.lock")
-          assert_path_exists(".ruby-lsp/main_lockfile_hash")
+          assert_path_exists(".ruby-lsp/freshness_hash")
           assert_match("ruby-lsp", File.read(".ruby-lsp/Gemfile"))
           assert_match("debug", File.read(".ruby-lsp/Gemfile"))
           refute_match("ruby-lsp-rails", File.read(".ruby-lsp/Gemfile"))
@@ -101,7 +101,7 @@
           assert_path_exists(".ruby-lsp")
           assert_path_exists(".ruby-lsp/Gemfile")
           assert_path_exists(".ruby-lsp/Gemfile.lock")
-          assert_path_exists(".ruby-lsp/main_lockfile_hash")
+          assert_path_exists(".ruby-lsp/freshness_hash")
           assert_match("ruby-lsp", File.read(".ruby-lsp/Gemfile"))
           assert_match("debug", File.read(".ruby-lsp/Gemfile"))
           assert_match("ruby-lsp-rails", File.read(".ruby-lsp/Gemfile"))
@@ -302,20 +302,6 @@
     end
   end
 
-  def test_creates_composed_bundle_with_specified_branch
-    in_temp_dir do |dir|
-      Bundler.with_unbundled_env do
-        stub_bundle_with_env(bundle_env(dir, ".ruby-lsp/Gemfile"))
-        run_script(File.realpath(dir), branch: "test-branch")
-      end
-
-      assert_path_exists(".ruby-lsp")
-      assert_path_exists(".ruby-lsp/Gemfile")
-      assert_match(%r{ruby-lsp.*github: "Shopify/ruby-lsp", branch: "test-branch"}, File.read(".ruby-lsp/Gemfile"))
-      assert_match("debug", File.read(".ruby-lsp/Gemfile"))
-    end
-  end
-
   def test_returns_bundle_app_config_if_there_is_local_config
     in_temp_dir do |dir|
       Bundler.with_unbundled_env do
@@ -538,42 +524,24 @@
 
   def test_recovers_from_stale_lockfiles
     in_temp_dir do |dir|
-      custom_dir = File.join(dir, ".ruby-lsp")
-      FileUtils.mkdir_p(custom_dir)
-
-      # Write the main Gemfile and lockfile with valid versions
       File.write(File.join(dir, "Gemfile"), <<~GEMFILE)
         source "https://rubygems.org"
         gem "stringio"
       GEMFILE
 
-      lockfile_contents = <<~LOCKFILE
-        GEM
-          remote: https://rubygems.org/
-          specs:
-            stringio (3.1.0)
-
-        PLATFORMS
-          arm64-darwin-23
-          ruby
-
-        DEPENDENCIES
-          stringio
-
-        BUNDLED WITH
-          2.5.7
-      LOCKFILE
-      File.write(File.join(dir, "Gemfile.lock"), lockfile_contents)
+      capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          system("bundle install")
 
-      # Write the lockfile hash based on the valid file
-      File.write(File.join(custom_dir, "main_lockfile_hash"), Digest::SHA256.hexdigest(lockfile_contents))
+          # First run to set up the composed bundle correctly, including the freshness hash
+          run_script(dir)
+        end
+      end
 
-      # Write the composed bundle's lockfile using a fake version that doesn't exist to force bundle install to fail
-      File.write(File.join(custom_dir, "Gemfile"), <<~GEMFILE)
-        source "https://rubygems.org"
-        gem "stringio"
-      GEMFILE
-      File.write(File.join(custom_dir, "Gemfile.lock"), <<~LOCKFILE)
+      # Tamper with the composed lockfile using a fake version that doesn't exist to force bundle install to fail.
+      # The freshness hash from the first run still matches (main lockfile and composed Gemfile are unchanged), so
+      # the stale lockfile will NOT be re-copied and bundle install will encounter the bad version.
+      File.write(File.join(dir, ".ruby-lsp", "Gemfile.lock"), <<~LOCKFILE)
         GEM
           remote: https://rubygems.org/
           specs:
@@ -590,8 +558,10 @@
           2.5.7
       LOCKFILE
 
-      Bundler.with_unbundled_env do
-        run_script(dir)
+      capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          run_script(dir)
+        end
       end
 
       # Verify that the script recovered and re-generated the composed bundle from scratch
@@ -1067,8 +1037,152 @@
     end
   end
 
+  def test_does_not_report_native_extension_build_failures_to_telemetry
+    in_temp_dir do |dir|
+      File.write(File.join(dir, "gems.rb"), <<~GEMFILE)
+        source "https://rubygems.org"
+        gem "irb"
+      GEMFILE
+
+      Bundler.with_unbundled_env do
+        capture_subprocess_io do
+          system("bundle install")
+
+          compose = RubyLsp::SetupBundler.new(dir, launcher: true)
+          compose.expects(:run_bundle_install_directly).raises(
+            Bundler::InstallError,
+            "Gem::Ext::BuildError: ERROR: Failed to build gem native extension",
+          )
+          compose.setup!
+          refute_path_exists(File.join(dir, ".ruby-lsp", "install_error"))
+        end
+      end
+    end
+  end
+
+  def test_beta_adds_prerelease_constraint_to_composed_gemfile
+    in_temp_dir do |dir|
+      File.write(File.join(dir, "Gemfile"), <<~GEMFILE)
+        source "https://rubygems.org"
+        gem "rdoc"
+      GEMFILE
+
+      capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          system("bundle install")
+          run_script(dir, beta: true)
+        end
+      end
+
+      gemfile_content = File.read(File.join(dir, ".ruby-lsp", "Gemfile"))
+      assert_match(/gem "ruby-lsp", ">= 0.a", require: false, group: :development/, gemfile_content)
+      assert_valid_gemfile(File.join(dir, ".ruby-lsp", "Gemfile"))
+    end
+  end
+
+  def test_beta_adds_prerelease_constraint_to_composed_gemfile_in_launcher_mode
+    in_temp_dir do |dir|
+      File.write(File.join(dir, "Gemfile"), <<~GEMFILE)
+        source "https://rubygems.org"
+        gem "rdoc"
+      GEMFILE
+
+      capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          system("bundle install")
+          RubyLsp::SetupBundler.new(dir, launcher: true, beta: true).setup!
+        end
+      end
+
+      gemfile_content = File.read(File.join(dir, ".ruby-lsp", "Gemfile"))
+      assert_match(/gem "ruby-lsp", ">= 0.a", require: false, group: :development/, gemfile_content)
+      assert_valid_gemfile(File.join(dir, ".ruby-lsp", "Gemfile"))
+    end
+  end
+
+  def test_beta_has_no_effect_when_ruby_lsp_is_in_the_bundle_in_launcher_mode
+    in_temp_dir do |dir|
+      File.write(File.join(dir, "Gemfile"), <<~GEMFILE)
+        source "https://rubygems.org"
+        gem "ruby-lsp"
+      GEMFILE
+
+      capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          system("bundle install")
+          RubyLsp::SetupBundler.new(dir, launcher: true, beta: true).setup!
+        end
+      end
+
+      gemfile_content = File.read(File.join(dir, ".ruby-lsp", "Gemfile"))
+      refute_match(/gem "ruby-lsp", ">= 0.a", require: false, group: :development/, gemfile_content)
+    end
+  end
+
+  def test_beta_has_no_effect_when_ruby_lsp_is_in_the_bundle
+    in_temp_dir do |dir|
+      File.write(File.join(dir, "Gemfile"), <<~GEMFILE)
+        source "https://rubygems.org"
+        gem "ruby-lsp"
+      GEMFILE
+
+      capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          system("bundle install")
+          run_script(dir, beta: true)
+        end
+      end
+
+      gemfile_content = File.read(File.join(dir, ".ruby-lsp", "Gemfile"))
+      refute_match(/gem "ruby-lsp", ">= 0.a", require: false, group: :development/, gemfile_content)
+    end
+  end
+
+  def test_composed_lockfile_is_recopied_when_cli_options_change
+    in_temp_dir do |dir|
+      File.write(File.join(dir, "Gemfile"), <<~GEMFILE)
+        source "https://rubygems.org"
+        gem "rdoc"
+      GEMFILE
+
+      capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          system("bundle install")
+
+          # First run with --beta creates composed bundle
+          run_script(dir, beta: true)
+        end
+      end
+
+      assert_match(/>= 0\.a/, File.read(".ruby-lsp/Gemfile"))
+      assert_valid_gemfile(File.join(dir, ".ruby-lsp", "Gemfile"))
+
+      # Second run without --beta. The main lockfile hasn't changed, but the composed Gemfile will change. The freshness
+      # check should detect this and re-copy the lockfile from main, NOT skip it.
+      _stdout, stderr = capture_subprocess_io do
+        Bundler.with_unbundled_env do
+          RubyLsp::SetupBundler.new(File.realpath(dir)).setup!
+        end
+      end
+
+      refute_match(/>= 0\.a/, File.read(".ruby-lsp/Gemfile"))
+      assert_valid_gemfile(File.join(dir, ".ruby-lsp", "Gemfile"))
+      refute_match(
+        /Skipping composed bundle setup/,
+        stderr,
+        "Composed lockfile was not refreshed when CLI options changed",
+      )
+    end
+  end
+
   private
 
+  def assert_valid_gemfile(gemfile_path)
+    Bundler::Definition.build(gemfile_path, nil, nil)
+  rescue Bundler::GemfileError => e
+    flunk("Composed Gemfile is not valid: #{e.message}")
+  end
+
   def in_temp_dir(&block)
     Dir.mktmpdir do |dir|
       Dir.chdir(dir) do
diff -Nru ruby-ruby-lsp-0.26.7/VERSION ruby-ruby-lsp-0.26.9/VERSION
--- ruby-ruby-lsp-0.26.7/VERSION	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/VERSION	2026-03-25 21:37:12.000000000 +0200
@@ -1 +1 @@
-0.26.7
+0.26.9
diff -Nru ruby-ruby-lsp-0.26.7/vscode/package.json ruby-ruby-lsp-0.26.9/vscode/package.json
--- ruby-ruby-lsp-0.26.7/vscode/package.json	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/package.json	2026-03-25 21:37:12.000000000 +0200
@@ -2,7 +2,7 @@
   "name": "ruby-lsp",
   "displayName": "Ruby LSP",
   "description": "VS Code plugin for connecting with the Ruby LSP",
-  "version": "0.10.0",
+  "version": "0.10.2",
   "publisher": "Shopify",
   "repository": {
     "type": "git",
@@ -468,11 +468,6 @@
           "type": "integer",
           "default": 30
         },
-        "rubyLsp.branch": {
-          "description": "Run the Ruby LSP server from the specified branch rather than using the released gem. Only supported if not using bundleGemfile",
-          "type": "string",
-          "default": ""
-        },
         "rubyLsp.pullDiagnosticsOn": {
           "description": "When to pull diagnostics from the server (on change, save or both). Selecting 'save' may significantly improve performance on large files",
           "type": "string",
@@ -562,6 +557,10 @@
             "launcher": {
               "description": "Opt-in/out of the new launcher mode",
               "type": "boolean"
+            },
+            "betaServer": {
+              "description": "Opt-in/out of beta server versions",
+              "type": "boolean"
             }
           },
           "default": {}
@@ -826,16 +825,16 @@
     "@types/vscode": "^1.91.0",
     "@vscode/test-electron": "^2.5.2",
     "@vscode/vsce": "^3.7.1",
-    "esbuild": "^0.27.3",
+    "esbuild": "^0.27.4",
     "eslint": "^9.30.1",
     "eslint-plugin-prettier": "^5.5.5",
-    "glob": "^13.0.3",
+    "glob": "^13.0.6",
     "mocha": "^11.7.5",
     "ovsx": "^0.10.9",
     "prettier": "^3.8.1",
-    "sinon": "^21.0.1",
+    "sinon": "^21.0.3",
     "typescript": "^5.9.3",
-    "typescript-eslint": "^8.55.0",
+    "typescript-eslint": "^8.57.1",
     "vscode-oniguruma": "^2.0.1",
     "vscode-textmate": "^9.3.2"
   },
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/client.ts ruby-ruby-lsp-0.26.9/vscode/src/client.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/client.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/client.ts	2026-03-25 21:37:12.000000000 +0200
@@ -81,7 +81,6 @@
   let run: Executable;
   let debug: Executable;
   const config = vscode.workspace.getConfiguration("rubyLsp");
-  const branch: string = config.get("branch")!;
   const customBundleGemfile: string = config.get("bundleGemfile")!;
   const useBundlerCompose: boolean = config.get("useBundlerCompose")!;
   const bypassTypechecker: boolean = config.get("bypassTypechecker")!;
@@ -127,14 +126,14 @@
 
     const args = [];
 
-    if (branch.length > 0) {
-      args.push("--branch", branch);
-    }
-
     if (featureEnabled("launcher")) {
       args.push("--use-launcher");
     }
 
+    if (featureEnabled("betaServer")) {
+      args.push("--beta");
+    }
+
     run = { command, args, options: executableOptions };
     debug = {
       command,
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/common.ts ruby-ruby-lsp-0.26.9/vscode/src/common.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/common.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/common.ts	2026-03-25 21:37:12.000000000 +0200
@@ -84,6 +84,7 @@
   tapiocaAddon: 1.0,
   launcher: 0.3,
   fullTestDiscovery: 1.0,
+  betaServer: -1,
 };
 
 type FeatureFlagConfigurationKey = keyof typeof FEATURE_FLAGS | "all";
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/asdf.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/asdf.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/asdf.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/asdf.ts	2026-03-25 21:37:12.000000000 +0200
@@ -3,7 +3,7 @@
 
 import * as vscode from "vscode";
 
-import { VersionManager, ActivationResult } from "./versionManager";
+import { VersionManager, ActivationResult, NonReportableError } from "./versionManager";
 
 // A tool to manage multiple runtime versions with a single CLI tool
 //
@@ -82,7 +82,9 @@
       this.outputChannel.info(`Using configured ASDF executable path: ${asdfPath}`);
       return configuredPath.fsPath;
     } catch (_error: any) {
-      throw new Error(`ASDF executable configured as ${configuredPath.fsPath}, but that file doesn't exist`);
+      throw new NonReportableError(
+        `ASDF executable configured as ${configuredPath.fsPath}, but that file doesn't exist`,
+      );
     }
   }
 }
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/chruby.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/chruby.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/chruby.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/chruby.ts	2026-03-25 21:37:12.000000000 +0200
@@ -5,7 +5,13 @@
 
 import { WorkspaceChannel } from "../workspaceChannel";
 
-import { ActivationResult, VersionManager, ACTIVATION_SEPARATOR } from "./versionManager";
+import {
+  ActivationResult,
+  MissingRubyError,
+  NonReportableError,
+  VersionManager,
+  ACTIVATION_SEPARATOR,
+} from "./versionManager";
 
 interface RubyVersion {
   engine?: string;
@@ -226,7 +232,7 @@
       return closest;
     }
 
-    throw new Error("Cannot find any Ruby installations");
+    throw new MissingRubyError("Cannot find any Ruby installations");
   }
 
   // Returns the Ruby version information including version and engine. E.g.: ruby-3.3.0, truffleruby-21.3.0
@@ -248,13 +254,13 @@
       }
 
       if (version === "") {
-        throw new Error(`Ruby version file ${rubyVersionUri.fsPath} is empty`);
+        throw new NonReportableError(`Ruby version file ${rubyVersionUri.fsPath} is empty`);
       }
 
       const match = /((?<engine>[A-Za-z]+)-)?(?<version>\d+\.\d+(\.\d+)?(-[A-Za-z0-9]+)?)/.exec(version);
 
       if (!match?.groups) {
-        throw new Error(
+        throw new NonReportableError(
           `Ruby version file ${rubyVersionUri.fsPath} contains invalid format. Expected (engine-)?version, got ${version}`,
         );
       }
@@ -425,15 +431,15 @@
       }
     }
 
-    throw new Error("Cannot find any Ruby installations");
+    throw new MissingRubyError("Cannot find any Ruby installations");
   }
 
   private missingRubyError(version: string) {
-    return new Error(`Cannot find Ruby installation for version ${version}`);
+    return new MissingRubyError(`Cannot find Ruby installation for version ${version}`);
   }
 
   private rubyVersionError() {
-    return new Error(
+    return new NonReportableError(
       `Cannot find .ruby-version file. Please specify the Ruby version in a
            .ruby-version either in ${this.bundleUri.fsPath} or in a parent directory`,
     );
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/custom.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/custom.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/custom.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/custom.ts	2026-03-25 21:37:12.000000000 +0200
@@ -1,6 +1,6 @@
 import * as vscode from "vscode";
 
-import { VersionManager, ActivationResult } from "./versionManager";
+import { VersionManager, ActivationResult, NonReportableError } from "./versionManager";
 
 // Custom
 //
@@ -24,7 +24,7 @@
     const customCommand: string | undefined = configuration.get("customRubyCommand");
 
     if (customCommand === undefined) {
-      throw new Error(
+      throw new NonReportableError(
         "The customRubyCommand configuration must be set when 'custom' is selected as the version manager. \
         See the [README](https://shopify.github.io/ruby-lsp/version-managers.html) for instructions.",
       );
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/mise.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/mise.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/mise.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/mise.ts	2026-03-25 21:37:12.000000000 +0200
@@ -2,7 +2,7 @@
 
 import * as vscode from "vscode";
 
-import { VersionManager, ActivationResult } from "./versionManager";
+import { VersionManager, ActivationResult, NonReportableError } from "./versionManager";
 
 // Mise (mise en place) is a manager for dev tools, environment variables and tasks
 //
@@ -33,7 +33,9 @@
         await vscode.workspace.fs.stat(configuredPath);
         return configuredPath;
       } catch (_error: any) {
-        throw new Error(`Mise executable configured as ${configuredPath.fsPath}, but that file doesn't exist`);
+        throw new NonReportableError(
+          `Mise executable configured as ${configuredPath.fsPath}, but that file doesn't exist`,
+        );
       }
     }
 
@@ -57,7 +59,7 @@
       }
     }
 
-    throw new Error(
+    throw new NonReportableError(
       `The Ruby LSP version manager is configured to be Mise, but could not find Mise installation. Searched in
         ${possiblePaths.join(", ")}`,
     );
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/rbenv.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/rbenv.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/rbenv.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/rbenv.ts	2026-03-25 21:37:12.000000000 +0200
@@ -1,6 +1,6 @@
 import * as vscode from "vscode";
 
-import { VersionManager, ActivationResult } from "./versionManager";
+import { VersionManager, ActivationResult, NonReportableError } from "./versionManager";
 
 // Seamlessly manage your app’s Ruby environment with rbenv.
 //
@@ -36,7 +36,9 @@
 
       return path;
     } catch (_error: any) {
-      throw new Error(`The Ruby LSP version manager is configured to be rbenv, but ${path} does not exist`);
+      throw new NonReportableError(
+        `The Ruby LSP version manager is configured to be rbenv, but ${path} does not exist`,
+      );
     }
   }
 }
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/rubyInstaller.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/rubyInstaller.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/rubyInstaller.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/rubyInstaller.ts	2026-03-25 21:37:12.000000000 +0200
@@ -3,6 +3,7 @@
 import * as vscode from "vscode";
 
 import { Chruby } from "./chruby";
+import { MissingRubyError } from "./versionManager";
 
 interface RubyVersion {
   engine?: string;
@@ -40,7 +41,7 @@
       }
     }
 
-    throw new Error(
+    throw new MissingRubyError(
       `Cannot find installation directory for Ruby version ${rubyVersion.version}.\
          Searched in ${possibleInstallationUris.map((uri) => uri.fsPath).join(", ")}`,
     );
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/rvm.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/rvm.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/rvm.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/rvm.ts	2026-03-25 21:37:12.000000000 +0200
@@ -2,7 +2,7 @@
 
 import * as vscode from "vscode";
 
-import { ActivationResult, VersionManager } from "./versionManager";
+import { ActivationResult, NonReportableError, VersionManager } from "./versionManager";
 
 // Ruby enVironment Manager. It manages Ruby application environments and enables switching between them.
 // Learn more:
@@ -43,7 +43,7 @@
       }
     }
 
-    throw new Error(
+    throw new NonReportableError(
       `Cannot find RVM installation directory. Searched in ${possiblePaths.map((uri) => uri.fsPath).join(",")}`,
     );
   }
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/rv.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/rv.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/rv.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/rv.ts	2026-03-25 21:37:12.000000000 +0200
@@ -1,6 +1,6 @@
 import * as vscode from "vscode";
 
-import { VersionManager, ActivationResult } from "./versionManager";
+import { VersionManager, ActivationResult, NonReportableError } from "./versionManager";
 
 // Manage your Ruby environment with rv
 //
@@ -40,7 +40,7 @@
       await vscode.workspace.fs.stat(vscode.Uri.file(path));
       return path;
     } catch (_error: any) {
-      throw new Error(`The Ruby LSP version manager is configured to be rv, but ${path} does not exist`);
+      throw new NonReportableError(`The Ruby LSP version manager is configured to be rv, but ${path} does not exist`);
     }
   }
 }
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/shadowenv.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/shadowenv.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/shadowenv.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/shadowenv.ts	2026-03-25 21:37:12.000000000 +0200
@@ -2,20 +2,20 @@
 
 import { asyncExec } from "../common";
 
-import { VersionManager, ActivationResult } from "./versionManager";
+import { VersionManager, ActivationResult, NonReportableError } from "./versionManager";
 
 // Shadowenv is a tool that allows managing environment variables upon entering a directory. It allows users to manage
 // which Ruby version should be used for each project, in addition to other customizations such as GEM_HOME.
 //
 // Learn more: https://github.com/Shopify/shadowenv
-export class UntrustedWorkspaceError extends Error {}
+export class UntrustedWorkspaceError extends NonReportableError {}
 
 export class Shadowenv extends VersionManager {
   async activate(): Promise<ActivationResult> {
     try {
       await vscode.workspace.fs.stat(vscode.Uri.joinPath(this.bundleUri, ".shadowenv.d"));
     } catch (_error: any) {
-      throw new Error(
+      throw new NonReportableError(
         "The Ruby LSP version manager is configured to be shadowenv, \
         but no .shadowenv.d directory was found in the workspace",
       );
@@ -58,7 +58,7 @@
       try {
         await asyncExec("shadowenv --version");
       } catch (_error: any) {
-        throw new Error(
+        throw new NonReportableError(
           `Shadowenv executable not found. Ensure it is installed and available in the PATH.
            This error may happen if your shell configuration is failing to be sourced from the editor or if
            another extension is mutating the process PATH.`,
@@ -66,7 +66,7 @@
       }
 
       // If it failed for some other reason, present the error to the user
-      throw new Error(`Failed to activate Ruby environment with Shadowenv: ${error.message}`);
+      throw new NonReportableError(`Failed to activate Ruby environment with Shadowenv: ${error.message}`);
     }
   }
 }
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby/versionManager.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby/versionManager.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby/versionManager.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby/versionManager.ts	2026-03-25 21:37:12.000000000 +0200
@@ -13,6 +13,9 @@
   gemPath: string[];
 }
 
+export class NonReportableError extends Error {}
+export class MissingRubyError extends NonReportableError {}
+
 // Changes to either one of these values have to be synchronized with a corresponding update in `activation.rb`
 export const ACTIVATION_SEPARATOR = "RUBY_LSP_ACTIVATION_SEPARATOR";
 export const VALUE_SEPARATOR = "RUBY_LSP_VS";
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/ruby.ts ruby-ruby-lsp-0.26.9/vscode/src/ruby.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/ruby.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/ruby.ts	2026-03-25 21:37:12.000000000 +0200
@@ -5,9 +5,9 @@
 
 import { asyncExec, RubyInterface } from "./common";
 import { WorkspaceChannel } from "./workspaceChannel";
-import { Shadowenv, UntrustedWorkspaceError } from "./ruby/shadowenv";
+import { Shadowenv } from "./ruby/shadowenv";
 import { Chruby } from "./ruby/chruby";
-import { VersionManager } from "./ruby/versionManager";
+import { NonReportableError, VersionManager } from "./ruby/versionManager";
 import { Mise } from "./ruby/mise";
 import { RubyInstaller } from "./ruby/rubyInstaller";
 import { Rbenv } from "./ruby/rbenv";
@@ -151,7 +151,7 @@
       try {
         await this.runManagerActivation();
       } catch (error: any) {
-        if (!(error instanceof UntrustedWorkspaceError)) {
+        if (!(error instanceof NonReportableError)) {
           this.telemetry.logError(error, {
             appType: "extension",
             appVersion: this.context.extension.packageJSON.version,
@@ -273,7 +273,7 @@
       // RUBYOPT may be empty or it may contain bundler paths. In the second case, we must concat to avoid accidentally
       // removing the paths from the env variable
       if (this._env.RUBYOPT) {
-        this._env.RUBYOPT.concat(" --yjit");
+        this._env.RUBYOPT += " --yjit";
       } else {
         this._env.RUBYOPT = "--yjit";
       }
diff -Nru ruby-ruby-lsp-0.26.7/vscode/src/test/suite/ruby.test.ts ruby-ruby-lsp-0.26.9/vscode/src/test/suite/ruby.test.ts
--- ruby-ruby-lsp-0.26.7/vscode/src/test/suite/ruby.test.ts	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/src/test/suite/ruby.test.ts	2026-03-25 21:37:12.000000000 +0200
@@ -12,7 +12,8 @@
 import { LOG_CHANNEL } from "../../common";
 import * as common from "../../common";
 import { Shadowenv, UntrustedWorkspaceError } from "../../ruby/shadowenv";
-import { ACTIVATION_SEPARATOR, FIELD_SEPARATOR, VALUE_SEPARATOR } from "../../ruby/versionManager";
+import { Chruby } from "../../ruby/chruby";
+import { ACTIVATION_SEPARATOR, FIELD_SEPARATOR, MissingRubyError, VALUE_SEPARATOR } from "../../ruby/versionManager";
 
 import { createContext, FakeContext } from "./helpers";
 import { FAKE_TELEMETRY } from "./fakeTelemetry";
@@ -146,6 +147,21 @@
     assert.ok(!telemetry.logError.called);
   });
 
+  test("Ignores missing Ruby version for telemetry", async () => {
+    const telemetry = { ...FAKE_TELEMETRY, logError: sandbox.stub() };
+    const ruby = new Ruby(context, workspaceFolder, outputChannel, telemetry);
+
+    sandbox
+      .stub(Chruby.prototype, "activate")
+      .rejects(new MissingRubyError("Cannot find Ruby installation for version 3.4.0"));
+
+    await assert.rejects(async () => {
+      await ruby.activateRuby({ identifier: ManagerIdentifier.Chruby });
+    });
+
+    assert.ok(!telemetry.logError.called);
+  });
+
   test("Clears outdated workspace Ruby path caches", async () => {
     const manager = process.env.CI ? ManagerIdentifier.None : ManagerIdentifier.Chruby;
 
@@ -218,6 +234,37 @@
     fs.rmSync(tmpPath, { recursive: true, force: true });
   });
 
+  test("Appends YJIT flag to existing RUBYOPT for Ruby 3.2", async () => {
+    sandbox.stub(vscode.workspace, "getConfiguration").returns({
+      get: (name: string) => {
+        if (name === "rubyVersionManager") {
+          return { identifier: ManagerIdentifier.None };
+        } else if (name === "bundleGemfile") {
+          return "";
+        }
+
+        return undefined;
+      },
+    } as unknown as vscode.WorkspaceConfiguration);
+
+    const envStub = [
+      "3.2.0",
+      "~/.gem/ruby/3.2.0,/opt/rubies/3.2.0/lib/ruby/gems/3.2.0",
+      "true",
+      `RUBYOPT${VALUE_SEPARATOR}-rbundler/setup`,
+    ].join(FIELD_SEPARATOR);
+
+    sandbox.stub(common, "asyncExec").resolves({
+      stdout: "",
+      stderr: `${ACTIVATION_SEPARATOR}${envStub}${ACTIVATION_SEPARATOR}`,
+    });
+
+    const ruby = new Ruby(context, workspaceFolder, outputChannel, FAKE_TELEMETRY);
+    await ruby.activateRuby();
+
+    assert.strictEqual(ruby.env.RUBYOPT, "-rbundler/setup --yjit");
+  });
+
   test("Raises an error if the configured bundleGemfile does not exist", async () => {
     const tmpPath = fs.mkdtempSync(path.join(os.tmpdir(), "ruby-lsp-test-"));
     const tmpWorkspaceFolder: vscode.WorkspaceFolder = {
diff -Nru ruby-ruby-lsp-0.26.7/vscode/yarn.lock ruby-ruby-lsp-0.26.9/vscode/yarn.lock
--- ruby-ruby-lsp-0.26.7/vscode/yarn.lock	2026-02-19 20:19:23.000000000 +0200
+++ ruby-ruby-lsp-0.26.9/vscode/yarn.lock	2026-03-25 21:37:12.000000000 +0200
@@ -303,135 +303,135 @@
   dependencies:
     tslib "^2.4.0"
 
-"@esbuild/aix-ppc64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz#815b39267f9bffd3407ea6c376ac32946e24f8d2"
-  integrity sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==
-
-"@esbuild/android-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz#19b882408829ad8e12b10aff2840711b2da361e8"
-  integrity sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==
-
-"@esbuild/android-arm@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz#90be58de27915efa27b767fcbdb37a4470627d7b"
-  integrity sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==
-
-"@esbuild/android-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz#d7dcc976f16e01a9aaa2f9b938fbec7389f895ac"
-  integrity sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==
-
-"@esbuild/darwin-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz#9f6cac72b3a8532298a6a4493ed639a8988e8abd"
-  integrity sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==
-
-"@esbuild/darwin-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz#ac61d645faa37fd650340f1866b0812e1fb14d6a"
-  integrity sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==
-
-"@esbuild/freebsd-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz#b8625689d73cf1830fe58c39051acdc12474ea1b"
-  integrity sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==
-
-"@esbuild/freebsd-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz#07be7dd3c9d42fe0eccd2ab9f9ded780bc53bead"
-  integrity sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==
-
-"@esbuild/linux-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz#bf31918fe5c798586460d2b3d6c46ed2c01ca0b6"
-  integrity sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==
-
-"@esbuild/linux-arm@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz#28493ee46abec1dc3f500223cd9f8d2df08f9d11"
-  integrity sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==
-
-"@esbuild/linux-ia32@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz#750752a8b30b43647402561eea764d0a41d0ee29"
-  integrity sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==
-
-"@esbuild/linux-loong64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz#a5a92813a04e71198c50f05adfaf18fc1e95b9ed"
-  integrity sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==
-
-"@esbuild/linux-mips64el@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz#deb45d7fd2d2161eadf1fbc593637ed766d50bb1"
-  integrity sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==
-
-"@esbuild/linux-ppc64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz#6f39ae0b8c4d3d2d61a65b26df79f6e12a1c3d78"
-  integrity sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==
-
-"@esbuild/linux-riscv64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz#4c5c19c3916612ec8e3915187030b9df0b955c1d"
-  integrity sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==
-
-"@esbuild/linux-s390x@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz#9ed17b3198fa08ad5ccaa9e74f6c0aff7ad0156d"
-  integrity sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==
-
-"@esbuild/linux-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz#12383dcbf71b7cf6513e58b4b08d95a710bf52a5"
-  integrity sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==
-
-"@esbuild/netbsd-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz#dd0cb2fa543205fcd931df44f4786bfcce6df7d7"
-  integrity sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==
-
-"@esbuild/netbsd-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz#028ad1807a8e03e155153b2d025b506c3787354b"
-  integrity sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==
-
-"@esbuild/openbsd-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz#e3c16ff3490c9b59b969fffca87f350ffc0e2af5"
-  integrity sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==
-
-"@esbuild/openbsd-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz#c5a4693fcb03d1cbecbf8b422422468dfc0d2a8b"
-  integrity sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==
-
-"@esbuild/openharmony-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz#082082444f12db564a0775a41e1991c0e125055e"
-  integrity sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==
-
-"@esbuild/sunos-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz#5ab036c53f929e8405c4e96e865a424160a1b537"
-  integrity sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==
-
-"@esbuild/win32-arm64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz#38de700ef4b960a0045370c171794526e589862e"
-  integrity sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==
-
-"@esbuild/win32-ia32@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz#451b93dc03ec5d4f38619e6cd64d9f9eff06f55c"
-  integrity sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==
-
-"@esbuild/win32-x64@0.27.3":
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz#0eaf705c941a218a43dba8e09f1df1d6cd2f1f17"
-  integrity sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==
+"@esbuild/aix-ppc64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz#4c585002f7ad694d38fe0e8cbf5cfd939ccff327"
+  integrity sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==
+
+"@esbuild/android-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz#7625d0952c3b402d3ede203a16c9f2b78f8a4827"
+  integrity sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==
+
+"@esbuild/android-arm@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.4.tgz#9a0cf1d12997ec46dddfb32ce67e9bca842381ac"
+  integrity sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==
+
+"@esbuild/android-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.4.tgz#06e1fdc6283fccd6bc6aadd6754afce6cf96f42e"
+  integrity sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==
+
+"@esbuild/darwin-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz#6c550ee6c0273bcb0fac244478ff727c26755d80"
+  integrity sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==
+
+"@esbuild/darwin-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz#ed7a125e9f25ce0091b9aff783ee943f6ba6cb86"
+  integrity sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==
+
+"@esbuild/freebsd-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz#597dc8e7161dba71db4c1656131c1f1e9d7660c6"
+  integrity sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==
+
+"@esbuild/freebsd-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz#ea171f9f4f00efaa8e9d3fe8baa1b75d757d1b36"
+  integrity sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==
+
+"@esbuild/linux-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz#e52d57f202369386e6dbcb3370a17a0491ab1464"
+  integrity sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==
+
+"@esbuild/linux-arm@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz#5e0c0b634908adbce0a02cebeba8b3acac263fb6"
+  integrity sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==
+
+"@esbuild/linux-ia32@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz#5f90f01f131652473ec06b038a14c49683e14ec7"
+  integrity sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==
+
+"@esbuild/linux-loong64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz#63bacffdb99574c9318f9afbd0dd4fff76a837e3"
+  integrity sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==
+
+"@esbuild/linux-mips64el@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz#c4b6952eca6a8efff67fee3671a3536c8e67b7eb"
+  integrity sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==
+
+"@esbuild/linux-ppc64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz#6dea67d3d98c6986f1b7769e4f1848e5ae47ad58"
+  integrity sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==
+
+"@esbuild/linux-riscv64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz#9ad2b4c3c0502c6bada9c81997bb56c597853489"
+  integrity sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==
+
+"@esbuild/linux-s390x@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz#c43d3cfd073042ca6f5c52bb9bc313ed2066ce28"
+  integrity sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==
+
+"@esbuild/linux-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz#45fa173e0591ac74d80d3cf76704713e14e2a4a6"
+  integrity sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==
+
+"@esbuild/netbsd-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz#366b0ef40cdb986fc751cbdad16e8c25fe1ba879"
+  integrity sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==
+
+"@esbuild/netbsd-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz#e985d49a3668fd2044343071d52e1ae815112b3e"
+  integrity sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==
+
+"@esbuild/openbsd-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz#6fb4ab7b73f7e5572ce5ec9cf91c13ff6dd44842"
+  integrity sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==
+
+"@esbuild/openbsd-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz#641f052040a0d79843d68898f5791638a026d983"
+  integrity sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==
+
+"@esbuild/openharmony-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz#fc1d33eac9d81ae0a433b3ed1dd6171a20d4e317"
+  integrity sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==
+
+"@esbuild/sunos-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz#af2cd5ca842d6d057121f66a192d4f797de28f53"
+  integrity sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==
+
+"@esbuild/win32-arm64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz#78ec7e59bb06404583d4c9511e621db31c760de3"
+  integrity sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==
+
+"@esbuild/win32-ia32@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz#0e616aa488b7ee5d2592ab070ff9ec06a9fddf11"
+  integrity sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==
+
+"@esbuild/win32-x64@0.27.4":
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz#1f7ba71a3d6155d44a6faa8dbe249c62ab3e408c"
+  integrity sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==
 
 "@eslint-community/eslint-utils@^4.2.0":
   version "4.4.0"
@@ -869,17 +869,17 @@
   dependencies:
     type-detect "4.0.8"
 
-"@sinonjs/fake-timers@^15.1.0":
-  version "15.1.0"
-  resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.1.0.tgz#f42e713425d4eb1a7bc88ef5d7f76c4546586c25"
-  integrity sha512-cqfapCxwTGsrR80FEgOoPsTonoefMBY7dnUEbQ+GRcved0jvkJLzvX6F4WtN+HBqbPX/SiFsIRUp+IrCW/2I2w==
+"@sinonjs/fake-timers@^15.1.1":
+  version "15.1.1"
+  resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz#e1a6f7171941aadcc31d2cea1744264d58b8b34c"
+  integrity sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==
   dependencies:
     "@sinonjs/commons" "^3.0.1"
 
-"@sinonjs/samsam@^8.0.3":
-  version "8.0.3"
-  resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.3.tgz#eb6ffaef421e1e27783cc9b52567de20cb28072d"
-  integrity sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==
+"@sinonjs/samsam@^9.0.3":
+  version "9.0.3"
+  resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-9.0.3.tgz#da4cad6ee24ca0c9c205da16676f7d540df71f12"
+  integrity sha512-ZgYY7Dc2RW+OUdnZ1DEHg00lhRt+9BjymPKHog4PRFzr1U3MbK57+djmscWyKxzO1qfunHqs4N45WWyKIFKpiQ==
   dependencies:
     "@sinonjs/commons" "^3.0.1"
     type-detect "^4.1.0"
@@ -949,11 +949,11 @@
   integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==
 
 "@types/node@25.x":
-  version "25.2.3"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-25.2.3.tgz#9c18245be768bdb4ce631566c7da303a5c99a7f8"
-  integrity sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==
+  version "25.5.0"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31"
+  integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==
   dependencies:
-    undici-types "~7.16.0"
+    undici-types "~7.18.0"
 
 "@types/normalize-package-data@^2.4.3":
   version "2.4.4"
@@ -982,101 +982,101 @@
   resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.92.0.tgz#b4d6bc180e7206defe643a1a5f38a1367947d418"
   integrity sha512-DcZoCj17RXlzB4XJ7IfKdPTcTGDLYvTOcTNkvtjXWF+K2TlKzHHkBEXNWQRpBIXixNEUgx39cQeTFunY0E2msw==
 
-"@typescript-eslint/eslint-plugin@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz#086d2ef661507b561f7b17f62d3179d692a0765f"
-  integrity sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==
+"@typescript-eslint/eslint-plugin@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz#ddfdfb30f8b5ccee7f3c21798b377c51370edd55"
+  integrity sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==
   dependencies:
     "@eslint-community/regexpp" "^4.12.2"
-    "@typescript-eslint/scope-manager" "8.55.0"
-    "@typescript-eslint/type-utils" "8.55.0"
-    "@typescript-eslint/utils" "8.55.0"
-    "@typescript-eslint/visitor-keys" "8.55.0"
+    "@typescript-eslint/scope-manager" "8.57.1"
+    "@typescript-eslint/type-utils" "8.57.1"
+    "@typescript-eslint/utils" "8.57.1"
+    "@typescript-eslint/visitor-keys" "8.57.1"
     ignore "^7.0.5"
     natural-compare "^1.4.0"
     ts-api-utils "^2.4.0"
 
-"@typescript-eslint/parser@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.55.0.tgz#6eace4e9e95f178d3447ed1f17f3d6a5dfdb345c"
-  integrity sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==
-  dependencies:
-    "@typescript-eslint/scope-manager" "8.55.0"
-    "@typescript-eslint/types" "8.55.0"
-    "@typescript-eslint/typescript-estree" "8.55.0"
-    "@typescript-eslint/visitor-keys" "8.55.0"
+"@typescript-eslint/parser@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.57.1.tgz#d523e559b148264055c0a49a29d5f50c7de659c2"
+  integrity sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==
+  dependencies:
+    "@typescript-eslint/scope-manager" "8.57.1"
+    "@typescript-eslint/types" "8.57.1"
+    "@typescript-eslint/typescript-estree" "8.57.1"
+    "@typescript-eslint/visitor-keys" "8.57.1"
     debug "^4.4.3"
 
-"@typescript-eslint/project-service@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.55.0.tgz#b8a71c06a625bdad481c24d5614b68e252f3ae9b"
-  integrity sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==
+"@typescript-eslint/project-service@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.57.1.tgz#16af9fe16eedbd7085e4fdc29baa73715c0c55c5"
+  integrity sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==
   dependencies:
-    "@typescript-eslint/tsconfig-utils" "^8.55.0"
-    "@typescript-eslint/types" "^8.55.0"
+    "@typescript-eslint/tsconfig-utils" "^8.57.1"
+    "@typescript-eslint/types" "^8.57.1"
     debug "^4.4.3"
 
-"@typescript-eslint/scope-manager@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz#8a0752c31c788651840dc98f840b0c2ebe143b8c"
-  integrity sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==
-  dependencies:
-    "@typescript-eslint/types" "8.55.0"
-    "@typescript-eslint/visitor-keys" "8.55.0"
-
-"@typescript-eslint/tsconfig-utils@8.55.0", "@typescript-eslint/tsconfig-utils@^8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz#62f1d005419985e09d37a040b2f1450e4e805afa"
-  integrity sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==
-
-"@typescript-eslint/type-utils@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz#195d854b3e56308ce475fdea2165313bb1190200"
-  integrity sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==
-  dependencies:
-    "@typescript-eslint/types" "8.55.0"
-    "@typescript-eslint/typescript-estree" "8.55.0"
-    "@typescript-eslint/utils" "8.55.0"
+"@typescript-eslint/scope-manager@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz#4524d7e7b420cb501807499684d435ae129aaf35"
+  integrity sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==
+  dependencies:
+    "@typescript-eslint/types" "8.57.1"
+    "@typescript-eslint/visitor-keys" "8.57.1"
+
+"@typescript-eslint/tsconfig-utils@8.57.1", "@typescript-eslint/tsconfig-utils@^8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz#9233443ec716882a6f9e240fd900a73f0235f3d7"
+  integrity sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==
+
+"@typescript-eslint/type-utils@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz#c49af1347b5869ca85155547a8f34f84ab386fd9"
+  integrity sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==
+  dependencies:
+    "@typescript-eslint/types" "8.57.1"
+    "@typescript-eslint/typescript-estree" "8.57.1"
+    "@typescript-eslint/utils" "8.57.1"
     debug "^4.4.3"
     ts-api-utils "^2.4.0"
 
-"@typescript-eslint/types@8.55.0", "@typescript-eslint/types@^8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.55.0.tgz#8449c5a7adac61184cac92dbf6315733569708c2"
-  integrity sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==
-
-"@typescript-eslint/typescript-estree@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz#c83ac92c11ce79bedd984937c7780a65e7f7b2e3"
-  integrity sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==
-  dependencies:
-    "@typescript-eslint/project-service" "8.55.0"
-    "@typescript-eslint/tsconfig-utils" "8.55.0"
-    "@typescript-eslint/types" "8.55.0"
-    "@typescript-eslint/visitor-keys" "8.55.0"
+"@typescript-eslint/types@8.57.1", "@typescript-eslint/types@^8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.57.1.tgz#54b27a8a25a7b45b4f978c3f8e00c4c78f11142c"
+  integrity sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==
+
+"@typescript-eslint/typescript-estree@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz#a9fd28d4a0ec896aa9a9a7e0cead62ea24f99e76"
+  integrity sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==
+  dependencies:
+    "@typescript-eslint/project-service" "8.57.1"
+    "@typescript-eslint/tsconfig-utils" "8.57.1"
+    "@typescript-eslint/types" "8.57.1"
+    "@typescript-eslint/visitor-keys" "8.57.1"
     debug "^4.4.3"
-    minimatch "^9.0.5"
+    minimatch "^10.2.2"
     semver "^7.7.3"
     tinyglobby "^0.2.15"
     ts-api-utils "^2.4.0"
 
-"@typescript-eslint/utils@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.55.0.tgz#c1744d94a3901deb01f58b09d3478d811f96d619"
-  integrity sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==
+"@typescript-eslint/utils@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.57.1.tgz#e40f5a7fcff02fd24092a7b52bd6ec029fb50465"
+  integrity sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==
   dependencies:
     "@eslint-community/eslint-utils" "^4.9.1"
-    "@typescript-eslint/scope-manager" "8.55.0"
-    "@typescript-eslint/types" "8.55.0"
-    "@typescript-eslint/typescript-estree" "8.55.0"
-
-"@typescript-eslint/visitor-keys@8.55.0":
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz#3d9a40fd4e3705c63d8fae3af58988add3ed464d"
-  integrity sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==
+    "@typescript-eslint/scope-manager" "8.57.1"
+    "@typescript-eslint/types" "8.57.1"
+    "@typescript-eslint/typescript-estree" "8.57.1"
+
+"@typescript-eslint/visitor-keys@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz#3af4f88118924d3be983d4b8ae84803f11fe4563"
+  integrity sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==
   dependencies:
-    "@typescript-eslint/types" "8.55.0"
-    eslint-visitor-keys "^4.2.1"
+    "@typescript-eslint/types" "8.57.1"
+    eslint-visitor-keys "^5.0.0"
 
 "@vscode/test-electron@^2.5.2":
   version "2.5.2"
@@ -1652,10 +1652,10 @@
   resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a"
   integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==
 
-diff@^8.0.2:
-  version "8.0.2"
-  resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.2.tgz#712156a6dd288e66ebb986864e190c2fc9eddfae"
-  integrity sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==
+diff@^8.0.3:
+  version "8.0.3"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.3.tgz#c7da3d9e0e8c283bb548681f8d7174653720c2d5"
+  integrity sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==
 
 dom-serializer@^2.0.0:
   version "2.0.0"
@@ -1786,37 +1786,37 @@
     has-tostringtag "^1.0.2"
     hasown "^2.0.2"
 
-esbuild@^0.27.3:
-  version "0.27.3"
-  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.3.tgz#5859ca8e70a3af956b26895ce4954d7e73bd27a8"
-  integrity sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==
+esbuild@^0.27.4:
+  version "0.27.4"
+  resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.4.tgz#b9591dd7e0ab803a11c9c3b602850403bef22f00"
+  integrity sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==
   optionalDependencies:
-    "@esbuild/aix-ppc64" "0.27.3"
-    "@esbuild/android-arm" "0.27.3"
-    "@esbuild/android-arm64" "0.27.3"
-    "@esbuild/android-x64" "0.27.3"
-    "@esbuild/darwin-arm64" "0.27.3"
-    "@esbuild/darwin-x64" "0.27.3"
-    "@esbuild/freebsd-arm64" "0.27.3"
-    "@esbuild/freebsd-x64" "0.27.3"
-    "@esbuild/linux-arm" "0.27.3"
-    "@esbuild/linux-arm64" "0.27.3"
-    "@esbuild/linux-ia32" "0.27.3"
-    "@esbuild/linux-loong64" "0.27.3"
-    "@esbuild/linux-mips64el" "0.27.3"
-    "@esbuild/linux-ppc64" "0.27.3"
-    "@esbuild/linux-riscv64" "0.27.3"
-    "@esbuild/linux-s390x" "0.27.3"
-    "@esbuild/linux-x64" "0.27.3"
-    "@esbuild/netbsd-arm64" "0.27.3"
-    "@esbuild/netbsd-x64" "0.27.3"
-    "@esbuild/openbsd-arm64" "0.27.3"
-    "@esbuild/openbsd-x64" "0.27.3"
-    "@esbuild/openharmony-arm64" "0.27.3"
-    "@esbuild/sunos-x64" "0.27.3"
-    "@esbuild/win32-arm64" "0.27.3"
-    "@esbuild/win32-ia32" "0.27.3"
-    "@esbuild/win32-x64" "0.27.3"
+    "@esbuild/aix-ppc64" "0.27.4"
+    "@esbuild/android-arm" "0.27.4"
+    "@esbuild/android-arm64" "0.27.4"
+    "@esbuild/android-x64" "0.27.4"
+    "@esbuild/darwin-arm64" "0.27.4"
+    "@esbuild/darwin-x64" "0.27.4"
+    "@esbuild/freebsd-arm64" "0.27.4"
+    "@esbuild/freebsd-x64" "0.27.4"
+    "@esbuild/linux-arm" "0.27.4"
+    "@esbuild/linux-arm64" "0.27.4"
+    "@esbuild/linux-ia32" "0.27.4"
+    "@esbuild/linux-loong64" "0.27.4"
+    "@esbuild/linux-mips64el" "0.27.4"
+    "@esbuild/linux-ppc64" "0.27.4"
+    "@esbuild/linux-riscv64" "0.27.4"
+    "@esbuild/linux-s390x" "0.27.4"
+    "@esbuild/linux-x64" "0.27.4"
+    "@esbuild/netbsd-arm64" "0.27.4"
+    "@esbuild/netbsd-x64" "0.27.4"
+    "@esbuild/openbsd-arm64" "0.27.4"
+    "@esbuild/openbsd-x64" "0.27.4"
+    "@esbuild/openharmony-arm64" "0.27.4"
+    "@esbuild/sunos-x64" "0.27.4"
+    "@esbuild/win32-arm64" "0.27.4"
+    "@esbuild/win32-ia32" "0.27.4"
+    "@esbuild/win32-x64" "0.27.4"
 
 escalade@^3.1.1, escalade@^3.1.2:
   version "3.1.2"
@@ -1859,6 +1859,11 @@
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1"
   integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
 
+eslint-visitor-keys@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be"
+  integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==
+
 eslint@^9.30.1:
   version "9.30.1"
   resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.30.1.tgz#d4107b39964412acd9b5c0744f1c6df514fa1211"
@@ -2056,9 +2061,9 @@
   integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
 
 flatted@^3.2.9:
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
-  integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726"
+  integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==
 
 follow-redirects@^1.14.6:
   version "1.15.6"
@@ -2203,14 +2208,14 @@
     package-json-from-dist "^1.0.0"
     path-scurry "^2.0.0"
 
-glob@^13.0.3:
-  version "13.0.3"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.3.tgz#e5c39b3e0eb8a2e2bc35e3b28e78fd0839ff9e68"
-  integrity sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==
-  dependencies:
-    minimatch "^10.2.0"
-    minipass "^7.1.2"
-    path-scurry "^2.0.0"
+glob@^13.0.6:
+  version "13.0.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d"
+  integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==
+  dependencies:
+    minimatch "^10.2.2"
+    minipass "^7.1.3"
+    path-scurry "^2.0.2"
 
 globals@^14.0.0:
   version "14.0.0"
@@ -2839,10 +2844,10 @@
   resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
   integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
 
-minimatch@^10.1.1, minimatch@^10.2.0:
-  version "10.2.0"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.0.tgz#e710473e66e3e1aaf376d0aa82438375cac86e9e"
-  integrity sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==
+minimatch@^10.1.1, minimatch@^10.2.2:
+  version "10.2.2"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.2.tgz#361603ee323cfb83496fea2ae17cc44ea4e1f99f"
+  integrity sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==
   dependencies:
     brace-expansion "^5.0.2"
 
@@ -2872,10 +2877,10 @@
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
   integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
 
-"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
-  integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2, minipass@^7.1.3:
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b"
+  integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==
 
 mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
   version "0.5.3"
@@ -3143,10 +3148,10 @@
     lru-cache "^10.2.0"
     minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
 
-path-scurry@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.0.tgz#9f052289f23ad8bf9397a2a0425e7b8615c58580"
-  integrity sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==
+path-scurry@^2.0.0, path-scurry@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85"
+  integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==
   dependencies:
     lru-cache "^11.0.0"
     minipass "^7.1.2"
@@ -3494,15 +3499,15 @@
   resolved "https://registry.yarnpkg.com/simple-invariant/-/simple-invariant-2.0.1.tgz#b8935284d31bc0c2719582f9cddf17bee8f57526"
   integrity sha512-1sbhsxqI+I2tqlmjbz99GXNmZtr6tKIyEgGGnJw/MKGblalqk/XoOYYFJlBzTKZCxx8kLaD3FD5s9BEEjx5Pyg==
 
-sinon@^21.0.1:
-  version "21.0.1"
-  resolved "https://registry.yarnpkg.com/sinon/-/sinon-21.0.1.tgz#36b9126065a44906f7ba4a47b723b99315a8c356"
-  integrity sha512-Z0NVCW45W8Mg5oC/27/+fCqIHFnW8kpkFOq0j9XJIev4Ld0mKmERaZv5DMLAb9fGCevjKwaEeIQz5+MBXfZcDw==
+sinon@^21.0.3:
+  version "21.0.3"
+  resolved "https://registry.yarnpkg.com/sinon/-/sinon-21.0.3.tgz#fd3a2387ffe4fdbbfbbf3a0858f18d46c4acb34e"
+  integrity sha512-0x8TQFr8EjADhSME01u1ZK31yv2+bd6Z5NrBCHVM+n4qL1wFqbxftmeyi3bwlr49FbbzRfrqSFOpyHCOh/YmYA==
   dependencies:
     "@sinonjs/commons" "^3.0.1"
-    "@sinonjs/fake-timers" "^15.1.0"
-    "@sinonjs/samsam" "^8.0.3"
-    diff "^8.0.2"
+    "@sinonjs/fake-timers" "^15.1.1"
+    "@sinonjs/samsam" "^9.0.3"
+    diff "^8.0.3"
     supports-color "^7.2.0"
 
 slash@^5.1.0:
@@ -3807,15 +3812,15 @@
     tunnel "0.0.6"
     underscore "^1.12.1"
 
-typescript-eslint@^8.55.0:
-  version "8.55.0"
-  resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.55.0.tgz#abae8295c5f0f82f816218113a46e89bc30c3de2"
-  integrity sha512-HE4wj+r5lmDVS9gdaN0/+iqNvPZwGfnJ5lZuz7s5vLlg9ODw0bIiiETaios9LvFI1U94/VBXGm3CB2Y5cNFMpw==
-  dependencies:
-    "@typescript-eslint/eslint-plugin" "8.55.0"
-    "@typescript-eslint/parser" "8.55.0"
-    "@typescript-eslint/typescript-estree" "8.55.0"
-    "@typescript-eslint/utils" "8.55.0"
+typescript-eslint@^8.57.1:
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.57.1.tgz#573f97d3e48bbb67290b47dde1b7cb3b5d01dc4f"
+  integrity sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==
+  dependencies:
+    "@typescript-eslint/eslint-plugin" "8.57.1"
+    "@typescript-eslint/parser" "8.57.1"
+    "@typescript-eslint/typescript-estree" "8.57.1"
+    "@typescript-eslint/utils" "8.57.1"
 
 typescript@^5.9.3:
   version "5.9.3"
@@ -3832,10 +3837,10 @@
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441"
   integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==
 
-undici-types@~7.16.0:
-  version "7.16.0"
-  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46"
-  integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==
+undici-types@~7.18.0:
+  version "7.18.2"
+  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9"
+  integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==
 
 unicorn-magic@^0.1.0:
   version "0.1.0"
