You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Add an OCR engine selection preference in OCR preferences, and auto-detection of the engine path is run automatically when switching engines.
Steps to test
Open OCR preferences, there is a preference for engine selection
2. Try switching between OCRmyPDF and Docling
3. On switching the selection, the engine path will change automatically to match one of the default paths stored for each engine
• Add OCR engine selector (OCRmyPDF/Docling) to OCR preferences.
• Auto-detect and switch default engine path when the engine selection changes.
• Persist engine selection in preferences and localize new/updated UI messages.
Diagram
graph TD
A["OcrTab (UI)"] --> B["OcrTabViewModel"] --> C["OcrPreferences"] --> D["OcrEngine factory"] --> E["OcrMyPdfEngine / DoclingEngine"]
F["JabRefCliPreferences"] --> C
G["OcrLinkedFileAction"] --> C --> D
Loading
High-Level Assessment
The following are alternative approaches to this PR:
1. Pluggable engine registry (ServiceLoader/DI)
➕ Avoids growing switch/if logic as more engines are added
➕ Allows engines to be added without touching core preference code
➕ Can centralize per-engine metadata (display name, default paths, capabilities)
➖ More moving parts and indirection for a two-engine setup
➖ Harder to reason about at compile time; needs careful ordering/selection rules
2. Store engine implementation id + per-engine settings map
➕ More extensible preference model (per-engine defaults and overrides)
➕ Can remember last-used path per engine rather than overwriting a single field
➖ Larger migration/change footprint in preferences and UI
➖ More complex UX (multiple paths) unless carefully designed
Recommendation: The current enum-based selection with OcrPreferences#getOcrEngine() is a good fit for two supported engines and keeps the behavior explicit and testable. If additional engines are planned, consider evolving toward a small registry that encapsulates engine metadata (display name, default paths, detection strategy) to avoid further conditional branching and to optionally remember per-engine paths.
Files changed (8) +106 / -26
Enhancement (5) +92 / -17
OcrLinkedFileAction.javaUse selected OCR engine from preferences and improve error text+2/-3
Use selected OCR engine from preferences and improve error text
• Stops hard-coding OCRmyPDF and instead retrieves the active OcrEngine from OcrPreferences. Error messaging now includes the selected engine name when the engine is unavailable.
OcrTab.javaAdd engine selection UI and simplify engine-path row+7/-4
Add engine selection UI and simplify engine-path row
• Introduces an OCR engine selection combo box in the OCR preferences tab. Removes the manual 'auto-detect' button from the path row (auto-detection is now triggered by engine switching).
OcrTabViewModel.javaPersist engine selection and auto-detect per-engine default paths+33/-8
Persist engine selection and auto-detect per-engine default paths
• Adds an EngineSelection property with available options, loads/stores it via OcrPreferences, and triggers auto-detection when the engine changes. Splits default detection paths by engine (OCRmyPDF vs Docling) and updates user-facing task/notification strings to be engine-specific.
OcrPreferences.javaAdd engine selection to OCR preferences and engine factory method+26/-2
Add engine selection to OCR preferences and engine factory method
• Extends OCR preferences with an EngineSelection property (defaulting to OCRmyPDF). Adds getOcrEngine() to construct the correct engine implementation (OCRmyPDF or Docling) based on the stored selection.
JabRef_en.propertiesLocalize engine selection and parameterized engine messages+7/-6
Localize engine selection and parameterized engine messages
• Replaces OCRmyPDF-specific strings with parameterized variants that include the engine name and path. Adds new localization keys for the engine selection UI and auto-detection messaging.
JabRefCliPreferences.javaPersist and bind OCR engine selection preference+5/-1
Persist and bind OCR engine selection preference
• Introduces a new preference key (ocrEngineSelection), includes it in OcrPreferences construction, and binds it for persistence alongside existing OCR preferences.
The new public enum EngineSelection is introduced without JSpecify nullness defaults
(@NullMarked), leaving nullability contracts implicit and inconsistent with the project’s
null-safety conventions. This increases the risk of null-related bugs and weakens API guarantees for
new code.
PR Compliance ID 12 requires new public classes/types to use JSpecify nullness conventions
(including @NullMarked). The newly added EngineSelection enum is public but contains no JSpecify
annotations.
AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not return or accept null; use JSpecify nullness annotations and @NullMarked on new classes: AGENTS.md: Public APIs should not ret...
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add an OCR engine selection preference in OCR preferences, and auto-detection of the engine path is run automatically when switching engines.
Steps to test
Related issues and pull requests
Follow-up #16231
AI usage
NA
Checklist
CHANGELOG.mdin a way that can be understood by the average user (if change is visible to the user)