test on merge workflow#28
Merged
Merged
Conversation
Contributor
🧪 C++ Test Coverage Report (Comprehensive)Platform: linux-x64 📊 Detailed CoverageTest Components:
|
1 similar comment
Contributor
🧪 C++ Test Coverage Report (Comprehensive)Platform: linux-x64 📊 Detailed CoverageTest Components:
|
This was referenced May 19, 2026
Zbig9000
added a commit
to Zbig9000/qvac
that referenced
this pull request
May 21, 2026
…4.3#5 (REF flipped to tetherto/master) [whisper-cpp PR tetherto#28](tetherto/qvac-ext-lib-whisper.cpp#28) (QVAC-18993 bundled-ggml --- Android dynamic backend + per-arch CPU dlopen fallback) was merged today (2026-05-21, merge commit `f3102199` on `tetherto/qvac-ext-lib-whisper.cpp/master`). With it merged, `tetherto/master` now carries every commit the registry's `whisper-cpp` port previously pulled from the temporary `Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857` branch: - PR tetherto#25 (QVAC-18991, upstream whisper.cpp sync) --- merged 2026-05-20 - PR tetherto#27 (QVAC-18966, tts-cpp chatterbox <atomic> fix) --- merged 2026-05-20 - PR tetherto#28 (QVAC-18993, ggml-backend android dynamic backend) --- merged 2026-05-21 [qvac-registry-vcpkg PR tetherto#152](tetherto/qvac-registry-vcpkg#152) HEAD (`f2870372`) bumps `whisper-cpp` to port-version `1.8.4.3#5` with the REF repoint --- byte-identical source tarball outside `parakeet-cpp/` and `tts-cpp/` (separate vcpkg ports). This commit just re-pins the consumer-side baseline so the addon resolves against the new port-version. vcpkg-configuration.json default-registry baseline: 9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d (MSVC fix only, whisper-cpp 1.8.4.3#4) -> f2870372965e899ae1f8a221154d2b243a6c3d30 (+ whisper-cpp 1.8.4.3#5 REF repoint) No code change in this monorepo --- pure baseline re-pin. CHANGELOG updated to record both the new baseline and the (now superseded) intermediate `9f4e8e2` pin. Closes the consumer-side half of [QVAC-19071](https://tetherapp.atlassian.net/browse/QVAC-19071) ("Update qvac-registry-vcpkg and addon with new port versions"). Registry-side half = vcpkg PR tetherto#152 commit `f287037`. [QVAC-18993][QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com>
GustavoA1604
added a commit
that referenced
this pull request
May 22, 2026
…c GGML backends (#2124) * transcription-whispercpp: bump to 0.7.1 with whisper-cpp 1.8.4.3#1 (QVAC-18993) Pull in the consolidated vcpkg PR (whisper-cpp 1.8.4.3 #1 + ggml-speech 2026-05-18 #1) that covers four asana tickets: - QVAC-18991: whisper.cpp upstream-sync from ggml-org/master to v1.8.4.3. Adds upstream's VAD streaming API (whisper_vad_detect_speech_no_reset, whisper_vad_reset_state) with a regression test, the macOS Vulkan persistent-pipeline cache, and various BCI / bindings fixes. - QVAC-18300: enables OpenCL on Whisper for Android, gated behind a new `opencl` feature. This package now declares an android-only `opencl` feature that wires through to the whisper-cpp port's opencl feature, so a transcription addon built for android-arm64 can ship the Adreno backend without forcing it on non-Adreno consumers. - QVAC-18992: rebases the speech-stack ggml (qvac-ext-ggml@speech) onto the same upstream v0.10.2 baseline that whisper.cpp's bundled ggml uses, so the QVAC speech stack (whisper + parakeet + tts-cpp) consumes a coherent ggml API surface. No direct dependency from this package -- transitive via other speech-stack addons sharing the Android process. - QVAC-18993: switches the Android build to pure dynamic-backend mode: GGML_BACKEND_DL=ON + GGML_CPU_ALL_VARIANTS=ON on both the whisper-cpp port and ggml-speech port, so the addon's .bare prebuild ships one libggml-cpu-android_armv*_*.so per microarchitecture plus dynamically-loaded libggml-vulkan.so / libggml-opencl.so. ggml's loader picks the highest-feature CPU variant (armv9.2_2 .. armv8.0_1) plus the right GPU backend (Adreno 700+ -> OpenCL, everything else -> Vulkan) at runtime, so a single APK serves the whole device matrix without per-device builds. vcpkg-configuration.json is TEMPORARILY pointed at Zbig9000/qvac-registry-vcpkg.git @ b5a5e199 (= QVAC-vcpkg-speech-stack-android-dynamic-backend HEAD on Zbig9000's fork) because the consolidated port versions don't exist on tetherto/main yet. Once the vcpkg PR lands the default-registry block must be re-pointed back to https://github.com/tetherto/qvac-registry-vcpkg.git with the post-merge tetherto/main SHA as baseline. Devicefarm: the asana asks for GPU testing on mobile to verify S25 picks OpenCL and Pixel 9 picks Vulkan. Those tests live outside this addon (in qvac CI's integration-mobile-test workflow) and depend on device-farm config that I can't validate locally; the addon code side is unchanged in this bump (CPU dispatcher + dynamic backend `.so` files are already wired by the whisper-cpp port's prebuild output, and the JS layer already enumerates ggml_backend_devs at init). * transcription-whispercpp: bump to 0.7.2 with whisper-cpp 1.8.4.3#2 (QVAC-18993) Picks up the Android per-arch CPU dlopen fallback patch added to the whisper-cpp port (mirrors qvac-ext-ggml@speech 9562ed04). Without this, every APK consumer with `useLegacyPackaging=false` (AGP 3.6+ default) would silently lose CPU init: the directory iterator finds nothing inside compressed APK libs, and the existing on-disk filename fallback never composes the per-arch `libggml-cpu-android_armv*_*.so` names that `GGML_CPU_ALL_VARIANTS=ON` produces. Re-pins the Zbig9000/qvac-registry-vcpkg default-registry baseline to 86257dc376ca043c67cc4805ab8d1e74a94b7eda so both whisper-cpp 1.8.4.3#2 and ggml-speech 2026-05-19#0 are reachable. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: bump to 0.7.3 → whisper-cpp 1.8.4.3#3 (QVAC-18993) Pure follow-up to 0.7.2 -- the two Android dynamic-backend ggml fixes the 0.7.2 release pulled in via vcpkg patches are now upstreamed as commits on tetherto/qvac-ext-lib-whisper.cpp PR #26 ("ggml + tts-cpp Android dynamic-backend overlays") instead of being carried in the vcpkg port's patches/ tree. Plus a tts-cpp `<atomic>` include fix that closes the parallel speech-stack consumer's build under the day-2 ggml-speech merge. Build output is bit-identical to 0.7.2 (whisper-cpp 1.8.4.3#3 SOURCE == 1.8.4.3#2 SOURCE+PATCHES, verified by hashing all libggml-cpu-android_armv*_*.so files from the NDK r29 cross-compile). Registry baseline bumped to 965f5e5a so the new port-version (1.8.4.3#3) is reachable. PRs in the cross-repo set: whisper.cpp #26 (Zbig9000:QVAC-18993-bundled-ggml-android-dynamic-backend) vcpkg #152 (Zbig9000:QVAC-vcpkg-speech-stack-android-dynamic-backend) Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: bridge ggml dlopen backends as IMPORTED targets (QVAC-18993) `bare-make generate` failed on android-arm64 with CMake Error: get_target_property() called with non-existent target "ggml::ggml-cpu-android_armv8.0_1" (… 8 backends total) after enabling `GGML_BACKEND_DL=ON` on the `whisper-cpp` port. With dynamic- backend mode, ggml builds the per-arch CPU + GPU backends as standalone MODULE libraries that ggml dlopens at runtime; upstream ggml's `install(TARGETS … EXPORT)` deliberately skips them, so the consumer's `BACKEND_DL_LIBS` loop in `CMakeLists.txt` referenced targets that don't exist. Wrap the existing loop with a `if(NOT TARGET ggml::${_backend})` fallback that locates the `.so` under `${VCPKG_INSTALLED_PATH}/bin` via `find_library` and materialises a `SHARED IMPORTED` target locally with `IMPORTED_NO_SONAME=TRUE` — then bundle via the existing `INSTALL TARGET` path. Mirrors the pattern that already ships in `packages/diffusion-cpp` for the same Android-dlopen build mode. Static backends (any platform that links ggml in directly) still find their imported target via ggml-config.cmake on the first branch, so non-Android prebuilds are byte-identical. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin baseline to vcpkg PR #152 rebased HEAD 8c6ca188 (QVAC-18993) tetherto/qvac-registry-vcpkg/main moved forward yesterday with #156 (parakeet-cpp 2026-05-20 + ggml-speech 2026-04-09#2 bumps), so vcpkg PR #152 was rebased onto the new base 0e75457. Update the default- registry baseline pointer from the old PR #152 HEAD (dffaaf6) to the rebased HEAD (8c6ca188) so the version-resolver still finds `ggml-speech 2026-05-19#3` (now layered on top of the just-landed 2026-04-09#2) and `whisper-cpp 1.8.4.3#3` (unchanged content, correct SHA512). No other changes --- the resolver picks up the same final versions of every package as before, just with the rebased baseline as the search root. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: consume whisper-cpp 1.8.4.3#4 + ggml-speech 2026-05-19#4 (QVAC-18993, QVAC-18992) Picks up the MSVC `/I` fix in the spirv-headers include-shim (vcpkg PR #152 commit 5cd209c) so prebuild / win32-x64 stops dying with `c1xx: fatal error C1083: Cannot open source file: '.../x64-windows/include'` on the `whisper-cpp[vulkan]` configure step. The shim now emits the MSVC-style `/I<path>` on Windows and keeps `-isystem <path>` (with warning suppression) on GCC/Clang elsewhere. whisper-cpp override bumped 1.8.4.3#3 -> 1.8.4.3#4. Default-registry baseline bumped 8c6ca188 -> 5cd209c1. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: wire ENABLE_OPENCL so Android prebuilds ship libggml-opencl.so (QVAC-18300) The `opencl` feature was declared in `packages/transcription-whispercpp/vcpkg.json` (gated to `platform: android`) and the `whisper-cpp` port's `opencl` feature correctly enables `-DGGML_OPENCL=ON` on Android — but the consumer's `CMakeLists.txt` only appended `"tests"` and `"vulkan"` to `VCPKG_MANIFEST_FEATURES`. The `opencl` feature was therefore never activated, so vcpkg resolved `whisper-cpp` without `[opencl]`, ggml was built without `GGML_OPENCL=ON`, and the `android-arm64` prebuild silently shipped CPU + Vulkan backends only (no `libggml-opencl.so`) — defeating the entire point of QVAC-18300. Add an `ENABLE_OPENCL` option (default `ON` on Android, `OFF` elsewhere — the `vcpkg.json` feature is `platform: android` gated so non-Android is a no-op anyway) that appends `"opencl"` to `VCPKG_MANIFEST_FEATURES`. Mirrors the `SD_OPENCL` pattern in `packages/diffusion-cpp/CMakeLists.txt` and keeps the GPU-feature wiring uniform across the three GPU backends (Metal auto, Vulkan toggle, OpenCL toggle). After this commit, the `android-arm64` prebuild's `qvac__transcription-whispercpp/` directory should ship `libggml-opencl.so` alongside the existing 7 per-microarch CPU variants and `libggml-vulkan.so`. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: default ENABLE_OPENCL ON unconditionally (QVAC-18300) Previous commit (6b42bc0) wired ENABLE_OPENCL but gated it on `_qvac_whispercpp_target_os STREQUAL "Android"`, mirroring the existing ENABLE_VULKAN block. CI re-run (26172345624) exposed that the gate is broken: at top-level CMakeLists.txt time, `CMAKE_SYSTEM_NAME` is not yet set --- the bare-make Android toolchain file is loaded by `project()` (which runs *after* the option block), so `_qvac_whispercpp_target_os` falls through to the host OS ("Linux") and ENABLE_OPENCL stayed OFF on the android-arm64 prebuild. Evidence from run 26172345624's android-arm64 build log: `Installing 9/9 whisper-cpp[core,vulkan]:arm64-android@1.8.4.3#4...` ^^^^^^^^ no `[opencl]` ENABLE_VULKAN works only by coincidence: Vulkan is also default-ON on the Linux host detection branch, so the wrong target detection produces the right behaviour. For Android-only features there is no such overlap. Fix: default ENABLE_OPENCL ON unconditionally and let the actual platform gating happen where it can: (1) the `platform: android` clause on the `whisper-cpp[opencl]` dep in `vcpkg.json`, and (2) the `VCPKG_TARGET_IS_ANDROID` check in the `whisper-cpp` portfile that gates `-DGGML_OPENCL=ON`. Adding `"opencl"` to `VCPKG_MANIFEST_FEATURES` on non-Android is a guaranteed no-op because the feature's only dep is platform-gated --- mirrors the layered gating that `whisper-cpp[vulkan]` already uses (the `vulkan` feature's deps are `!osx & !ios` gated and the portfile's `-DGGML_VULKAN=ON` is also target-gated). After this commit, the android-arm64 install plan should resolve as `whisper-cpp[core,vulkan,opencl]` and the prebuild tarball should contain `libggml-opencl.so` alongside the 7 per-microarch CPU `.so`s and `libggml-vulkan.so`. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: call ggml_backend_load_all_from_path before whisper_init (QVAC-18993) Android mobile-test E2E crashed inside whisper_init_from_file_with_params with SIGABRT on PR #2124 / run 26173084690 (both Pixel 9 Pro + Samsung S25 Ultra, 132 ms after Downloaded model: ggml-tiny.bin). Stack: abort → ggml_abort+228 → ggml_backend_dev_backend_reg+48 → whisper_init_with_params_no_state+480 → whisper_init_from_file_with_params_no_state+212 → whisper_init_from_file_with_params+48 → WhisperModel::load()+460 Root cause: the addon never called ggml_backend_load_all*(). With the QVAC-18993 GGML_BACKEND_DL=ON build, the bundled ggml-base no longer defines GGML_USE_CPU, so the static ggml_backend_registry ctor registers zero backends. whisper.cpp's first ggml_backend_init_by_type(CPU) returns NULL → ggml_backend_dev_backend_reg(NULL) trips GGML_ASSERT(device). This is the same crash signature on both the pre-OpenCL run 26170576156 and the post-OpenCL run 26173084690, so it is independent of the recent OpenCL enablement. The mobile workflow last passed on tmp-whisper-184-3-validation back on 2026-05-11, which predates GGML_BACKEND_DL=ON. Mirror the pattern used by every other ggml-based addon in the monorepo (packages/{diffusion-cpp,llm-llamacpp,classification-ggml,…}): * CMakeLists.txt — emit BACKENDS_SUBDIR (<bare_target>/<module_name>) compile def via bare_target / bare_module_target. * WhisperConfig — add backendsDir field (sibling of the handler-driven maps so it bypasses WHISPER_CONTEXT_HANDLERS.at()). * JSAdapter — read top-level backendsDir string directly from configurationParams into config.backendsDir. * WhisperModel::load — on __ANDROID__, std::call_once → ggml_backend_load_all_from_path(backendsDir/BACKENDS_SUBDIR) before whisper_init. * index.js — require('bare-path'); pass backendsDir: path.join(__dirname, 'prebuilds') in _load + reload. No diff on non-Android (Linux/macOS/Windows/iOS): ggml's static ctor keeps registering CPU there as before. aiDocs/15-android-mobile-test-crash-fix.md has the full investigation (crash extraction, layered root-cause, why every other ggml addon already does this, follow-ups). Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin vcpkg baseline to cleaned PR #152 head (QVAC-18993) PR #152 (qvac-registry-vcpkg) was rebased today to drop the ggml-speech port bump (b4cf7b2) and the matching ggml-speech-side MSVC shim. Only the whisper-cpp bump + whisper-cpp portfile MSVC `/I` fix remain. The consumer-side migration to ggml-speech (QVAC-18992 / PR #13) stays open on the speech branch but is no longer a prerequisite for this Android dynamic-backend rollout. New PR #152 HEAD: 9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d Old (pre-cleanup): 5cd209c145a1d61636f1d44b4afe37868c298a8c This addon does not depend on `ggml-speech` (it consumes the bundled ggml inside `whisper-cpp`), so the dependency closure is unchanged. Updated CHANGELOG to record the new baseline + the reason ggml-speech got dropped. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: fix cpp-lint failures (clang-format + clang-tidy) The prior CI run skipped cpp-lint entirely because the recent PR commits only touched CMakeLists.txt / CHANGELOG.md. The new ea298cf commit (QVAC-18993 mobile-test fix) added the first C++ diff in this branch, so cpp-lint now runs full clang-format + clang-tidy and surfaces three issues: 1. clang-format: JSAdapter.cpp had a one-line declaration broken across two lines (LLVM PointerAlignment=Left + AlignAfterOpen collapsed it). Reformatted in place. 2. clang-tidy [readability-identifier-naming]: WhisperHandlers.hpp:9 -- local `const int LANG_ID` violates the variable case style. Renamed to `langId` (lowerCamelCase, matches `checkLanguage` two lines above). Latent issue; never reported before because cpp-lint was a no-op on every prior PR commit. 3. clang-tidy [readability-identifier-naming]: WhisperModel.hpp:100 -- unused `set_weights_for_file(span, bool)` stub kept for parity with `transcription-parakeet` (which uses snake_case extensively for this exact API). Renaming would diverge from the parakeet pattern, so suppress with a single NOLINTNEXTLINE rather than touching the API surface. Local repro: `cp packages/lint-cpp/.clang-format packages/transcription-whispercpp/.clang-format` then `git-clang-format --diff $(git merge-base HEAD origin/main) -- packages/transcription-whispercpp` reports `did not modify any files`. The .clang-format copy is normally produced by `packages/transcription-whispercpp/CMakeLists.txt:58 (configure_file COPYONLY)` during CMake configure. [QVAC-18993][QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: reference QVAC-19071 in CHANGELOG QVAC-19071 ([Whisper] Update qvac-registry-vcpkg and addon with new port versions) is the meta task that bundles the registry-side port bump (qvac-registry-vcpkg PR #152: whisper-cpp 1.8.4.3#4) with the consumer-side addon bump (qvac PR #2124: transcription-whispercpp 0.7.3, baseline re-pin). No code changes; the work itself was already covered by PR #152 + this PR. Adds the cross-reference so the Asana ticket can be closed off this release cycle. The QVAC-18992 ggml-speech migration (PR #13 + ggml-speech port bump) stays deferred per the 2026-05-21 plan; it will land as a follow-up port bump under the same QVAC-19071 umbrella. [QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin baseline to consume whisper-cpp 1.8.4.3#5 (REF flipped to tetherto/master) [whisper-cpp PR #28](tetherto/qvac-ext-lib-whisper.cpp#28) (QVAC-18993 bundled-ggml --- Android dynamic backend + per-arch CPU dlopen fallback) was merged today (2026-05-21, merge commit `f3102199` on `tetherto/qvac-ext-lib-whisper.cpp/master`). With it merged, `tetherto/master` now carries every commit the registry's `whisper-cpp` port previously pulled from the temporary `Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857` branch: - PR #25 (QVAC-18991, upstream whisper.cpp sync) --- merged 2026-05-20 - PR #27 (QVAC-18966, tts-cpp chatterbox <atomic> fix) --- merged 2026-05-20 - PR #28 (QVAC-18993, ggml-backend android dynamic backend) --- merged 2026-05-21 [qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152) HEAD (`f2870372`) bumps `whisper-cpp` to port-version `1.8.4.3#5` with the REF repoint --- byte-identical source tarball outside `parakeet-cpp/` and `tts-cpp/` (separate vcpkg ports). This commit just re-pins the consumer-side baseline so the addon resolves against the new port-version. vcpkg-configuration.json default-registry baseline: 9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d (MSVC fix only, whisper-cpp 1.8.4.3#4) -> f2870372965e899ae1f8a221154d2b243a6c3d30 (+ whisper-cpp 1.8.4.3#5 REF repoint) No code change in this monorepo --- pure baseline re-pin. CHANGELOG updated to record both the new baseline and the (now superseded) intermediate `9f4e8e2` pin. Closes the consumer-side half of [QVAC-19071](https://tetherapp.atlassian.net/browse/QVAC-19071) ("Update qvac-registry-vcpkg and addon with new port versions"). Registry-side half = vcpkg PR #152 commit `f287037`. [QVAC-18993][QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin baseline to whisper-cpp 1.8.4.3#0 (PR #152 review fixes) @GustavoA1604 review on [qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152) requested three changes on the registry side: 1. Drop the explanatory comment block at top of `ports/whisper-cpp/portfile.cmake`. 2. Reset `port-version` 5 -> 0 (treat the tetherto REF repoint as a fresh start, not a continuation of the Zbig9000-branch series). 3. Collapse the three historical `1.8.4.3` entries (`port-version` 3, 4, 5 -- never consumed off-fork) in `versions/w-/whisper-cpp.json` into a single `port-version: 0` entry with the new git-tree. All three landed in PR #152 commit `ee71ecb`. This commit is the consumer-side mirror: vcpkg-configuration.json default-registry baseline: f2870372965e899ae1f8a221154d2b243a6c3d30 (1.8.4.3#5, pre-review) -> ee71ecb5b286224377313e5a50558d11adbef3ac (1.8.4.3#0, post-review) CHANGELOG entry updated: "1.8.4.3#5" -> "1.8.4.3#0" + note about port-version reset and history collapse + supersession line covers both prior pins (`9f4e8e2` MSVC fix, `f287037` 1.8.4.3#5). No code change in this monorepo --- pure baseline re-pin. The underlying whisper.cpp source bytes are unchanged (REPO + REF + SHA512 in the portfile are identical between `1.8.4.3#5` and `1.8.4.3#0`), so the produced binary is bit-for-bit equivalent. [QVAC-18993][QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: 0.8.0 — address PR review Collapses the 0.7.1/0.7.2/0.7.3 work into a single 0.8.0 release and folds in Gustavo's PR #2124 review feedback: - Bump version to 0.8.0; collapse CHANGELOG into a single 0.8.0 entry - Bump whisper-cpp override to 1.8.4.3#0 (matches PR #152 collapse) - Repoint default-registry to tetherto/qvac-registry-vcpkg @ a9d7e924 (PR #152 merge commit on tetherto/main) - vcpkg.json: model GPU features on transcription-parakeet's pattern — platform-gated whisper-cpp deps select [opencl,vulkan] on android, [vulkan] on linux/windows, and no GPU feature on apple. Drop the addon-side opencl/vulkan feature sections; CMake no longer carries ENABLE_OPENCL / ENABLE_VULKAN option indirection. - index.js: nest backendsDir under whisperConfig (mirrors parakeet's parakeetConfig.backendsDir). Strip it from the wire-format whisperConfig map and surface it as top-level configurationParams.backendsDir before handing the config to the addon. Fix the stale _createAddon JSDoc that still described "LLM-specific settings". - index.d.ts + README.md: document whisperConfig.backendsDir; drop the ENABLE_VULKAN build instructions (now controlled by vcpkg.json). - Compact all the addon-side comments (CMakeLists.txt, JSAdapter.cpp, WhisperConfig.hpp, WhisperModel.cpp); drop every QVAC asana ticket reference; standardise the C++ log wording on "configurationParams.backendsDir". - Drop "-D ENABLE_VULKAN=OFF" from the test:cpp:build / coverage:cpp:build npm scripts (no-op now that the option is gone). Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: 0.9.0 -> 0.8.0 (fold into single release) Reverts the 0.8.0 -> 0.9.0 bump from the merge commit: per request, this PR's release notes are folded into the existing 0.8.0 entry rather than shipping as a separate semver step. Order: Added -> Changed -> Fixed (from this PR) -> Removed (the OutputCallbackJs revert that landed on main as 0.8.0 via #2133). package.json bumped back to 0.8.0. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: GustavoA1604 <54457676+GustavoA1604@users.noreply.github.com>
Proletter
pushed a commit
that referenced
this pull request
May 24, 2026
…c GGML backends (#2124) * transcription-whispercpp: bump to 0.7.1 with whisper-cpp 1.8.4.3#1 (QVAC-18993) Pull in the consolidated vcpkg PR (whisper-cpp 1.8.4.3 #1 + ggml-speech 2026-05-18 #1) that covers four asana tickets: - QVAC-18991: whisper.cpp upstream-sync from ggml-org/master to v1.8.4.3. Adds upstream's VAD streaming API (whisper_vad_detect_speech_no_reset, whisper_vad_reset_state) with a regression test, the macOS Vulkan persistent-pipeline cache, and various BCI / bindings fixes. - QVAC-18300: enables OpenCL on Whisper for Android, gated behind a new `opencl` feature. This package now declares an android-only `opencl` feature that wires through to the whisper-cpp port's opencl feature, so a transcription addon built for android-arm64 can ship the Adreno backend without forcing it on non-Adreno consumers. - QVAC-18992: rebases the speech-stack ggml (qvac-ext-ggml@speech) onto the same upstream v0.10.2 baseline that whisper.cpp's bundled ggml uses, so the QVAC speech stack (whisper + parakeet + tts-cpp) consumes a coherent ggml API surface. No direct dependency from this package -- transitive via other speech-stack addons sharing the Android process. - QVAC-18993: switches the Android build to pure dynamic-backend mode: GGML_BACKEND_DL=ON + GGML_CPU_ALL_VARIANTS=ON on both the whisper-cpp port and ggml-speech port, so the addon's .bare prebuild ships one libggml-cpu-android_armv*_*.so per microarchitecture plus dynamically-loaded libggml-vulkan.so / libggml-opencl.so. ggml's loader picks the highest-feature CPU variant (armv9.2_2 .. armv8.0_1) plus the right GPU backend (Adreno 700+ -> OpenCL, everything else -> Vulkan) at runtime, so a single APK serves the whole device matrix without per-device builds. vcpkg-configuration.json is TEMPORARILY pointed at Zbig9000/qvac-registry-vcpkg.git @ b5a5e199 (= QVAC-vcpkg-speech-stack-android-dynamic-backend HEAD on Zbig9000's fork) because the consolidated port versions don't exist on tetherto/main yet. Once the vcpkg PR lands the default-registry block must be re-pointed back to https://github.com/tetherto/qvac-registry-vcpkg.git with the post-merge tetherto/main SHA as baseline. Devicefarm: the asana asks for GPU testing on mobile to verify S25 picks OpenCL and Pixel 9 picks Vulkan. Those tests live outside this addon (in qvac CI's integration-mobile-test workflow) and depend on device-farm config that I can't validate locally; the addon code side is unchanged in this bump (CPU dispatcher + dynamic backend `.so` files are already wired by the whisper-cpp port's prebuild output, and the JS layer already enumerates ggml_backend_devs at init). * transcription-whispercpp: bump to 0.7.2 with whisper-cpp 1.8.4.3#2 (QVAC-18993) Picks up the Android per-arch CPU dlopen fallback patch added to the whisper-cpp port (mirrors qvac-ext-ggml@speech 9562ed04). Without this, every APK consumer with `useLegacyPackaging=false` (AGP 3.6+ default) would silently lose CPU init: the directory iterator finds nothing inside compressed APK libs, and the existing on-disk filename fallback never composes the per-arch `libggml-cpu-android_armv*_*.so` names that `GGML_CPU_ALL_VARIANTS=ON` produces. Re-pins the Zbig9000/qvac-registry-vcpkg default-registry baseline to 86257dc376ca043c67cc4805ab8d1e74a94b7eda so both whisper-cpp 1.8.4.3#2 and ggml-speech 2026-05-19#0 are reachable. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: bump to 0.7.3 → whisper-cpp 1.8.4.3#3 (QVAC-18993) Pure follow-up to 0.7.2 -- the two Android dynamic-backend ggml fixes the 0.7.2 release pulled in via vcpkg patches are now upstreamed as commits on tetherto/qvac-ext-lib-whisper.cpp PR #26 ("ggml + tts-cpp Android dynamic-backend overlays") instead of being carried in the vcpkg port's patches/ tree. Plus a tts-cpp `<atomic>` include fix that closes the parallel speech-stack consumer's build under the day-2 ggml-speech merge. Build output is bit-identical to 0.7.2 (whisper-cpp 1.8.4.3#3 SOURCE == 1.8.4.3#2 SOURCE+PATCHES, verified by hashing all libggml-cpu-android_armv*_*.so files from the NDK r29 cross-compile). Registry baseline bumped to 965f5e5a so the new port-version (1.8.4.3#3) is reachable. PRs in the cross-repo set: whisper.cpp #26 (Zbig9000:QVAC-18993-bundled-ggml-android-dynamic-backend) vcpkg #152 (Zbig9000:QVAC-vcpkg-speech-stack-android-dynamic-backend) Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: bridge ggml dlopen backends as IMPORTED targets (QVAC-18993) `bare-make generate` failed on android-arm64 with CMake Error: get_target_property() called with non-existent target "ggml::ggml-cpu-android_armv8.0_1" (… 8 backends total) after enabling `GGML_BACKEND_DL=ON` on the `whisper-cpp` port. With dynamic- backend mode, ggml builds the per-arch CPU + GPU backends as standalone MODULE libraries that ggml dlopens at runtime; upstream ggml's `install(TARGETS … EXPORT)` deliberately skips them, so the consumer's `BACKEND_DL_LIBS` loop in `CMakeLists.txt` referenced targets that don't exist. Wrap the existing loop with a `if(NOT TARGET ggml::${_backend})` fallback that locates the `.so` under `${VCPKG_INSTALLED_PATH}/bin` via `find_library` and materialises a `SHARED IMPORTED` target locally with `IMPORTED_NO_SONAME=TRUE` — then bundle via the existing `INSTALL TARGET` path. Mirrors the pattern that already ships in `packages/diffusion-cpp` for the same Android-dlopen build mode. Static backends (any platform that links ggml in directly) still find their imported target via ggml-config.cmake on the first branch, so non-Android prebuilds are byte-identical. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin baseline to vcpkg PR #152 rebased HEAD 8c6ca188 (QVAC-18993) tetherto/qvac-registry-vcpkg/main moved forward yesterday with #156 (parakeet-cpp 2026-05-20 + ggml-speech 2026-04-09#2 bumps), so vcpkg PR #152 was rebased onto the new base 0e75457. Update the default- registry baseline pointer from the old PR #152 HEAD (dffaaf6) to the rebased HEAD (8c6ca188) so the version-resolver still finds `ggml-speech 2026-05-19#3` (now layered on top of the just-landed 2026-04-09#2) and `whisper-cpp 1.8.4.3#3` (unchanged content, correct SHA512). No other changes --- the resolver picks up the same final versions of every package as before, just with the rebased baseline as the search root. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: consume whisper-cpp 1.8.4.3#4 + ggml-speech 2026-05-19#4 (QVAC-18993, QVAC-18992) Picks up the MSVC `/I` fix in the spirv-headers include-shim (vcpkg PR #152 commit 5cd209c) so prebuild / win32-x64 stops dying with `c1xx: fatal error C1083: Cannot open source file: '.../x64-windows/include'` on the `whisper-cpp[vulkan]` configure step. The shim now emits the MSVC-style `/I<path>` on Windows and keeps `-isystem <path>` (with warning suppression) on GCC/Clang elsewhere. whisper-cpp override bumped 1.8.4.3#3 -> 1.8.4.3#4. Default-registry baseline bumped 8c6ca188 -> 5cd209c1. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: wire ENABLE_OPENCL so Android prebuilds ship libggml-opencl.so (QVAC-18300) The `opencl` feature was declared in `packages/transcription-whispercpp/vcpkg.json` (gated to `platform: android`) and the `whisper-cpp` port's `opencl` feature correctly enables `-DGGML_OPENCL=ON` on Android — but the consumer's `CMakeLists.txt` only appended `"tests"` and `"vulkan"` to `VCPKG_MANIFEST_FEATURES`. The `opencl` feature was therefore never activated, so vcpkg resolved `whisper-cpp` without `[opencl]`, ggml was built without `GGML_OPENCL=ON`, and the `android-arm64` prebuild silently shipped CPU + Vulkan backends only (no `libggml-opencl.so`) — defeating the entire point of QVAC-18300. Add an `ENABLE_OPENCL` option (default `ON` on Android, `OFF` elsewhere — the `vcpkg.json` feature is `platform: android` gated so non-Android is a no-op anyway) that appends `"opencl"` to `VCPKG_MANIFEST_FEATURES`. Mirrors the `SD_OPENCL` pattern in `packages/diffusion-cpp/CMakeLists.txt` and keeps the GPU-feature wiring uniform across the three GPU backends (Metal auto, Vulkan toggle, OpenCL toggle). After this commit, the `android-arm64` prebuild's `qvac__transcription-whispercpp/` directory should ship `libggml-opencl.so` alongside the existing 7 per-microarch CPU variants and `libggml-vulkan.so`. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: default ENABLE_OPENCL ON unconditionally (QVAC-18300) Previous commit (6b42bc0) wired ENABLE_OPENCL but gated it on `_qvac_whispercpp_target_os STREQUAL "Android"`, mirroring the existing ENABLE_VULKAN block. CI re-run (26172345624) exposed that the gate is broken: at top-level CMakeLists.txt time, `CMAKE_SYSTEM_NAME` is not yet set --- the bare-make Android toolchain file is loaded by `project()` (which runs *after* the option block), so `_qvac_whispercpp_target_os` falls through to the host OS ("Linux") and ENABLE_OPENCL stayed OFF on the android-arm64 prebuild. Evidence from run 26172345624's android-arm64 build log: `Installing 9/9 whisper-cpp[core,vulkan]:arm64-android@1.8.4.3#4...` ^^^^^^^^ no `[opencl]` ENABLE_VULKAN works only by coincidence: Vulkan is also default-ON on the Linux host detection branch, so the wrong target detection produces the right behaviour. For Android-only features there is no such overlap. Fix: default ENABLE_OPENCL ON unconditionally and let the actual platform gating happen where it can: (1) the `platform: android` clause on the `whisper-cpp[opencl]` dep in `vcpkg.json`, and (2) the `VCPKG_TARGET_IS_ANDROID` check in the `whisper-cpp` portfile that gates `-DGGML_OPENCL=ON`. Adding `"opencl"` to `VCPKG_MANIFEST_FEATURES` on non-Android is a guaranteed no-op because the feature's only dep is platform-gated --- mirrors the layered gating that `whisper-cpp[vulkan]` already uses (the `vulkan` feature's deps are `!osx & !ios` gated and the portfile's `-DGGML_VULKAN=ON` is also target-gated). After this commit, the android-arm64 install plan should resolve as `whisper-cpp[core,vulkan,opencl]` and the prebuild tarball should contain `libggml-opencl.so` alongside the 7 per-microarch CPU `.so`s and `libggml-vulkan.so`. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: call ggml_backend_load_all_from_path before whisper_init (QVAC-18993) Android mobile-test E2E crashed inside whisper_init_from_file_with_params with SIGABRT on PR #2124 / run 26173084690 (both Pixel 9 Pro + Samsung S25 Ultra, 132 ms after Downloaded model: ggml-tiny.bin). Stack: abort → ggml_abort+228 → ggml_backend_dev_backend_reg+48 → whisper_init_with_params_no_state+480 → whisper_init_from_file_with_params_no_state+212 → whisper_init_from_file_with_params+48 → WhisperModel::load()+460 Root cause: the addon never called ggml_backend_load_all*(). With the QVAC-18993 GGML_BACKEND_DL=ON build, the bundled ggml-base no longer defines GGML_USE_CPU, so the static ggml_backend_registry ctor registers zero backends. whisper.cpp's first ggml_backend_init_by_type(CPU) returns NULL → ggml_backend_dev_backend_reg(NULL) trips GGML_ASSERT(device). This is the same crash signature on both the pre-OpenCL run 26170576156 and the post-OpenCL run 26173084690, so it is independent of the recent OpenCL enablement. The mobile workflow last passed on tmp-whisper-184-3-validation back on 2026-05-11, which predates GGML_BACKEND_DL=ON. Mirror the pattern used by every other ggml-based addon in the monorepo (packages/{diffusion-cpp,llm-llamacpp,classification-ggml,…}): * CMakeLists.txt — emit BACKENDS_SUBDIR (<bare_target>/<module_name>) compile def via bare_target / bare_module_target. * WhisperConfig — add backendsDir field (sibling of the handler-driven maps so it bypasses WHISPER_CONTEXT_HANDLERS.at()). * JSAdapter — read top-level backendsDir string directly from configurationParams into config.backendsDir. * WhisperModel::load — on __ANDROID__, std::call_once → ggml_backend_load_all_from_path(backendsDir/BACKENDS_SUBDIR) before whisper_init. * index.js — require('bare-path'); pass backendsDir: path.join(__dirname, 'prebuilds') in _load + reload. No diff on non-Android (Linux/macOS/Windows/iOS): ggml's static ctor keeps registering CPU there as before. aiDocs/15-android-mobile-test-crash-fix.md has the full investigation (crash extraction, layered root-cause, why every other ggml addon already does this, follow-ups). Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin vcpkg baseline to cleaned PR #152 head (QVAC-18993) PR #152 (qvac-registry-vcpkg) was rebased today to drop the ggml-speech port bump (b4cf7b2) and the matching ggml-speech-side MSVC shim. Only the whisper-cpp bump + whisper-cpp portfile MSVC `/I` fix remain. The consumer-side migration to ggml-speech (QVAC-18992 / PR #13) stays open on the speech branch but is no longer a prerequisite for this Android dynamic-backend rollout. New PR #152 HEAD: 9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d Old (pre-cleanup): 5cd209c145a1d61636f1d44b4afe37868c298a8c This addon does not depend on `ggml-speech` (it consumes the bundled ggml inside `whisper-cpp`), so the dependency closure is unchanged. Updated CHANGELOG to record the new baseline + the reason ggml-speech got dropped. Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: fix cpp-lint failures (clang-format + clang-tidy) The prior CI run skipped cpp-lint entirely because the recent PR commits only touched CMakeLists.txt / CHANGELOG.md. The new ea298cf commit (QVAC-18993 mobile-test fix) added the first C++ diff in this branch, so cpp-lint now runs full clang-format + clang-tidy and surfaces three issues: 1. clang-format: JSAdapter.cpp had a one-line declaration broken across two lines (LLVM PointerAlignment=Left + AlignAfterOpen collapsed it). Reformatted in place. 2. clang-tidy [readability-identifier-naming]: WhisperHandlers.hpp:9 -- local `const int LANG_ID` violates the variable case style. Renamed to `langId` (lowerCamelCase, matches `checkLanguage` two lines above). Latent issue; never reported before because cpp-lint was a no-op on every prior PR commit. 3. clang-tidy [readability-identifier-naming]: WhisperModel.hpp:100 -- unused `set_weights_for_file(span, bool)` stub kept for parity with `transcription-parakeet` (which uses snake_case extensively for this exact API). Renaming would diverge from the parakeet pattern, so suppress with a single NOLINTNEXTLINE rather than touching the API surface. Local repro: `cp packages/lint-cpp/.clang-format packages/transcription-whispercpp/.clang-format` then `git-clang-format --diff $(git merge-base HEAD origin/main) -- packages/transcription-whispercpp` reports `did not modify any files`. The .clang-format copy is normally produced by `packages/transcription-whispercpp/CMakeLists.txt:58 (configure_file COPYONLY)` during CMake configure. [QVAC-18993][QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: reference QVAC-19071 in CHANGELOG QVAC-19071 ([Whisper] Update qvac-registry-vcpkg and addon with new port versions) is the meta task that bundles the registry-side port bump (qvac-registry-vcpkg PR #152: whisper-cpp 1.8.4.3#4) with the consumer-side addon bump (qvac PR #2124: transcription-whispercpp 0.7.3, baseline re-pin). No code changes; the work itself was already covered by PR #152 + this PR. Adds the cross-reference so the Asana ticket can be closed off this release cycle. The QVAC-18992 ggml-speech migration (PR #13 + ggml-speech port bump) stays deferred per the 2026-05-21 plan; it will land as a follow-up port bump under the same QVAC-19071 umbrella. [QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin baseline to consume whisper-cpp 1.8.4.3#5 (REF flipped to tetherto/master) [whisper-cpp PR #28](tetherto/qvac-ext-lib-whisper.cpp#28) (QVAC-18993 bundled-ggml --- Android dynamic backend + per-arch CPU dlopen fallback) was merged today (2026-05-21, merge commit `f3102199` on `tetherto/qvac-ext-lib-whisper.cpp/master`). With it merged, `tetherto/master` now carries every commit the registry's `whisper-cpp` port previously pulled from the temporary `Zbig9000/qvac-ext-lib-whisper.cpp@14620c8857` branch: - PR #25 (QVAC-18991, upstream whisper.cpp sync) --- merged 2026-05-20 - PR #27 (QVAC-18966, tts-cpp chatterbox <atomic> fix) --- merged 2026-05-20 - PR #28 (QVAC-18993, ggml-backend android dynamic backend) --- merged 2026-05-21 [qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152) HEAD (`f2870372`) bumps `whisper-cpp` to port-version `1.8.4.3#5` with the REF repoint --- byte-identical source tarball outside `parakeet-cpp/` and `tts-cpp/` (separate vcpkg ports). This commit just re-pins the consumer-side baseline so the addon resolves against the new port-version. vcpkg-configuration.json default-registry baseline: 9f4e8e20072d8a7a1e118a49c36aacf6af6b3e0d (MSVC fix only, whisper-cpp 1.8.4.3#4) -> f2870372965e899ae1f8a221154d2b243a6c3d30 (+ whisper-cpp 1.8.4.3#5 REF repoint) No code change in this monorepo --- pure baseline re-pin. CHANGELOG updated to record both the new baseline and the (now superseded) intermediate `9f4e8e2` pin. Closes the consumer-side half of [QVAC-19071](https://tetherapp.atlassian.net/browse/QVAC-19071) ("Update qvac-registry-vcpkg and addon with new port versions"). Registry-side half = vcpkg PR #152 commit `f287037`. [QVAC-18993][QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: re-pin baseline to whisper-cpp 1.8.4.3#0 (PR #152 review fixes) @GustavoA1604 review on [qvac-registry-vcpkg PR #152](tetherto/qvac-registry-vcpkg#152) requested three changes on the registry side: 1. Drop the explanatory comment block at top of `ports/whisper-cpp/portfile.cmake`. 2. Reset `port-version` 5 -> 0 (treat the tetherto REF repoint as a fresh start, not a continuation of the Zbig9000-branch series). 3. Collapse the three historical `1.8.4.3` entries (`port-version` 3, 4, 5 -- never consumed off-fork) in `versions/w-/whisper-cpp.json` into a single `port-version: 0` entry with the new git-tree. All three landed in PR #152 commit `ee71ecb`. This commit is the consumer-side mirror: vcpkg-configuration.json default-registry baseline: f2870372965e899ae1f8a221154d2b243a6c3d30 (1.8.4.3#5, pre-review) -> ee71ecb5b286224377313e5a50558d11adbef3ac (1.8.4.3#0, post-review) CHANGELOG entry updated: "1.8.4.3#5" -> "1.8.4.3#0" + note about port-version reset and history collapse + supersession line covers both prior pins (`9f4e8e2` MSVC fix, `f287037` 1.8.4.3#5). No code change in this monorepo --- pure baseline re-pin. The underlying whisper.cpp source bytes are unchanged (REPO + REF + SHA512 in the portfile are identical between `1.8.4.3#5` and `1.8.4.3#0`), so the produced binary is bit-for-bit equivalent. [QVAC-18993][QVAC-19071] Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: 0.8.0 — address PR review Collapses the 0.7.1/0.7.2/0.7.3 work into a single 0.8.0 release and folds in Gustavo's PR #2124 review feedback: - Bump version to 0.8.0; collapse CHANGELOG into a single 0.8.0 entry - Bump whisper-cpp override to 1.8.4.3#0 (matches PR #152 collapse) - Repoint default-registry to tetherto/qvac-registry-vcpkg @ a9d7e924 (PR #152 merge commit on tetherto/main) - vcpkg.json: model GPU features on transcription-parakeet's pattern — platform-gated whisper-cpp deps select [opencl,vulkan] on android, [vulkan] on linux/windows, and no GPU feature on apple. Drop the addon-side opencl/vulkan feature sections; CMake no longer carries ENABLE_OPENCL / ENABLE_VULKAN option indirection. - index.js: nest backendsDir under whisperConfig (mirrors parakeet's parakeetConfig.backendsDir). Strip it from the wire-format whisperConfig map and surface it as top-level configurationParams.backendsDir before handing the config to the addon. Fix the stale _createAddon JSDoc that still described "LLM-specific settings". - index.d.ts + README.md: document whisperConfig.backendsDir; drop the ENABLE_VULKAN build instructions (now controlled by vcpkg.json). - Compact all the addon-side comments (CMakeLists.txt, JSAdapter.cpp, WhisperConfig.hpp, WhisperModel.cpp); drop every QVAC asana ticket reference; standardise the C++ log wording on "configurationParams.backendsDir". - Drop "-D ENABLE_VULKAN=OFF" from the test:cpp:build / coverage:cpp:build npm scripts (no-op now that the option is gone). Co-authored-by: Cursor <cursoragent@cursor.com> * transcription-whispercpp: 0.9.0 -> 0.8.0 (fold into single release) Reverts the 0.8.0 -> 0.9.0 bump from the merge commit: per request, this PR's release notes are folded into the existing 0.8.0 entry rather than shipping as a separate semver step. Order: Added -> Changed -> Fixed (from this PR) -> Removed (the OutputCallbackJs revert that landed on main as 0.8.0 via #2133). package.json bumped back to 0.8.0. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: GustavoA1604 <54457676+GustavoA1604@users.noreply.github.com>
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
No description provided.