diff --git a/.github/workflows/electron-native-package.yml b/.github/workflows/electron-native-package.yml index 8a02850b2..7657e915e 100644 --- a/.github/workflows/electron-native-package.yml +++ b/.github/workflows/electron-native-package.yml @@ -359,8 +359,9 @@ jobs: # Replaces a hand-copied C:\actions-runner-state directory that carried no # version information and had already gone stale once (QAIRT 2.45.x staged - # against a newer install). Now a checksum-pinned public asset, and the - # pairing gate proves it is the SDK this engine was built against. + # against a newer install). Now a checksum-pinned PRIVATE asset on the + # neurun repo (NEURUN_TOKEN below), and the pairing gate proves it is the + # SDK this engine was built against. - name: Download the pinned QAIRT runtime (win-arm64) shell: bash env: diff --git a/AGENTS.md b/AGENTS.md index 79a1b16be..ae3a77562 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -74,7 +74,7 @@ platform services (file I/O, HTTP, Keychain, audio) via an inversion-of-control call into the C core for all inference. Protobuf IDL schemas generate type-safe bindings for every language. -**Current version**: `0.20.26` (canonical source: `core/VERSION`) +**Current version**: `0.20.27` (canonical source: `core/VERSION`) | SDK | Path | Bridge mechanism | Platforms | |-----|------|-------------------|-----------| diff --git a/Package.swift b/Package.swift index 3cf5287c8..bef19a375 100644 --- a/Package.swift +++ b/Package.swift @@ -9,7 +9,7 @@ import Foundation // This is the SINGLE Package.swift for both local development and SPM consumption. // // FOR EXTERNAL USERS (consuming via GitHub): -// .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", from: "0.20.26") +// .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", from: "0.20.27") // // Consume the SWIFT DISTRIBUTION REPO, never this monorepo. Two reasons, and // the first one is fatal: @@ -120,7 +120,7 @@ let mlxRuntimeDistributionSwiftSettings: [SwiftSetting] = buildMLXDistributionFr // republished carrying Windows x64 and ARM64 natives, and 0.20.22 fixes their // packaging; none of v0.20.20, v0.20.21 or v0.20.22 exists as a tag with // release assets, so the remote binaryTargets must keep resolving 0.20.19. -let sdkVersion = "0.20.26" +let sdkVersion = "0.20.27" let homebrewPrefix = ProcessInfo.processInfo.environment["RUNANYWHERE_HOMEBREW_PREFIX"] ?? ProcessInfo.processInfo.environment["HOMEBREW_PREFIX"] diff --git a/bindings/electron/native/package.json b/bindings/electron/native/package.json index 082f02a8e..736993883 100644 --- a/bindings/electron/native/package.json +++ b/bindings/electron/native/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/electron-native", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Electron SDK — native N-API addon over the rac_* C ABI (on-device LLM/VLM/STT/TTS, Windows-first, Hexagon-ready).", "private": true, "license": "SEE LICENSE IN ../../../LICENSE", diff --git a/bindings/electron/package-lock.json b/bindings/electron/package-lock.json index 9b8bee567..9038f73e8 100644 --- a/bindings/electron/package-lock.json +++ b/bindings/electron/package-lock.json @@ -1,12 +1,12 @@ { "name": "@runanywhere/electron", - "version": "0.20.26", + "version": "0.20.27", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@runanywhere/electron", - "version": "0.20.26", + "version": "0.20.27", "cpu": [ "x64", "arm64" diff --git a/bindings/electron/package.json b/bindings/electron/package.json index 0486e8a17..4dce37eae 100644 --- a/bindings/electron/package.json +++ b/bindings/electron/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/electron", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Electron SDK — on-device LLM/VLM/STT/TTS/embeddings for Electron & Node (prebuilds: darwin-arm64, win32-x64; win32-arm64 QHexRT/Hexagon NPU).", "publishConfig": { "access": "public" @@ -75,7 +75,7 @@ "@runanywhere/proto-ts": "file:../proto-ts" }, "peerDependencies": { - "@runanywhere/proto-ts": "^0.20.26" + "@runanywhere/proto-ts": "^0.20.27" }, "devDependencies": { "@types/node": "^22.7.0", diff --git a/bindings/electron/packages/llamacpp/package.json b/bindings/electron/packages/llamacpp/package.json index 11f751ccd..a9dbec53a 100644 --- a/bindings/electron/packages/llamacpp/package.json +++ b/bindings/electron/packages/llamacpp/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/electron-llamacpp", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Electron SDK — LlamaCPP backend plugin (LLM / VLM / GGUF embeddings)", "publishConfig": { "access": "public" diff --git a/bindings/electron/packages/neurt/package.json b/bindings/electron/packages/neurt/package.json index 6adf96222..90a81d062 100644 --- a/bindings/electron/packages/neurt/package.json +++ b/bindings/electron/packages/neurt/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/electron-neurt", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Electron SDK — NeuRT backend plugin (Apple Neural Engine via Core ML; macOS only)", "license": "SEE LICENSE IN LICENSE", "type": "commonjs", diff --git a/bindings/electron/packages/onnx/package.json b/bindings/electron/packages/onnx/package.json index 484ece1ed..ab11d5c9a 100644 --- a/bindings/electron/packages/onnx/package.json +++ b/bindings/electron/packages/onnx/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/electron-onnx", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Electron SDK — ONNX backend plugin (embeddings / segmentation)", "publishConfig": { "access": "public" diff --git a/bindings/electron/packages/qhexrt/package.json b/bindings/electron/packages/qhexrt/package.json index 772cbd447..b62d944f1 100644 --- a/bindings/electron/packages/qhexrt/package.json +++ b/bindings/electron/packages/qhexrt/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/electron-qhexrt", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Electron SDK \u2014 QHexRT backend plugin (Qualcomm Hexagon NPU; Snapdragon X / X2 Elite on Windows ARM64)", "license": "SEE LICENSE IN LICENSE", "type": "commonjs", diff --git a/bindings/electron/packages/sherpa/package.json b/bindings/electron/packages/sherpa/package.json index ab0a007a6..c32c214ec 100644 --- a/bindings/electron/packages/sherpa/package.json +++ b/bindings/electron/packages/sherpa/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/electron-sherpa", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Electron SDK — Sherpa backend plugin (STT / TTS / VAD)", "publishConfig": { "access": "public" diff --git a/bindings/flutter/AGENTS.md b/bindings/flutter/AGENTS.md index 8b3230d11..63e5ab3f7 100644 --- a/bindings/flutter/AGENTS.md +++ b/bindings/flutter/AGENTS.md @@ -26,7 +26,7 @@ bindings/flutter/ └── runanywhere_qhexrt/ # QHexRT Qualcomm Hexagon NPU backend (Android-only) ``` -All four backend packages depend on `runanywhere ^0.20.26`; the core package vendors +All four backend packages depend on `runanywhere ^0.20.27`; the core package vendors `RACommons`, each backend vendors its own XCFrameworks/`.so` files. Example app: `bindings/flutter/example/` (setup/troubleshooting in `docs/DEVELOPMENT.md`; `example/scripts/verify.sh` is the clean-clone build gate). @@ -218,7 +218,7 @@ strict-raw-types, error-level `dead_code`/`unused_import`/`unused_local_variable | Package / Artifact | Version | |---|---| -| `runanywhere`, `runanywhere_llamacpp`, `runanywhere_mlx`, `runanywhere_onnx`, `runanywhere_qhexrt` | 0.20.26 (all 5, confirmed identical) | +| `runanywhere`, `runanywhere_llamacpp`, `runanywhere_mlx`, `runanywhere_onnx`, `runanywhere_qhexrt` | 0.20.27 (all 5, confirmed identical) | | `RACommons` native | 0.1.6 | | llama.cpp engine | runanywhere-b10453.4 | | ONNX Runtime | 1.28.0 | diff --git a/bindings/flutter/README.md b/bindings/flutter/README.md index 217c4e1e3..c5476330d 100644 --- a/bindings/flutter/README.md +++ b/bindings/flutter/README.md @@ -40,36 +40,36 @@ ARM64 devices are recommended. Metal on iOS and NEON on Android provide signific ## Installation -Add the packages you need to `pubspec.yaml`. Pin to **0.20.26**: +Add the packages you need to `pubspec.yaml`. Pin to **0.20.27**: **Core + LlamaCpp (LLM):** ```yaml dependencies: - runanywhere: 0.20.26 - runanywhere_llamacpp: 0.20.26 + runanywhere: 0.20.27 + runanywhere_llamacpp: 0.20.27 ``` **Core + ONNX (STT / TTS / VAD):** ```yaml dependencies: - runanywhere: 0.20.26 - runanywhere_onnx: 0.20.26 + runanywhere: 0.20.27 + runanywhere_onnx: 0.20.27 ``` **Core + MLX (Apple LLM / VLM / speech on physical iOS devices):** ```yaml dependencies: - runanywhere: 0.20.26 - runanywhere_mlx: 0.20.26 + runanywhere: 0.20.27 + runanywhere_mlx: 0.20.27 ``` **Optional NPU (Snapdragon Android):** ```yaml - runanywhere_qhexrt: 0.20.26 + runanywhere_qhexrt: 0.20.27 ``` Then run: diff --git a/bindings/flutter/docs/ARCHITECTURE.md b/bindings/flutter/docs/ARCHITECTURE.md index a763deb4a..9c7df797b 100644 --- a/bindings/flutter/docs/ARCHITECTURE.md +++ b/bindings/flutter/docs/ARCHITECTURE.md @@ -51,7 +51,7 @@ bindings/flutter/ └── runanywhere_qhexrt/ # Qualcomm Hexagon NPU (Android-only) ``` -Backend packages depend on `runanywhere ^0.20.26`. Source checkouts prefer +Backend packages depend on `runanywhere ^0.20.27`. Source checkouts prefer package-owned XCFramework/JNI staging, while public pub archives omit those large binaries and resolve versioned, checksum-verified release archives through CocoaPods/SwiftPM on iOS and Gradle on Android. MLX is CocoaPods-only because @@ -463,11 +463,11 @@ lives in the bundled native backend (C++ engines or the Swift MLX runtime). | Component | Version | |-----------|---------| -| `runanywhere` (Dart) | 0.20.26 | -| `runanywhere_llamacpp` | 0.20.26 | -| `runanywhere_mlx` | 0.20.26 | -| `runanywhere_onnx` | 0.20.26 | -| `runanywhere_qhexrt` | 0.20.26 | +| `runanywhere` (Dart) | 0.20.27 | +| `runanywhere_llamacpp` | 0.20.27 | +| `runanywhere_mlx` | 0.20.27 | +| `runanywhere_onnx` | 0.20.27 | +| `runanywhere_qhexrt` | 0.20.27 | | `RACommons` native | 0.1.6 | | llama.cpp engine | runanywhere-b10453.4 | | ONNX Runtime | 1.28.0 | diff --git a/bindings/flutter/docs/Documentation.md b/bindings/flutter/docs/Documentation.md index 1a1f96dca..1655c4e24 100644 --- a/bindings/flutter/docs/Documentation.md +++ b/bindings/flutter/docs/Documentation.md @@ -534,7 +534,7 @@ import 'package:runanywhere_onnx/runanywhere_onnx.dart'; ## Versioning -- Canonical SDK version: `RunAnywhere.version` (currently `0.20.26`). +- Canonical SDK version: `RunAnywhere.version` (currently `0.20.27`). - Native commons version: vendored `RACommons` build (`0.1.6`). - llama.cpp engine: `runanywhere-b10453.4`. - ONNX Runtime: `1.28.0`. diff --git a/bindings/flutter/packages/runanywhere/CHANGELOG.md b/bindings/flutter/packages/runanywhere/CHANGELOG.md index 7e8d40ed0..a38be198d 100644 --- a/bindings/flutter/packages/runanywhere/CHANGELOG.md +++ b/bindings/flutter/packages/runanywhere/CHANGELOG.md @@ -5,6 +5,20 @@ All notable changes to the RunAnywhere Flutter SDK will be documented in this fi The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.20.27] - 2026-08-24 + +### Changed + +- The Apple Neural Engine (NeuRT) and Hexagon NPU (QHexRT) engines now ship from + pinned, prebuilt archives published by the private engine repository rather + than being compiled from source. Each archive is verified by SHA-256 and by a + build receipt naming the plugin ABI version it was built against. +- The Hexagon engine's QAIRT/QNN runtime dependency is now pinned and fetched + the same way — as a private, checksum-verified artifact from the engine + repository, paired against the engine's own build identity so the two can + never silently drift apart. +- No Flutter-facing API change. + ## [0.20.26] - 2026-08-23 ### Changed diff --git a/bindings/flutter/packages/runanywhere/README.md b/bindings/flutter/packages/runanywhere/README.md index 674395031..8775fe9ee 100644 --- a/bindings/flutter/packages/runanywhere/README.md +++ b/bindings/flutter/packages/runanywhere/README.md @@ -10,7 +10,7 @@ ```yaml dependencies: - runanywhere: 0.20.26 + runanywhere: 0.20.27 ``` Add backend packages as needed (`runanywhere_llamacpp`, `runanywhere_onnx`, etc.). See the [Flutter SDK README](../../README.md) for iOS Podfile, Android permissions, and platform setup. diff --git a/bindings/flutter/packages/runanywhere/android/binary_config.gradle b/bindings/flutter/packages/runanywhere/android/binary_config.gradle index a07b7927a..e68768765 100644 --- a/bindings/flutter/packages/runanywhere/android/binary_config.gradle +++ b/bindings/flutter/packages/runanywhere/android/binary_config.gradle @@ -16,7 +16,7 @@ ext { // ============================================================================= // Version Configuration (MUST match Swift Package.swift and Kotlin build.gradle.kts) // ============================================================================= - fallbackCoreVersion = "0.20.26" + fallbackCoreVersion = "0.20.27" coreVersion = coreVersionFile.exists() ? coreVersionFile.text.trim() : fallbackCoreVersion // ============================================================================= diff --git a/bindings/flutter/packages/runanywhere/android/build.gradle b/bindings/flutter/packages/runanywhere/android/build.gradle index 5ea40c65c..f07c8fed4 100644 --- a/bindings/flutter/packages/runanywhere/android/build.gradle +++ b/bindings/flutter/packages/runanywhere/android/build.gradle @@ -11,7 +11,7 @@ // Version: Must match Swift SDK's Package.swift and Kotlin SDK's build.gradle.kts group = 'ai.runanywhere.sdk' -version = '0.20.26' +version = '0.20.27' // Load binary configuration apply from: 'binary_config.gradle' diff --git a/bindings/flutter/packages/runanywhere/android/src/main/kotlin/ai/runanywhere/sdk/RunAnywherePlugin.kt b/bindings/flutter/packages/runanywhere/android/src/main/kotlin/ai/runanywhere/sdk/RunAnywherePlugin.kt index da2b5118f..ff1f1ebd4 100644 --- a/bindings/flutter/packages/runanywhere/android/src/main/kotlin/ai/runanywhere/sdk/RunAnywherePlugin.kt +++ b/bindings/flutter/packages/runanywhere/android/src/main/kotlin/ai/runanywhere/sdk/RunAnywherePlugin.kt @@ -21,8 +21,8 @@ class RunAnywherePlugin : FlutterPlugin, MethodCallHandler { companion object { private const val TAG = "RunAnywherePlugin" private const val CHANNEL_NAME = "runanywhere" - private const val SDK_VERSION = "0.20.26" - private const val COMMONS_VERSION = "0.20.26" + private const val SDK_VERSION = "0.20.27" + private const val COMMONS_VERSION = "0.20.27" init { // Load the Flutter-owned helper through the JVM so JNI_OnLoad can diff --git a/bindings/flutter/packages/runanywhere/ios/runanywhere.podspec b/bindings/flutter/packages/runanywhere/ios/runanywhere.podspec index 779194547..bd683e25c 100644 --- a/bindings/flutter/packages/runanywhere/ios/runanywhere.podspec +++ b/bindings/flutter/packages/runanywhere/ios/runanywhere.podspec @@ -20,13 +20,13 @@ end Pod::Spec.new do |s| s.name = 'runanywhere' - s.version = '0.20.26' + s.version = '0.20.27' # TEMP: iOS archives are downloaded from the v#{asset_version} GitHub release. # s.version leads the published release because 0.20.20 republished only the # Electron npm packages -- no v0.20.20 tag or iOS archives were ever cut, and # the checksums below are still the 0.20.19 ones. Bump this back to # s.version once a matching release exists. - asset_version = '0.20.26' + asset_version = '0.20.27' s.summary = 'RunAnywhere: Privacy-first, on-device AI SDK for Flutter' s.description = <<-DESC Privacy-first, on-device AI SDK for Flutter. This package provides the core diff --git a/bindings/flutter/packages/runanywhere/ios/runanywhere/Package.swift b/bindings/flutter/packages/runanywhere/ios/runanywhere/Package.swift index ba2071a17..bf92e50fb 100644 --- a/bindings/flutter/packages/runanywhere/ios/runanywhere/Package.swift +++ b/bindings/flutter/packages/runanywhere/ios/runanywhere/Package.swift @@ -3,7 +3,7 @@ import PackageDescription import Foundation -let sdkVersion = "0.20.26" +let sdkVersion = "0.20.27" let packageRoot = URL(fileURLWithPath: #filePath).deletingLastPathComponent() func runAnywhereBinaryTarget(name: String, checksum: String) -> Target { diff --git a/bindings/flutter/packages/runanywhere/ios/runanywhere/Sources/runanywhere/RunAnywherePlugin.swift b/bindings/flutter/packages/runanywhere/ios/runanywhere/Sources/runanywhere/RunAnywherePlugin.swift index fc38a4e94..9c21ddd8d 100644 --- a/bindings/flutter/packages/runanywhere/ios/runanywhere/Sources/runanywhere/RunAnywherePlugin.swift +++ b/bindings/flutter/packages/runanywhere/ios/runanywhere/Sources/runanywhere/RunAnywherePlugin.swift @@ -39,9 +39,9 @@ public class RunAnywherePlugin: NSObject, FlutterPlugin { case "getPlatformVersion": result("iOS " + UIDevice.current.systemVersion) case "getSDKVersion": - result("0.20.26") + result("0.20.27") case "getCommonsVersion": - result("0.20.26") + result("0.20.27") default: result(FlutterMethodNotImplemented) } diff --git a/bindings/flutter/packages/runanywhere/pubspec.yaml b/bindings/flutter/packages/runanywhere/pubspec.yaml index 5e2689a34..40c8dc944 100644 --- a/bindings/flutter/packages/runanywhere/pubspec.yaml +++ b/bindings/flutter/packages/runanywhere/pubspec.yaml @@ -1,6 +1,6 @@ name: runanywhere description: Privacy-first, on-device AI SDK for Flutter. Run LLMs, STT, TTS, and VAD directly on device with no data leaving the device. -version: 0.20.26 +version: 0.20.27 homepage: https://runanywhere.ai repository: https://github.com/RunanywhereAI/runanywhere-sdks issue_tracker: https://github.com/RunanywhereAI/runanywhere-sdks/issues diff --git a/bindings/flutter/packages/runanywhere_llamacpp/CHANGELOG.md b/bindings/flutter/packages/runanywhere_llamacpp/CHANGELOG.md index 219f2b832..632a134b9 100644 --- a/bindings/flutter/packages/runanywhere_llamacpp/CHANGELOG.md +++ b/bindings/flutter/packages/runanywhere_llamacpp/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to the RunAnywhere LlamaCpp Backend will be documented in th The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.20.27] - 2026-08-24 + +### Changed + +- Version-train bump only; no llama.cpp-facing changes in this release. + ## [0.20.26] - 2026-08-23 ### Changed diff --git a/bindings/flutter/packages/runanywhere_llamacpp/README.md b/bindings/flutter/packages/runanywhere_llamacpp/README.md index 7d1c8a78f..96a09a5ad 100644 --- a/bindings/flutter/packages/runanywhere_llamacpp/README.md +++ b/bindings/flutter/packages/runanywhere_llamacpp/README.md @@ -10,8 +10,8 @@ ```yaml dependencies: - runanywhere: 0.20.26 - runanywhere_llamacpp: 0.20.26 + runanywhere: 0.20.27 + runanywhere_llamacpp: 0.20.27 ``` Platform setup (Podfile, permissions) is documented in the [Flutter SDK README](../../README.md). diff --git a/bindings/flutter/packages/runanywhere_llamacpp/android/binary_config.gradle b/bindings/flutter/packages/runanywhere_llamacpp/android/binary_config.gradle index dfa7cafb4..b162aefa3 100644 --- a/bindings/flutter/packages/runanywhere_llamacpp/android/binary_config.gradle +++ b/bindings/flutter/packages/runanywhere_llamacpp/android/binary_config.gradle @@ -14,7 +14,7 @@ ext { // ============================================================================= // Version Configuration (MUST match Swift Package.swift and Kotlin build.gradle.kts) // ============================================================================= - fallbackCoreVersion = "0.20.26" + fallbackCoreVersion = "0.20.27" coreVersion = coreVersionFile.exists() ? coreVersionFile.text.trim() : fallbackCoreVersion // ============================================================================= diff --git a/bindings/flutter/packages/runanywhere_llamacpp/android/build.gradle b/bindings/flutter/packages/runanywhere_llamacpp/android/build.gradle index ceffa5b8e..d2ab74644 100644 --- a/bindings/flutter/packages/runanywhere_llamacpp/android/build.gradle +++ b/bindings/flutter/packages/runanywhere_llamacpp/android/build.gradle @@ -11,7 +11,7 @@ // Version: Must match Swift SDK's Package.swift and Kotlin SDK's build.gradle.kts group = 'ai.runanywhere.sdk.llamacpp' -version = '0.20.26' +version = '0.20.27' // Load binary configuration apply from: 'binary_config.gradle' diff --git a/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp.podspec b/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp.podspec index 72d4bc379..0cebb0b6b 100644 --- a/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp.podspec +++ b/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp.podspec @@ -20,13 +20,13 @@ end Pod::Spec.new do |s| s.name = 'runanywhere_llamacpp' - s.version = '0.20.26' + s.version = '0.20.27' # TEMP: iOS archives are downloaded from the v#{asset_version} GitHub release. # s.version leads the published release because 0.20.20 republished only the # Electron npm packages -- no v0.20.20 tag or iOS archives were ever cut, and # the checksums below are still the 0.20.19 ones. Bump this back to # s.version once a matching release exists. - asset_version = '0.20.26' + asset_version = '0.20.27' s.summary = 'RunAnywhere LlamaCPP: LLM text generation for Flutter' s.description = <<-DESC LlamaCPP backend for RunAnywhere Flutter SDK. Provides LLM text generation diff --git a/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp/Package.swift b/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp/Package.swift index 9dd3bce6f..6e95bb7f1 100644 --- a/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp/Package.swift +++ b/bindings/flutter/packages/runanywhere_llamacpp/ios/runanywhere_llamacpp/Package.swift @@ -3,7 +3,7 @@ import PackageDescription import Foundation -let sdkVersion = "0.20.26" +let sdkVersion = "0.20.27" let packageRoot = URL(fileURLWithPath: #filePath).deletingLastPathComponent() func runAnywhereBinaryTarget(name: String, checksum: String) -> Target { diff --git a/bindings/flutter/packages/runanywhere_llamacpp/pubspec.yaml b/bindings/flutter/packages/runanywhere_llamacpp/pubspec.yaml index e6d8ad98b..8cdc81ec8 100644 --- a/bindings/flutter/packages/runanywhere_llamacpp/pubspec.yaml +++ b/bindings/flutter/packages/runanywhere_llamacpp/pubspec.yaml @@ -1,6 +1,6 @@ name: runanywhere_llamacpp description: LlamaCpp backend for RunAnywhere Flutter SDK. High-performance on-device LLM text generation with GGUF model support. -version: 0.20.26 +version: 0.20.27 homepage: https://runanywhere.ai repository: https://github.com/RunanywhereAI/runanywhere-sdks issue_tracker: https://github.com/RunanywhereAI/runanywhere-sdks/issues @@ -25,7 +25,7 @@ dependencies: # Each backend ships against same-version native binaries, so the version # range floor MUST match this release. The caret range still lets consumers # upgrade core within the compatible published minor suite. - runanywhere: ^0.20.26 + runanywhere: ^0.20.27 # Keep this bounded for pub.dev publish validation, matching the core # package's major-version range. ffi: '>=2.2.0 <3.0.0' diff --git a/bindings/flutter/packages/runanywhere_mlx/CHANGELOG.md b/bindings/flutter/packages/runanywhere_mlx/CHANGELOG.md index edf2910c6..1aa5c75ef 100644 --- a/bindings/flutter/packages/runanywhere_mlx/CHANGELOG.md +++ b/bindings/flutter/packages/runanywhere_mlx/CHANGELOG.md @@ -1,3 +1,9 @@ +## [0.20.27] - 2026-08-24 + +### Changed + +- Version-train bump only; no MLX-facing changes in this release. + ## [0.20.26] - 2026-08-23 ### Changed diff --git a/bindings/flutter/packages/runanywhere_mlx/README.md b/bindings/flutter/packages/runanywhere_mlx/README.md index 29c03146b..361a7304c 100644 --- a/bindings/flutter/packages/runanywhere_mlx/README.md +++ b/bindings/flutter/packages/runanywhere_mlx/README.md @@ -10,8 +10,8 @@ ```yaml dependencies: - runanywhere: 0.20.26 - runanywhere_mlx: 0.20.26 + runanywhere: 0.20.27 + runanywhere_mlx: 0.20.27 ``` Requires Xcode 26+ and a physical iOS device for MLX execution. See the [Flutter SDK README](../../README.md) for Podfile setup. diff --git a/bindings/flutter/packages/runanywhere_mlx/ios/runanywhere_mlx.podspec b/bindings/flutter/packages/runanywhere_mlx/ios/runanywhere_mlx.podspec index 15fef8f65..26c43d5f1 100644 --- a/bindings/flutter/packages/runanywhere_mlx/ios/runanywhere_mlx.podspec +++ b/bindings/flutter/packages/runanywhere_mlx/ios/runanywhere_mlx.podspec @@ -25,13 +25,13 @@ end Pod::Spec.new do |s| s.name = 'runanywhere_mlx' - s.version = '0.20.26' + s.version = '0.20.27' # TEMP: iOS archives are downloaded from the v#{asset_version} GitHub release. # s.version leads the published release because 0.20.20 republished only the # Electron npm packages -- no v0.20.20 tag or iOS archives were ever cut, and # the checksums below are still the 0.20.19 ones. Bump this back to # s.version once a matching release exists. - asset_version = '0.20.26' + asset_version = '0.20.27' s.summary = 'RunAnywhere MLX backend for physical iOS devices' s.description = <<-DESC Apple MLX backend for the RunAnywhere Flutter SDK. Provides on-device LLM, diff --git a/bindings/flutter/packages/runanywhere_mlx/pubspec.yaml b/bindings/flutter/packages/runanywhere_mlx/pubspec.yaml index 06c4292a4..b887778e0 100644 --- a/bindings/flutter/packages/runanywhere_mlx/pubspec.yaml +++ b/bindings/flutter/packages/runanywhere_mlx/pubspec.yaml @@ -1,6 +1,6 @@ name: runanywhere_mlx description: Apple MLX backend for RunAnywhere Flutter SDK with on-device LLM, VLM, embeddings, speech recognition, and speech synthesis. -version: 0.20.26 +version: 0.20.27 homepage: https://runanywhere.ai repository: https://github.com/RunanywhereAI/runanywhere-sdks issue_tracker: https://github.com/RunanywhereAI/runanywhere-sdks/issues @@ -21,7 +21,7 @@ dependencies: flutter: sdk: flutter # MLX and core native binaries are released as one ABI-compatible train. - runanywhere: ^0.20.26 + runanywhere: ^0.20.27 dev_dependencies: flutter_test: diff --git a/bindings/flutter/packages/runanywhere_onnx/CHANGELOG.md b/bindings/flutter/packages/runanywhere_onnx/CHANGELOG.md index 87764449b..4283662f7 100644 --- a/bindings/flutter/packages/runanywhere_onnx/CHANGELOG.md +++ b/bindings/flutter/packages/runanywhere_onnx/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to the RunAnywhere ONNX Backend will be documented in this f The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.20.27] - 2026-08-24 + +### Changed + +- Version-train bump only; no ONNX-facing changes in this release. + ## [0.20.26] - 2026-08-23 ### Changed diff --git a/bindings/flutter/packages/runanywhere_onnx/README.md b/bindings/flutter/packages/runanywhere_onnx/README.md index 9c3300f7c..d30b26d9d 100644 --- a/bindings/flutter/packages/runanywhere_onnx/README.md +++ b/bindings/flutter/packages/runanywhere_onnx/README.md @@ -10,8 +10,8 @@ ```yaml dependencies: - runanywhere: 0.20.26 - runanywhere_onnx: 0.20.26 + runanywhere: 0.20.27 + runanywhere_onnx: 0.20.27 ``` Platform setup (Podfile, microphone permissions) is documented in the [Flutter SDK README](../../README.md). diff --git a/bindings/flutter/packages/runanywhere_onnx/android/binary_config.gradle b/bindings/flutter/packages/runanywhere_onnx/android/binary_config.gradle index 830d8195f..adf7dc23a 100644 --- a/bindings/flutter/packages/runanywhere_onnx/android/binary_config.gradle +++ b/bindings/flutter/packages/runanywhere_onnx/android/binary_config.gradle @@ -14,7 +14,7 @@ ext { // ============================================================================= // Version Configuration (MUST match Swift Package.swift and Kotlin build.gradle.kts) // ============================================================================= - fallbackCoreVersion = "0.20.26" + fallbackCoreVersion = "0.20.27" coreVersion = coreVersionFile.exists() ? coreVersionFile.text.trim() : fallbackCoreVersion // ============================================================================= diff --git a/bindings/flutter/packages/runanywhere_onnx/android/build.gradle b/bindings/flutter/packages/runanywhere_onnx/android/build.gradle index e5a0da939..b0e45d5e8 100644 --- a/bindings/flutter/packages/runanywhere_onnx/android/build.gradle +++ b/bindings/flutter/packages/runanywhere_onnx/android/build.gradle @@ -11,7 +11,7 @@ // Version: Must match Swift SDK's Package.swift and Kotlin SDK's build.gradle.kts group = 'ai.runanywhere.sdk.onnx' -version = '0.20.26' +version = '0.20.27' // Load binary configuration apply from: 'binary_config.gradle' diff --git a/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx.podspec b/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx.podspec index e9833924b..59a15a5e7 100644 --- a/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx.podspec +++ b/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx.podspec @@ -24,14 +24,14 @@ end Pod::Spec.new do |s| s.name = 'runanywhere_onnx' - s.version = '0.20.26' + s.version = '0.20.27' # iOS archives are downloaded from the v#{asset_version} GitHub release. # Normally identical to s.version, and a literal on purpose: # scripts/release/sync-versions.sh rewrites it and # check_release_version_coherence.sh requires the exact string. It only # diverges when a version republishes non-iOS packages without cutting iOS # archives (0.20.20 did that) -- then pin the last release that has them. - asset_version = '0.20.26' + asset_version = '0.20.27' s.summary = 'RunAnywhere ONNX: STT, TTS, VAD for Flutter' s.description = <<-DESC ONNX Runtime backend for RunAnywhere Flutter SDK. Provides speech-to-text (STT), diff --git a/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx/Package.swift b/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx/Package.swift index 4473bd0c9..9d3117d00 100644 --- a/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx/Package.swift +++ b/bindings/flutter/packages/runanywhere_onnx/ios/runanywhere_onnx/Package.swift @@ -3,7 +3,7 @@ import PackageDescription import Foundation -let sdkVersion = "0.20.26" +let sdkVersion = "0.20.27" let packageRoot = URL(fileURLWithPath: #filePath).deletingLastPathComponent() func runAnywhereBinaryTarget(name: String, checksum: String) -> Target { diff --git a/bindings/flutter/packages/runanywhere_onnx/pubspec.yaml b/bindings/flutter/packages/runanywhere_onnx/pubspec.yaml index 3333b3623..c05e18c0c 100644 --- a/bindings/flutter/packages/runanywhere_onnx/pubspec.yaml +++ b/bindings/flutter/packages/runanywhere_onnx/pubspec.yaml @@ -1,6 +1,6 @@ name: runanywhere_onnx description: ONNX Runtime backend for RunAnywhere Flutter SDK. On-device Speech-to-Text, Text-to-Speech, and Voice Activity Detection. -version: 0.20.26 +version: 0.20.27 homepage: https://runanywhere.ai repository: https://github.com/RunanywhereAI/runanywhere-sdks issue_tracker: https://github.com/RunanywhereAI/runanywhere-sdks/issues @@ -25,7 +25,7 @@ dependencies: # Each backend ships against same-version native binaries, so the version # range floor MUST match this release. The caret range still lets consumers # upgrade core within the compatible published minor suite. - runanywhere: ^0.20.26 + runanywhere: ^0.20.27 # Keep this bounded for pub.dev publish validation, matching the core # package's major-version range. ffi: '>=2.2.0 <3.0.0' diff --git a/bindings/flutter/packages/runanywhere_qhexrt/CHANGELOG.md b/bindings/flutter/packages/runanywhere_qhexrt/CHANGELOG.md index 633c305d0..d7998a145 100644 --- a/bindings/flutter/packages/runanywhere_qhexrt/CHANGELOG.md +++ b/bindings/flutter/packages/runanywhere_qhexrt/CHANGELOG.md @@ -5,6 +5,18 @@ All notable changes to the RunAnywhere QHexRT Backend will be documented in this The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.20.27] - 2026-08-24 + +### Changed + +- The Hexagon NPU payload is now fetched from a pinned prebuilt release instead + of being staged by hand, with atomic selection on every platform. +- The QAIRT/QNN runtime the engine depends on at execution time is now a + separate, pinned, checksum-verified private artifact — fetched with the same + credential as the engine payload, so a build that can reach one reaches both. + A build without that credential correctly falls back to the non-routable + shell rather than shipping a half-configured engine. + ## [0.20.26] - 2026-08-23 ### Changed diff --git a/bindings/flutter/packages/runanywhere_qhexrt/android/build.gradle b/bindings/flutter/packages/runanywhere_qhexrt/android/build.gradle index 5b29f2311..dccb69a19 100644 --- a/bindings/flutter/packages/runanywhere_qhexrt/android/build.gradle +++ b/bindings/flutter/packages/runanywhere_qhexrt/android/build.gradle @@ -1,5 +1,5 @@ group = 'ai.runanywhere.sdk.qhexrt' -version = '0.20.26' +version = '0.20.27' apply plugin: 'com.android.library' diff --git a/bindings/flutter/packages/runanywhere_qhexrt/android/src/main/kotlin/ai/runanywhere/sdk/qhexrt/QhexrtPlugin.kt b/bindings/flutter/packages/runanywhere_qhexrt/android/src/main/kotlin/ai/runanywhere/sdk/qhexrt/QhexrtPlugin.kt index bcd07dab6..ba4eab15b 100644 --- a/bindings/flutter/packages/runanywhere_qhexrt/android/src/main/kotlin/ai/runanywhere/sdk/qhexrt/QhexrtPlugin.kt +++ b/bindings/flutter/packages/runanywhere_qhexrt/android/src/main/kotlin/ai/runanywhere/sdk/qhexrt/QhexrtPlugin.kt @@ -19,7 +19,7 @@ class QhexrtPlugin : FlutterPlugin, MethodCallHandler { companion object { private const val CHANNEL_NAME = "runanywhere_qhexrt" - private const val BACKEND_VERSION = "0.20.26" + private const val BACKEND_VERSION = "0.20.27" private const val BACKEND_NAME = "QHexRT" @JvmStatic diff --git a/bindings/flutter/packages/runanywhere_qhexrt/lib/qhexrt.dart b/bindings/flutter/packages/runanywhere_qhexrt/lib/qhexrt.dart index 7c235e7a1..0fcdff27d 100644 --- a/bindings/flutter/packages/runanywhere_qhexrt/lib/qhexrt.dart +++ b/bindings/flutter/packages/runanywhere_qhexrt/lib/qhexrt.dart @@ -23,7 +23,7 @@ export 'package:runanywhere/generated/hardware_profile.pbenum.dart' class QHexRT { QHexRT._(); - static const String version = '0.20.26'; + static const String version = '0.20.27'; static bool _isRegistered = false; static QhexrtBindings? _bindings; diff --git a/bindings/flutter/packages/runanywhere_qhexrt/pubspec.yaml b/bindings/flutter/packages/runanywhere_qhexrt/pubspec.yaml index 9d0be7405..d187a7a21 100644 --- a/bindings/flutter/packages/runanywhere_qhexrt/pubspec.yaml +++ b/bindings/flutter/packages/runanywhere_qhexrt/pubspec.yaml @@ -1,6 +1,6 @@ name: runanywhere_qhexrt description: On-device NPU acceleration backend for RunAnywhere — LLM/VLM/STT/TTS on Qualcomm Snapdragon Hexagon (V75/V79/V81), Android arm64. -version: 0.20.26 +version: 0.20.27 homepage: https://runanywhere.ai repository: https://github.com/RunanywhereAI/runanywhere-sdks issue_tracker: https://github.com/RunanywhereAI/runanywhere-sdks/issues @@ -20,7 +20,7 @@ resolution: workspace dependencies: flutter: sdk: flutter - runanywhere: ^0.20.26 + runanywhere: ^0.20.27 # Keep this bounded for pub.dev publish validation, matching the core # package's major-version range. ffi: '>=2.2.0 <3.0.0' diff --git a/bindings/kotlin/README.md b/bindings/kotlin/README.md index 238263ebb..4952da43f 100644 --- a/bindings/kotlin/README.md +++ b/bindings/kotlin/README.md @@ -26,13 +26,13 @@ Add dependencies to your app module's `build.gradle.kts`: ```kotlin dependencies { // Core SDK (required) - implementation("io.github.sanchitmonga22:runanywhere-sdk:0.20.26") + implementation("io.github.sanchitmonga22:runanywhere-sdk:0.20.27") // LLM support via llama.cpp (~34 MB) - implementation("io.github.sanchitmonga22:runanywhere-llamacpp:0.20.26") + implementation("io.github.sanchitmonga22:runanywhere-llamacpp:0.20.27") // Optional: STT, TTS, VAD via ONNX/Sherpa (~25 MB) - implementation("io.github.sanchitmonga22:runanywhere-onnx:0.20.26") + implementation("io.github.sanchitmonga22:runanywhere-onnx:0.20.27") } ``` diff --git a/bindings/kotlin/gradle.properties b/bindings/kotlin/gradle.properties index 462f65af4..10dd05aa4 100644 --- a/bindings/kotlin/gradle.properties +++ b/bindings/kotlin/gradle.properties @@ -16,7 +16,7 @@ runanywhere.rebuildCommons=false # NOT the package version. 0.20.20 republished only the Electron npm packages, so # no v0.20.20 tag or android archives exist and the download 404s. Keep this at the # last release that actually has assets; move it with the next real release train. -runanywhere.nativeLibVersion=0.20.26 +runanywhere.nativeLibVersion=0.20.27 # Enabled parallel sync for Gradle 9.4+ org.gradle.tooling.parallel=true diff --git a/bindings/kotlin/src/main/kotlin/com/runanywhere/sdk/foundation/constants/SDKConstants.kt b/bindings/kotlin/src/main/kotlin/com/runanywhere/sdk/foundation/constants/SDKConstants.kt index 71c4fde26..9199cd1c5 100644 --- a/bindings/kotlin/src/main/kotlin/com/runanywhere/sdk/foundation/constants/SDKConstants.kt +++ b/bindings/kotlin/src/main/kotlin/com/runanywhere/sdk/foundation/constants/SDKConstants.kt @@ -19,7 +19,7 @@ object SDKConstants { * below is rewritten on every release by `scripts/release/sync-versions.sh`. */ private object Fallback { - const val VERSION = "0.20.26" + const val VERSION = "0.20.27" } /** diff --git a/bindings/proto-ts/package-lock.json b/bindings/proto-ts/package-lock.json index 0c65d3a63..d3399c7db 100644 --- a/bindings/proto-ts/package-lock.json +++ b/bindings/proto-ts/package-lock.json @@ -1,12 +1,12 @@ { "name": "@runanywhere/proto-ts", - "version": "0.20.26", + "version": "0.20.27", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@runanywhere/proto-ts", - "version": "0.20.26", + "version": "0.20.27", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@bufbuild/protobuf": "^2.12.1" diff --git a/bindings/proto-ts/package.json b/bindings/proto-ts/package.json index f687ee425..32a46340a 100644 --- a/bindings/proto-ts/package.json +++ b/bindings/proto-ts/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/proto-ts", - "version": "0.20.26", + "version": "0.20.27", "description": "Shared RunAnywhere ts-proto generated types and stream wrappers", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/bindings/python/pyproject.toml b/bindings/python/pyproject.toml index 82527af68..e5bfd8c84 100644 --- a/bindings/python/pyproject.toml +++ b/bindings/python/pyproject.toml @@ -10,7 +10,7 @@ backend-path = ["_build"] [project] name = "runanywhere" -version = "0.20.26" +version = "0.20.27" description = "RunAnywhere SDK — on-device AI inference (LLM, ASR, TTS, embeddings) with a native runtime core." readme = "README.md" requires-python = ">=3.9" diff --git a/bindings/python/runanywhere/__init__.py b/bindings/python/runanywhere/__init__.py index 5c0febb52..a9324e8f2 100644 --- a/bindings/python/runanywhere/__init__.py +++ b/bindings/python/runanywhere/__init__.py @@ -158,7 +158,7 @@ Word, ) -__version__ = "0.20.26" +__version__ = "0.20.27" def initialize( diff --git a/bindings/react-native/AGENTS.md b/bindings/react-native/AGENTS.md index 73204e19c..0f0747e1c 100644 --- a/bindings/react-native/AGENTS.md +++ b/bindings/react-native/AGENTS.md @@ -217,5 +217,5 @@ The example sets `installConfig.hoistingLimits: "workspaces"`, so its deps stay - **ESLint**: `@typescript-eslint/recommended` + `prettier`, `no-console: error`, `no-explicit-any: error` - **Prettier**: single quotes, 2-space indent, es5 trailing commas - **SwiftLint** (`.swiftlint.yml`, `packages/{core,llamacpp,onnx}/ios` only — mlx/qhexrt have no iOS side): `print()`, `NSLog()`, `os_log()`, `debugPrint()`, `Logger` are all banned as lint errors; use `SDKLogger` -- **Versioning**: core + backend packages share one semver (currently `0.20.26`), managed by Lerna with conventional commits +- **Versioning**: core + backend packages share one semver (currently `0.20.27`), managed by Lerna with conventional commits - **Package naming**: Kotlin Nitro-generated code uses namespace `com.margelo.nitro.runanywhere.*` diff --git a/bindings/react-native/lerna.json b/bindings/react-native/lerna.json index 12e8b46e7..d7cdb41ca 100644 --- a/bindings/react-native/lerna.json +++ b/bindings/react-native/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "0.20.26", + "version": "0.20.27", "packages": [ "packages/*" ], diff --git a/bindings/react-native/package.json b/bindings/react-native/package.json index 3dcb497fd..eb84a9d98 100644 --- a/bindings/react-native/package.json +++ b/bindings/react-native/package.json @@ -1,6 +1,6 @@ { "name": "runanywhere-react-native-monorepo", - "version": "0.20.26", + "version": "0.20.27", "private": true, "description": "RunAnywhere React Native SDK - Multi-Package Monorepo", "workspaces": [ diff --git a/bindings/react-native/packages/core/RunAnywhereCore.podspec b/bindings/react-native/packages/core/RunAnywhereCore.podspec index 396d26e8d..30d35d94b 100644 --- a/bindings/react-native/packages/core/RunAnywhereCore.podspec +++ b/bindings/react-native/packages/core/RunAnywhereCore.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| # `pod install` fails outright. Mirrors asset_version in the Flutter # podspecs. Bump back in step with the SwiftPM pin once a matching release # exists; check_release_version_coherence.sh enforces that they agree. - source_tag_version = '0.20.26' + source_tag_version = '0.20.27' s.source = { :git => "https://github.com/RunanywhereAI/runanywhere-sdks.git", :tag => "v#{source_tag_version}" } # ============================================================================= diff --git a/bindings/react-native/packages/core/package.json b/bindings/react-native/packages/core/package.json index aa373ee86..2a3dc1853 100644 --- a/bindings/react-native/packages/core/package.json +++ b/bindings/react-native/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/core", - "version": "0.20.26", + "version": "0.20.27", "description": "Core SDK for RunAnywhere React Native - includes RACommons bindings, native bridges, and public API", "main": "src/index.ts", "types": "src/index.ts", diff --git a/bindings/react-native/packages/core/src/Foundation/Constants/SDKConstants.ts b/bindings/react-native/packages/core/src/Foundation/Constants/SDKConstants.ts index 2a22f4d51..ee9a9ab56 100644 --- a/bindings/react-native/packages/core/src/Foundation/Constants/SDKConstants.ts +++ b/bindings/react-native/packages/core/src/Foundation/Constants/SDKConstants.ts @@ -26,7 +26,7 @@ export const SDKConstants = { * Native commons receives this through the Phase 1 init payload. * The literal is rewritten by `scripts/release/sync-versions.sh`. */ - version: '0.20.26', + version: '0.20.27', /** SDK name. Mirrors Swift `SDKConstants.name`. */ name: 'RunAnywhere SDK', diff --git a/bindings/react-native/packages/llamacpp/RunAnywhereLlama.podspec b/bindings/react-native/packages/llamacpp/RunAnywhereLlama.podspec index ed87246db..9bfbdd450 100644 --- a/bindings/react-native/packages/llamacpp/RunAnywhereLlama.podspec +++ b/bindings/react-native/packages/llamacpp/RunAnywhereLlama.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| # `pod install` fails outright. Mirrors asset_version in the Flutter # podspecs. Bump back in step with the SwiftPM pin once a matching release # exists; check_release_version_coherence.sh enforces that they agree. - source_tag_version = '0.20.26' + source_tag_version = '0.20.27' s.source = { :git => "https://github.com/RunanywhereAI/runanywhere-sdks.git", :tag => "v#{source_tag_version}" } # ============================================================================= diff --git a/bindings/react-native/packages/llamacpp/android/build.gradle b/bindings/react-native/packages/llamacpp/android/build.gradle index bca4e2e5f..8c65def7c 100644 --- a/bindings/react-native/packages/llamacpp/android/build.gradle +++ b/bindings/react-native/packages/llamacpp/android/build.gradle @@ -102,7 +102,7 @@ def getExtOrIntegerDefault(name) { // symlink (node_modules/@runanywhere/llamacpp -> ../../bindings/react-native/packages/llamacpp); // fall back to the pinned version if the commons VERSION file can't be located. def coreVersionFile = file("${projectDir.canonicalPath}/../../../../../core/VERSION") -def coreVersion = coreVersionFile.exists() ? coreVersionFile.text.trim() : "0.20.26" +def coreVersion = coreVersionFile.exists() ? coreVersionFile.text.trim() : "0.20.27" // ============================================================================= // Binary Source - RABackendLlamaCPP from runanywhere-sdks diff --git a/bindings/react-native/packages/llamacpp/package.json b/bindings/react-native/packages/llamacpp/package.json index 6e6adea2c..e4d21034b 100644 --- a/bindings/react-native/packages/llamacpp/package.json +++ b/bindings/react-native/packages/llamacpp/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/llamacpp", - "version": "0.20.26", + "version": "0.20.27", "description": "LlamaCpp backend for RunAnywhere React Native SDK - GGUF model support for on-device LLM", "main": "src/index.ts", "types": "src/index.ts", @@ -64,7 +64,7 @@ "@runanywhere/proto-ts": "workspace:*" }, "peerDependencies": { - "@runanywhere/core": ">=0.20.26", + "@runanywhere/core": ">=0.20.27", "react": ">=19.0.0", "react-native": ">=0.83.1", "react-native-nitro-modules": "^0.33.9" diff --git a/bindings/react-native/packages/mlx/README.md b/bindings/react-native/packages/mlx/README.md index b402cb8c2..1a245abf2 100644 --- a/bindings/react-native/packages/mlx/README.md +++ b/bindings/react-native/packages/mlx/README.md @@ -7,7 +7,7 @@ ## Installation ```bash -npm install @runanywhere/core@0.20.26 @runanywhere/mlx@0.20.26 +npm install @runanywhere/core@0.20.27 @runanywhere/mlx@0.20.27 cd ios && pod install && cd .. ``` diff --git a/bindings/react-native/packages/mlx/RunAnywhereMLX.podspec b/bindings/react-native/packages/mlx/RunAnywhereMLX.podspec index 587a830b3..7c0f2009a 100644 --- a/bindings/react-native/packages/mlx/RunAnywhereMLX.podspec +++ b/bindings/react-native/packages/mlx/RunAnywhereMLX.podspec @@ -19,7 +19,7 @@ Pod::Spec.new do |s| # `pod install` fails outright. Mirrors asset_version in the Flutter # podspecs. Bump back in step with the SwiftPM pin once a matching release # exists; check_release_version_coherence.sh enforces that they agree. - source_tag_version = '0.20.26' + source_tag_version = '0.20.27' s.source = { :git => "https://github.com/RunanywhereAI/runanywhere-sdks.git", :tag => "v#{source_tag_version}" } # All three binaries are required. RABackendMLX owns the commons backend diff --git a/bindings/react-native/packages/mlx/package.json b/bindings/react-native/packages/mlx/package.json index 66f22c736..62759f6a6 100644 --- a/bindings/react-native/packages/mlx/package.json +++ b/bindings/react-native/packages/mlx/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/mlx", - "version": "0.20.26", + "version": "0.20.27", "description": "Apple MLX backend registration for the RunAnywhere React Native SDK", "main": "src/index.ts", "types": "src/index.ts", @@ -52,7 +52,7 @@ "author": "RunAnywhere AI (https://runanywhere.ai)", "license": "SEE LICENSE IN LICENSE", "peerDependencies": { - "@runanywhere/core": ">=0.20.26", + "@runanywhere/core": ">=0.20.27", "react": ">=19.0.0", "react-native": ">=0.83.1", "react-native-nitro-modules": "^0.33.9" diff --git a/bindings/react-native/packages/onnx/RunAnywhereONNX.podspec b/bindings/react-native/packages/onnx/RunAnywhereONNX.podspec index bd6ec8b7d..770572a40 100644 --- a/bindings/react-native/packages/onnx/RunAnywhereONNX.podspec +++ b/bindings/react-native/packages/onnx/RunAnywhereONNX.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| # `pod install` fails outright. Mirrors asset_version in the Flutter # podspecs. Bump back in step with the SwiftPM pin once a matching release # exists; check_release_version_coherence.sh enforces that they agree. - source_tag_version = '0.20.26' + source_tag_version = '0.20.27' s.source = { :git => "https://github.com/RunanywhereAI/runanywhere-sdks.git", :tag => "v#{source_tag_version}" } # ============================================================================= diff --git a/bindings/react-native/packages/onnx/android/build.gradle b/bindings/react-native/packages/onnx/android/build.gradle index 1c8394f83..0535e1b2f 100644 --- a/bindings/react-native/packages/onnx/android/build.gradle +++ b/bindings/react-native/packages/onnx/android/build.gradle @@ -99,7 +99,7 @@ def getExtOrIntegerDefault(name) { // RABackendONNX from runanywhere-sdks // ============================================================================= def coreVersionFile = file("${projectDir.canonicalPath}/../../../../../core/VERSION") -def coreVersion = coreVersionFile.exists() ? coreVersionFile.text.trim() : "0.20.26" +def coreVersion = coreVersionFile.exists() ? coreVersionFile.text.trim() : "0.20.27" // ============================================================================= // Binary Source - RABackendONNX from runanywhere-sdks diff --git a/bindings/react-native/packages/onnx/package.json b/bindings/react-native/packages/onnx/package.json index b7bf8e8e5..fac9f450a 100644 --- a/bindings/react-native/packages/onnx/package.json +++ b/bindings/react-native/packages/onnx/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/onnx", - "version": "0.20.26", + "version": "0.20.27", "description": "ONNX Runtime backend for RunAnywhere React Native SDK - Speech-to-Text, Text-to-Speech, and VAD", "main": "src/index.ts", "types": "src/index.ts", @@ -67,7 +67,7 @@ "@runanywhere/proto-ts": "workspace:*" }, "peerDependencies": { - "@runanywhere/core": ">=0.20.26", + "@runanywhere/core": ">=0.20.27", "react": ">=19.0.0", "react-native": ">=0.83.1", "react-native-nitro-modules": "^0.33.9" diff --git a/bindings/react-native/packages/qhexrt/package.json b/bindings/react-native/packages/qhexrt/package.json index f69c9c5d0..6ace38102 100644 --- a/bindings/react-native/packages/qhexrt/package.json +++ b/bindings/react-native/packages/qhexrt/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/qhexrt", - "version": "0.20.26", + "version": "0.20.27", "description": "On-device NPU acceleration backend for RunAnywhere (React Native) — LLM/VLM/STT/TTS on Qualcomm Snapdragon Hexagon (V75/V79/V81), Android arm64.", "main": "src/index.ts", "types": "src/index.ts", @@ -60,7 +60,7 @@ "@runanywhere/proto-ts": "workspace:*" }, "peerDependencies": { - "@runanywhere/core": ">=0.20.26", + "@runanywhere/core": ">=0.20.27", "react": ">=19.0.0", "react-native": ">=0.83.1", "react-native-nitro-modules": "^0.33.9" diff --git a/bindings/react-native/packages/qhexrt/src/QHexRTProvider.ts b/bindings/react-native/packages/qhexrt/src/QHexRTProvider.ts index e3d6bf951..5444987c6 100644 --- a/bindings/react-native/packages/qhexrt/src/QHexRTProvider.ts +++ b/bindings/react-native/packages/qhexrt/src/QHexRTProvider.ts @@ -30,7 +30,7 @@ export class QHexRTProvider { static readonly moduleName = 'QHexRT'; // Keep in sync with package.json "version" (same convention as the other // backend providers — there is no runtime package.json read in RN bundles). - static readonly version = '0.20.26'; + static readonly version = '0.20.27'; private static registered = false; diff --git a/bindings/react-native/yarn.lock b/bindings/react-native/yarn.lock index 34745b3b8..8ef14c00d 100644 --- a/bindings/react-native/yarn.lock +++ b/bindings/react-native/yarn.lock @@ -3464,7 +3464,7 @@ __metadata: react-native-nitro-modules: ^0.33.9 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9 @@ -3479,7 +3479,7 @@ __metadata: react-native-nitro-modules: ^0.33.9 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9 @@ -3497,7 +3497,7 @@ __metadata: react-native-nitro-modules: ^0.33.9 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9 @@ -3526,7 +3526,7 @@ __metadata: ts-jest: ^29.1.2 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9 diff --git a/bindings/swift/ARCHITECTURE.md b/bindings/swift/ARCHITECTURE.md index f4aa93e24..93eed9d2d 100644 --- a/bindings/swift/ARCHITECTURE.md +++ b/bindings/swift/ARCHITECTURE.md @@ -41,7 +41,7 @@ The Swift SDK (`bindings/swift/`) is a thin platform bridge that adapts Apple pl - macOS deployment target: 14.5 - Swift tools version: 5.9 (`Package.swift:1`) - Xcode required: 15+ -- Current SDK version: `0.20.26` (`bindings/swift/VERSION:1`) +- Current SDK version: `0.20.27` (`bindings/swift/VERSION:1`) ### §1.3 Package layout (preview) @@ -87,7 +87,7 @@ The full slot map and per-slot implementation notes are documented in §6.5.18 ( bindings/swift/ ├── Package.swift ← local dev manifest (references Binaries/) ├── Package.resolved -├── VERSION ← 0.20.26 +├── VERSION ← 0.20.27 ├── AGENTS.md ├── README.md ├── ARCHITECTURE.md ← this document @@ -1568,7 +1568,7 @@ Seven files under `Foundation/Bridge/Extensions/` form the type-conversion layer | Constant | Value / Derivation | |---|---| -| `version` | `"0.20.26"` (line 14) — kept in sync with `core/VERSION` | +| `version` | `"0.20.27"` (line 14) — kept in sync with `core/VERSION` | | `name` | `"RunAnywhere SDK"` (line 17) | | `userAgent` | `"\(name)/\(version) (Swift)"` (line 20) | | `platform` | Compile-time conditional (lines 23–33): `"ios"`, `"macos"`, `"tvos"`, `"watchos"`, or `"unknown"` | diff --git a/bindings/swift/README.md b/bindings/swift/README.md index 1c7a5e43c..577861a54 100644 --- a/bindings/swift/README.md +++ b/bindings/swift/README.md @@ -3,7 +3,7 @@ Run large language models, speech recognition, text-to-speech, and voice agents directly on iPhone, iPad, and Mac — with low latency and on-device privacy. The Swift SDK provides a unified API over pluggable backends (llama.cpp, ONNX, Apple MLX) so you can ship AI features without sending user data to the cloud for inference. [![Swift Package Manager](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/RunanywhereAI/runanywhere-sdks) -[![Version](https://img.shields.io/badge/version-0.20.26-blue.svg)](https://github.com/RunanywhereAI/runanywhere-sdks/releases) +[![Version](https://img.shields.io/badge/version-0.20.27-blue.svg)](https://github.com/RunanywhereAI/runanywhere-sdks/releases) [![Platform](https://img.shields.io/badge/Platform-iOS%2017.5%2B%20%7C%20macOS%2014.5%2B-lightgrey)](https://developer.apple.com) [![License: RunAnywhere](https://img.shields.io/badge/License-RunAnywhere-blue.svg)](../../LICENSE) @@ -32,7 +32,7 @@ https://github.com/RunanywhereAI/runanywhere-swift.git Consume the Swift **distribution repo**, never this monorepo. This repo's tags do not compile as a Swift package: the generated protobuf Swift sources are codegen output and are no longer committed, so resolving the monorepo URL by version fails with hundreds of "cannot find type" errors. The distribution repo is generated with those sources and declares the same binary targets, with the same checksums, against the same release assets. -Select version **`0.20.26`** (or `from: "0.20.26"`), then add the products you need. Resolve against the newest tag on the [Releases](https://github.com/RunanywhereAI/runanywhere-sdks/releases) page if `0.20.26` binary assets are not published yet. +Select version **`0.20.27`** (or `from: "0.20.27"`), then add the products you need. Resolve against the newest tag on the [Releases](https://github.com/RunanywhereAI/runanywhere-sdks/releases) page if `0.20.27` binary assets are not published yet. | Product | Required | Capabilities | |---------|----------|--------------| @@ -45,7 +45,7 @@ Select version **`0.20.26`** (or `from: "0.20.26"`), then add the products you n ```swift dependencies: [ - .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", from: "0.20.26") + .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", from: "0.20.27") ], targets: [ .target( diff --git a/bindings/swift/Sources/LlamaCPPRuntime/README.md b/bindings/swift/Sources/LlamaCPPRuntime/README.md index 0c3a04fcf..79218c608 100644 --- a/bindings/swift/Sources/LlamaCPPRuntime/README.md +++ b/bindings/swift/Sources/LlamaCPPRuntime/README.md @@ -6,11 +6,11 @@ ## Installation -Add the Swift package and include the `RunAnywhereLlamaCPP` product (pin `0.20.26`): +Add the Swift package and include the `RunAnywhereLlamaCPP` product (pin `0.20.27`): ```swift dependencies: [ - .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", exact: "0.20.26"), + .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", exact: "0.20.27"), ], targets: [ .target( diff --git a/bindings/swift/Sources/ONNXRuntime/README.md b/bindings/swift/Sources/ONNXRuntime/README.md index 1319bfd73..5c55e15ee 100644 --- a/bindings/swift/Sources/ONNXRuntime/README.md +++ b/bindings/swift/Sources/ONNXRuntime/README.md @@ -6,11 +6,11 @@ ## Installation -Add the Swift package and include the `RunAnywhereONNX` product (pin `0.20.26`): +Add the Swift package and include the `RunAnywhereONNX` product (pin `0.20.27`): ```swift dependencies: [ - .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", exact: "0.20.26"), + .package(url: "https://github.com/RunanywhereAI/runanywhere-swift.git", exact: "0.20.27"), ], targets: [ .target( diff --git a/bindings/swift/Sources/RunAnywhere/Generated/Versions.swift b/bindings/swift/Sources/RunAnywhere/Generated/Versions.swift index 78f8f0092..fb8e57ede 100644 --- a/bindings/swift/Sources/RunAnywhere/Generated/Versions.swift +++ b/bindings/swift/Sources/RunAnywhere/Generated/Versions.swift @@ -24,7 +24,7 @@ /// Centralized version constants for the Swift SDK. Do not hand-edit; /// run scripts/release/sync-versions.sh to refresh. public enum RAVersions { - public static let sdkVersion = "0.20.26" + public static let sdkVersion = "0.20.27" public static let swiftToolsVersion = "6.2" // Pinned SPM dep version floors (must match Package.swift) — bumped in T5.4. public static let swiftProtobuf = "1.38.0" diff --git a/bindings/swift/VERSION b/bindings/swift/VERSION index 1a01ba1b8..fa62df0ec 100644 --- a/bindings/swift/VERSION +++ b/bindings/swift/VERSION @@ -1 +1 @@ -0.20.26 +0.20.27 diff --git a/bindings/web/package-lock.json b/bindings/web/package-lock.json index 127640c30..f6976b302 100644 --- a/bindings/web/package-lock.json +++ b/bindings/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "@runanywhere/web-root", - "version": "0.20.26", + "version": "0.20.27", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@runanywhere/web-root", - "version": "0.20.26", + "version": "0.20.27", "workspaces": [ "../proto-ts", "packages/core", @@ -23,7 +23,7 @@ }, "../proto-ts": { "name": "@runanywhere/proto-ts", - "version": "0.20.26", + "version": "0.20.27", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@bufbuild/protobuf": "^2.12.1" @@ -4516,11 +4516,11 @@ }, "packages/core": { "name": "@runanywhere/web", - "version": "0.20.26", + "version": "0.20.27", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@bufbuild/protobuf": "^2.12.1", - "@runanywhere/proto-ts": "^0.20.26", + "@runanywhere/proto-ts": "^0.20.27", "long": "^5.3.2", "protobufjs": "^7.5.8" }, @@ -4538,11 +4538,11 @@ }, "packages/llamacpp": { "name": "@runanywhere/web-llamacpp", - "version": "0.20.26", + "version": "0.20.27", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@bufbuild/protobuf": "^2.12.1", - "@runanywhere/proto-ts": "^0.20.26" + "@runanywhere/proto-ts": "^0.20.27" }, "devDependencies": { "@eslint/js": "^9.39.4", @@ -4554,15 +4554,15 @@ "node": ">=22.12.0" }, "peerDependencies": { - "@runanywhere/web": ">=0.20.26 <1" + "@runanywhere/web": ">=0.20.27 <1" } }, "packages/onnx": { "name": "@runanywhere/web-onnx", - "version": "0.20.26", + "version": "0.20.27", "license": "SEE LICENSE IN LICENSE", "dependencies": { - "@runanywhere/proto-ts": "^0.20.26" + "@runanywhere/proto-ts": "^0.20.27" }, "devDependencies": { "@eslint/js": "^9.39.4", @@ -4574,7 +4574,7 @@ "node": ">=22.12.0" }, "peerDependencies": { - "@runanywhere/web": ">=0.20.26 <1" + "@runanywhere/web": ">=0.20.27 <1" } } } diff --git a/bindings/web/package.json b/bindings/web/package.json index bdcfdaf0e..852357997 100644 --- a/bindings/web/package.json +++ b/bindings/web/package.json @@ -1,7 +1,7 @@ { "name": "@runanywhere/web-root", "private": true, - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Web SDK - On-device AI for the browser via RACommons WASM", "workspaces": [ "../proto-ts", diff --git a/bindings/web/packages/core/package.json b/bindings/web/packages/core/package.json index 5d90ef94a..cd3238de4 100644 --- a/bindings/web/packages/core/package.json +++ b/bindings/web/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/web", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Web SDK - Backend-neutral browser infrastructure with the RACommons WebAssembly core", "type": "module", "main": "./dist/index.js", @@ -79,7 +79,7 @@ }, "dependencies": { "@bufbuild/protobuf": "^2.12.1", - "@runanywhere/proto-ts": "^0.20.26", + "@runanywhere/proto-ts": "^0.20.27", "long": "^5.3.2", "protobufjs": "^7.5.8" }, diff --git a/bindings/web/packages/core/src/Foundation/Version.ts b/bindings/web/packages/core/src/Foundation/Version.ts index 909a11f9f..313be1e1e 100644 --- a/bindings/web/packages/core/src/Foundation/Version.ts +++ b/bindings/web/packages/core/src/Foundation/Version.ts @@ -10,7 +10,7 @@ * Do not hand-edit — update `core/VERSION` and run * `scripts/release/sync-versions.sh `. */ -export const SDK_VERSION = '0.20.26'; +export const SDK_VERSION = '0.20.27'; /** SDK display name. Mirrors Swift `SDKConstants.name` (SDKConstants.swift:17). */ export const SDK_NAME = 'RunAnywhere SDK'; diff --git a/bindings/web/packages/llamacpp/package.json b/bindings/web/packages/llamacpp/package.json index 2ea4d6864..75440faaa 100644 --- a/bindings/web/packages/llamacpp/package.json +++ b/bindings/web/packages/llamacpp/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/web-llamacpp", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Web SDK - LlamaCpp backend for on-device LLM, embeddings, and VLM inference", "type": "module", "main": "./dist/index.js", @@ -64,11 +64,11 @@ "node": ">=22.12.0" }, "peerDependencies": { - "@runanywhere/web": ">=0.20.26 <1" + "@runanywhere/web": ">=0.20.27 <1" }, "dependencies": { "@bufbuild/protobuf": "^2.12.1", - "@runanywhere/proto-ts": "^0.20.26" + "@runanywhere/proto-ts": "^0.20.27" }, "devDependencies": { "@eslint/js": "^9.39.4", diff --git a/bindings/web/packages/onnx/package.json b/bindings/web/packages/onnx/package.json index 57d68593b..22d258a7a 100644 --- a/bindings/web/packages/onnx/package.json +++ b/bindings/web/packages/onnx/package.json @@ -1,6 +1,6 @@ { "name": "@runanywhere/web-onnx", - "version": "0.20.26", + "version": "0.20.27", "description": "RunAnywhere Web SDK - ONNX backend for STT, TTS, and VAD via sherpa-onnx", "type": "module", "main": "./dist/index.js", @@ -64,10 +64,10 @@ "node": ">=22.12.0" }, "peerDependencies": { - "@runanywhere/web": ">=0.20.26 <1" + "@runanywhere/web": ">=0.20.27 <1" }, "dependencies": { - "@runanywhere/proto-ts": "^0.20.26" + "@runanywhere/proto-ts": "^0.20.27" }, "devDependencies": { "@eslint/js": "^9.39.4", diff --git a/core/VERSION b/core/VERSION index 1a01ba1b8..fa62df0ec 100644 --- a/core/VERSION +++ b/core/VERSION @@ -1 +1 @@ -0.20.26 +0.20.27 diff --git a/core/VERSIONS b/core/VERSIONS index b075ee2de..2e447826e 100644 --- a/core/VERSIONS +++ b/core/VERSIONS @@ -14,7 +14,7 @@ # ============================================================================= # Project version (read from VERSION file, but also defined here for scripts) -PROJECT_VERSION=0.20.26 +PROJECT_VERSION=0.20.27 # ============================================================================= # Platform Deployment Targets diff --git a/dependencies/versions.json b/dependencies/versions.json index 917c0a09f..3e9ac4f2f 100644 --- a/dependencies/versions.json +++ b/dependencies/versions.json @@ -28,7 +28,7 @@ "prettier": "^3.8.3", "@playwright/test": "^1.61.1", "vite": "^8.1.4", - "@runanywhere/proto-ts": "^0.20.26", + "@runanywhere/proto-ts": "^0.20.27", "react-native": "0.85.3", "react": "19.2.3", "@eslint/js": "^9.39.4", diff --git a/scripts/build/_release_asset.sh b/scripts/build/_release_asset.sh index a854539d1..709f22603 100644 --- a/scripts/build/_release_asset.sh +++ b/scripts/build/_release_asset.sh @@ -14,8 +14,12 @@ fetch_release_asset() { local repo="$1" tag="$2" name="$3" dest="$4" token="$5" py="$6" local api="https://api.github.com/repos/${repo}" - # An empty token is legitimate: the QAIRT runtime assets are public. Passing an - # empty Bearer header makes GitHub reject the request outright, so omit it. + # Every current caller (download-neurt.sh, download-qhexrt.sh, + # download-qairt-runtime.sh, check_engine_prebuilt_pins.sh) requires a real + # NEURUN_TOKEN and exits before reaching here without one -- NeuRT, QHexRT and + # the QAIRT runtime are all private assets on the neurun repo. This guard just + # avoids ever sending a literally empty Bearer header (GitHub rejects that + # outright) if a future caller legitimately has none. local auth=() [[ -n "$token" ]] && auth=(-H "Authorization: Bearer ${token}") diff --git a/scripts/build/build-core-android.sh b/scripts/build/build-core-android.sh index fd979d28e..6dd622851 100755 --- a/scripts/build/build-core-android.sh +++ b/scripts/build/build-core-android.sh @@ -231,11 +231,14 @@ find_qairt_root() { fi done < <(find "${REPO_ROOT}/.." -maxdepth 4 -type d -path "*/qairt/*/lib/aarch64-android" -print 2>/dev/null | sort -r) - # LAST RESORT: the pinned public QAIRT runtime fetched by - # scripts/build/download-qairt-runtime.sh. Deliberately last, so any real - # local install still wins and every branch above keeps its fail-closed - # semantics. This is what lets a hosted runner (or a fork) build a routable - # Hexagon engine with no licensed QAIRT install. + # LAST RESORT: the pinned QAIRT runtime fetched by + # scripts/build/download-qairt-runtime.sh from the PRIVATE neurun repo (needs + # NEURUN_TOKEN/GH_TOKEN; that script exits 3 without one). Deliberately last, + # so any real local install still wins and every branch above keeps its + # fail-closed semantics. With the token, this is what lets a hosted runner + # build a routable Hexagon engine with no licensed QAIRT install on the + # machine; without it, this branch is skipped and the build falls back to the + # non-routable shell. candidate="${REPO_ROOT}/engines/qhexrt/prebuilt/qairt-runtime/arm64-v8a/current" if [ -d "${candidate}/lib/aarch64-android" ] && [ -f "${candidate}/qairt-runtime.json" ]; then # Refuse anything resolving INSIDE the engine payload tree. If the runtime diff --git a/scripts/build/publish-qairt-runtime.sh b/scripts/build/publish-qairt-runtime.sh index 3c90748d7..e9157f05e 100755 --- a/scripts/build/publish-qairt-runtime.sh +++ b/scripts/build/publish-qairt-runtime.sh @@ -184,7 +184,10 @@ with open(out, "wb") as raw: with open(full, "rb") as fh: tar.addfile(info, fh) PYTAR - (cd "$OUT_DIR" && shasum -a 256 "${name}.tar.gz" > "${name}.tar.gz.sha256") + # Bare hash, no filename -- matches the NeuRT/QHexRT sidecar convention. Plain + # `shasum > file` appends the filename, which check_engine_prebuilt_pins.sh's + # raw string compare then fails on bytes that are otherwise identical. + (cd "$OUT_DIR" && shasum -a 256 "${name}.tar.gz" | awk '{print $1}' > "${name}.tar.gz.sha256") sha="$(cut -d' ' -f1 < "${OUT_DIR}/${name}.tar.gz.sha256")" bytes="$(wc -c < "${OUT_DIR}/${name}.tar.gz" | tr -d ' ')" echo " -> ${name}.tar.gz ($((bytes / 1048576)) MB)" diff --git a/scripts/validation/gates/check_engine_prebuilt_pins.sh b/scripts/validation/gates/check_engine_prebuilt_pins.sh index 5c745e78a..0c89216a6 100755 --- a/scripts/validation/gates/check_engine_prebuilt_pins.sh +++ b/scripts/validation/gates/check_engine_prebuilt_pins.sh @@ -32,6 +32,7 @@ source "${REPO_ROOT}/scripts/build/_release_asset.sh" # The engines, their ABIs/slices, and the asset basename each publishes. NEURT_SLICES=(macos-arm64 ios-arm64 ios-arm64-simulator) QHEXRT_ABIS=(arm64-v8a win-arm64) +QAIRT_PLATFORMS=(arm64-v8a win-arm64) echo "== engine prebuilt pins ==" @@ -49,9 +50,14 @@ for a in "${QHEXRT_ABIS[@]}"; do check_sha_var "QHEXRT_${u}_SHA256" check_sha_var "QHEXRT_${u}_RECEIPT" done -[[ -n "${NEURUN_REPO:-}" ]] || bad "NEURUN_REPO is not set" -[[ -n "${NEURT_RELEASE_TAG:-}" ]] || bad "NEURT_RELEASE_TAG is not set" -[[ -n "${QHEXRT_RELEASE_TAG:-}" ]] || bad "QHEXRT_RELEASE_TAG is not set" +for p in "${QAIRT_PLATFORMS[@]}"; do + check_sha_var "QAIRT_RUNTIME_$(echo "$p" | tr 'a-z-' 'A-Z_')_SHA256" +done +[[ -n "${NEURUN_REPO:-}" ]] || bad "NEURUN_REPO is not set" +[[ -n "${NEURT_RELEASE_TAG:-}" ]] || bad "NEURT_RELEASE_TAG is not set" +[[ -n "${QHEXRT_RELEASE_TAG:-}" ]] || bad "QHEXRT_RELEASE_TAG is not set" +[[ -n "${QAIRT_RUNTIME_VERSION:-}" ]] || bad "QAIRT_RUNTIME_VERSION is not set" +[[ -n "${QAIRT_RUNTIME_RELEASE_TAG:-}" ]] || bad "QAIRT_RUNTIME_RELEASE_TAG is not set" [[ $fail -eq 0 ]] && ok "all pins present and well-formed" # ---- 2. the ABI pin matches the header it must match ------------------------ @@ -137,13 +143,15 @@ expect_requires "electron win-arm64 fetches the pinned QAIRT runtime" \ # No consumer may point at a hand-staged payload by absolute path again. echo "== no hand-staged payload paths ==" -if grep -rnE "QHEXRT_ROOT: *['\"][A-Za-z]:\\\\|NEURT_ROOT: *['\"]?[A-Za-z]:\\\\|qhexrt-prebuilt\\\\versions" \ - "${REPO_ROOT}/.github/workflows/" >/dev/null 2>&1; then - bad "a workflow pins an engine payload by absolute path; use the downloader" - grep -rnE "QHEXRT_ROOT: *['\"][A-Za-z]:\\\\|qhexrt-prebuilt\\\\versions" \ - "${REPO_ROOT}/.github/workflows/" | sed 's/^/ /' >&2 +# Also covers QAIRT: RA_QNN_RUNTIME_DIR pointing at a literal Windows path is +# exactly the C:\actions-runner-state\qhexrt-qnn-runtime-flat regression -- +# that directory carried no version info and had already gone stale once. +HANDSTAGE_RE="QHEXRT_ROOT: *['\"][A-Za-z]:\\\\|NEURT_ROOT: *['\"]?[A-Za-z]:\\\\|QAIRT_ROOT: *['\"][A-Za-z]:\\\\|RA_QNN_RUNTIME_DIR: *['\"][A-Za-z]:\\\\|qhexrt-prebuilt\\\\versions|qairt-runtime\\\\versions" +if grep -rnE "$HANDSTAGE_RE" "${REPO_ROOT}/.github/workflows/" >/dev/null 2>&1; then + bad "a workflow pins an engine or QAIRT payload by absolute path; use the downloader" + grep -rnE "$HANDSTAGE_RE" "${REPO_ROOT}/.github/workflows/" | sed 's/^/ /' >&2 else - ok "no workflow hardcodes an engine payload path" + ok "no workflow hardcodes an engine or QAIRT payload path" fi # ---- 3b. the headers the prebuilt was compiled against have not moved ------- @@ -247,6 +255,30 @@ for a in rel.get('assets',[]): print(a['name'])" 2>/dev/null || true)" done [[ $fail -eq 0 ]] && ok "release carries all $(( ${#want[@]} * 2 )) expected files" + # QAIRT is on its OWN tag too -- the SDK version and the engine version + # move independently, so it is fetched from a separate release listing. + qairt_listing="$(curl -sSL -H "Authorization: Bearer ${TOKEN}" \ + -H "Accept: application/vnd.github+json" \ + "https://api.github.com/repos/${repo}/releases/tags/${QAIRT_RUNTIME_RELEASE_TAG}" \ + | python3 -c "import json,sys +rel=json.load(sys.stdin) +for a in rel.get('assets',[]): print(a['name'])" 2>/dev/null || true)" + if [[ -z "$qairt_listing" ]]; then + bad "could not read release ${QAIRT_RUNTIME_RELEASE_TAG} from $repo" + else + qairt_want=() + for p in "${QAIRT_PLATFORMS[@]}"; do + qairt_want+=("qairt-runtime-${p}-v${QAIRT_RUNTIME_VERSION}.tar.gz") + done + qairt_fail_before=$fail + for w in "${qairt_want[@]}"; do + if ! grep -qx "$w" <<<"$qairt_listing"; then bad "QAIRT release is missing $w" + elif ! grep -qx "${w}.sha256" <<<"$qairt_listing"; then bad "QAIRT release is missing ${w}.sha256" + fi + done + [[ $fail -eq $qairt_fail_before ]] && ok "QAIRT release carries all $(( ${#qairt_want[@]} * 2 )) expected files" + fi + # The pin must equal the PUBLISHED checksum. A local rebuild produces # different bytes, so a hand-copied pin can describe something that was # never released -- exactly the drift this boundary exists to prevent. @@ -257,7 +289,7 @@ for a in rel.get('assets',[]): print(a['name'])" 2>/dev/null || true)" "neurt-${s}-v${nv}.tar.gz.sha256" "$tmp" "$TOKEN" python3 2>/dev/null; then bad "could not download the published checksum for neurt-${s}"; continue fi - pub="$(cat "$tmp/neurt-${s}-v${nv}.tar.gz.sha256")" + pub="$(cut -d' ' -f1 < "$tmp/neurt-${s}-v${nv}.tar.gz.sha256")" [[ "$pub" == "${!var}" ]] && ok "$var matches the published asset" \ || bad "$var=${!var} but the release publishes $pub" done @@ -268,7 +300,19 @@ for a in rel.get('assets',[]): print(a['name'])" 2>/dev/null || true)" "qhexrt-${a}-v${qv}.tar.gz.sha256" "$tmp" "$TOKEN" python3 2>/dev/null; then bad "could not download the published checksum for qhexrt-${a}"; continue fi - pub="$(cat "$tmp/qhexrt-${a}-v${qv}.tar.gz.sha256")" + pub="$(cut -d' ' -f1 < "$tmp/qhexrt-${a}-v${qv}.tar.gz.sha256")" + [[ "$pub" == "${!var}" ]] && ok "$var matches the published asset" \ + || bad "$var=${!var} but the release publishes $pub" + done + for p in "${QAIRT_PLATFORMS[@]}"; do + var="QAIRT_RUNTIME_$(echo "$p" | tr 'a-z-' 'A-Z_')_SHA256" + qairt_repo="${NEURUN_REPO:-$repo}" + aname="qairt-runtime-${p}-v${QAIRT_RUNTIME_VERSION}.tar.gz" + if ! fetch_release_asset "$qairt_repo" "$QAIRT_RUNTIME_RELEASE_TAG" \ + "${aname}.sha256" "$tmp" "$TOKEN" python3 2>/dev/null; then + bad "could not download the published checksum for qairt-runtime-${p}"; continue + fi + pub="$(cut -d' ' -f1 < "$tmp/${aname}.sha256")" [[ "$pub" == "${!var}" ]] && ok "$var matches the published asset" \ || bad "$var=${!var} but the release publishes $pub" done diff --git a/yarn.lock b/yarn.lock index 19c844e60..cdde1c80f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2764,7 +2764,7 @@ __metadata: react-native-nitro-modules: ^0.33.9 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9 @@ -2779,7 +2779,7 @@ __metadata: react-native-nitro-modules: ^0.33.9 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9 @@ -2797,7 +2797,7 @@ __metadata: react-native-nitro-modules: ^0.33.9 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9 @@ -2826,7 +2826,7 @@ __metadata: ts-jest: ^29.1.2 typescript: ^5.9.3 peerDependencies: - "@runanywhere/core": ">=0.20.26" + "@runanywhere/core": ">=0.20.27" react: ">=19.0.0" react-native: ">=0.83.1" react-native-nitro-modules: ^0.33.9