@runanywhere/core 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/RunAnywhereCore.podspec +130 -0
  2. package/android/CMakeLists.txt +92 -0
  3. package/android/build.gradle +321 -0
  4. package/android/consumer-rules.pro +5 -0
  5. package/android/src/main/AndroidManifest.xml +3 -0
  6. package/android/src/main/cpp/cpp-adapter.cpp +271 -0
  7. package/android/src/main/include/rac/backends/rac_llm_llamacpp.h +218 -0
  8. package/android/src/main/include/rac/backends/rac_stt_onnx.h +99 -0
  9. package/android/src/main/include/rac/backends/rac_stt_whispercpp.h +153 -0
  10. package/android/src/main/include/rac/backends/rac_tts_onnx.h +71 -0
  11. package/android/src/main/include/rac/backends/rac_vad_onnx.h +84 -0
  12. package/android/src/main/include/rac/core/capabilities/rac_lifecycle.h +290 -0
  13. package/android/src/main/include/rac/core/rac_analytics_events.h +610 -0
  14. package/android/src/main/include/rac/core/rac_audio_utils.h +88 -0
  15. package/android/src/main/include/rac/core/rac_component_types.h +160 -0
  16. package/android/src/main/include/rac/core/rac_core.h +331 -0
  17. package/android/src/main/include/rac/core/rac_error.h +469 -0
  18. package/android/src/main/include/rac/core/rac_events.h +334 -0
  19. package/android/src/main/include/rac/core/rac_logger.h +416 -0
  20. package/android/src/main/include/rac/core/rac_platform_adapter.h +340 -0
  21. package/android/src/main/include/rac/core/rac_sdk_state.h +292 -0
  22. package/android/src/main/include/rac/core/rac_structured_error.h +594 -0
  23. package/android/src/main/include/rac/core/rac_types.h +264 -0
  24. package/android/src/main/include/rac/features/llm/rac_llm.h +17 -0
  25. package/android/src/main/include/rac/features/llm/rac_llm_analytics.h +188 -0
  26. package/android/src/main/include/rac/features/llm/rac_llm_component.h +228 -0
  27. package/android/src/main/include/rac/features/llm/rac_llm_events.h +215 -0
  28. package/android/src/main/include/rac/features/llm/rac_llm_metrics.h +402 -0
  29. package/android/src/main/include/rac/features/llm/rac_llm_service.h +163 -0
  30. package/android/src/main/include/rac/features/llm/rac_llm_structured_output.h +141 -0
  31. package/android/src/main/include/rac/features/llm/rac_llm_types.h +384 -0
  32. package/android/src/main/include/rac/features/platform/rac_llm_platform.h +204 -0
  33. package/android/src/main/include/rac/features/platform/rac_tts_platform.h +197 -0
  34. package/android/src/main/include/rac/features/stt/rac_stt.h +17 -0
  35. package/android/src/main/include/rac/features/stt/rac_stt_analytics.h +204 -0
  36. package/android/src/main/include/rac/features/stt/rac_stt_component.h +162 -0
  37. package/android/src/main/include/rac/features/stt/rac_stt_events.h +62 -0
  38. package/android/src/main/include/rac/features/stt/rac_stt_service.h +154 -0
  39. package/android/src/main/include/rac/features/stt/rac_stt_types.h +389 -0
  40. package/android/src/main/include/rac/features/tts/rac_tts.h +17 -0
  41. package/android/src/main/include/rac/features/tts/rac_tts_analytics.h +181 -0
  42. package/android/src/main/include/rac/features/tts/rac_tts_component.h +158 -0
  43. package/android/src/main/include/rac/features/tts/rac_tts_events.h +54 -0
  44. package/android/src/main/include/rac/features/tts/rac_tts_service.h +162 -0
  45. package/android/src/main/include/rac/features/tts/rac_tts_types.h +374 -0
  46. package/android/src/main/include/rac/features/vad/rac_vad.h +17 -0
  47. package/android/src/main/include/rac/features/vad/rac_vad_analytics.h +236 -0
  48. package/android/src/main/include/rac/features/vad/rac_vad_component.h +185 -0
  49. package/android/src/main/include/rac/features/vad/rac_vad_energy.h +443 -0
  50. package/android/src/main/include/rac/features/vad/rac_vad_events.h +76 -0
  51. package/android/src/main/include/rac/features/vad/rac_vad_service.h +167 -0
  52. package/android/src/main/include/rac/features/vad/rac_vad_types.h +244 -0
  53. package/android/src/main/include/rac/features/voice_agent/rac_voice_agent.h +612 -0
  54. package/android/src/main/include/rac/infrastructure/device/rac_device_manager.h +176 -0
  55. package/android/src/main/include/rac/infrastructure/download/rac_download.h +418 -0
  56. package/android/src/main/include/rac/infrastructure/events/rac_events.h +177 -0
  57. package/android/src/main/include/rac/infrastructure/model_management/rac_model_assignment.h +169 -0
  58. package/android/src/main/include/rac/infrastructure/model_management/rac_model_paths.h +258 -0
  59. package/android/src/main/include/rac/infrastructure/model_management/rac_model_registry.h +357 -0
  60. package/android/src/main/include/rac/infrastructure/model_management/rac_model_strategy.h +374 -0
  61. package/android/src/main/include/rac/infrastructure/model_management/rac_model_types.h +613 -0
  62. package/android/src/main/include/rac/infrastructure/network/rac_api_types.h +335 -0
  63. package/android/src/main/include/rac/infrastructure/network/rac_auth_manager.h +252 -0
  64. package/android/src/main/include/rac/infrastructure/network/rac_dev_config.h +85 -0
  65. package/android/src/main/include/rac/infrastructure/network/rac_endpoints.h +102 -0
  66. package/android/src/main/include/rac/infrastructure/network/rac_environment.h +220 -0
  67. package/android/src/main/include/rac/infrastructure/network/rac_http_client.h +233 -0
  68. package/android/src/main/include/rac/infrastructure/storage/rac_storage_analyzer.h +286 -0
  69. package/android/src/main/include/rac/infrastructure/telemetry/rac_telemetry_manager.h +206 -0
  70. package/android/src/main/include/rac/infrastructure/telemetry/rac_telemetry_types.h +234 -0
  71. package/android/src/main/java/com/margelo/nitro/runanywhere/ArchiveUtility.kt +308 -0
  72. package/android/src/main/java/com/margelo/nitro/runanywhere/HybridRunAnywhereDeviceInfo.kt +229 -0
  73. package/android/src/main/java/com/margelo/nitro/runanywhere/PlatformAdapterBridge.kt +392 -0
  74. package/android/src/main/java/com/margelo/nitro/runanywhere/RunAnywhereCorePackage.kt +28 -0
  75. package/android/src/main/java/com/margelo/nitro/runanywhere/SDKLogger.kt +357 -0
  76. package/android/src/main/java/com/margelo/nitro/runanywhere/SecureStorageManager.kt +147 -0
  77. package/android/src/main/jniLibs/arm64-v8a/libc++_shared.so +0 -0
  78. package/android/src/main/jniLibs/arm64-v8a/libomp.so +0 -0
  79. package/android/src/main/jniLibs/arm64-v8a/librac_commons.so +0 -0
  80. package/android/src/main/jniLibs/arm64-v8a/librunanywhere_jni.so +0 -0
  81. package/cpp/HybridRunAnywhereCore.cpp +2505 -0
  82. package/cpp/HybridRunAnywhereCore.hpp +271 -0
  83. package/cpp/bridges/AuthBridge.cpp +209 -0
  84. package/cpp/bridges/AuthBridge.hpp +157 -0
  85. package/cpp/bridges/DeviceBridge.cpp +257 -0
  86. package/cpp/bridges/DeviceBridge.hpp +155 -0
  87. package/cpp/bridges/DownloadBridge.cpp +299 -0
  88. package/cpp/bridges/DownloadBridge.hpp +197 -0
  89. package/cpp/bridges/EventBridge.cpp +125 -0
  90. package/cpp/bridges/EventBridge.hpp +139 -0
  91. package/cpp/bridges/HTTPBridge.cpp +96 -0
  92. package/cpp/bridges/HTTPBridge.hpp +144 -0
  93. package/cpp/bridges/InitBridge.cpp +1273 -0
  94. package/cpp/bridges/InitBridge.hpp +306 -0
  95. package/cpp/bridges/ModelRegistryBridge.cpp +394 -0
  96. package/cpp/bridges/ModelRegistryBridge.hpp +177 -0
  97. package/cpp/bridges/StorageBridge.cpp +269 -0
  98. package/cpp/bridges/StorageBridge.hpp +172 -0
  99. package/cpp/bridges/TelemetryBridge.cpp +352 -0
  100. package/cpp/bridges/TelemetryBridge.hpp +126 -0
  101. package/ios/.testlocal +0 -0
  102. package/ios/ArchiveUtility.swift +526 -0
  103. package/ios/ArchiveUtilityBridge.m +52 -0
  104. package/ios/AudioDecoder.h +38 -0
  105. package/ios/AudioDecoder.m +162 -0
  106. package/ios/Binaries/RACommons.xcframework/Info.plist +44 -0
  107. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/RACommons.h +67 -0
  108. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_analytics_events.h +610 -0
  109. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_api_types.h +335 -0
  110. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_audio_utils.h +88 -0
  111. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_auth_manager.h +252 -0
  112. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_component_types.h +160 -0
  113. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_core.h +331 -0
  114. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_dev_config.h +85 -0
  115. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_device_manager.h +176 -0
  116. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_download.h +418 -0
  117. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_endpoints.h +102 -0
  118. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_environment.h +220 -0
  119. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_error.h +469 -0
  120. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_events.h +177 -0
  121. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_http_client.h +233 -0
  122. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_lifecycle.h +290 -0
  123. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm.h +17 -0
  124. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_analytics.h +188 -0
  125. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_component.h +228 -0
  126. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_events.h +215 -0
  127. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_llamacpp.h +218 -0
  128. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_metrics.h +402 -0
  129. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_platform.h +204 -0
  130. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_service.h +163 -0
  131. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_structured_output.h +141 -0
  132. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_llm_types.h +384 -0
  133. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_logger.h +416 -0
  134. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_model_assignment.h +169 -0
  135. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_model_paths.h +258 -0
  136. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_model_registry.h +357 -0
  137. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_model_strategy.h +374 -0
  138. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_model_types.h +613 -0
  139. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_platform_adapter.h +340 -0
  140. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_sdk_state.h +292 -0
  141. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_storage_analyzer.h +286 -0
  142. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_structured_error.h +594 -0
  143. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt.h +17 -0
  144. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt_analytics.h +204 -0
  145. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt_component.h +162 -0
  146. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt_events.h +62 -0
  147. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt_onnx.h +99 -0
  148. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt_service.h +154 -0
  149. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt_types.h +389 -0
  150. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_stt_whispercpp.h +153 -0
  151. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_telemetry_manager.h +206 -0
  152. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_telemetry_types.h +234 -0
  153. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts.h +17 -0
  154. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts_analytics.h +181 -0
  155. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts_component.h +158 -0
  156. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts_events.h +54 -0
  157. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts_onnx.h +71 -0
  158. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts_platform.h +197 -0
  159. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts_service.h +162 -0
  160. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_tts_types.h +374 -0
  161. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_types.h +264 -0
  162. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad.h +17 -0
  163. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad_analytics.h +236 -0
  164. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad_component.h +185 -0
  165. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad_energy.h +443 -0
  166. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad_events.h +76 -0
  167. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad_onnx.h +84 -0
  168. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad_service.h +167 -0
  169. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_vad_types.h +244 -0
  170. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Headers/rac_voice_agent.h +612 -0
  171. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Info.plist +11 -0
  172. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/Modules/module.modulemap +5 -0
  173. package/ios/Binaries/RACommons.xcframework/ios-arm64/RACommons.framework/RACommons +0 -0
  174. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/RACommons.h +67 -0
  175. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_analytics_events.h +610 -0
  176. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_api_types.h +335 -0
  177. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_audio_utils.h +88 -0
  178. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_auth_manager.h +252 -0
  179. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_component_types.h +160 -0
  180. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_core.h +331 -0
  181. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_dev_config.h +85 -0
  182. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_device_manager.h +176 -0
  183. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_download.h +418 -0
  184. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_endpoints.h +102 -0
  185. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_environment.h +220 -0
  186. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_error.h +469 -0
  187. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_events.h +177 -0
  188. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_http_client.h +233 -0
  189. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_lifecycle.h +290 -0
  190. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm.h +17 -0
  191. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_analytics.h +188 -0
  192. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_component.h +228 -0
  193. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_events.h +215 -0
  194. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_llamacpp.h +218 -0
  195. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_metrics.h +402 -0
  196. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_platform.h +204 -0
  197. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_service.h +163 -0
  198. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_structured_output.h +141 -0
  199. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_llm_types.h +384 -0
  200. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_logger.h +416 -0
  201. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_model_assignment.h +169 -0
  202. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_model_paths.h +258 -0
  203. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_model_registry.h +357 -0
  204. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_model_strategy.h +374 -0
  205. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_model_types.h +613 -0
  206. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_platform_adapter.h +340 -0
  207. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_sdk_state.h +292 -0
  208. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_storage_analyzer.h +286 -0
  209. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_structured_error.h +594 -0
  210. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt.h +17 -0
  211. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt_analytics.h +204 -0
  212. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt_component.h +162 -0
  213. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt_events.h +62 -0
  214. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt_onnx.h +99 -0
  215. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt_service.h +154 -0
  216. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt_types.h +389 -0
  217. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_stt_whispercpp.h +153 -0
  218. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_telemetry_manager.h +206 -0
  219. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_telemetry_types.h +234 -0
  220. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts.h +17 -0
  221. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts_analytics.h +181 -0
  222. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts_component.h +158 -0
  223. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts_events.h +54 -0
  224. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts_onnx.h +71 -0
  225. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts_platform.h +197 -0
  226. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts_service.h +162 -0
  227. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_tts_types.h +374 -0
  228. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_types.h +264 -0
  229. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad.h +17 -0
  230. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad_analytics.h +236 -0
  231. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad_component.h +185 -0
  232. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad_energy.h +443 -0
  233. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad_events.h +76 -0
  234. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad_onnx.h +84 -0
  235. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad_service.h +167 -0
  236. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_vad_types.h +244 -0
  237. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Headers/rac_voice_agent.h +612 -0
  238. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Info.plist +11 -0
  239. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/Modules/module.modulemap +5 -0
  240. package/ios/Binaries/RACommons.xcframework/ios-arm64_x86_64-simulator/RACommons.framework/RACommons +0 -0
  241. package/ios/HybridRunAnywhereDeviceInfo.swift +214 -0
  242. package/ios/KeychainManager.swift +116 -0
  243. package/ios/PlatformAdapter.swift +100 -0
  244. package/ios/PlatformAdapterBridge.h +152 -0
  245. package/ios/PlatformAdapterBridge.m +570 -0
  246. package/ios/RNSDKLoggerBridge.h +41 -0
  247. package/ios/RNSDKLoggerBridge.m +66 -0
  248. package/ios/SDKLogger.swift +329 -0
  249. package/nitro.json +20 -0
  250. package/nitrogen/generated/.gitattributes +1 -0
  251. package/nitrogen/generated/android/c++/JHybridRunAnywhereDeviceInfoSpec.cpp +257 -0
  252. package/nitrogen/generated/android/c++/JHybridRunAnywhereDeviceInfoSpec.hpp +77 -0
  253. package/nitrogen/generated/android/kotlin/com/margelo/nitro/runanywhere/HybridRunAnywhereDeviceInfoSpec.kt +106 -0
  254. package/nitrogen/generated/android/kotlin/com/margelo/nitro/runanywhere/runanywherecoreOnLoad.kt +35 -0
  255. package/nitrogen/generated/android/runanywherecore+autolinking.cmake +82 -0
  256. package/nitrogen/generated/android/runanywherecore+autolinking.gradle +27 -0
  257. package/nitrogen/generated/android/runanywherecoreOnLoad.cpp +54 -0
  258. package/nitrogen/generated/android/runanywherecoreOnLoad.hpp +25 -0
  259. package/nitrogen/generated/ios/RunAnywhereCore+autolinking.rb +60 -0
  260. package/nitrogen/generated/ios/RunAnywhereCore-Swift-Cxx-Bridge.cpp +65 -0
  261. package/nitrogen/generated/ios/RunAnywhereCore-Swift-Cxx-Bridge.hpp +197 -0
  262. package/nitrogen/generated/ios/RunAnywhereCore-Swift-Cxx-Umbrella.hpp +45 -0
  263. package/nitrogen/generated/ios/RunAnywhereCoreAutolinking.mm +43 -0
  264. package/nitrogen/generated/ios/RunAnywhereCoreAutolinking.swift +25 -0
  265. package/nitrogen/generated/ios/c++/HybridRunAnywhereDeviceInfoSpecSwift.cpp +11 -0
  266. package/nitrogen/generated/ios/c++/HybridRunAnywhereDeviceInfoSpecSwift.hpp +173 -0
  267. package/nitrogen/generated/ios/swift/Func_void_bool.swift +47 -0
  268. package/nitrogen/generated/ios/swift/Func_void_double.swift +47 -0
  269. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  270. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  271. package/nitrogen/generated/ios/swift/HybridRunAnywhereDeviceInfoSpec.swift +68 -0
  272. package/nitrogen/generated/ios/swift/HybridRunAnywhereDeviceInfoSpec_cxx.swift +366 -0
  273. package/nitrogen/generated/shared/c++/HybridRunAnywhereCoreSpec.cpp +92 -0
  274. package/nitrogen/generated/shared/c++/HybridRunAnywhereCoreSpec.hpp +138 -0
  275. package/nitrogen/generated/shared/c++/HybridRunAnywhereDeviceInfoSpec.cpp +33 -0
  276. package/nitrogen/generated/shared/c++/HybridRunAnywhereDeviceInfoSpec.hpp +75 -0
  277. package/package.json +76 -0
  278. package/react-native.config.js +14 -0
  279. package/src/Features/VoiceSession/AudioCaptureManager.ts +286 -0
  280. package/src/Features/VoiceSession/AudioPlaybackManager.ts +300 -0
  281. package/src/Features/VoiceSession/VoiceSessionHandle.ts +530 -0
  282. package/src/Features/VoiceSession/index.ts +20 -0
  283. package/src/Features/index.ts +7 -0
  284. package/src/Foundation/Constants/SDKConstants.ts +47 -0
  285. package/src/Foundation/Constants/index.ts +8 -0
  286. package/src/Foundation/DependencyInjection/ServiceContainer.ts +154 -0
  287. package/src/Foundation/DependencyInjection/ServiceRegistry.ts +51 -0
  288. package/src/Foundation/DependencyInjection/index.ts +6 -0
  289. package/src/Foundation/ErrorTypes/ErrorCategory.ts +184 -0
  290. package/src/Foundation/ErrorTypes/ErrorCodes.ts +151 -0
  291. package/src/Foundation/ErrorTypes/ErrorContext.ts +201 -0
  292. package/src/Foundation/ErrorTypes/SDKError.ts +507 -0
  293. package/src/Foundation/ErrorTypes/index.ts +57 -0
  294. package/src/Foundation/Initialization/InitializationPhase.ts +85 -0
  295. package/src/Foundation/Initialization/InitializationState.ts +168 -0
  296. package/src/Foundation/Initialization/index.ts +26 -0
  297. package/src/Foundation/Logging/Destinations/NativeLogBridge.ts +147 -0
  298. package/src/Foundation/Logging/Destinations/SentryDestination.ts +209 -0
  299. package/src/Foundation/Logging/Logger/SDKLogger.ts +232 -0
  300. package/src/Foundation/Logging/Models/LogLevel.ts +36 -0
  301. package/src/Foundation/Logging/Models/LoggingConfiguration.ts +117 -0
  302. package/src/Foundation/Logging/Services/LoggingManager.ts +407 -0
  303. package/src/Foundation/Logging/index.ts +59 -0
  304. package/src/Foundation/Security/DeviceIdentity.ts +92 -0
  305. package/src/Foundation/Security/SecureStorageError.ts +132 -0
  306. package/src/Foundation/Security/SecureStorageKeys.ts +35 -0
  307. package/src/Foundation/Security/SecureStorageService.ts +449 -0
  308. package/src/Foundation/Security/index.ts +17 -0
  309. package/src/Foundation/index.ts +26 -0
  310. package/src/Infrastructure/Events/EventPublisher.ts +165 -0
  311. package/src/Infrastructure/Events/SDKEvent.ts +214 -0
  312. package/src/Infrastructure/Events/index.ts +15 -0
  313. package/src/Infrastructure/index.ts +9 -0
  314. package/src/Public/Events/EventBus.ts +488 -0
  315. package/src/Public/Events/index.ts +8 -0
  316. package/src/Public/Extensions/RunAnywhere+Logging.ts +51 -0
  317. package/src/Public/Extensions/RunAnywhere+Models.ts +392 -0
  318. package/src/Public/Extensions/RunAnywhere+STT.ts +424 -0
  319. package/src/Public/Extensions/RunAnywhere+Storage.ts +151 -0
  320. package/src/Public/Extensions/RunAnywhere+StructuredOutput.ts +316 -0
  321. package/src/Public/Extensions/RunAnywhere+TTS.ts +430 -0
  322. package/src/Public/Extensions/RunAnywhere+TextGeneration.ts +320 -0
  323. package/src/Public/Extensions/RunAnywhere+VAD.ts +359 -0
  324. package/src/Public/Extensions/RunAnywhere+VoiceAgent.ts +225 -0
  325. package/src/Public/Extensions/RunAnywhere+VoiceSession.ts +155 -0
  326. package/src/Public/Extensions/index.ts +126 -0
  327. package/src/Public/RunAnywhere.ts +695 -0
  328. package/src/index.ts +238 -0
  329. package/src/native/NativeRunAnywhereCore.ts +291 -0
  330. package/src/native/NativeRunAnywhereModule.ts +32 -0
  331. package/src/native/index.ts +21 -0
  332. package/src/services/DownloadService.ts +282 -0
  333. package/src/services/FileSystem.ts +810 -0
  334. package/src/services/ModelRegistry.ts +246 -0
  335. package/src/services/Network/APIEndpoints.ts +84 -0
  336. package/src/services/Network/HTTPService.ts +479 -0
  337. package/src/services/Network/NetworkConfiguration.ts +130 -0
  338. package/src/services/Network/TelemetryService.ts +318 -0
  339. package/src/services/Network/index.ts +29 -0
  340. package/src/services/SystemTTSService.ts +130 -0
  341. package/src/services/index.ts +66 -0
  342. package/src/specs/RunAnywhereCore.nitro.ts +627 -0
  343. package/src/specs/RunAnywhereDeviceInfo.nitro.ts +73 -0
  344. package/src/types/LLMTypes.ts +127 -0
  345. package/src/types/STTTypes.ts +124 -0
  346. package/src/types/StructuredOutputTypes.ts +156 -0
  347. package/src/types/TTSTypes.ts +126 -0
  348. package/src/types/VADTypes.ts +70 -0
  349. package/src/types/VoiceAgentTypes.ts +182 -0
  350. package/src/types/enums.ts +258 -0
  351. package/src/types/events.ts +337 -0
  352. package/src/types/external.d.ts +142 -0
  353. package/src/types/index.ts +146 -0
  354. package/src/types/models.ts +579 -0
@@ -0,0 +1,1273 @@
1
+ /**
2
+ * @file InitBridge.cpp
3
+ * @brief SDK initialization bridge implementation
4
+ *
5
+ * Implements platform adapter registration and SDK initialization.
6
+ * Mirrors Swift's CppBridge.initialize() pattern.
7
+ */
8
+
9
+ #include "InitBridge.hpp"
10
+ #include "rac_model_paths.h"
11
+ #include "rac_environment.h" // For rac_sdk_init, rac_sdk_config_t
12
+ #include <cstring>
13
+ #include <cstdlib>
14
+ #include <chrono>
15
+ #include <mutex>
16
+ #include <tuple>
17
+
18
+ // Platform-specific logging and bridges
19
+ #if defined(ANDROID) || defined(__ANDROID__)
20
+ #include <android/log.h>
21
+ #include <jni.h>
22
+ #define LOG_TAG "InitBridge"
23
+ #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
24
+ #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
25
+ #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
26
+ #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
27
+
28
+ // Use the JavaVM from cpp-adapter.cpp (set in JNI_OnLoad there)
29
+ // NOTE: JNI_OnLoad is defined in cpp-adapter.cpp - do NOT define it here!
30
+ extern JavaVM* g_javaVM;
31
+
32
+ // Use cached class and method references from cpp-adapter.cpp
33
+ // These are set in JNI_OnLoad to avoid FindClass from background threads
34
+ extern jclass g_platformAdapterBridgeClass;
35
+ extern jclass g_httpResponseClass;
36
+ extern jmethodID g_secureSetMethod;
37
+ extern jmethodID g_secureGetMethod;
38
+ extern jmethodID g_secureDeleteMethod;
39
+ extern jmethodID g_secureExistsMethod;
40
+ extern jmethodID g_getPersistentDeviceUUIDMethod;
41
+ extern jmethodID g_httpPostSyncMethod;
42
+ extern jmethodID g_getDeviceModelMethod;
43
+ extern jmethodID g_getOSVersionMethod;
44
+ extern jmethodID g_getChipNameMethod;
45
+ extern jmethodID g_getTotalMemoryMethod;
46
+ extern jmethodID g_getAvailableMemoryMethod;
47
+ extern jmethodID g_getCoreCountMethod;
48
+ extern jmethodID g_getArchitectureMethod;
49
+ extern jmethodID g_getGPUFamilyMethod;
50
+ extern jmethodID g_isTabletMethod;
51
+ // HttpResponse field IDs
52
+ extern jfieldID g_httpResponse_successField;
53
+ extern jfieldID g_httpResponse_statusCodeField;
54
+ extern jfieldID g_httpResponse_responseBodyField;
55
+ extern jfieldID g_httpResponse_errorMessageField;
56
+
57
+ // Helper to get JNIEnv for current thread
58
+ static JNIEnv* getJNIEnv() {
59
+ if (!g_javaVM) {
60
+ LOGE("JavaVM not initialized - cpp-adapter JNI_OnLoad may not have been called");
61
+ return nullptr;
62
+ }
63
+
64
+ JNIEnv* env = nullptr;
65
+ int status = g_javaVM->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
66
+
67
+ if (status == JNI_EDETACHED) {
68
+ // Attach current thread
69
+ if (g_javaVM->AttachCurrentThread(&env, nullptr) != JNI_OK) {
70
+ LOGE("Failed to attach current thread to JVM");
71
+ return nullptr;
72
+ }
73
+ } else if (status != JNI_OK) {
74
+ LOGE("Failed to get JNI environment: %d", status);
75
+ return nullptr;
76
+ }
77
+
78
+ return env;
79
+ }
80
+
81
+ // Android JNI bridge for secure storage
82
+ // Uses cached class/method references from cpp-adapter.cpp to avoid FindClass from bg threads
83
+ namespace AndroidBridge {
84
+ bool secureSet(const char* key, const char* value) {
85
+ JNIEnv* env = getJNIEnv();
86
+ if (!env) return false;
87
+
88
+ // Use cached references from JNI_OnLoad
89
+ if (!g_platformAdapterBridgeClass || !g_secureSetMethod) {
90
+ LOGE("PlatformAdapterBridge class or secureSet method not cached");
91
+ return false;
92
+ }
93
+
94
+ jstring jKey = env->NewStringUTF(key);
95
+ jstring jValue = env->NewStringUTF(value);
96
+ jboolean result = env->CallStaticBooleanMethod(g_platformAdapterBridgeClass, g_secureSetMethod, jKey, jValue);
97
+
98
+ LOGD("secureSet (Android): key=%s, success=%d", key, result);
99
+
100
+ env->DeleteLocalRef(jKey);
101
+ env->DeleteLocalRef(jValue);
102
+
103
+ return result;
104
+ }
105
+
106
+ bool secureGet(const char* key, std::string& outValue) {
107
+ JNIEnv* env = getJNIEnv();
108
+ if (!env) return false;
109
+
110
+ // Use cached references from JNI_OnLoad
111
+ if (!g_platformAdapterBridgeClass || !g_secureGetMethod) {
112
+ LOGE("PlatformAdapterBridge class or secureGet method not cached");
113
+ return false;
114
+ }
115
+
116
+ jstring jKey = env->NewStringUTF(key);
117
+ jstring jResult = (jstring)env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_secureGetMethod, jKey);
118
+
119
+ env->DeleteLocalRef(jKey);
120
+
121
+ if (jResult == nullptr) {
122
+ LOGD("secureGet (Android): key=%s not found", key);
123
+ return false;
124
+ }
125
+
126
+ const char* resultStr = env->GetStringUTFChars(jResult, nullptr);
127
+ if (resultStr) {
128
+ outValue = resultStr;
129
+ env->ReleaseStringUTFChars(jResult, resultStr);
130
+ }
131
+ env->DeleteLocalRef(jResult);
132
+
133
+ LOGD("secureGet (Android): key=%s found", key);
134
+ return !outValue.empty();
135
+ }
136
+
137
+ bool secureDelete(const char* key) {
138
+ JNIEnv* env = getJNIEnv();
139
+ if (!env) return false;
140
+
141
+ // Use cached references from JNI_OnLoad
142
+ if (!g_platformAdapterBridgeClass || !g_secureDeleteMethod) {
143
+ LOGE("PlatformAdapterBridge class or secureDelete method not cached");
144
+ return false;
145
+ }
146
+
147
+ jstring jKey = env->NewStringUTF(key);
148
+ jboolean result = env->CallStaticBooleanMethod(g_platformAdapterBridgeClass, g_secureDeleteMethod, jKey);
149
+
150
+ LOGD("secureDelete (Android): key=%s, success=%d", key, result);
151
+
152
+ env->DeleteLocalRef(jKey);
153
+
154
+ return result;
155
+ }
156
+
157
+ bool secureExists(const char* key) {
158
+ // For secureExists, we'll try secureGet and check if value is non-empty
159
+ // since we don't have a cached method for it
160
+ std::string value;
161
+ return secureGet(key, value);
162
+ }
163
+
164
+ std::string getPersistentDeviceUUID() {
165
+ JNIEnv* env = getJNIEnv();
166
+ if (!env) return "";
167
+
168
+ // Use cached references from JNI_OnLoad
169
+ if (!g_platformAdapterBridgeClass || !g_getPersistentDeviceUUIDMethod) {
170
+ LOGE("PlatformAdapterBridge class or getPersistentDeviceUUID method not cached");
171
+ return "";
172
+ }
173
+
174
+ jstring jResult = (jstring)env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_getPersistentDeviceUUIDMethod);
175
+ if (!jResult) return "";
176
+
177
+ const char* resultStr = env->GetStringUTFChars(jResult, nullptr);
178
+ std::string uuid = resultStr ? resultStr : "";
179
+
180
+ if (resultStr) env->ReleaseStringUTFChars(jResult, resultStr);
181
+ env->DeleteLocalRef(jResult);
182
+
183
+ LOGD("getPersistentDeviceUUID (Android): %s", uuid.c_str());
184
+ return uuid;
185
+ }
186
+
187
+ // HTTP POST for device registration (synchronous)
188
+ // Returns: (success, statusCode, responseBody, errorMessage)
189
+ std::tuple<bool, int, std::string, std::string> httpPostSync(
190
+ const std::string& url,
191
+ const std::string& jsonBody,
192
+ const std::string& supabaseKey
193
+ ) {
194
+ JNIEnv* env = getJNIEnv();
195
+ if (!env) {
196
+ return {false, 0, "", "JNI not available"};
197
+ }
198
+
199
+ // Use cached references from JNI_OnLoad
200
+ if (!g_platformAdapterBridgeClass || !g_httpPostSyncMethod) {
201
+ LOGE("PlatformAdapterBridge class or httpPostSync method not cached");
202
+ return {false, 0, "", "Bridge class/method not cached"};
203
+ }
204
+
205
+ if (!g_httpResponseClass || !g_httpResponse_successField) {
206
+ LOGE("HttpResponse class or fields not cached");
207
+ return {false, 0, "", "HttpResponse class/fields not cached"};
208
+ }
209
+
210
+ LOGI("httpPostSync to: %s", url.c_str());
211
+
212
+ jstring jUrl = env->NewStringUTF(url.c_str());
213
+ jstring jBody = env->NewStringUTF(jsonBody.c_str());
214
+ jstring jKey = supabaseKey.empty() ? nullptr : env->NewStringUTF(supabaseKey.c_str());
215
+
216
+ jobject response = env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_httpPostSyncMethod, jUrl, jBody, jKey);
217
+
218
+ env->DeleteLocalRef(jUrl);
219
+ env->DeleteLocalRef(jBody);
220
+ if (jKey) env->DeleteLocalRef(jKey);
221
+
222
+ if (!response) {
223
+ LOGE("httpPostSync returned null response");
224
+ return {false, 0, "", "httpPostSync returned null"};
225
+ }
226
+
227
+ // Extract fields from HttpResponse using cached field IDs
228
+ bool success = env->GetBooleanField(response, g_httpResponse_successField);
229
+ int statusCode = env->GetIntField(response, g_httpResponse_statusCodeField);
230
+
231
+ std::string responseBody;
232
+ jstring jResponseBody = (jstring)env->GetObjectField(response, g_httpResponse_responseBodyField);
233
+ if (jResponseBody) {
234
+ const char* str = env->GetStringUTFChars(jResponseBody, nullptr);
235
+ if (str) {
236
+ responseBody = str;
237
+ env->ReleaseStringUTFChars(jResponseBody, str);
238
+ }
239
+ env->DeleteLocalRef(jResponseBody);
240
+ }
241
+
242
+ std::string errorMessage;
243
+ jstring jErrorMessage = (jstring)env->GetObjectField(response, g_httpResponse_errorMessageField);
244
+ if (jErrorMessage) {
245
+ const char* str = env->GetStringUTFChars(jErrorMessage, nullptr);
246
+ if (str) {
247
+ errorMessage = str;
248
+ env->ReleaseStringUTFChars(jErrorMessage, str);
249
+ }
250
+ env->DeleteLocalRef(jErrorMessage);
251
+ }
252
+
253
+ env->DeleteLocalRef(response);
254
+
255
+ LOGI("httpPostSync result: success=%d statusCode=%d", success, statusCode);
256
+
257
+ return {success, statusCode, responseBody, errorMessage};
258
+ }
259
+
260
+ // Device info methods - use cached references from JNI_OnLoad
261
+ std::string getDeviceModel() {
262
+ JNIEnv* env = getJNIEnv();
263
+ if (!env) return "Unknown";
264
+
265
+ // Use cached references
266
+ if (!g_platformAdapterBridgeClass || !g_getDeviceModelMethod) {
267
+ LOGE("PlatformAdapterBridge class or getDeviceModel method not cached");
268
+ return "Unknown";
269
+ }
270
+
271
+ jstring result = (jstring)env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_getDeviceModelMethod);
272
+
273
+ if (!result) return "Unknown";
274
+
275
+ const char* str = env->GetStringUTFChars(result, nullptr);
276
+ std::string modelName = str ? str : "Unknown";
277
+ env->ReleaseStringUTFChars(result, str);
278
+ env->DeleteLocalRef(result);
279
+
280
+ LOGD("getDeviceModel (Android): %s", modelName.c_str());
281
+ return modelName;
282
+ }
283
+
284
+ std::string getOSVersion() {
285
+ JNIEnv* env = getJNIEnv();
286
+ if (!env) return "Unknown";
287
+
288
+ // Use cached references
289
+ if (!g_platformAdapterBridgeClass || !g_getOSVersionMethod) {
290
+ LOGE("PlatformAdapterBridge class or getOSVersion method not cached");
291
+ return "Unknown";
292
+ }
293
+
294
+ jstring result = (jstring)env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_getOSVersionMethod);
295
+
296
+ if (!result) return "Unknown";
297
+
298
+ const char* str = env->GetStringUTFChars(result, nullptr);
299
+ std::string version = str ? str : "Unknown";
300
+ env->ReleaseStringUTFChars(result, str);
301
+ env->DeleteLocalRef(result);
302
+
303
+ return version;
304
+ }
305
+
306
+ std::string getChipName() {
307
+ JNIEnv* env = getJNIEnv();
308
+ if (!env) return "Unknown";
309
+
310
+ // Use cached references
311
+ if (!g_platformAdapterBridgeClass || !g_getChipNameMethod) {
312
+ LOGE("PlatformAdapterBridge class or getChipName method not cached");
313
+ return "Unknown";
314
+ }
315
+
316
+ jstring result = (jstring)env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_getChipNameMethod);
317
+
318
+ if (!result) return "Unknown";
319
+
320
+ const char* str = env->GetStringUTFChars(result, nullptr);
321
+ std::string chipName = str ? str : "Unknown";
322
+ env->ReleaseStringUTFChars(result, str);
323
+ env->DeleteLocalRef(result);
324
+
325
+ return chipName;
326
+ }
327
+
328
+ uint64_t getTotalMemory() {
329
+ JNIEnv* env = getJNIEnv();
330
+ if (!env) return 0;
331
+
332
+ // Use cached references
333
+ if (!g_platformAdapterBridgeClass || !g_getTotalMemoryMethod) {
334
+ LOGE("PlatformAdapterBridge class or getTotalMemory method not cached");
335
+ return 0;
336
+ }
337
+
338
+ jlong result = env->CallStaticLongMethod(g_platformAdapterBridgeClass, g_getTotalMemoryMethod);
339
+
340
+ return static_cast<uint64_t>(result);
341
+ }
342
+
343
+ uint64_t getAvailableMemory() {
344
+ JNIEnv* env = getJNIEnv();
345
+ if (!env) return 0;
346
+
347
+ // Use cached references
348
+ if (!g_platformAdapterBridgeClass || !g_getAvailableMemoryMethod) {
349
+ LOGE("PlatformAdapterBridge class or getAvailableMemory method not cached");
350
+ return 0;
351
+ }
352
+
353
+ jlong result = env->CallStaticLongMethod(g_platformAdapterBridgeClass, g_getAvailableMemoryMethod);
354
+
355
+ return static_cast<uint64_t>(result);
356
+ }
357
+
358
+ int getCoreCount() {
359
+ JNIEnv* env = getJNIEnv();
360
+ if (!env) return 1;
361
+
362
+ // Use cached references
363
+ if (!g_platformAdapterBridgeClass || !g_getCoreCountMethod) {
364
+ LOGE("PlatformAdapterBridge class or getCoreCount method not cached");
365
+ return 1;
366
+ }
367
+
368
+ jint result = env->CallStaticIntMethod(g_platformAdapterBridgeClass, g_getCoreCountMethod);
369
+
370
+ return static_cast<int>(result);
371
+ }
372
+
373
+ std::string getArchitecture() {
374
+ JNIEnv* env = getJNIEnv();
375
+ if (!env) return "unknown";
376
+
377
+ // Use cached references
378
+ if (!g_platformAdapterBridgeClass || !g_getArchitectureMethod) {
379
+ LOGE("PlatformAdapterBridge class or getArchitecture method not cached");
380
+ return "unknown";
381
+ }
382
+
383
+ jstring result = (jstring)env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_getArchitectureMethod);
384
+
385
+ if (!result) return "unknown";
386
+
387
+ const char* str = env->GetStringUTFChars(result, nullptr);
388
+ std::string arch = str ? str : "unknown";
389
+ env->ReleaseStringUTFChars(result, str);
390
+ env->DeleteLocalRef(result);
391
+
392
+ return arch;
393
+ }
394
+
395
+ std::string getGPUFamily() {
396
+ JNIEnv* env = getJNIEnv();
397
+ if (!env) return "unknown";
398
+
399
+ // Use cached references
400
+ if (!g_platformAdapterBridgeClass || !g_getGPUFamilyMethod) {
401
+ LOGE("PlatformAdapterBridge class or getGPUFamily method not cached");
402
+ return "unknown";
403
+ }
404
+
405
+ jstring result = (jstring)env->CallStaticObjectMethod(g_platformAdapterBridgeClass, g_getGPUFamilyMethod);
406
+
407
+ if (!result) return "unknown";
408
+
409
+ const char* str = env->GetStringUTFChars(result, nullptr);
410
+ std::string gpuFamily = str ? str : "unknown";
411
+ env->ReleaseStringUTFChars(result, str);
412
+ env->DeleteLocalRef(result);
413
+
414
+ return gpuFamily;
415
+ }
416
+
417
+ bool isTablet() {
418
+ JNIEnv* env = getJNIEnv();
419
+ if (!env) return false;
420
+
421
+ // Use cached references
422
+ if (!g_platformAdapterBridgeClass || !g_isTabletMethod) {
423
+ LOGE("PlatformAdapterBridge class or isTablet method not cached");
424
+ return false;
425
+ }
426
+
427
+ jboolean result = env->CallStaticBooleanMethod(g_platformAdapterBridgeClass, g_isTabletMethod);
428
+ return result == JNI_TRUE;
429
+ }
430
+ } // namespace AndroidBridge
431
+ #elif defined(__APPLE__)
432
+ #include <cstdio>
433
+ // iOS platform bridge for Keychain, HTTP, and Device Info
434
+ extern "C" {
435
+ // Secure storage
436
+ bool PlatformAdapter_secureSet(const char* key, const char* value);
437
+ bool PlatformAdapter_secureGet(const char* key, char** outValue);
438
+ bool PlatformAdapter_secureDelete(const char* key);
439
+ bool PlatformAdapter_secureExists(const char* key);
440
+
441
+ // Device type detection
442
+ bool PlatformAdapter_isTablet(void);
443
+ bool PlatformAdapter_getPersistentDeviceUUID(char** outValue);
444
+
445
+ // Device info (synchronous)
446
+ bool PlatformAdapter_getDeviceModel(char** outValue);
447
+ bool PlatformAdapter_getOSVersion(char** outValue);
448
+ bool PlatformAdapter_getChipName(char** outValue);
449
+ uint64_t PlatformAdapter_getTotalMemory(void);
450
+ uint64_t PlatformAdapter_getAvailableMemory(void);
451
+ int PlatformAdapter_getCoreCount(void);
452
+ bool PlatformAdapter_getArchitecture(char** outValue);
453
+ bool PlatformAdapter_getGPUFamily(char** outValue);
454
+
455
+ // HTTP
456
+ bool PlatformAdapter_httpPostSync(
457
+ const char* url,
458
+ const char* jsonBody,
459
+ const char* supabaseKey,
460
+ int* outStatusCode,
461
+ char** outResponseBody,
462
+ char** outErrorMessage
463
+ );
464
+ }
465
+ #define LOGI(...) printf("[InitBridge] "); printf(__VA_ARGS__); printf("\n")
466
+ #define LOGD(...) printf("[InitBridge DEBUG] "); printf(__VA_ARGS__); printf("\n")
467
+ #define LOGW(...) printf("[InitBridge WARN] "); printf(__VA_ARGS__); printf("\n")
468
+ #define LOGE(...) printf("[InitBridge ERROR] "); printf(__VA_ARGS__); printf("\n")
469
+ #else
470
+ #include <cstdio>
471
+ #define LOGI(...) printf("[InitBridge] "); printf(__VA_ARGS__); printf("\n")
472
+ #define LOGD(...) printf("[InitBridge DEBUG] "); printf(__VA_ARGS__); printf("\n")
473
+ #define LOGW(...) printf("[InitBridge WARN] "); printf(__VA_ARGS__); printf("\n")
474
+ #define LOGE(...) printf("[InitBridge ERROR] "); printf(__VA_ARGS__); printf("\n")
475
+ #endif
476
+
477
+ namespace runanywhere {
478
+ namespace bridges {
479
+
480
+ // =============================================================================
481
+ // Static storage for callbacks (needed for C function pointers)
482
+ // =============================================================================
483
+
484
+ static PlatformCallbacks* g_platformCallbacks = nullptr;
485
+
486
+ // =============================================================================
487
+ // C Callback Implementations (called by RACommons)
488
+ // =============================================================================
489
+
490
+ static rac_bool_t platformFileExistsCallback(const char* path, void* userData) {
491
+ if (!path || !g_platformCallbacks || !g_platformCallbacks->fileExists) {
492
+ return RAC_FALSE;
493
+ }
494
+ return g_platformCallbacks->fileExists(path) ? RAC_TRUE : RAC_FALSE;
495
+ }
496
+
497
+ static rac_result_t platformFileReadCallback(
498
+ const char* path,
499
+ void** outData,
500
+ size_t* outSize,
501
+ void* userData
502
+ ) {
503
+ if (!path || !outData || !outSize) {
504
+ return RAC_ERROR_NULL_POINTER;
505
+ }
506
+
507
+ if (!g_platformCallbacks || !g_platformCallbacks->fileRead) {
508
+ return RAC_ERROR_NOT_SUPPORTED;
509
+ }
510
+
511
+ try {
512
+ std::string content = g_platformCallbacks->fileRead(path);
513
+ if (content.empty()) {
514
+ return RAC_ERROR_FILE_NOT_FOUND;
515
+ }
516
+
517
+ // Allocate buffer and copy data
518
+ char* buffer = static_cast<char*>(malloc(content.size()));
519
+ if (!buffer) {
520
+ return RAC_ERROR_OUT_OF_MEMORY;
521
+ }
522
+
523
+ memcpy(buffer, content.data(), content.size());
524
+ *outData = buffer;
525
+ *outSize = content.size();
526
+
527
+ return RAC_SUCCESS;
528
+ } catch (...) {
529
+ return RAC_ERROR_FILE_NOT_FOUND;
530
+ }
531
+ }
532
+
533
+ static rac_result_t platformFileWriteCallback(
534
+ const char* path,
535
+ const void* data,
536
+ size_t size,
537
+ void* userData
538
+ ) {
539
+ if (!path || !data) {
540
+ return RAC_ERROR_NULL_POINTER;
541
+ }
542
+
543
+ if (!g_platformCallbacks || !g_platformCallbacks->fileWrite) {
544
+ return RAC_ERROR_NOT_SUPPORTED;
545
+ }
546
+
547
+ try {
548
+ std::string content(static_cast<const char*>(data), size);
549
+ bool success = g_platformCallbacks->fileWrite(path, content);
550
+ return success ? RAC_SUCCESS : RAC_ERROR_FILE_WRITE_FAILED;
551
+ } catch (...) {
552
+ return RAC_ERROR_FILE_WRITE_FAILED;
553
+ }
554
+ }
555
+
556
+ static rac_result_t platformFileDeleteCallback(const char* path, void* userData) {
557
+ if (!path) {
558
+ return RAC_ERROR_NULL_POINTER;
559
+ }
560
+
561
+ if (!g_platformCallbacks || !g_platformCallbacks->fileDelete) {
562
+ return RAC_ERROR_NOT_SUPPORTED;
563
+ }
564
+
565
+ try {
566
+ bool success = g_platformCallbacks->fileDelete(path);
567
+ return success ? RAC_SUCCESS : RAC_ERROR_FILE_NOT_FOUND;
568
+ } catch (...) {
569
+ return RAC_ERROR_FILE_NOT_FOUND;
570
+ }
571
+ }
572
+
573
+ static rac_result_t platformSecureGetCallback(
574
+ const char* key,
575
+ char** outValue,
576
+ void* userData
577
+ ) {
578
+ if (!key || !outValue) {
579
+ return RAC_ERROR_NULL_POINTER;
580
+ }
581
+
582
+ if (!g_platformCallbacks || !g_platformCallbacks->secureGet) {
583
+ return RAC_ERROR_NOT_SUPPORTED;
584
+ }
585
+
586
+ try {
587
+ std::string value = g_platformCallbacks->secureGet(key);
588
+ if (value.empty()) {
589
+ return RAC_ERROR_SECURE_STORAGE_FAILED;
590
+ }
591
+
592
+ *outValue = strdup(value.c_str());
593
+ return *outValue ? RAC_SUCCESS : RAC_ERROR_OUT_OF_MEMORY;
594
+ } catch (...) {
595
+ return RAC_ERROR_SECURE_STORAGE_FAILED;
596
+ }
597
+ }
598
+
599
+ static rac_result_t platformSecureSetCallback(
600
+ const char* key,
601
+ const char* value,
602
+ void* userData
603
+ ) {
604
+ if (!key || !value) {
605
+ return RAC_ERROR_NULL_POINTER;
606
+ }
607
+
608
+ if (!g_platformCallbacks || !g_platformCallbacks->secureSet) {
609
+ return RAC_ERROR_NOT_SUPPORTED;
610
+ }
611
+
612
+ try {
613
+ bool success = g_platformCallbacks->secureSet(key, value);
614
+ return success ? RAC_SUCCESS : RAC_ERROR_SECURE_STORAGE_FAILED;
615
+ } catch (...) {
616
+ return RAC_ERROR_SECURE_STORAGE_FAILED;
617
+ }
618
+ }
619
+
620
+ static rac_result_t platformSecureDeleteCallback(const char* key, void* userData) {
621
+ if (!key) {
622
+ return RAC_ERROR_NULL_POINTER;
623
+ }
624
+
625
+ if (!g_platformCallbacks || !g_platformCallbacks->secureDelete) {
626
+ return RAC_ERROR_NOT_SUPPORTED;
627
+ }
628
+
629
+ try {
630
+ bool success = g_platformCallbacks->secureDelete(key);
631
+ return success ? RAC_SUCCESS : RAC_ERROR_SECURE_STORAGE_FAILED;
632
+ } catch (...) {
633
+ return RAC_ERROR_SECURE_STORAGE_FAILED;
634
+ }
635
+ }
636
+
637
+ static void platformLogCallback(
638
+ rac_log_level_t level,
639
+ const char* category,
640
+ const char* message,
641
+ void* userData
642
+ ) {
643
+ if (!message) return;
644
+
645
+ // Always log to Android/iOS native logging
646
+ const char* levelStr = "INFO";
647
+ switch (level) {
648
+ case RAC_LOG_TRACE: levelStr = "TRACE"; break;
649
+ case RAC_LOG_DEBUG: levelStr = "DEBUG"; break;
650
+ case RAC_LOG_INFO: levelStr = "INFO"; break;
651
+ case RAC_LOG_WARNING: levelStr = "WARN"; break;
652
+ case RAC_LOG_ERROR: levelStr = "ERROR"; break;
653
+ case RAC_LOG_FATAL: levelStr = "FATAL"; break;
654
+ }
655
+
656
+ const char* cat = category ? category : "RAC";
657
+
658
+ #if defined(ANDROID) || defined(__ANDROID__)
659
+ int androidLevel = ANDROID_LOG_INFO;
660
+ switch (level) {
661
+ case RAC_LOG_TRACE:
662
+ case RAC_LOG_DEBUG: androidLevel = ANDROID_LOG_DEBUG; break;
663
+ case RAC_LOG_INFO: androidLevel = ANDROID_LOG_INFO; break;
664
+ case RAC_LOG_WARNING: androidLevel = ANDROID_LOG_WARN; break;
665
+ case RAC_LOG_ERROR:
666
+ case RAC_LOG_FATAL: androidLevel = ANDROID_LOG_ERROR; break;
667
+ }
668
+ __android_log_print(androidLevel, cat, "%s", message);
669
+ #else
670
+ printf("[%s] [%s] %s\n", levelStr, cat, message);
671
+ #endif
672
+
673
+ // Also forward to JS callback if available
674
+ if (g_platformCallbacks && g_platformCallbacks->log) {
675
+ g_platformCallbacks->log(static_cast<int>(level), cat, message);
676
+ }
677
+ }
678
+
679
+ static int64_t platformNowMsCallback(void* userData) {
680
+ if (g_platformCallbacks && g_platformCallbacks->nowMs) {
681
+ return g_platformCallbacks->nowMs();
682
+ }
683
+
684
+ // Fallback to system time
685
+ auto now = std::chrono::system_clock::now();
686
+ auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
687
+ now.time_since_epoch()
688
+ ).count();
689
+ return static_cast<int64_t>(ms);
690
+ }
691
+
692
+ static rac_result_t platformGetMemoryInfoCallback(rac_memory_info_t* outInfo, void* userData) {
693
+ // Memory info not easily available in React Native
694
+ // Return not supported - platform can query via JS if needed
695
+ return RAC_ERROR_NOT_SUPPORTED;
696
+ }
697
+
698
+ static void platformTrackErrorCallback(const char* errorJson, void* userData) {
699
+ // Forward error tracking to logging for now
700
+ if (errorJson) {
701
+ LOGE("Track error: %s", errorJson);
702
+ }
703
+ }
704
+
705
+ // =============================================================================
706
+ // InitBridge Implementation
707
+ // =============================================================================
708
+
709
+ InitBridge& InitBridge::shared() {
710
+ static InitBridge instance;
711
+ return instance;
712
+ }
713
+
714
+ InitBridge::~InitBridge() {
715
+ shutdown();
716
+ }
717
+
718
+ void InitBridge::setPlatformCallbacks(const PlatformCallbacks& callbacks) {
719
+ callbacks_ = callbacks;
720
+
721
+ // Store in global for C callbacks
722
+ static PlatformCallbacks storedCallbacks;
723
+ storedCallbacks = callbacks_;
724
+ g_platformCallbacks = &storedCallbacks;
725
+
726
+ LOGI("Platform callbacks registered");
727
+ }
728
+
729
+ void InitBridge::registerPlatformAdapter() {
730
+ if (adapterRegistered_) {
731
+ return;
732
+ }
733
+
734
+ // Reset adapter
735
+ memset(&adapter_, 0, sizeof(adapter_));
736
+
737
+ // File operations
738
+ adapter_.file_exists = platformFileExistsCallback;
739
+ adapter_.file_read = platformFileReadCallback;
740
+ adapter_.file_write = platformFileWriteCallback;
741
+ adapter_.file_delete = platformFileDeleteCallback;
742
+
743
+ // Secure storage
744
+ adapter_.secure_get = platformSecureGetCallback;
745
+ adapter_.secure_set = platformSecureSetCallback;
746
+ adapter_.secure_delete = platformSecureDeleteCallback;
747
+
748
+ // Logging
749
+ adapter_.log = platformLogCallback;
750
+
751
+ // Clock
752
+ adapter_.now_ms = platformNowMsCallback;
753
+
754
+ // Memory info (not implemented)
755
+ adapter_.get_memory_info = platformGetMemoryInfoCallback;
756
+
757
+ // Error tracking
758
+ adapter_.track_error = platformTrackErrorCallback;
759
+
760
+ // HTTP download (handled by JS layer)
761
+ adapter_.http_download = nullptr;
762
+ adapter_.http_download_cancel = nullptr;
763
+
764
+ // Archive extraction (handled by JS layer)
765
+ adapter_.extract_archive = nullptr;
766
+
767
+ adapter_.user_data = nullptr;
768
+
769
+ // Register with RACommons
770
+ rac_result_t result = rac_set_platform_adapter(&adapter_);
771
+ if (result == RAC_SUCCESS) {
772
+ adapterRegistered_ = true;
773
+ LOGI("Platform adapter registered with RACommons");
774
+ } else {
775
+ LOGE("Failed to register platform adapter: %d", result);
776
+ }
777
+ }
778
+
779
+ rac_environment_t InitBridge::toRacEnvironment(SDKEnvironment env) {
780
+ switch (env) {
781
+ case SDKEnvironment::Development:
782
+ return RAC_ENV_DEVELOPMENT;
783
+ case SDKEnvironment::Staging:
784
+ return RAC_ENV_STAGING;
785
+ case SDKEnvironment::Production:
786
+ return RAC_ENV_PRODUCTION;
787
+ default:
788
+ return RAC_ENV_DEVELOPMENT;
789
+ }
790
+ }
791
+
792
+ rac_result_t InitBridge::initialize(
793
+ SDKEnvironment environment,
794
+ const std::string& apiKey,
795
+ const std::string& baseURL,
796
+ const std::string& deviceId
797
+ ) {
798
+ if (initialized_) {
799
+ LOGI("SDK already initialized");
800
+ return RAC_SUCCESS;
801
+ }
802
+
803
+ environment_ = environment;
804
+ apiKey_ = apiKey;
805
+ baseURL_ = baseURL;
806
+ deviceId_ = deviceId;
807
+
808
+ // Step 1: Register platform adapter FIRST
809
+ registerPlatformAdapter();
810
+
811
+ // Step 2: Configure logging based on environment
812
+ rac_environment_t racEnv = toRacEnvironment(environment);
813
+ rac_result_t logResult = rac_configure_logging(racEnv);
814
+ if (logResult != RAC_SUCCESS) {
815
+ LOGE("Failed to configure logging: %d", logResult);
816
+ // Continue anyway - logging is not critical
817
+ }
818
+
819
+ // Step 3: Initialize RACommons using rac_init
820
+ // NOTE: rac_init takes a config struct, not individual parameters
821
+ // The actual auth/state management is done at the platform level
822
+ rac_config_t config = {};
823
+ config.platform_adapter = &adapter_;
824
+ config.log_level = RAC_LOG_INFO;
825
+ config.log_tag = "RunAnywhere";
826
+ config.reserved = nullptr;
827
+
828
+ rac_result_t initResult = rac_init(&config);
829
+
830
+ if (initResult != RAC_SUCCESS) {
831
+ LOGE("Failed to initialize RACommons: %d", initResult);
832
+ return initResult;
833
+ }
834
+
835
+ // Step 4: Initialize SDK config with version (required for device registration)
836
+ // This populates rac_sdk_get_config() which device registration uses
837
+ // Matches Swift: CppBridge+State.swift initialize()
838
+ rac_sdk_config_t sdkConfig = {};
839
+ // Use actual platform (ios/android) as backend only accepts these values
840
+ #if defined(__APPLE__)
841
+ sdkConfig.platform = "ios";
842
+ #elif defined(ANDROID) || defined(__ANDROID__)
843
+ sdkConfig.platform = "android";
844
+ #else
845
+ sdkConfig.platform = "ios"; // Default to ios for unknown platforms
846
+ #endif
847
+ // Use centralized SDK version (set from TypeScript SDKConstants via setSdkVersion)
848
+ static std::string s_sdkVersion;
849
+ s_sdkVersion = getSdkVersion();
850
+ sdkConfig.sdk_version = s_sdkVersion.c_str();
851
+ sdkConfig.device_id = getPersistentDeviceUUID().c_str();
852
+
853
+ rac_validation_result_t validResult = rac_sdk_init(&sdkConfig);
854
+ if (validResult != RAC_VALIDATION_OK) {
855
+ LOGW("SDK config validation warning: %d (non-fatal)", validResult);
856
+ // Non-fatal - device registration can still work without this
857
+ } else {
858
+ LOGI("SDK config initialized with version: %s", sdkConfig.sdk_version);
859
+ }
860
+
861
+ initialized_ = true;
862
+ LOGI("SDK initialized successfully for environment %d", static_cast<int>(environment));
863
+
864
+ return RAC_SUCCESS;
865
+ }
866
+
867
+ rac_result_t InitBridge::setBaseDirectory(const std::string& documentsPath) {
868
+ if (documentsPath.empty()) {
869
+ LOGE("Base directory path is empty");
870
+ return RAC_ERROR_NULL_POINTER;
871
+ }
872
+
873
+ rac_result_t result = rac_model_paths_set_base_dir(documentsPath.c_str());
874
+ if (result == RAC_SUCCESS) {
875
+ LOGI("Model paths base directory set to: %s", documentsPath.c_str());
876
+ } else {
877
+ LOGE("Failed to set model paths base directory: %d", result);
878
+ }
879
+
880
+ return result;
881
+ }
882
+
883
+ void InitBridge::shutdown() {
884
+ if (!initialized_) {
885
+ return;
886
+ }
887
+
888
+ LOGI("Shutting down SDK...");
889
+
890
+ // Shutdown RACommons
891
+ rac_shutdown();
892
+
893
+ // Note: Platform adapter callbacks remain valid (static)
894
+
895
+ initialized_ = false;
896
+ LOGI("SDK shutdown complete");
897
+ }
898
+
899
+ // =============================================================================
900
+ // Secure Storage Methods
901
+ // Matches Swift: KeychainManager
902
+ // =============================================================================
903
+
904
+ bool InitBridge::secureSet(const std::string& key, const std::string& value) {
905
+ #if defined(__APPLE__)
906
+ // Use iOS Keychain bridge directly
907
+ bool success = PlatformAdapter_secureSet(key.c_str(), value.c_str());
908
+ LOGD("secureSet (iOS): key=%s, success=%d", key.c_str(), success);
909
+ return success;
910
+ #elif defined(ANDROID) || defined(__ANDROID__)
911
+ // Use Android JNI bridge
912
+ bool success = AndroidBridge::secureSet(key.c_str(), value.c_str());
913
+ LOGD("secureSet (Android): key=%s, success=%d", key.c_str(), success);
914
+ return success;
915
+ #else
916
+ if (!g_platformCallbacks || !g_platformCallbacks->secureSet) {
917
+ LOGE("secureSet: Platform callback not available");
918
+ return false;
919
+ }
920
+
921
+ try {
922
+ bool success = g_platformCallbacks->secureSet(key, value);
923
+ LOGD("secureSet: key=%s, success=%d", key.c_str(), success);
924
+ return success;
925
+ } catch (...) {
926
+ LOGE("secureSet: Exception for key=%s", key.c_str());
927
+ return false;
928
+ }
929
+ #endif
930
+ }
931
+
932
+ bool InitBridge::secureGet(const std::string& key, std::string& outValue) {
933
+ #if defined(__APPLE__)
934
+ // Use iOS Keychain bridge directly
935
+ char* value = nullptr;
936
+ bool success = PlatformAdapter_secureGet(key.c_str(), &value);
937
+ if (success && value != nullptr) {
938
+ outValue = value;
939
+ free(value);
940
+ LOGD("secureGet (iOS): key=%s found", key.c_str());
941
+ return true;
942
+ }
943
+ LOGD("secureGet (iOS): key=%s not found", key.c_str());
944
+ return false;
945
+ #elif defined(ANDROID) || defined(__ANDROID__)
946
+ // Use Android JNI bridge
947
+ bool success = AndroidBridge::secureGet(key.c_str(), outValue);
948
+ LOGD("secureGet (Android): key=%s, found=%d", key.c_str(), success);
949
+ return success;
950
+ #else
951
+ if (!g_platformCallbacks || !g_platformCallbacks->secureGet) {
952
+ LOGE("secureGet: Platform callback not available");
953
+ return false;
954
+ }
955
+
956
+ try {
957
+ std::string value = g_platformCallbacks->secureGet(key);
958
+ if (value.empty()) {
959
+ LOGD("secureGet: key=%s not found", key.c_str());
960
+ return false;
961
+ }
962
+ outValue = value;
963
+ LOGD("secureGet: key=%s found", key.c_str());
964
+ return true;
965
+ } catch (...) {
966
+ LOGE("secureGet: Exception for key=%s", key.c_str());
967
+ return false;
968
+ }
969
+ #endif
970
+ }
971
+
972
+ bool InitBridge::secureDelete(const std::string& key) {
973
+ #if defined(__APPLE__)
974
+ // Use iOS Keychain bridge directly
975
+ bool success = PlatformAdapter_secureDelete(key.c_str());
976
+ LOGD("secureDelete (iOS): key=%s, success=%d", key.c_str(), success);
977
+ return success;
978
+ #elif defined(ANDROID) || defined(__ANDROID__)
979
+ // Use Android JNI bridge
980
+ bool success = AndroidBridge::secureDelete(key.c_str());
981
+ LOGD("secureDelete (Android): key=%s, success=%d", key.c_str(), success);
982
+ return success;
983
+ #else
984
+ if (!g_platformCallbacks || !g_platformCallbacks->secureDelete) {
985
+ LOGE("secureDelete: Platform callback not available");
986
+ return false;
987
+ }
988
+
989
+ try {
990
+ bool success = g_platformCallbacks->secureDelete(key);
991
+ LOGD("secureDelete: key=%s, success=%d", key.c_str(), success);
992
+ return success;
993
+ } catch (...) {
994
+ LOGE("secureDelete: Exception for key=%s", key.c_str());
995
+ return false;
996
+ }
997
+ #endif
998
+ }
999
+
1000
+ bool InitBridge::secureExists(const std::string& key) {
1001
+ #if defined(__APPLE__)
1002
+ // Use iOS Keychain bridge directly
1003
+ bool exists = PlatformAdapter_secureExists(key.c_str());
1004
+ LOGD("secureExists (iOS): key=%s, exists=%d", key.c_str(), exists);
1005
+ return exists;
1006
+ #elif defined(ANDROID) || defined(__ANDROID__)
1007
+ // Use Android JNI bridge
1008
+ bool exists = AndroidBridge::secureExists(key.c_str());
1009
+ LOGD("secureExists (Android): key=%s, exists=%d", key.c_str(), exists);
1010
+ return exists;
1011
+ #else
1012
+ if (!g_platformCallbacks || !g_platformCallbacks->secureGet) {
1013
+ LOGE("secureExists: Platform callback not available");
1014
+ return false;
1015
+ }
1016
+
1017
+ try {
1018
+ std::string value = g_platformCallbacks->secureGet(key);
1019
+ bool exists = !value.empty();
1020
+ LOGD("secureExists: key=%s, exists=%d", key.c_str(), exists);
1021
+ return exists;
1022
+ } catch (...) {
1023
+ LOGE("secureExists: Exception for key=%s", key.c_str());
1024
+ return false;
1025
+ }
1026
+ #endif
1027
+ }
1028
+
1029
+ std::string InitBridge::getPersistentDeviceUUID() {
1030
+ // Key matches Swift: KeychainManager.KeychainKey.deviceUUID
1031
+ static const char* DEVICE_UUID_KEY = "com.runanywhere.sdk.device.uuid";
1032
+
1033
+ // Thread-safe: cached result (matches Swift pattern)
1034
+ static std::string cachedUUID;
1035
+ static std::mutex uuidMutex;
1036
+
1037
+ {
1038
+ std::lock_guard<std::mutex> lock(uuidMutex);
1039
+ if (!cachedUUID.empty()) {
1040
+ return cachedUUID;
1041
+ }
1042
+ }
1043
+
1044
+ // Strategy 1: Try to load from secure storage (survives reinstalls)
1045
+ std::string storedUUID;
1046
+ if (secureGet(DEVICE_UUID_KEY, storedUUID) && !storedUUID.empty()) {
1047
+ std::lock_guard<std::mutex> lock(uuidMutex);
1048
+ cachedUUID = storedUUID;
1049
+ LOGI("Loaded persistent device UUID from keychain");
1050
+ return cachedUUID;
1051
+ }
1052
+
1053
+ // Strategy 2: Generate new UUID
1054
+ // Generate a UUID4-like string: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
1055
+ auto generateUUID = []() -> std::string {
1056
+ static const char hexChars[] = "0123456789abcdef";
1057
+
1058
+ // Use high-resolution clock and random for seeding
1059
+ auto now = std::chrono::high_resolution_clock::now();
1060
+ auto seed = static_cast<unsigned>(
1061
+ now.time_since_epoch().count() ^
1062
+ reinterpret_cast<uintptr_t>(&now)
1063
+ );
1064
+ srand(seed);
1065
+
1066
+ char uuid[37];
1067
+ for (int i = 0; i < 36; i++) {
1068
+ if (i == 8 || i == 13 || i == 18 || i == 23) {
1069
+ uuid[i] = '-';
1070
+ } else if (i == 14) {
1071
+ uuid[i] = '4'; // UUID version 4
1072
+ } else if (i == 19) {
1073
+ uuid[i] = hexChars[(rand() & 0x03) | 0x08]; // variant bits
1074
+ } else {
1075
+ uuid[i] = hexChars[rand() & 0x0F];
1076
+ }
1077
+ }
1078
+ uuid[36] = '\0';
1079
+ return std::string(uuid);
1080
+ };
1081
+
1082
+ std::string newUUID = generateUUID();
1083
+
1084
+ // Store in secure storage
1085
+ if (secureSet(DEVICE_UUID_KEY, newUUID)) {
1086
+ LOGI("Generated and stored new persistent device UUID");
1087
+ } else {
1088
+ LOGW("Generated device UUID but failed to persist (will regenerate on restart)");
1089
+ }
1090
+
1091
+ {
1092
+ std::lock_guard<std::mutex> lock(uuidMutex);
1093
+ cachedUUID = newUUID;
1094
+ }
1095
+
1096
+ return newUUID;
1097
+ }
1098
+
1099
+ // =============================================================================
1100
+ // Device Info (Synchronous)
1101
+ // For device registration callback which must be synchronous
1102
+ // =============================================================================
1103
+
1104
+ std::string InitBridge::getDeviceModel() {
1105
+ #if defined(__APPLE__)
1106
+ char* value = nullptr;
1107
+ if (PlatformAdapter_getDeviceModel(&value) && value) {
1108
+ std::string result(value);
1109
+ free(value);
1110
+ return result;
1111
+ }
1112
+ return "Unknown";
1113
+ #elif defined(ANDROID) || defined(__ANDROID__)
1114
+ return AndroidBridge::getDeviceModel();
1115
+ #else
1116
+ return "Unknown";
1117
+ #endif
1118
+ }
1119
+
1120
+ std::string InitBridge::getOSVersion() {
1121
+ #if defined(__APPLE__)
1122
+ char* value = nullptr;
1123
+ if (PlatformAdapter_getOSVersion(&value) && value) {
1124
+ std::string result(value);
1125
+ free(value);
1126
+ return result;
1127
+ }
1128
+ return "Unknown";
1129
+ #elif defined(ANDROID) || defined(__ANDROID__)
1130
+ return AndroidBridge::getOSVersion();
1131
+ #else
1132
+ return "Unknown";
1133
+ #endif
1134
+ }
1135
+
1136
+ std::string InitBridge::getChipName() {
1137
+ #if defined(__APPLE__)
1138
+ char* value = nullptr;
1139
+ if (PlatformAdapter_getChipName(&value) && value) {
1140
+ std::string result(value);
1141
+ free(value);
1142
+ return result;
1143
+ }
1144
+ return "Apple Silicon";
1145
+ #elif defined(ANDROID) || defined(__ANDROID__)
1146
+ return AndroidBridge::getChipName();
1147
+ #else
1148
+ return "Unknown";
1149
+ #endif
1150
+ }
1151
+
1152
+ uint64_t InitBridge::getTotalMemory() {
1153
+ #if defined(__APPLE__)
1154
+ return PlatformAdapter_getTotalMemory();
1155
+ #elif defined(ANDROID) || defined(__ANDROID__)
1156
+ return AndroidBridge::getTotalMemory();
1157
+ #else
1158
+ return 0;
1159
+ #endif
1160
+ }
1161
+
1162
+ uint64_t InitBridge::getAvailableMemory() {
1163
+ #if defined(__APPLE__)
1164
+ return PlatformAdapter_getAvailableMemory();
1165
+ #elif defined(ANDROID) || defined(__ANDROID__)
1166
+ return AndroidBridge::getAvailableMemory();
1167
+ #else
1168
+ return 0;
1169
+ #endif
1170
+ }
1171
+
1172
+ int InitBridge::getCoreCount() {
1173
+ #if defined(__APPLE__)
1174
+ return PlatformAdapter_getCoreCount();
1175
+ #elif defined(ANDROID) || defined(__ANDROID__)
1176
+ return AndroidBridge::getCoreCount();
1177
+ #else
1178
+ return 1;
1179
+ #endif
1180
+ }
1181
+
1182
+ std::string InitBridge::getArchitecture() {
1183
+ #if defined(__APPLE__)
1184
+ char* value = nullptr;
1185
+ if (PlatformAdapter_getArchitecture(&value) && value) {
1186
+ std::string result(value);
1187
+ free(value);
1188
+ return result;
1189
+ }
1190
+ return "arm64";
1191
+ #elif defined(ANDROID) || defined(__ANDROID__)
1192
+ return AndroidBridge::getArchitecture();
1193
+ #else
1194
+ return "unknown";
1195
+ #endif
1196
+ }
1197
+
1198
+ std::string InitBridge::getGPUFamily() {
1199
+ #if defined(__APPLE__)
1200
+ char* value = nullptr;
1201
+ if (PlatformAdapter_getGPUFamily(&value) && value) {
1202
+ std::string result(value);
1203
+ free(value);
1204
+ return result;
1205
+ }
1206
+ return "apple"; // Default GPU family for iOS/macOS
1207
+ #elif defined(ANDROID) || defined(__ANDROID__)
1208
+ return AndroidBridge::getGPUFamily();
1209
+ #else
1210
+ return "unknown";
1211
+ #endif
1212
+ }
1213
+
1214
+ bool InitBridge::isTablet() {
1215
+ #if defined(__APPLE__)
1216
+ return PlatformAdapter_isTablet();
1217
+ #elif defined(ANDROID) || defined(__ANDROID__)
1218
+ return AndroidBridge::isTablet();
1219
+ #else
1220
+ return false;
1221
+ #endif
1222
+ }
1223
+
1224
+ // =============================================================================
1225
+ // HTTP POST for Device Registration (Synchronous)
1226
+ // Matches Swift: CppBridge+Device.swift http_post callback
1227
+ // =============================================================================
1228
+
1229
+ std::tuple<bool, int, std::string, std::string> InitBridge::httpPostSync(
1230
+ const std::string& url,
1231
+ const std::string& jsonBody,
1232
+ const std::string& supabaseKey
1233
+ ) {
1234
+ LOGI("httpPostSync to: %s", url.c_str());
1235
+
1236
+ #if defined(ANDROID) || defined(__ANDROID__)
1237
+ // Android: Call JNI to PlatformAdapterBridge.httpPostSync
1238
+ return AndroidBridge::httpPostSync(url, jsonBody, supabaseKey);
1239
+
1240
+ #elif defined(__APPLE__)
1241
+ // iOS: Call PlatformAdapter_httpPostSync via extern C
1242
+ int statusCode = 0;
1243
+ char* responseBody = nullptr;
1244
+ char* errorMessage = nullptr;
1245
+
1246
+ bool success = PlatformAdapter_httpPostSync(
1247
+ url.c_str(),
1248
+ jsonBody.c_str(),
1249
+ supabaseKey.empty() ? nullptr : supabaseKey.c_str(),
1250
+ &statusCode,
1251
+ &responseBody,
1252
+ &errorMessage
1253
+ );
1254
+
1255
+ std::string responseBodyStr = responseBody ? responseBody : "";
1256
+ std::string errorMessageStr = errorMessage ? errorMessage : "";
1257
+
1258
+ // Free allocated strings
1259
+ if (responseBody) free(responseBody);
1260
+ if (errorMessage) free(errorMessage);
1261
+
1262
+ LOGI("httpPostSync result: success=%d statusCode=%d", success, statusCode);
1263
+ return {success, statusCode, responseBodyStr, errorMessageStr};
1264
+
1265
+ #else
1266
+ // Unsupported platform
1267
+ LOGE("httpPostSync: Unsupported platform");
1268
+ return {false, 0, "", "Unsupported platform"};
1269
+ #endif
1270
+ }
1271
+
1272
+ } // namespace bridges
1273
+ } // namespace runanywhere