@elizaos/app-core 2.0.0-beta.3 → 2.0.11-beta.6

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 (1530) hide show
  1. package/agent-bridge.d.ts +27 -0
  2. package/agent-bridge.d.ts.map +1 -0
  3. package/agent-bridge.js +26 -0
  4. package/api/__tests__/sandbox-test-helpers.js +1 -1
  5. package/api/auth/audit.js +1 -1
  6. package/api/auth/auth-context.js +1 -1
  7. package/api/auth/bootstrap-token.js +2 -2
  8. package/api/auth/index.d.ts +9 -10
  9. package/api/auth/index.d.ts.map +1 -1
  10. package/api/auth/index.js +9 -10
  11. package/api/auth/passwords.js +2 -2
  12. package/api/auth/sensitive-rate-limit.d.ts +1 -4
  13. package/api/auth/sensitive-rate-limit.d.ts.map +1 -1
  14. package/api/auth/sensitive-rate-limit.js +6 -6
  15. package/api/auth/sessions.js +2 -2
  16. package/api/auth-bootstrap-routes.d.ts +6 -13
  17. package/api/auth-bootstrap-routes.d.ts.map +1 -1
  18. package/api/auth-bootstrap-routes.js +14 -27
  19. package/api/auth-pairing-routes.d.ts +17 -0
  20. package/api/auth-pairing-routes.d.ts.map +1 -0
  21. package/api/auth-pairing-routes.js +300 -0
  22. package/api/auth-session-routes.d.ts.map +1 -1
  23. package/api/auth-session-routes.js +36 -15
  24. package/api/auth.d.ts +12 -19
  25. package/api/auth.d.ts.map +1 -1
  26. package/api/auth.js +32 -27
  27. package/api/automations-compat-routes.d.ts.map +1 -1
  28. package/api/automations-compat-routes.js +5 -5
  29. package/api/background-tasks-routes.d.ts +4 -0
  30. package/api/background-tasks-routes.d.ts.map +1 -0
  31. package/api/background-tasks-routes.js +63 -0
  32. package/api/catalog-routes.js +3 -3
  33. package/api/cloud-pair-route.d.ts +26 -0
  34. package/api/cloud-pair-route.d.ts.map +1 -0
  35. package/api/cloud-pair-route.js +222 -0
  36. package/api/cloud-voice-routes.d.ts +52 -0
  37. package/api/cloud-voice-routes.d.ts.map +1 -0
  38. package/api/cloud-voice-routes.js +50 -0
  39. package/api/compat-route-shared.d.ts +2 -2
  40. package/api/compat-route-shared.d.ts.map +1 -1
  41. package/api/compat-route-shared.js +11 -7
  42. package/api/credential-resolver.d.ts +2 -2
  43. package/api/credential-resolver.d.ts.map +1 -1
  44. package/api/credential-resolver.js +8 -2
  45. package/api/database-rows-compat-routes.d.ts.map +1 -1
  46. package/api/database-rows-compat-routes.js +69 -31
  47. package/api/dev-boot-history.d.ts +26 -0
  48. package/api/dev-boot-history.d.ts.map +1 -0
  49. package/api/dev-boot-history.js +69 -0
  50. package/api/dev-compat-routes.d.ts +5 -0
  51. package/api/dev-compat-routes.d.ts.map +1 -1
  52. package/api/dev-compat-routes.js +127 -4
  53. package/api/dev-console-log.d.ts +2 -2
  54. package/api/dev-console-log.d.ts.map +1 -1
  55. package/api/dev-console-log.js +8 -5
  56. package/api/dev-route-catalog.d.ts +58 -0
  57. package/api/dev-route-catalog.d.ts.map +1 -0
  58. package/api/dev-route-catalog.js +447 -0
  59. package/api/dev-stack.d.ts.map +1 -1
  60. package/api/dev-stack.js +6 -9
  61. package/api/first-run-routes.d.ts +4 -0
  62. package/api/first-run-routes.d.ts.map +1 -0
  63. package/api/first-run-routes.js +208 -0
  64. package/api/first-run-tts-route.d.ts +19 -0
  65. package/api/first-run-tts-route.d.ts.map +1 -0
  66. package/api/first-run-tts-route.js +59 -0
  67. package/api/internal-routes.d.ts +23 -0
  68. package/api/internal-routes.d.ts.map +1 -0
  69. package/api/internal-routes.js +203 -0
  70. package/api/ios-local-agent-transport.d.ts +36 -0
  71. package/api/ios-local-agent-transport.d.ts.map +1 -0
  72. package/api/ios-local-agent-transport.js +566 -0
  73. package/api/onboarding-voice-lines.d.ts +23 -0
  74. package/api/onboarding-voice-lines.d.ts.map +1 -0
  75. package/api/onboarding-voice-lines.js +8 -0
  76. package/api/perf-instrument.d.ts +43 -0
  77. package/api/perf-instrument.d.ts.map +1 -0
  78. package/api/perf-instrument.js +113 -0
  79. package/api/response.d.ts.map +1 -1
  80. package/api/response.js +14 -14
  81. package/api/runtime-mode-routes.d.ts.map +1 -1
  82. package/api/runtime-mode-routes.js +2 -2
  83. package/api/secrets-inventory-routes.js +2 -2
  84. package/api/secrets-manager-routes.d.ts +1 -1
  85. package/api/secrets-manager-routes.d.ts.map +1 -1
  86. package/api/secrets-manager-routes.js +9 -10
  87. package/api/sensitive-request-routes.js +5 -5
  88. package/api/server-cors.d.ts.map +1 -1
  89. package/api/server-cors.js +13 -2
  90. package/api/server-first-run-helpers.d.ts +26 -0
  91. package/api/server-first-run-helpers.d.ts.map +1 -0
  92. package/api/server-first-run-helpers.js +271 -0
  93. package/api/server-security.js +1 -1
  94. package/api/server-startup.d.ts.map +1 -1
  95. package/api/server-startup.js +3 -4
  96. package/api/server-wallet-trade.js +1 -1
  97. package/api/server.d.ts +4 -4
  98. package/api/server.d.ts.map +1 -1
  99. package/api/server.js +222 -88
  100. package/api/setup-contract.d.ts +63 -0
  101. package/api/setup-contract.d.ts.map +1 -0
  102. package/api/setup-contract.js +39 -0
  103. package/api/training-benchmarks.d.ts +97 -0
  104. package/api/training-benchmarks.d.ts.map +1 -0
  105. package/api/training-benchmarks.js +307 -0
  106. package/api/workbench-compat-routes.js +2 -2
  107. package/benchmark/cerebras-autowire.d.ts +28 -0
  108. package/benchmark/cerebras-autowire.d.ts.map +1 -0
  109. package/benchmark/cerebras-autowire.js +62 -0
  110. package/benchmark/lifeops-bench-handler.d.ts +36 -0
  111. package/benchmark/lifeops-bench-handler.d.ts.map +1 -1
  112. package/benchmark/lifeops-bench-handler.js +63 -1
  113. package/benchmark/lifeops-fake-backend.d.ts +39 -0
  114. package/benchmark/lifeops-fake-backend.d.ts.map +1 -1
  115. package/benchmark/lifeops-fake-backend.js +993 -21
  116. package/benchmark/mock-plugin.d.ts.map +1 -1
  117. package/benchmark/mock-plugin.js +0 -24
  118. package/benchmark/plugin.d.ts +2 -1
  119. package/benchmark/plugin.d.ts.map +1 -1
  120. package/benchmark/plugin.js +989 -68
  121. package/benchmark/replay-capture.d.ts +2 -2
  122. package/benchmark/replay-capture.d.ts.map +1 -1
  123. package/benchmark/replay-capture.js +3 -3
  124. package/benchmark/server-utils.d.ts +162 -9
  125. package/benchmark/server-utils.d.ts.map +1 -1
  126. package/benchmark/server-utils.js +625 -62
  127. package/benchmark/server.d.ts.map +1 -1
  128. package/benchmark/server.js +1962 -118
  129. package/boot-profile.d.ts +3 -0
  130. package/boot-profile.d.ts.map +1 -0
  131. package/boot-profile.js +30 -0
  132. package/browser.d.ts +23 -1
  133. package/browser.d.ts.map +1 -1
  134. package/browser.js +20 -1
  135. package/cli/argv.js +1 -1
  136. package/cli/banner.js +1 -1
  137. package/cli/command-format.js +2 -2
  138. package/cli/doctor/checks.d.ts.map +1 -1
  139. package/cli/doctor/checks.js +6 -6
  140. package/cli/plugins-cli.d.ts.map +1 -1
  141. package/cli/plugins-cli.js +77 -32
  142. package/cli/profile.d.ts.map +1 -1
  143. package/cli/profile.js +5 -4
  144. package/cli/program/build-program.js +4 -4
  145. package/cli/program/command-registry.d.ts.map +1 -1
  146. package/cli/program/command-registry.js +13 -11
  147. package/cli/program/help.js +5 -5
  148. package/cli/program/preaction.js +5 -5
  149. package/cli/program/register.auth.d.ts.map +1 -1
  150. package/cli/program/register.auth.js +6 -12
  151. package/cli/program/register.capability-router.d.ts +29 -0
  152. package/cli/program/register.capability-router.d.ts.map +1 -0
  153. package/cli/program/register.capability-router.js +568 -0
  154. package/cli/program/register.config.js +1 -1
  155. package/cli/program/register.configure.d.ts.map +1 -1
  156. package/cli/program/register.configure.js +1 -1
  157. package/cli/program/register.dashboard.d.ts.map +1 -1
  158. package/cli/program/register.dashboard.js +6 -7
  159. package/cli/program/register.db.d.ts.map +1 -1
  160. package/cli/program/register.db.js +3 -4
  161. package/cli/program/register.doctor.js +7 -7
  162. package/cli/program/register.setup.d.ts.map +1 -1
  163. package/cli/program/register.setup.js +14 -10
  164. package/cli/program/register.start.d.ts.map +1 -1
  165. package/cli/program/register.start.js +5 -3
  166. package/cli/program/register.subclis.js +3 -3
  167. package/cli/program/register.update.d.ts +6 -0
  168. package/cli/program/register.update.d.ts.map +1 -1
  169. package/cli/program/register.update.js +58 -6
  170. package/cli/program.js +1 -1
  171. package/cli/run-main.js +4 -4
  172. package/config/app-config.d.ts +2 -0
  173. package/config/app-config.d.ts.map +1 -0
  174. package/config/app-config.js +1 -0
  175. package/connectors/capacitor-jsc.d.ts.map +1 -1
  176. package/connectors/capacitor-jsc.js +16 -10
  177. package/connectors/capacitor-quickjs.d.ts.map +1 -1
  178. package/connectors/capacitor-quickjs.js +18 -13
  179. package/connectors/capacitor-sqlite.d.ts.map +1 -1
  180. package/connectors/capacitor-sqlite.js +27 -12
  181. package/dispatch/approval-queue.d.ts +37 -0
  182. package/dispatch/approval-queue.d.ts.map +1 -0
  183. package/dispatch/approval-queue.js +25 -0
  184. package/dispatch/channel-registry.d.ts +30 -0
  185. package/dispatch/channel-registry.d.ts.map +1 -0
  186. package/dispatch/channel-registry.js +22 -0
  187. package/dispatch/connector-registry.d.ts +39 -0
  188. package/dispatch/connector-registry.d.ts.map +1 -0
  189. package/dispatch/connector-registry.js +24 -0
  190. package/dispatch/index.d.ts +14 -0
  191. package/dispatch/index.d.ts.map +1 -0
  192. package/dispatch/index.js +13 -0
  193. package/dispatch/send-policy.d.ts +36 -0
  194. package/dispatch/send-policy.d.ts.map +1 -0
  195. package/dispatch/send-policy.js +16 -0
  196. package/entry.js +28 -11
  197. package/first-run/first-run-config.d.ts +55 -0
  198. package/first-run/first-run-config.d.ts.map +1 -0
  199. package/first-run/first-run-config.js +178 -0
  200. package/first-run/runtime-target.d.ts +4 -0
  201. package/first-run/runtime-target.d.ts.map +1 -0
  202. package/first-run/runtime-target.js +13 -0
  203. package/index.d.ts +16 -3
  204. package/index.d.ts.map +1 -1
  205. package/index.js +57 -33
  206. package/package.json +159 -50
  207. package/packaging/debian/apt-repo-config/README.md +18 -0
  208. package/packaging/debian/apt-repo-config/conf/distributions +11 -0
  209. package/packaging/flatpak/README.md +26 -16
  210. package/packaging/flatpak/ai.elizaos.App.metainfo.xml +17 -12
  211. package/packaging/flatpak/ai.elizaos.App.store.yml +5 -5
  212. package/packaging/flatpak/ai.elizaos.App.yml +10 -24
  213. package/packaging/flatpak/elizaos-app-wrapper.store.sh +2 -2
  214. package/packaging/flatpak/generate-sources.sh +74 -0
  215. package/packaging/flatpak/node-sources.json +7930 -0
  216. package/packaging/inno/build-inno.ps1 +34 -9
  217. package/packaging/msix/AppxManifest.store.xml +1 -1
  218. package/packaging/msix/README.md +39 -19
  219. package/packaging/msix/build-msix.ps1 +44 -14
  220. package/packaging/snap/snapcraft.yaml +22 -21
  221. package/packaging/test-packaging.sh +2 -2
  222. package/permissions/types.d.ts +1 -1
  223. package/permissions/types.js +1 -1
  224. package/platform/elizaos-agent-browser-stub.d.ts +144 -0
  225. package/platform/elizaos-agent-browser-stub.d.ts.map +1 -0
  226. package/platform/elizaos-agent-browser-stub.js +158 -0
  227. package/platform/elizaos-plugin-elizacloud-browser-stub.d.ts +34 -0
  228. package/platform/elizaos-plugin-elizacloud-browser-stub.d.ts.map +1 -0
  229. package/platform/elizaos-plugin-elizacloud-browser-stub.js +51 -0
  230. package/platform/empty-node-module.d.ts +148 -0
  231. package/platform/empty-node-module.d.ts.map +1 -1
  232. package/platform/empty-node-module.js +140 -3
  233. package/platform/ios-runtime-backends.d.ts +83 -0
  234. package/platform/ios-runtime-backends.d.ts.map +1 -0
  235. package/platform/ios-runtime-backends.js +133 -0
  236. package/platform/ios-runtime-bridge.d.ts +15 -0
  237. package/platform/ios-runtime-bridge.d.ts.map +1 -0
  238. package/platform/ios-runtime-bridge.js +527 -0
  239. package/platform/native-library-policy.d.ts +23 -0
  240. package/platform/native-library-policy.d.ts.map +1 -0
  241. package/platform/native-library-policy.js +112 -0
  242. package/platform/native-plugin-entrypoints.d.ts +19 -0
  243. package/platform/native-plugin-entrypoints.d.ts.map +1 -0
  244. package/platform/native-plugin-entrypoints.js +29 -0
  245. package/platforms/android/README.md +68 -10
  246. package/platforms/android/app/build.gradle +268 -3
  247. package/platforms/android/app/capacitor.build.gradle +18 -1
  248. package/platforms/android/app/proguard-rules.pro +17 -2
  249. package/platforms/android/app/src/androidTest/java/ai/elizaos/app/ElizaOsInstrumentedTest.java +1 -1
  250. package/platforms/android/app/src/main/AndroidManifest.xml +334 -17
  251. package/platforms/android/app/src/main/assets/runners/eliza-tasks.js +177 -0
  252. package/platforms/android/app/src/main/elizavoice-jni/CMakeLists.txt +100 -0
  253. package/platforms/android/app/src/main/elizavoice-jni/elizavoice-jni.cpp +1349 -0
  254. package/platforms/android/app/src/main/java/ai/elizaos/app/AgentPlugin.java +111 -171
  255. package/platforms/android/app/src/main/java/ai/elizaos/app/AndroidVirtualizationBridge.java +284 -0
  256. package/platforms/android/app/src/main/java/ai/elizaos/app/BatteryOptimizationPlugin.java +95 -0
  257. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAccessibilityService.java +55 -0
  258. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAgentService.java +1198 -141
  259. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAndroidSystemBridge.java +83 -0
  260. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAssistActivity.java +50 -1
  261. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBootReceiver.java +90 -8
  262. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBrowserActivity.java +2 -2
  263. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaCalendarActivity.java +1 -1
  264. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaCameraActivity.java +1 -1
  265. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaClockActivity.java +2 -2
  266. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaContactsActivity.java +1 -1
  267. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaDialActivity.java +1 -1
  268. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaInCallService.java +1 -1
  269. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaMmsReceiver.java +1 -1
  270. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaNativeBridge.java +22 -0
  271. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaNotificationListenerService.java +45 -0
  272. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaQuickActionsWidgetProvider.java +68 -0
  273. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaShareActivity.java +132 -0
  274. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsComposeActivity.java +1 -1
  275. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsGatewayService.java +268 -0
  276. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsReceiver.java +12 -1
  277. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaTasksWorker.java +194 -0
  278. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceCaptureService.java +198 -0
  279. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceNative.java +205 -0
  280. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoicePlugin.java +498 -0
  281. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceTileService.java +39 -0
  282. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaWorkScheduler.java +60 -0
  283. package/platforms/android/app/src/main/java/ai/elizaos/app/GatewayConnectionService.java +53 -19
  284. package/platforms/android/app/src/main/java/ai/elizaos/app/MainActivity.java +160 -33
  285. package/platforms/android/app/src/main/java/ai/elizaos/app/ResourceProbePlugin.java +169 -0
  286. package/platforms/android/app/src/main/java/ai/elizaos/app/VoiceCapturePlugin.java +119 -0
  287. package/platforms/android/app/src/main/res/drawable/eliza_widget_background.xml +10 -0
  288. package/platforms/android/app/src/main/res/drawable/eliza_widget_button_background.xml +13 -0
  289. package/platforms/android/app/src/main/res/drawable/splash.png +0 -0
  290. package/platforms/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
  291. package/platforms/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
  292. package/platforms/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
  293. package/platforms/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
  294. package/platforms/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
  295. package/platforms/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
  296. package/platforms/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
  297. package/platforms/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
  298. package/platforms/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
  299. package/platforms/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
  300. package/platforms/android/app/src/main/res/layout/eliza_quick_actions_widget.xml +86 -0
  301. package/platforms/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +2 -1
  302. package/platforms/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +2 -1
  303. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  304. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
  305. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png +0 -0
  306. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  307. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  308. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
  309. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png +0 -0
  310. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  311. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  312. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
  313. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png +0 -0
  314. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  315. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  316. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
  317. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png +0 -0
  318. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  319. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  320. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
  321. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png +0 -0
  322. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  323. package/platforms/android/app/src/main/res/values/android_app_actions.xml +48 -0
  324. package/platforms/android/app/src/main/res/values/colors.xml +8 -0
  325. package/platforms/android/app/src/main/res/values/ic_launcher_background.xml +2 -2
  326. package/platforms/android/app/src/main/res/values/strings.xml +2 -2
  327. package/platforms/android/app/src/main/res/values/styles.xml +25 -1
  328. package/platforms/android/app/src/main/res/xml/eliza_accessibility_service.xml +9 -0
  329. package/platforms/android/app/src/main/res/xml/eliza_quick_actions_widget.xml +13 -0
  330. package/platforms/android/app/src/main/res/xml/shortcuts.xml +121 -0
  331. package/platforms/android/build.gradle +2 -2
  332. package/platforms/android/capacitor-cordova-android-plugins/build.gradle +9 -3
  333. package/platforms/android/capacitor-cordova-android-plugins/cordova.variables.gradle +6 -2
  334. package/platforms/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml +7 -2
  335. package/platforms/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep +0 -1
  336. package/platforms/android/capacitor.settings.gradle +66 -16
  337. package/platforms/android/gradle.properties +1 -0
  338. package/platforms/android/update-manifest/generate-manifest.mjs +97 -0
  339. package/platforms/android/update-manifest/schema.json +26 -0
  340. package/platforms/apple-store-entitlements.reviewed.json +155 -0
  341. package/platforms/electrobun/.generated/brand-config.json +3 -2
  342. package/platforms/electrobun/LICENSE +21 -0
  343. package/platforms/electrobun/README.md +15 -1
  344. package/platforms/electrobun/assets/appIcon.icns +0 -0
  345. package/platforms/electrobun/assets/appIcon.ico +0 -0
  346. package/platforms/electrobun/assets/appIcon.iconset/icon_128x128.png +0 -0
  347. package/platforms/electrobun/assets/appIcon.iconset/icon_128x128@2x.png +0 -0
  348. package/platforms/electrobun/assets/appIcon.iconset/icon_16x16.png +0 -0
  349. package/platforms/electrobun/assets/appIcon.iconset/icon_16x16@2x.png +0 -0
  350. package/platforms/electrobun/assets/appIcon.iconset/icon_256x256.png +0 -0
  351. package/platforms/electrobun/assets/appIcon.iconset/icon_256x256@2x.png +0 -0
  352. package/platforms/electrobun/assets/appIcon.iconset/icon_32x32.png +0 -0
  353. package/platforms/electrobun/assets/appIcon.iconset/icon_32x32@2x.png +0 -0
  354. package/platforms/electrobun/assets/appIcon.iconset/icon_512x512.png +0 -0
  355. package/platforms/electrobun/assets/brand-config.json +6 -6
  356. package/platforms/electrobun/biome.json +9 -9
  357. package/platforms/electrobun/docs/capability-collapse-matrix.json +318 -0
  358. package/platforms/electrobun/docs/capability-collapse-matrix.md +129 -0
  359. package/platforms/electrobun/docs/capability-routing.md +86 -0
  360. package/platforms/electrobun/docs/convergence-audit.json +3505 -0
  361. package/platforms/electrobun/docs/convergence-audit.md +694 -0
  362. package/platforms/electrobun/docs/database-boot-policy.md +90 -0
  363. package/platforms/electrobun/docs/riscv64-port.md +175 -0
  364. package/platforms/electrobun/docs/startup-first-run-cleanup.md +18 -0
  365. package/platforms/electrobun/docs/trace-first-annotations.md +52 -0
  366. package/platforms/electrobun/docs/ui-boundary-audit.json +580 -0
  367. package/platforms/electrobun/docs/ui-boundary-audit.md +257 -0
  368. package/platforms/electrobun/electrobun.config.ts +592 -364
  369. package/platforms/electrobun/entitlements/JUSTIFICATIONS.md +141 -0
  370. package/platforms/electrobun/entitlements/README.md +34 -6
  371. package/platforms/electrobun/entitlements/mas-bun.entitlements +15 -0
  372. package/platforms/electrobun/entitlements/mas.entitlements +6 -4
  373. package/platforms/electrobun/native/macos/window-effects.mm +1522 -0
  374. package/platforms/electrobun/package.json +18 -12
  375. package/platforms/electrobun/remotes/fs/README.md +70 -0
  376. package/platforms/electrobun/remotes/fs/electrobun.config.ts +38 -0
  377. package/platforms/electrobun/remotes/fs/package.json +12 -0
  378. package/platforms/electrobun/remotes/fs/plugin.json +25 -0
  379. package/platforms/electrobun/remotes/fs/src/bun/errors.ts +57 -0
  380. package/platforms/electrobun/remotes/fs/src/bun/file-limits.ts +50 -0
  381. package/platforms/electrobun/remotes/fs/src/bun/fs-service.ts +389 -0
  382. package/platforms/electrobun/remotes/fs/src/bun/path-guard.ts +270 -0
  383. package/platforms/electrobun/remotes/fs/src/bun/protocol.ts +149 -0
  384. package/platforms/electrobun/remotes/fs/src/bun/worker.ts +174 -0
  385. package/platforms/electrobun/remotes/fs/src/dev/phase5-smoke.ts +171 -0
  386. package/platforms/electrobun/remotes/fs/src/web/index.html +8 -0
  387. package/platforms/electrobun/remotes/git/README.md +75 -0
  388. package/platforms/electrobun/remotes/git/electrobun.config.ts +44 -0
  389. package/platforms/electrobun/remotes/git/package.json +12 -0
  390. package/platforms/electrobun/remotes/git/plugin.json +31 -0
  391. package/platforms/electrobun/remotes/git/src/bun/errors.ts +69 -0
  392. package/platforms/electrobun/remotes/git/src/bun/git-command.ts +156 -0
  393. package/platforms/electrobun/remotes/git/src/bun/git-service.ts +446 -0
  394. package/platforms/electrobun/remotes/git/src/bun/operation-history.ts +124 -0
  395. package/platforms/electrobun/remotes/git/src/bun/protocol.ts +252 -0
  396. package/platforms/electrobun/remotes/git/src/bun/worker.ts +316 -0
  397. package/platforms/electrobun/remotes/git/src/dev/phase7-smoke.ts +141 -0
  398. package/platforms/electrobun/remotes/git/src/web/index.html +8 -0
  399. package/platforms/electrobun/remotes/local-model/README.md +138 -0
  400. package/platforms/electrobun/remotes/local-model/electrobun.config.ts +46 -0
  401. package/platforms/electrobun/remotes/local-model/package.json +12 -0
  402. package/platforms/electrobun/remotes/local-model/plugin.json +33 -0
  403. package/platforms/electrobun/remotes/local-model/src/bun/download-state.ts +115 -0
  404. package/platforms/electrobun/remotes/local-model/src/bun/eliza1-catalog.ts +425 -0
  405. package/platforms/electrobun/remotes/local-model/src/bun/errors.ts +74 -0
  406. package/platforms/electrobun/remotes/local-model/src/bun/hf-eliza1-client.ts +169 -0
  407. package/platforms/electrobun/remotes/local-model/src/bun/local-inference-api-client.ts +245 -0
  408. package/platforms/electrobun/remotes/local-model/src/bun/model-service.ts +490 -0
  409. package/platforms/electrobun/remotes/local-model/src/bun/protocol.ts +301 -0
  410. package/platforms/electrobun/remotes/local-model/src/bun/worker.ts +248 -0
  411. package/platforms/electrobun/remotes/local-model/src/dev/phase8-smoke.ts +117 -0
  412. package/platforms/electrobun/remotes/local-model/src/web/index.html +13 -0
  413. package/platforms/electrobun/remotes/pty/README.md +65 -0
  414. package/platforms/electrobun/remotes/pty/electrobun.config.ts +47 -0
  415. package/platforms/electrobun/remotes/pty/package.json +12 -0
  416. package/platforms/electrobun/remotes/pty/plugin.json +34 -0
  417. package/platforms/electrobun/remotes/pty/src/bun/errors.ts +57 -0
  418. package/platforms/electrobun/remotes/pty/src/bun/output-buffer.ts +127 -0
  419. package/platforms/electrobun/remotes/pty/src/bun/protocol.ts +192 -0
  420. package/platforms/electrobun/remotes/pty/src/bun/pty-service.ts +562 -0
  421. package/platforms/electrobun/remotes/pty/src/bun/worker.ts +218 -0
  422. package/platforms/electrobun/remotes/pty/src/dev/phase6-smoke.ts +127 -0
  423. package/platforms/electrobun/remotes/pty/src/web/index.html +8 -0
  424. package/platforms/electrobun/remotes/runtime/README.md +370 -0
  425. package/platforms/electrobun/remotes/runtime/electrobun.config.ts +48 -0
  426. package/platforms/electrobun/remotes/runtime/package.json +14 -0
  427. package/platforms/electrobun/remotes/runtime/plugin.json +30 -0
  428. package/platforms/electrobun/remotes/runtime/src/bun/api-client.ts +620 -0
  429. package/platforms/electrobun/remotes/runtime/src/bun/errors.ts +45 -0
  430. package/platforms/electrobun/remotes/runtime/src/bun/log-buffer.ts +33 -0
  431. package/platforms/electrobun/remotes/runtime/src/bun/protocol.ts +366 -0
  432. package/platforms/electrobun/remotes/runtime/src/bun/route-discovery.ts +419 -0
  433. package/platforms/electrobun/remotes/runtime/src/bun/runtime-manager.ts +423 -0
  434. package/platforms/electrobun/remotes/runtime/src/bun/sse-parser.ts +99 -0
  435. package/platforms/electrobun/remotes/runtime/src/bun/stream-manager.ts +887 -0
  436. package/platforms/electrobun/remotes/runtime/src/bun/worker.ts +1231 -0
  437. package/platforms/electrobun/remotes/runtime/src/dev/phase1-smoke.ts +34 -0
  438. package/platforms/electrobun/remotes/runtime/src/dev/phase2-smoke.ts +86 -0
  439. package/platforms/electrobun/remotes/runtime/src/dev/phase3-smoke.ts +141 -0
  440. package/platforms/electrobun/remotes/runtime/src/web/index.css +187 -0
  441. package/platforms/electrobun/remotes/runtime/src/web/index.html +76 -0
  442. package/platforms/electrobun/remotes/runtime/src/web/index.ts +192 -0
  443. package/platforms/electrobun/remotes/surface/README.md +201 -0
  444. package/platforms/electrobun/remotes/surface/electrobun.config.ts +38 -0
  445. package/platforms/electrobun/remotes/surface/package.json +12 -0
  446. package/platforms/electrobun/remotes/surface/plugin.json +28 -0
  447. package/platforms/electrobun/remotes/surface/src/bun/worker.ts +132 -0
  448. package/platforms/electrobun/remotes/surface/src/dev/phase4-smoke.ts +566 -0
  449. package/platforms/electrobun/remotes/surface/src/protocol/event-types.ts +84 -0
  450. package/platforms/electrobun/remotes/surface/src/protocol/runtime-client.ts +673 -0
  451. package/platforms/electrobun/remotes/surface/src/web/app.ts +595 -0
  452. package/platforms/electrobun/remotes/surface/src/web/index.css +460 -0
  453. package/platforms/electrobun/remotes/surface/src/web/index.html +466 -0
  454. package/platforms/electrobun/remotes/surface/src/web/index.ts +5 -0
  455. package/platforms/electrobun/remotes/surface/src/web/render.ts +455 -0
  456. package/platforms/electrobun/remotes/surface/src/web/state.ts +427 -0
  457. package/platforms/electrobun/scripts/build-macos-effects.sh +4 -0
  458. package/platforms/electrobun/scripts/ensure-build-folder.ts +28 -0
  459. package/platforms/electrobun/scripts/ensure-whisper-gguf.sh +55 -0
  460. package/platforms/electrobun/scripts/ensure-whisper-model.sh +22 -80
  461. package/platforms/electrobun/scripts/generate-convergence-audit.ts +1203 -0
  462. package/platforms/electrobun/scripts/local-adhoc-sign-macos.ts +159 -159
  463. package/platforms/electrobun/scripts/postwrap-diagnostics.ts +424 -339
  464. package/platforms/electrobun/scripts/postwrap-sign-runtime-macos.ts +302 -271
  465. package/platforms/electrobun/scripts/smoke-test-windows.ps1 +17 -16
  466. package/platforms/electrobun/scripts/smoke-test.sh +5 -7
  467. package/platforms/electrobun/scripts/sync-web-assets.mjs +13 -13
  468. package/platforms/electrobun/scripts/verify-rpc-handlers.ts +109 -110
  469. package/platforms/electrobun/scripts/verify-windows-installer-proof.ps1 +3 -8
  470. package/platforms/electrobun/src/__stubs__/bun-ffi.ts +31 -31
  471. package/platforms/electrobun/src/__stubs__/electrobun-bun.ts +1 -1
  472. package/platforms/electrobun/src/agent-ready-state.ts +8 -8
  473. package/platforms/electrobun/src/agent-reset-from-main.test.ts +162 -0
  474. package/platforms/electrobun/src/agent-reset-from-main.ts +62 -62
  475. package/platforms/electrobun/src/agent-status-rpc.test.ts +95 -0
  476. package/platforms/electrobun/src/agent-status-rpc.ts +156 -0
  477. package/platforms/electrobun/src/api-base.test.ts +247 -0
  478. package/platforms/electrobun/src/api-base.ts +202 -93
  479. package/platforms/electrobun/src/application-menu-action-registry.ts +9 -9
  480. package/platforms/electrobun/src/application-menu.ts +348 -348
  481. package/platforms/electrobun/src/background-notice.ts +36 -36
  482. package/platforms/electrobun/src/boot-progress.test.ts +188 -0
  483. package/platforms/electrobun/src/boot-progress.ts +111 -0
  484. package/platforms/electrobun/src/brand-config.test.ts +39 -0
  485. package/platforms/electrobun/src/brand-config.ts +141 -129
  486. package/platforms/electrobun/src/bridge/browser-tabs-renderer-registry.ts +28 -28
  487. package/platforms/electrobun/src/bridge/electrobun-boot-config.ts +42 -0
  488. package/platforms/electrobun/src/bridge/electrobun-crypto-ready.ts +120 -0
  489. package/platforms/electrobun/src/bridge/electrobun-direct-rpc.ts +342 -357
  490. package/platforms/electrobun/src/bridge/electrobun-stub.ts +13 -13
  491. package/platforms/electrobun/src/browser-workspace-bridge-server.ts +285 -243
  492. package/platforms/electrobun/src/cloud-auth-window.ts +136 -136
  493. package/platforms/electrobun/src/cloud-disconnect-from-main.ts +90 -90
  494. package/platforms/electrobun/src/config-and-auth-rpc.test.ts +256 -0
  495. package/platforms/electrobun/src/config-and-auth-rpc.ts +302 -0
  496. package/platforms/electrobun/src/conversations-and-character-rpc.test.ts +185 -0
  497. package/platforms/electrobun/src/conversations-and-character-rpc.ts +131 -0
  498. package/platforms/electrobun/src/dashboard-rpc.test.ts +200 -0
  499. package/platforms/electrobun/src/dashboard-rpc.ts +344 -0
  500. package/platforms/electrobun/src/database/database-lock.ts +141 -0
  501. package/platforms/electrobun/src/database/database-mode.ts +149 -0
  502. package/platforms/electrobun/src/database/database-recovery.ts +72 -0
  503. package/platforms/electrobun/src/database/database-snapshot.ts +190 -0
  504. package/platforms/electrobun/src/database/database.test.ts +196 -0
  505. package/platforms/electrobun/src/database/index.ts +5 -0
  506. package/platforms/electrobun/src/database/pglite-paths.ts +100 -0
  507. package/platforms/electrobun/src/desktop-deep-link-events.test.ts +30 -0
  508. package/platforms/electrobun/src/desktop-deep-link-events.ts +17 -0
  509. package/platforms/electrobun/src/desktop-http-request.test.ts +73 -73
  510. package/platforms/electrobun/src/desktop-http-request.ts +85 -85
  511. package/platforms/electrobun/src/desktop-pill-config.test.ts +27 -0
  512. package/platforms/electrobun/src/desktop-pill-config.ts +40 -0
  513. package/platforms/electrobun/src/desktop-test-bridge-server.ts +204 -204
  514. package/platforms/electrobun/src/desktop-tray-config.test.ts +87 -0
  515. package/platforms/electrobun/src/desktop-tray-config.ts +84 -0
  516. package/platforms/electrobun/src/devtools-layout.ts +41 -41
  517. package/platforms/electrobun/src/diagnostic-format.test.ts +71 -0
  518. package/platforms/electrobun/src/diagnostic-format.ts +75 -36
  519. package/platforms/electrobun/src/dynamic-view-rpc-schema.test.ts +37 -0
  520. package/platforms/electrobun/src/dynamic-views/README.md +44 -0
  521. package/platforms/electrobun/src/dynamic-views/demo/agent-run-trace.html +135 -0
  522. package/platforms/electrobun/src/dynamic-views/errors.ts +29 -0
  523. package/platforms/electrobun/src/dynamic-views/host.test.ts +353 -0
  524. package/platforms/electrobun/src/dynamic-views/host.ts +332 -0
  525. package/platforms/electrobun/src/dynamic-views/index.ts +57 -0
  526. package/platforms/electrobun/src/dynamic-views/kiosk-canvas.ts +89 -0
  527. package/platforms/electrobun/src/dynamic-views/registry.test.ts +139 -0
  528. package/platforms/electrobun/src/dynamic-views/registry.ts +196 -0
  529. package/platforms/electrobun/src/dynamic-views/session-manager.test.ts +355 -0
  530. package/platforms/electrobun/src/dynamic-views/session-manager.ts +348 -0
  531. package/platforms/electrobun/src/dynamic-views/types.ts +105 -0
  532. package/platforms/electrobun/src/electrobun-boot-config.test.ts +50 -0
  533. package/platforms/electrobun/src/electrobun-config.test.ts +62 -0
  534. package/platforms/electrobun/src/electrobun-crypto-ready.test.ts +65 -0
  535. package/platforms/electrobun/src/electrobun-window-options.ts +25 -0
  536. package/platforms/electrobun/src/extension-rpc.test.ts +88 -0
  537. package/platforms/electrobun/src/extension-rpc.ts +102 -0
  538. package/platforms/electrobun/src/fatal-shutdown.test.ts +10 -10
  539. package/platforms/electrobun/src/fatal-shutdown.ts +1 -1
  540. package/platforms/electrobun/src/first-party-remotes.test.ts +169 -0
  541. package/platforms/electrobun/src/first-party-remotes.ts +297 -0
  542. package/platforms/electrobun/src/first-run-rpc.test.ts +192 -0
  543. package/platforms/electrobun/src/first-run-rpc.ts +146 -0
  544. package/platforms/electrobun/src/floating-chat-window.ts +181 -181
  545. package/platforms/electrobun/src/inbox-rpc.test.ts +123 -0
  546. package/platforms/electrobun/src/inbox-rpc.ts +158 -0
  547. package/platforms/electrobun/src/index.ts +2555 -2096
  548. package/platforms/electrobun/src/kiosk-mode.ts +50 -0
  549. package/platforms/electrobun/src/launch/index.ts +4 -0
  550. package/platforms/electrobun/src/launch/launch-dynamic-view.ts +37 -0
  551. package/platforms/electrobun/src/launch/launch-orchestrator.test.ts +224 -0
  552. package/platforms/electrobun/src/launch/launch-orchestrator.ts +456 -0
  553. package/platforms/electrobun/src/launch/launch-store.test.ts +97 -0
  554. package/platforms/electrobun/src/launch/launch-store.ts +134 -0
  555. package/platforms/electrobun/src/launch/types.ts +103 -0
  556. package/platforms/electrobun/src/launch/views/launch-diagnostics.html +205 -0
  557. package/platforms/electrobun/src/lifecycle/agent-ready-publish.test.ts +50 -0
  558. package/platforms/electrobun/src/lifecycle/agent-ready-publish.ts +27 -0
  559. package/platforms/electrobun/src/lifecycle/api-base-owner.ts +42 -31
  560. package/platforms/electrobun/src/lifecycle/desktop-session-prime.ts +44 -44
  561. package/platforms/electrobun/src/logger.ts +14 -14
  562. package/platforms/electrobun/src/main-window-runtime.ts +83 -83
  563. package/platforms/electrobun/src/main-window-session.test.ts +109 -0
  564. package/platforms/electrobun/src/main-window-session.ts +87 -51
  565. package/platforms/electrobun/src/menu-reset-from-main.ts +158 -158
  566. package/platforms/electrobun/src/native/agent-env.test.ts +52 -0
  567. package/platforms/electrobun/src/native/agent-runtime-layout.test.ts +42 -0
  568. package/platforms/electrobun/src/native/agent-state-dir.test.ts +91 -0
  569. package/platforms/electrobun/src/native/agent.ts +2122 -1682
  570. package/platforms/electrobun/src/native/auth-bridge.test.ts +67 -0
  571. package/platforms/electrobun/src/native/auth-bridge.ts +464 -360
  572. package/platforms/electrobun/src/native/browser-workspace.ts +723 -471
  573. package/platforms/electrobun/src/native/camera.ts +50 -50
  574. package/platforms/electrobun/src/native/canvas.ts +444 -445
  575. package/platforms/electrobun/src/native/credentials.ts +673 -616
  576. package/platforms/electrobun/src/native/desktop-window.test.ts +300 -0
  577. package/platforms/electrobun/src/native/desktop.ts +2196 -2156
  578. package/platforms/electrobun/src/native/editor-bridge.ts +201 -201
  579. package/platforms/electrobun/src/native/file-watcher.ts +154 -154
  580. package/platforms/electrobun/src/native/gateway.ts +179 -180
  581. package/platforms/electrobun/src/native/gpu-window.ts +256 -256
  582. package/platforms/electrobun/src/native/index.ts +76 -74
  583. package/platforms/electrobun/src/native/location.test.ts +44 -0
  584. package/platforms/electrobun/src/native/location.ts +90 -80
  585. package/platforms/electrobun/src/native/loopback-port.ts +60 -60
  586. package/platforms/electrobun/src/native/mac-window-effects.ts +166 -104
  587. package/platforms/electrobun/src/native/music-player.ts +38 -38
  588. package/platforms/electrobun/src/native/permissions-shared.ts +249 -150
  589. package/platforms/electrobun/src/native/permissions.ts +301 -208
  590. package/platforms/electrobun/src/native/power-state.ts +129 -129
  591. package/platforms/electrobun/src/native/remote-plugin-host.test.ts +1394 -0
  592. package/platforms/electrobun/src/native/remote-plugin-host.ts +1531 -0
  593. package/platforms/electrobun/src/native/screencapture.ts +667 -573
  594. package/platforms/electrobun/src/native/steward.ts +207 -204
  595. package/platforms/electrobun/src/native/swabble.ts +68 -324
  596. package/platforms/electrobun/src/native/talkmode.ts +253 -422
  597. package/platforms/electrobun/src/native/webgpu-browser-support.test.ts +18 -0
  598. package/platforms/electrobun/src/native/webgpu-browser-support.ts +165 -147
  599. package/platforms/electrobun/src/native/whisper-env.test.ts +71 -0
  600. package/platforms/electrobun/src/native/whisper-env.ts +68 -0
  601. package/platforms/electrobun/src/native-onboarding.ts +270 -0
  602. package/platforms/electrobun/src/onboarding-overlay-window.ts +141 -0
  603. package/platforms/electrobun/src/persisted-deployment.ts +91 -0
  604. package/platforms/electrobun/src/pill-window.test.ts +91 -0
  605. package/platforms/electrobun/src/pill-window.ts +99 -0
  606. package/platforms/electrobun/src/preload-validation.ts +44 -44
  607. package/platforms/electrobun/src/preload.js +1 -1
  608. package/platforms/electrobun/src/print-electrobun-dev-settings-banner.ts +120 -120
  609. package/platforms/electrobun/src/renderer-api-proxy.test.ts +73 -0
  610. package/platforms/electrobun/src/renderer-api-proxy.ts +86 -0
  611. package/platforms/electrobun/src/renderer-static.test.ts +53 -0
  612. package/platforms/electrobun/src/renderer-static.ts +144 -57
  613. package/platforms/electrobun/src/rpc-handler-slices.ts +121 -0
  614. package/platforms/electrobun/src/rpc-handlers.test.ts +267 -0
  615. package/platforms/electrobun/src/rpc-handlers.ts +1306 -913
  616. package/platforms/electrobun/src/rpc-parse-utils.ts +57 -0
  617. package/platforms/electrobun/src/rpc-port-resolver.test.ts +45 -0
  618. package/platforms/electrobun/src/rpc-port-resolver.ts +31 -0
  619. package/platforms/electrobun/src/rpc-schema.ts +2556 -1619
  620. package/platforms/electrobun/src/runtime-layout.ts +105 -105
  621. package/platforms/electrobun/src/runtime-permissions.ts +95 -95
  622. package/platforms/electrobun/src/runtime-rpc.test.ts +126 -0
  623. package/platforms/electrobun/src/runtime-rpc.ts +237 -0
  624. package/platforms/electrobun/src/screenshot-dev-server.ts +87 -87
  625. package/platforms/electrobun/src/settings-mutations-rpc.test.ts +193 -0
  626. package/platforms/electrobun/src/settings-mutations-rpc.ts +220 -0
  627. package/platforms/electrobun/src/startup-trace.ts +274 -270
  628. package/platforms/electrobun/src/subscription-rpc.test.ts +89 -0
  629. package/platforms/electrobun/src/subscription-rpc.ts +192 -0
  630. package/platforms/electrobun/src/surface-windows.test.ts +355 -0
  631. package/platforms/electrobun/src/surface-windows.ts +410 -410
  632. package/platforms/electrobun/src/trace/README.md +73 -0
  633. package/platforms/electrobun/src/trace/errors.ts +21 -0
  634. package/platforms/electrobun/src/trace/index.ts +40 -0
  635. package/platforms/electrobun/src/trace/trace-dynamic-view.ts +40 -0
  636. package/platforms/electrobun/src/trace/trace-host-requests.ts +473 -0
  637. package/platforms/electrobun/src/trace/trace-service.test.ts +186 -0
  638. package/platforms/electrobun/src/trace/trace-service.ts +324 -0
  639. package/platforms/electrobun/src/trace/trace-store.test.ts +141 -0
  640. package/platforms/electrobun/src/trace/trace-store.ts +551 -0
  641. package/platforms/electrobun/src/trace/types.ts +250 -0
  642. package/platforms/electrobun/src/trace/views/agent-run-trace.html +311 -0
  643. package/platforms/electrobun/src/types/web-speech.d.ts +28 -28
  644. package/platforms/electrobun/src/types.ts +5 -5
  645. package/platforms/electrobun/src/update-availability.test.ts +72 -0
  646. package/platforms/electrobun/src/update-availability.ts +90 -0
  647. package/platforms/electrobun/src/update-rpc.test.ts +83 -0
  648. package/platforms/electrobun/src/update-rpc.ts +123 -0
  649. package/platforms/electrobun/src/voice/README.md +184 -0
  650. package/platforms/electrobun/src/voice/errors.ts +42 -0
  651. package/platforms/electrobun/src/voice/index.ts +78 -0
  652. package/platforms/electrobun/src/voice/types.ts +316 -0
  653. package/platforms/electrobun/src/voice/voice-host-requests.ts +259 -0
  654. package/platforms/electrobun/src/voice/voice-latency-budget.test.ts +66 -0
  655. package/platforms/electrobun/src/voice/voice-latency-budget.ts +243 -0
  656. package/platforms/electrobun/src/voice/voice-live-validation.test.ts +352 -0
  657. package/platforms/electrobun/src/voice/voice-live-validation.ts +838 -0
  658. package/platforms/electrobun/src/voice/voice-pipeline.ts +250 -0
  659. package/platforms/electrobun/src/voice/voice-playback-adapter.ts +31 -0
  660. package/platforms/electrobun/src/voice/voice-runtime-adapter.test.ts +213 -0
  661. package/platforms/electrobun/src/voice/voice-runtime-adapter.ts +686 -0
  662. package/platforms/electrobun/src/voice/voice-service.test.ts +561 -0
  663. package/platforms/electrobun/src/voice/voice-service.ts +1027 -0
  664. package/platforms/electrobun/src/voice/voice-stream-coordinator.test.ts +115 -0
  665. package/platforms/electrobun/src/voice/voice-stream-coordinator.ts +270 -0
  666. package/platforms/electrobun/src/voice/voice-trace.ts +97 -0
  667. package/platforms/electrobun/src/voice/voice-tts-chunker.test.ts +91 -0
  668. package/platforms/electrobun/src/voice/voice-tts-chunker.ts +194 -0
  669. package/platforms/electrobun/src/windows-cef-profile.ts +88 -88
  670. package/platforms/electrobun/tsconfig.json +73 -13
  671. package/platforms/electrobun/update-channels.json +22 -0
  672. package/platforms/electrobun/vitest.electrobun.config.ts +72 -42
  673. package/platforms/ios/App/App/App.entitlements +4 -0
  674. package/platforms/ios/App/App/AppDelegate.swift +80 -18
  675. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ios-marketing-1024.png +0 -0
  676. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20x20@1x.png +0 -0
  677. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20x20@2x.png +0 -0
  678. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29x29@1x.png +0 -0
  679. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29x29@2x.png +0 -0
  680. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40x40@1x.png +0 -0
  681. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40x40@2x.png +0 -0
  682. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76x76@1x.png +0 -0
  683. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76x76@2x.png +0 -0
  684. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-83_5x83_5@2x.png +0 -0
  685. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-20x20@2x.png +0 -0
  686. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-20x20@3x.png +0 -0
  687. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-29x29@2x.png +0 -0
  688. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-29x29@3x.png +0 -0
  689. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-40x40@2x.png +0 -0
  690. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-40x40@3x.png +0 -0
  691. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-60x60@2x.png +0 -0
  692. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-60x60@3x.png +0 -0
  693. package/platforms/ios/App/App/Base.lproj/LaunchScreen.storyboard +1 -4
  694. package/platforms/ios/App/App/ComputerUseBridge.swift +589 -0
  695. package/platforms/ios/App/App/DeviceActivityMonitorExtension/DeviceActivityMonitorExtension.entitlements +12 -0
  696. package/platforms/ios/App/App/DeviceActivityMonitorExtension/DeviceActivityMonitorExtension.swift +34 -0
  697. package/platforms/ios/App/App/DeviceActivityMonitorExtension/Info.plist +29 -0
  698. package/platforms/ios/App/App/DeviceActivityReportExtension/DeviceActivityReportExtension.entitlements +12 -0
  699. package/platforms/ios/App/App/DeviceActivityReportExtension/DeviceActivityReportExtension.swift +53 -0
  700. package/platforms/ios/App/App/DeviceActivityReportExtension/Info.plist +27 -0
  701. package/platforms/ios/App/App/ElizaAppIntents.swift +183 -0
  702. package/platforms/ios/App/App/ElizaIntentPlugin.swift +342 -5
  703. package/platforms/ios/App/App/Info.plist +17 -1
  704. package/platforms/ios/App/App/runners/eliza-tasks.js +177 -0
  705. package/platforms/ios/App/App.xcodeproj/project.pbxproj +262 -6
  706. package/platforms/ios/App/BroadcastExtension/SampleHandler.swift +100 -0
  707. package/platforms/ios/App/Podfile +5 -0
  708. package/platforms/ios/App/Podfile.lock +83 -59
  709. package/register-runtime-hooks.js +11 -5
  710. package/registry/app-registry.d.ts +14 -0
  711. package/registry/app-registry.d.ts.map +1 -0
  712. package/registry/app-registry.js +29 -0
  713. package/registry/entries/apps/app-polymarket.json +31 -0
  714. package/registry/entries/apps/clawville.json +27 -0
  715. package/registry/entries/apps/companion.json +28 -0
  716. package/registry/entries/apps/database-viewer.json +27 -0
  717. package/registry/entries/apps/defense-of-the-agents.json +27 -0
  718. package/registry/entries/apps/documents.json +30 -0
  719. package/registry/entries/apps/feed.json +27 -0
  720. package/registry/entries/apps/hyperliquid.json +31 -0
  721. package/registry/entries/apps/log-viewer.json +27 -0
  722. package/registry/entries/apps/memory-viewer.json +27 -0
  723. package/registry/entries/apps/model-tester.json +31 -0
  724. package/registry/entries/apps/plugin-viewer.json +27 -0
  725. package/registry/entries/apps/relationship-viewer.json +27 -0
  726. package/registry/entries/apps/runtime-debugger.json +27 -0
  727. package/registry/entries/apps/shopify.json +31 -0
  728. package/registry/entries/apps/skills-viewer.json +27 -0
  729. package/registry/entries/apps/steward.json +31 -0
  730. package/registry/entries/apps/training.json +54 -0
  731. package/registry/entries/apps/trajectory-viewer.json +27 -0
  732. package/registry/entries/apps/vincent.json +31 -0
  733. package/registry/entries/connectors/bluebubbles.json +99 -0
  734. package/registry/entries/connectors/bluesky.json +173 -0
  735. package/registry/entries/connectors/discord.json +119 -0
  736. package/registry/entries/connectors/farcaster.json +174 -0
  737. package/registry/entries/connectors/feishu.json +79 -0
  738. package/registry/entries/connectors/google-chat.json +120 -0
  739. package/registry/entries/connectors/google.json +82 -0
  740. package/registry/entries/connectors/imessage.json +96 -0
  741. package/registry/entries/connectors/instagram.json +64 -0
  742. package/registry/entries/connectors/line.json +86 -0
  743. package/registry/entries/connectors/matrix.json +94 -0
  744. package/registry/entries/connectors/mattermost.json +110 -0
  745. package/registry/entries/connectors/msteams.json +104 -0
  746. package/registry/entries/connectors/nextcloud-talk.json +104 -0
  747. package/registry/entries/connectors/nostr.json +70 -0
  748. package/registry/entries/connectors/signal.json +81 -0
  749. package/registry/entries/connectors/slack.json +102 -0
  750. package/registry/entries/connectors/telegram.json +71 -0
  751. package/registry/entries/connectors/tlon.json +94 -0
  752. package/registry/entries/connectors/twitch.json +110 -0
  753. package/registry/entries/connectors/whatsapp.json +113 -0
  754. package/registry/entries/connectors/x.json +231 -0
  755. package/registry/entries/connectors/zalo.json +112 -0
  756. package/registry/entries/connectors/zalouser.json +122 -0
  757. package/registry/entries/plugins/agent-orchestrator.json +33 -0
  758. package/registry/entries/plugins/agent-skills.json +72 -0
  759. package/registry/entries/plugins/anthropic.json +73 -0
  760. package/registry/entries/plugins/app-control.json +23 -0
  761. package/registry/entries/plugins/auto-trader.json +203 -0
  762. package/registry/entries/plugins/background-runner.json +26 -0
  763. package/registry/entries/plugins/blooio.json +102 -0
  764. package/registry/entries/plugins/browser.json +75 -0
  765. package/registry/entries/plugins/cli.json +40 -0
  766. package/registry/entries/plugins/clipboard.json +44 -0
  767. package/registry/entries/plugins/coding-tools.json +71 -0
  768. package/registry/entries/plugins/commands.json +63 -0
  769. package/registry/entries/plugins/computeruse.json +74 -0
  770. package/registry/entries/plugins/copilot-proxy.json +93 -0
  771. package/registry/entries/plugins/directives.json +63 -0
  772. package/registry/entries/plugins/edge-tts.json +97 -0
  773. package/registry/entries/plugins/elevenlabs.json +169 -0
  774. package/registry/entries/plugins/elizacloud.json +208 -0
  775. package/registry/entries/plugins/evm.json +134 -0
  776. package/registry/entries/plugins/experience.json +34 -0
  777. package/registry/entries/plugins/facewear.json +131 -0
  778. package/registry/entries/plugins/form.json +26 -0
  779. package/registry/entries/plugins/github.json +93 -0
  780. package/registry/entries/plugins/gmail-watch.json +25 -0
  781. package/registry/entries/plugins/goals.json +77 -0
  782. package/registry/entries/plugins/google-genai.json +106 -0
  783. package/registry/entries/plugins/groq.json +93 -0
  784. package/registry/entries/plugins/hedera.json +48 -0
  785. package/registry/entries/plugins/inmemorydb.json +25 -0
  786. package/registry/entries/plugins/linear.json +51 -0
  787. package/registry/entries/plugins/local-inference.json +142 -0
  788. package/registry/entries/plugins/local-storage.json +36 -0
  789. package/registry/entries/plugins/localdb.json +25 -0
  790. package/registry/entries/plugins/mcp.json +44 -0
  791. package/registry/entries/plugins/memory.json +124 -0
  792. package/registry/entries/plugins/minecraft.json +79 -0
  793. package/registry/entries/plugins/moltbook.json +83 -0
  794. package/registry/entries/plugins/music.json +155 -0
  795. package/registry/entries/plugins/mysticism.json +48 -0
  796. package/registry/entries/plugins/nearai.json +82 -0
  797. package/registry/entries/plugins/ngrok.json +69 -0
  798. package/registry/entries/plugins/ollama.json +96 -0
  799. package/registry/entries/plugins/openai.json +189 -0
  800. package/registry/entries/plugins/openrouter.json +188 -0
  801. package/registry/entries/plugins/pdf.json +26 -0
  802. package/registry/entries/plugins/plugin-manager.json +23 -0
  803. package/registry/entries/plugins/prose.json +48 -0
  804. package/registry/entries/plugins/rlm.json +26 -0
  805. package/registry/entries/plugins/roblox.json +88 -0
  806. package/registry/entries/plugins/rss.json +64 -0
  807. package/registry/entries/plugins/s3-storage.json +91 -0
  808. package/registry/entries/plugins/scheduling.json +35 -0
  809. package/registry/entries/plugins/shell.json +94 -0
  810. package/registry/entries/plugins/social-alpha.json +72 -0
  811. package/registry/entries/plugins/tailscale.json +81 -0
  812. package/registry/entries/plugins/tee.json +53 -0
  813. package/registry/entries/plugins/todos.json +26 -0
  814. package/registry/entries/plugins/trajectory-logger.json +33 -0
  815. package/registry/entries/plugins/trust.json +39 -0
  816. package/registry/entries/plugins/tts.json +71 -0
  817. package/registry/entries/plugins/tunnel.json +45 -0
  818. package/registry/entries/plugins/twilio.json +168 -0
  819. package/registry/entries/plugins/vercel-ai-gateway.json +128 -0
  820. package/registry/entries/plugins/video.json +23 -0
  821. package/registry/entries/plugins/vision.json +43 -0
  822. package/registry/entries/plugins/webhooks.json +23 -0
  823. package/registry/entries/plugins/workflow.json +25 -0
  824. package/registry/entries/plugins/xai.json +75 -0
  825. package/registry/index.d.ts +2 -1
  826. package/registry/index.d.ts.map +1 -1
  827. package/registry/index.js +46 -12
  828. package/registry/loader.d.ts +2 -1
  829. package/registry/loader.d.ts.map +1 -1
  830. package/registry/loader.js +49 -2
  831. package/registry/schema.d.ts +244 -34
  832. package/registry/schema.d.ts.map +1 -1
  833. package/registry/schema.js +36 -0
  834. package/runtime/android-avf-microdroid-bridge.d.ts +29 -0
  835. package/runtime/android-avf-microdroid-bridge.d.ts.map +1 -0
  836. package/runtime/android-avf-microdroid-bridge.js +149 -0
  837. package/runtime/api-dev-settings-banner.d.ts.map +1 -1
  838. package/runtime/api-dev-settings-banner.js +5 -13
  839. package/runtime/app-core-runtime-hooks.d.ts +21 -0
  840. package/runtime/app-core-runtime-hooks.d.ts.map +1 -0
  841. package/runtime/app-core-runtime-hooks.js +10 -0
  842. package/runtime/autonomy-policy.d.ts +2 -0
  843. package/runtime/autonomy-policy.d.ts.map +1 -0
  844. package/runtime/autonomy-policy.js +4 -0
  845. package/runtime/desktop/AppWindowRenderer.d.ts +17 -0
  846. package/runtime/desktop/AppWindowRenderer.d.ts.map +1 -0
  847. package/runtime/desktop/AppWindowRenderer.js +360 -0
  848. package/runtime/desktop/DesktopSurfaceNavigationRuntime.d.ts +2 -0
  849. package/runtime/desktop/DesktopSurfaceNavigationRuntime.d.ts.map +1 -0
  850. package/runtime/desktop/DesktopSurfaceNavigationRuntime.js +41 -0
  851. package/runtime/desktop/DesktopTrayRuntime.d.ts +2 -0
  852. package/runtime/desktop/DesktopTrayRuntime.d.ts.map +1 -0
  853. package/runtime/desktop/DesktopTrayRuntime.js +174 -0
  854. package/runtime/desktop/DetachedShellRoot.d.ts +10 -0
  855. package/runtime/desktop/DetachedShellRoot.d.ts.map +1 -0
  856. package/runtime/desktop/DetachedShellRoot.js +111 -0
  857. package/runtime/desktop/index.d.ts +6 -0
  858. package/runtime/desktop/index.d.ts.map +1 -0
  859. package/runtime/desktop/index.js +5 -0
  860. package/runtime/desktop/tray-menu.d.ts +20 -0
  861. package/runtime/desktop/tray-menu.d.ts.map +1 -0
  862. package/runtime/desktop/tray-menu.js +143 -0
  863. package/runtime/dev-server.d.ts +1 -1
  864. package/runtime/dev-server.d.ts.map +1 -1
  865. package/runtime/dev-server.js +93 -17
  866. package/runtime/eliza.d.ts +75 -1
  867. package/runtime/eliza.d.ts.map +1 -1
  868. package/runtime/eliza.js +596 -122
  869. package/runtime/ensure-text-to-speech-handler.d.ts.map +1 -1
  870. package/runtime/ensure-text-to-speech-handler.js +10 -3
  871. package/runtime/mobile-safe-runtime.d.ts +181 -2
  872. package/runtime/mobile-safe-runtime.d.ts.map +1 -1
  873. package/runtime/mobile-safe-runtime.js +1019 -12
  874. package/runtime/mode/remote-forwarder.d.ts.map +1 -1
  875. package/runtime/mode/remote-forwarder.js +2 -2
  876. package/runtime/mode/route-mode-guard.d.ts +1 -2
  877. package/runtime/mode/route-mode-guard.d.ts.map +1 -1
  878. package/runtime/mode/route-mode-guard.js +4 -5
  879. package/runtime/mode/route-mode-matrix.d.ts.map +1 -1
  880. package/runtime/mode/route-mode-matrix.js +14 -1
  881. package/runtime/mode/runtime-mode.d.ts +1 -1
  882. package/runtime/mode/runtime-mode.js +1 -1
  883. package/runtime/runtime-bootstrap-policy.d.ts.map +1 -1
  884. package/runtime/runtime-bootstrap-policy.js +14 -2
  885. package/runtime/telegram-standalone-handler.d.ts.map +1 -1
  886. package/runtime/telegram-standalone-handler.js +10 -9
  887. package/runtime/tts-cache-wiring.d.ts +29 -0
  888. package/runtime/tts-cache-wiring.d.ts.map +1 -0
  889. package/runtime/tts-cache-wiring.js +114 -0
  890. package/runtime/voice-warmup.d.ts +81 -0
  891. package/runtime/voice-warmup.d.ts.map +1 -0
  892. package/runtime/voice-warmup.js +111 -0
  893. package/scripts/android-sms-gateway-template.test.mjs +1014 -0
  894. package/scripts/aosp/README.md +19 -15
  895. package/scripts/aosp/compile-libllama.mjs +1344 -248
  896. package/scripts/aosp/compile-shim.mjs +47 -18
  897. package/scripts/aosp/deploy-pixel.mjs +405 -0
  898. package/scripts/aosp/lib/load-variant-config.mjs +3 -3
  899. package/scripts/aosp/llama-cpp-patches/README.md +8 -8
  900. package/scripts/aosp/llama-cpp-patches/apply-patches.mjs +23 -6
  901. package/scripts/aosp/llama-cpp-patches/polarquant/README.md +37 -0
  902. package/scripts/aosp/llama-cpp-patches/qjl/README.md +37 -0
  903. package/scripts/aosp/seccomp-shim/sigsys-handler-arm64.c +169 -0
  904. package/scripts/aosp/seccomp-shim/sigsys-handler-riscv64.c +217 -0
  905. package/scripts/aosp/smoke-cuttlefish.mjs +34 -4
  906. package/scripts/aosp/stage-default-models.mjs +18 -18
  907. package/scripts/aosp/variant-config-schema.ts +2 -2
  908. package/scripts/assert-required-bundled-packages.test.ts +534 -0
  909. package/scripts/audit-apple-store-sandbox.mjs +146 -0
  910. package/scripts/audit-live-test-surface.mjs +5 -2
  911. package/scripts/build-capacitor-app.mjs +21 -0
  912. package/scripts/build-flatpak.mjs +5 -5
  913. package/scripts/build-helpers/arm64-simd.mjs +72 -0
  914. package/scripts/build-helpers/omnivoice-merged.mjs +87 -0
  915. package/scripts/build-helpers/verify-fused-symbols.mjs +567 -0
  916. package/scripts/build-image.sh +1 -1
  917. package/scripts/build-llama-cpp-mtp.mjs +487 -0
  918. package/scripts/build-native-plugins.mjs +230 -18
  919. package/scripts/build-patched-electrobun-cli.mjs +68 -10
  920. package/scripts/build-win.mjs +1 -1
  921. package/scripts/bun-riscv64/Dockerfile +418 -0
  922. package/scripts/bun-riscv64/README.md +316 -0
  923. package/scripts/bun-riscv64/build.sh +469 -0
  924. package/scripts/bun-riscv64/bun-patches/0001-config-add-riscv64-arch.patch +74 -0
  925. package/scripts/bun-riscv64/bun-patches/0002-flags-add-riscv64-march-mabi.patch +16 -0
  926. package/scripts/bun-riscv64/bun-patches/0003-zig-add-riscv64-target-triple-and-cpu.patch +26 -0
  927. package/scripts/bun-riscv64/bun-patches/0004-webkit-force-local-mode-on-riscv64.patch +33 -0
  928. package/scripts/bun-riscv64/bun-patches/0005-tinycc-disable-on-riscv64.patch +16 -0
  929. package/scripts/bun-riscv64/bun-patches/0006-build-add-riscv64-cli-validation.patch +15 -0
  930. package/scripts/bun-riscv64/bun-patches/0007-deps-per-dep-riscv64-checks.patch +24 -0
  931. package/scripts/bun-riscv64/bun-patches/0008-source-stabilize-riscv64-musl-build.patch +226 -0
  932. package/scripts/bun-riscv64/bun-patches/0009-disable-wasm-streaming-hooks-for-c-loop.patch +162 -0
  933. package/scripts/bun-riscv64/bun-patches/0010-disable-inspector-profiler-for-riscv64-c-loop.patch +80 -0
  934. package/scripts/bun-riscv64/bun-patches/0011-process-arch-add-riscv64.patch +23 -0
  935. package/scripts/bun-riscv64/bun-patches/0012-cpu-features-add-riscv64-fallback.patch +13 -0
  936. package/scripts/bun-riscv64/bun-patches/0013-disable-console-inspector-hooks-for-riscv64-c-loop.patch +43 -0
  937. package/scripts/bun-riscv64/bun-patches/0014-disable-custom-inspector-dispatchers-on-riscv64.patch +127 -0
  938. package/scripts/bun-riscv64/bun-patches/0015-disable-jsc-profiler-builtins-on-riscv64.patch +75 -0
  939. package/scripts/bun-riscv64/bun-patches/0016-node-vm-disable-jit-cached-data-on-riscv64-c-loop.patch +96 -0
  940. package/scripts/bun-riscv64/bun-patches/0017-disable-performance-domjit-signature-on-riscv64-c-loop.patch +34 -0
  941. package/scripts/bun-riscv64/bun-patches/0018-fix-serialized-script-identifier-big-endian-path.patch +19 -0
  942. package/scripts/bun-riscv64/bun-patches/0019-add-wtf-timer-fire-bridge-for-c-loop.patch +24 -0
  943. package/scripts/bun-riscv64/bun-patches/0020-run-riscv64-smoke-test-under-qemu.patch +13 -0
  944. package/scripts/bun-riscv64/bun-patches/0021-fix-riscv64-linux-open-flags.patch +25 -0
  945. package/scripts/bun-riscv64/bun-patches/0022-zlib-riscv64-generic-kernels.patch +25 -0
  946. package/scripts/bun-riscv64/bun-patches/README.md +127 -0
  947. package/scripts/bun-riscv64/bun-version.json +202 -0
  948. package/scripts/bun-riscv64/run-build.sh +162 -0
  949. package/scripts/bun-riscv64/rust-core/0001-riscv64-rust-core-port.patch +868 -0
  950. package/scripts/bun-riscv64/rust-core/0002-second-wave-riscv64-source-gaps.patch +130 -0
  951. package/scripts/bun-riscv64/rust-core/0003-third-wave-riscv64-crash-handler-gaps.patch +78 -0
  952. package/scripts/bun-riscv64/rust-core/0004-rust-target-cpu-riscv64.patch +39 -0
  953. package/scripts/bun-riscv64/rust-core/0005-fifth-wave-riscv64-source-gaps.patch +96 -0
  954. package/scripts/bun-riscv64/rust-core/0006-cpp-wasm-and-inspector-guards-riscv64.patch +91 -0
  955. package/scripts/bun-riscv64/rust-core/0007-bun-alloc-max-align-t-riscv64.patch +36 -0
  956. package/scripts/bun-riscv64/rust-core/0008-workspace-lints-warn-not-deny-riscv64.patch +75 -0
  957. package/scripts/bun-riscv64/rust-core/0009-zigglobalobject-wasm-streaming-guards-riscv64.patch +109 -0
  958. package/scripts/bun-riscv64/rust-core/0010-tcc-externs-stub-on-riscv64.patch +62 -0
  959. package/scripts/bun-riscv64/rust-core/0011-clippy-ptr-cast-lints-warn-riscv64.patch +61 -0
  960. package/scripts/bun-riscv64/rust-core/README.md +80 -0
  961. package/scripts/bun-riscv64/rust-core/webkit-patches/0003-disable-dfg-ftl-on-riscv64.patch +60 -0
  962. package/scripts/bun-riscv64/rust-core/webkit-patches/0004-riscv64-do-not-force-wasm-in-c-loop.patch +31 -0
  963. package/scripts/bun-riscv64/rust-core/webkit-patches/0005-domjit-effect-allow-no-dfg-c-loop.patch +40 -0
  964. package/scripts/bun-riscv64/rust-core/webkit-patches/0006-disable-usewasm-when-webassembly-compiled-out.patch +33 -0
  965. package/scripts/bun-riscv64/rust-core/webkit-patches/0007-restore-dropped-includes-and-llint-fwd-decl.patch +31 -0
  966. package/scripts/bun-riscv64/validate.sh +264 -0
  967. package/scripts/bun-riscv64/webkit-patches/0001-cherry-pick-llint-riscv64.recipe +155 -0
  968. package/scripts/bun-riscv64/webkit-patches/0002-cherry-pick-baseline-jit-riscv64.recipe +40 -0
  969. package/scripts/bun-riscv64/webkit-patches/0003-disable-dfg-ftl-on-riscv64.patch +60 -0
  970. package/scripts/bun-riscv64/webkit-patches/0004-riscv64-do-not-force-wasm-in-c-loop.patch +31 -0
  971. package/scripts/bun-riscv64/webkit-patches/0005-domjit-effect-allow-no-dfg-c-loop.patch +40 -0
  972. package/scripts/bun-riscv64/webkit-patches/0006-disable-usewasm-when-webassembly-compiled-out.patch +33 -0
  973. package/scripts/bun-riscv64/webkit-patches/0007-restore-dropped-includes-and-llint-fwd-decl.patch +72 -0
  974. package/scripts/bun-riscv64/webkit-patches/README.md +146 -0
  975. package/scripts/check-homepage-public-readiness.mjs +353 -0
  976. package/scripts/check-homepage-release-data.mjs +110 -0
  977. package/scripts/check-i18n.mjs +2 -1
  978. package/scripts/check-real-local-chat.ts +147 -0
  979. package/scripts/check-real-local-provisioning.ts +104 -0
  980. package/scripts/check-real-local-reset.ts +249 -0
  981. package/scripts/check-sms-gateway-completion-audit.mjs +428 -0
  982. package/scripts/check-sms-gateway-readiness.mjs +266 -0
  983. package/scripts/clean-repo.mjs +5 -5
  984. package/scripts/codesign-mas.mjs +222 -16
  985. package/scripts/collect-docker-runtime-deps.mjs +229 -0
  986. package/scripts/continue-sms-gateway-work.mjs +121 -0
  987. package/scripts/copy-runtime-node-modules.ts +903 -195
  988. package/scripts/deploy-cloud-api-production-gateway.mjs +52 -0
  989. package/scripts/desktop-build.mjs +655 -101
  990. package/scripts/dev-platform.mjs +346 -102
  991. package/scripts/dev-startup-smoke.mjs +248 -0
  992. package/scripts/dev-ui.mjs +418 -176
  993. package/scripts/disable-local-eliza-workspace.mjs +35 -0
  994. package/scripts/docker-ci-smoke.sh +298 -96
  995. package/scripts/docker-entrypoint.sh +62 -1
  996. package/scripts/docker-entrypoint.test.ts +283 -0
  997. package/scripts/ensure-avatars.mjs +2 -2
  998. package/scripts/ensure-electrobun-core.mjs +1 -1
  999. package/scripts/ensure-generated-core-proto-js.mjs +1 -1
  1000. package/scripts/ensure-type-package-aliases.mjs +62 -5
  1001. package/scripts/ensure-vision-deps.mjs +20 -1
  1002. package/scripts/entry.ts +1 -1
  1003. package/scripts/ffi-stub/Makefile +64 -0
  1004. package/scripts/ffi-stub/README.md +391 -0
  1005. package/scripts/ffi-stub/asr-ffi-smoke.ts +139 -0
  1006. package/scripts/ffi-stub/ffi-stub.c +539 -0
  1007. package/scripts/ffi-stub/ffi.h +538 -0
  1008. package/scripts/ffi-stub/libelizainference_stub.so +0 -0
  1009. package/scripts/ffi-stub/tts-stream-ffi-smoke.ts +349 -0
  1010. package/scripts/generate-first-run-voicelines.mjs +194 -0
  1011. package/scripts/generate-plugin-index.js +4 -3
  1012. package/scripts/generate-static-asset-manifest.mjs +1 -1
  1013. package/scripts/i18n-dynamic-keys.json +5 -5
  1014. package/scripts/init-submodules.mjs +2 -2
  1015. package/scripts/install-android-sms-gateway.md +177 -0
  1016. package/scripts/install-android-sms-gateway.mjs +1088 -0
  1017. package/scripts/ios-xcframework/README.md +74 -72
  1018. package/scripts/ios-xcframework/build-xcframework.mjs +204 -43
  1019. package/scripts/ios-xcframework/run-physical-device-smoke.mjs +1943 -0
  1020. package/scripts/ios-xcframework/runtime-symbol-shim.c +450 -0
  1021. package/scripts/kernel-patches/cpu-polar-kernels.mjs +441 -0
  1022. package/scripts/kernel-patches/cpu-simd-kernels.mjs +253 -0
  1023. package/scripts/kernel-patches/cpu-thread-parallelism.mjs +368 -0
  1024. package/scripts/kernel-patches/cuda-kernels.mjs +117 -0
  1025. package/scripts/kernel-patches/metal-kernels.mjs +1698 -109
  1026. package/scripts/kernel-patches/server-omnivoice-route.mjs +718 -0
  1027. package/scripts/kernel-patches/server-structured-output.mjs +279 -0
  1028. package/scripts/kernel-patches/vulkan-dispatch-log.mjs +166 -0
  1029. package/scripts/kernel-patches/vulkan-dispatch-log.test.mjs +50 -0
  1030. package/scripts/kernel-patches/vulkan-dispatch-patches/01-vulkan-shaders-gen.patch +30 -16
  1031. package/scripts/kernel-patches/vulkan-dispatch-patches/02-ggml-vulkan-pipelines.patch +75 -30
  1032. package/scripts/kernel-patches/vulkan-kernels.mjs +800 -49
  1033. package/scripts/lib/agent-source-watcher.mjs +174 -0
  1034. package/scripts/lib/agent-source-watcher.test.mjs +184 -0
  1035. package/scripts/lib/api-supervisor.mjs +78 -9
  1036. package/scripts/lib/api-supervisor.test.mjs +121 -0
  1037. package/scripts/lib/app-dir.mjs +2 -16
  1038. package/scripts/lib/apple-entitlement-audit.mjs +655 -0
  1039. package/scripts/lib/apple-entitlement-audit.test.mjs +144 -0
  1040. package/scripts/lib/bun-version-guard.mjs +13 -13
  1041. package/scripts/lib/capacitor-plugin-build-needed.mjs +4 -3
  1042. package/scripts/lib/capacitor-plugin-names.mjs +30 -14
  1043. package/scripts/lib/desktop-preflight.mjs +9 -5
  1044. package/scripts/lib/desktop-startup-embedding-warmup-policy.mjs +51 -0
  1045. package/scripts/lib/desktop-startup-embedding-warmup-policy.test.mjs +55 -0
  1046. package/scripts/lib/duet-bridge.d.mts +63 -0
  1047. package/scripts/lib/duet-bridge.mjs +193 -0
  1048. package/scripts/lib/node-path-env.mjs +4 -2
  1049. package/scripts/lib/orchestrator-desktop-dev-banner.mjs +12 -3
  1050. package/scripts/lib/patch-bun-exports.mjs +90 -27
  1051. package/scripts/lib/patch-bun-exports.test.mjs +79 -0
  1052. package/scripts/lib/renderer-build-action.mjs +35 -0
  1053. package/scripts/lib/renderer-build-action.test.mjs +70 -0
  1054. package/scripts/lib/stage-android-agent.mjs +748 -99
  1055. package/scripts/lib/sync-eliza-env-aliases.mjs +3 -25
  1056. package/scripts/lib/ui-smoke-stub-decision.mjs +33 -0
  1057. package/scripts/lib/ui-smoke-stub-decision.test.mjs +46 -0
  1058. package/scripts/lib/vite-renderer-dist-stale.mjs +5 -0
  1059. package/scripts/lib/voice-latency-report.mjs +154 -0
  1060. package/scripts/lifeops-prompt-benchmark.ts +21 -12
  1061. package/scripts/link-docker-local-app-packages.mjs +89 -36
  1062. package/scripts/local-stt-bench.ts +192 -0
  1063. package/scripts/maintain-cloud-api-production-gateway.mjs +54 -0
  1064. package/scripts/mas-smoke.mjs +459 -0
  1065. package/scripts/mas-smoke.test.mjs +220 -0
  1066. package/scripts/mobile-auth-simulator-smoke.mjs +0 -1
  1067. package/scripts/normalize-eliza-capture.ts +97 -0
  1068. package/scripts/omnivoice-fuse/prepare.mjs +2543 -23
  1069. package/scripts/pack-upstreams.mjs +65 -5
  1070. package/scripts/package-electrobun-linux.mjs +303 -0
  1071. package/scripts/patch-deps.mjs +5 -3
  1072. package/scripts/patches/llama-mobile-kokoro-tts.patch +480 -0
  1073. package/scripts/playwright-ui-live-stack.ts +194 -49
  1074. package/scripts/playwright-ui-smoke-api-stub.mjs +3501 -109
  1075. package/scripts/pre-review-local.mjs +2 -2
  1076. package/scripts/prepare-ios-cocoapods.sh +41 -3
  1077. package/scripts/release-check.ts +180 -84
  1078. package/scripts/release-workflow-drift.test.ts +57 -0
  1079. package/scripts/relink-workspace-packages-to-dist.mjs +21 -4
  1080. package/scripts/rt.mjs +16 -1
  1081. package/scripts/run-biome-check.mjs +1 -1
  1082. package/scripts/run-coding-agent-e2e.mjs +3 -3
  1083. package/scripts/run-eliza-app-core-script.mjs +34 -0
  1084. package/scripts/run-local-plugin-live-smoke.mjs +71 -2
  1085. package/scripts/run-mobile-build-android-app-actions.test.mjs +426 -0
  1086. package/scripts/run-mobile-build.mjs +4757 -607
  1087. package/scripts/run-node-runtime.mjs +184 -7
  1088. package/scripts/run-node-runtime.test.mjs +167 -0
  1089. package/scripts/run-node-tsx.mjs +80 -33
  1090. package/scripts/run-node.mjs +41 -1
  1091. package/scripts/run-production-build.mjs +34 -27
  1092. package/scripts/run-release-check.mjs +19 -0
  1093. package/scripts/run-release-contract-suite.mjs +107 -14
  1094. package/scripts/run-ui-smoke-playwright-suite.mjs +0 -2
  1095. package/scripts/runtime-package-manifest.ts +21 -3
  1096. package/scripts/setup-upstreams.mjs +42 -1
  1097. package/scripts/sms-gateway-status.mjs +194 -0
  1098. package/scripts/stage-android-agent.test.mjs +97 -0
  1099. package/scripts/stage-elizavoice-lib.mjs +203 -0
  1100. package/scripts/startup-integration-script-drift.test.ts +82 -4
  1101. package/scripts/streaming-pipeline-bench.ts +543 -0
  1102. package/scripts/sync-homepage-porkbun-dns.mjs +262 -0
  1103. package/scripts/test-sms-gateway-software.mjs +100 -0
  1104. package/scripts/type-audit.mjs +1 -1
  1105. package/scripts/validate-bluebubbles-outbound.mjs +293 -0
  1106. package/scripts/validate-cdn-assets.mjs +15 -7
  1107. package/scripts/validate-regression-matrix.mjs +109 -8
  1108. package/scripts/verify-android-sms-gateway-e2e.mjs +362 -0
  1109. package/scripts/verify-bluebubbles-gateway-e2e.mjs +191 -0
  1110. package/scripts/verify-bluebubbles-inbound-readiness.mjs +88 -0
  1111. package/scripts/verify-cloud-api-production-deploy.mjs +87 -0
  1112. package/scripts/verify-cloud-sms-onboarding-flow.mjs +336 -0
  1113. package/scripts/voice/freeze-voice.mjs +521 -0
  1114. package/scripts/voice-attribution-smoke.ts +538 -0
  1115. package/scripts/voice-create-profile.mjs +379 -0
  1116. package/scripts/voice-duet.mjs +1355 -0
  1117. package/scripts/voice-e2e-hardware.ts +871 -0
  1118. package/scripts/voice-interactive.mjs +1750 -0
  1119. package/scripts/voice-latency-report.mjs +96 -0
  1120. package/scripts/voice-latency-report.test.ts +176 -0
  1121. package/scripts/voice-preset/build-default-voice-preset.mjs +249 -0
  1122. package/scripts/voice-preset/build-onboarding-voice.mjs +281 -0
  1123. package/scripts/watch-sms-gateway-readiness.mjs +303 -0
  1124. package/scripts/write-homepage-release-data.mjs +458 -26
  1125. package/security/agent-vault-id.d.ts +1 -1
  1126. package/security/agent-vault-id.js +1 -1
  1127. package/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -1
  1128. package/security/hydrate-wallet-keys-from-platform-store.js +23 -14
  1129. package/security/platform-secure-store-node.d.ts +2 -2
  1130. package/security/platform-secure-store-node.js +3 -3
  1131. package/security/wallet-os-store-actions.d.ts +0 -9
  1132. package/security/wallet-os-store-actions.d.ts.map +1 -1
  1133. package/security/wallet-os-store-actions.js +3 -10
  1134. package/services/account-pool.d.ts +23 -14
  1135. package/services/account-pool.d.ts.map +1 -1
  1136. package/services/account-pool.js +86 -24
  1137. package/services/account-usage.d.ts.map +1 -1
  1138. package/services/account-usage.js +2 -5
  1139. package/services/ambient-audio/consent.d.ts +9 -0
  1140. package/services/ambient-audio/consent.d.ts.map +1 -0
  1141. package/services/ambient-audio/consent.js +28 -0
  1142. package/services/ambient-audio/index.d.ts +7 -0
  1143. package/services/ambient-audio/index.d.ts.map +1 -0
  1144. package/services/ambient-audio/index.js +4 -0
  1145. package/services/ambient-audio/replay-buffer.d.ts +14 -0
  1146. package/services/ambient-audio/replay-buffer.d.ts.map +1 -0
  1147. package/services/ambient-audio/replay-buffer.js +66 -0
  1148. package/services/ambient-audio/response-gate.d.ts +3 -0
  1149. package/services/ambient-audio/response-gate.d.ts.map +1 -0
  1150. package/services/ambient-audio/response-gate.js +33 -0
  1151. package/services/ambient-audio/service.d.ts +22 -0
  1152. package/services/ambient-audio/service.d.ts.map +1 -0
  1153. package/services/ambient-audio/service.js +47 -0
  1154. package/services/ambient-audio/types.d.ts +42 -0
  1155. package/services/ambient-audio/types.d.ts.map +1 -0
  1156. package/services/app-updates/update-policy.d.ts +64 -0
  1157. package/services/app-updates/update-policy.d.ts.map +1 -0
  1158. package/services/app-updates/update-policy.js +228 -0
  1159. package/services/auth-store.d.ts +37 -1
  1160. package/services/auth-store.d.ts.map +1 -1
  1161. package/services/auth-store.js +59 -26
  1162. package/services/cloud-jwks-store.d.ts +3 -3
  1163. package/services/cloud-jwks-store.d.ts.map +1 -1
  1164. package/services/cloud-jwks-store.js +5 -8
  1165. package/services/coding-account-bridge.d.ts +71 -0
  1166. package/services/coding-account-bridge.d.ts.map +1 -0
  1167. package/services/coding-account-bridge.js +267 -0
  1168. package/services/connector-target-catalog.d.ts +10 -3
  1169. package/services/connector-target-catalog.d.ts.map +1 -1
  1170. package/services/connector-target-catalog.js +7 -4
  1171. package/services/credential-tunnel-service.d.ts +66 -0
  1172. package/services/credential-tunnel-service.d.ts.map +1 -0
  1173. package/services/credential-tunnel-service.js +227 -0
  1174. package/services/github-credentials.d.ts +1 -1
  1175. package/services/github-credentials.js +1 -1
  1176. package/services/inference-abort.d.ts +47 -0
  1177. package/services/inference-abort.d.ts.map +1 -0
  1178. package/services/inference-abort.js +76 -0
  1179. package/services/persistence.d.ts +2 -3
  1180. package/services/persistence.d.ts.map +1 -1
  1181. package/services/persistence.js +2 -3
  1182. package/services/phrase-chunked-tts.d.ts +136 -0
  1183. package/services/phrase-chunked-tts.d.ts.map +1 -0
  1184. package/services/phrase-chunked-tts.js +208 -0
  1185. package/services/sandbox-registry.d.ts +78 -0
  1186. package/services/sandbox-registry.d.ts.map +1 -0
  1187. package/services/sandbox-registry.js +323 -0
  1188. package/services/secrets-manager-installer.d.ts +8 -1
  1189. package/services/secrets-manager-installer.d.ts.map +1 -1
  1190. package/services/secrets-manager-installer.js +27 -2
  1191. package/services/sensitive-requests/cloud-link-adapter.d.ts +15 -0
  1192. package/services/sensitive-requests/cloud-link-adapter.d.ts.map +1 -0
  1193. package/services/sensitive-requests/cloud-link-adapter.js +73 -0
  1194. package/services/sensitive-requests/index.d.ts +27 -0
  1195. package/services/sensitive-requests/index.d.ts.map +1 -0
  1196. package/services/sensitive-requests/index.js +51 -0
  1197. package/services/sensitive-requests/instruct-dm-only-adapter.d.ts +14 -0
  1198. package/services/sensitive-requests/instruct-dm-only-adapter.d.ts.map +1 -0
  1199. package/services/sensitive-requests/instruct-dm-only-adapter.js +22 -0
  1200. package/services/sensitive-requests/owner-app-inline-adapter.d.ts +3 -0
  1201. package/services/sensitive-requests/owner-app-inline-adapter.d.ts.map +1 -0
  1202. package/services/sensitive-requests/owner-app-inline-adapter.js +146 -0
  1203. package/services/sensitive-requests/owner-app-oauth-adapter.d.ts +3 -0
  1204. package/services/sensitive-requests/owner-app-oauth-adapter.d.ts.map +1 -0
  1205. package/services/sensitive-requests/owner-app-oauth-adapter.js +156 -0
  1206. package/services/sensitive-requests/public-link-adapter.d.ts +14 -0
  1207. package/services/sensitive-requests/public-link-adapter.d.ts.map +1 -0
  1208. package/services/sensitive-requests/public-link-adapter.js +86 -0
  1209. package/services/sensitive-requests/tunnel-link-adapter.d.ts +17 -0
  1210. package/services/sensitive-requests/tunnel-link-adapter.d.ts.map +1 -0
  1211. package/services/sensitive-requests/tunnel-link-adapter.js +38 -0
  1212. package/services/steward-credentials.d.ts +1 -1
  1213. package/services/steward-credentials.d.ts.map +1 -1
  1214. package/services/steward-credentials.js +10 -6
  1215. package/services/steward-sidecar/health-check.d.ts.map +1 -1
  1216. package/services/steward-sidecar/health-check.js +4 -3
  1217. package/services/steward-sidecar/process-management.d.ts +1 -1
  1218. package/services/steward-sidecar/process-management.d.ts.map +1 -1
  1219. package/services/steward-sidecar/process-management.js +9 -3
  1220. package/services/steward-sidecar/types.d.ts +1 -1
  1221. package/services/steward-sidecar/types.d.ts.map +1 -1
  1222. package/services/steward-sidecar/wallet-setup.d.ts.map +1 -1
  1223. package/services/steward-sidecar/wallet-setup.js +8 -7
  1224. package/services/steward-sidecar.d.ts +2 -2
  1225. package/services/steward-sidecar.d.ts.map +1 -1
  1226. package/services/steward-sidecar.js +27 -19
  1227. package/services/task-host-capabilities.d.ts +60 -0
  1228. package/services/task-host-capabilities.d.ts.map +1 -0
  1229. package/services/task-host-capabilities.js +122 -0
  1230. package/services/tool-call-cache/index.d.ts +2 -2
  1231. package/services/tool-call-cache/index.d.ts.map +1 -1
  1232. package/services/tool-call-cache/index.js +1 -1
  1233. package/services/trigger-event-bridge.js +1 -1
  1234. package/services/tunnel-to-mobile/index.d.ts +2 -0
  1235. package/services/tunnel-to-mobile/index.d.ts.map +1 -0
  1236. package/services/tunnel-to-mobile/index.js +1 -0
  1237. package/services/tunnel-to-mobile/tunnel-to-mobile-client.d.ts +105 -0
  1238. package/services/tunnel-to-mobile/tunnel-to-mobile-client.d.ts.map +1 -0
  1239. package/services/tunnel-to-mobile/tunnel-to-mobile-client.js +190 -0
  1240. package/services/vault-bootstrap.d.ts.map +1 -1
  1241. package/services/vault-bootstrap.js +48 -21
  1242. package/services/vault-mirror.d.ts +1 -1
  1243. package/services/vault-mirror.d.ts.map +1 -1
  1244. package/services/vault-mirror.js +29 -6
  1245. package/services/voice-profiles/diarization-pipeline.d.ts +6 -0
  1246. package/services/voice-profiles/diarization-pipeline.d.ts.map +1 -0
  1247. package/services/voice-profiles/diarization-pipeline.js +20 -0
  1248. package/services/voice-profiles/index.d.ts +12 -0
  1249. package/services/voice-profiles/index.d.ts.map +1 -0
  1250. package/services/voice-profiles/index.js +5 -0
  1251. package/services/voice-profiles/nickname-evaluator.d.ts +14 -0
  1252. package/services/voice-profiles/nickname-evaluator.d.ts.map +1 -0
  1253. package/services/voice-profiles/nickname-evaluator.js +46 -0
  1254. package/services/voice-profiles/owner-confidence.d.ts +10 -0
  1255. package/services/voice-profiles/owner-confidence.d.ts.map +1 -0
  1256. package/services/voice-profiles/owner-confidence.js +38 -0
  1257. package/services/voice-profiles/private-challenge.d.ts +20 -0
  1258. package/services/voice-profiles/private-challenge.d.ts.map +1 -0
  1259. package/services/voice-profiles/private-challenge.js +44 -0
  1260. package/services/voice-profiles/store.d.ts +21 -0
  1261. package/services/voice-profiles/store.d.ts.map +1 -0
  1262. package/services/voice-profiles/store.js +50 -0
  1263. package/services/voice-profiles/types.d.ts +38 -0
  1264. package/services/voice-profiles/types.d.ts.map +1 -0
  1265. package/services/voice-profiles/types.js +1 -0
  1266. package/styles/electrobun-mac-window-drag.css +4 -4
  1267. package/test/helpers/__tests__/live-agent-test.smoke.test.ts +43 -70
  1268. package/test/helpers/browser-mocks.ts +2 -2
  1269. package/test/helpers/conditional-tests.ts +2 -2
  1270. package/test/helpers/i18n.ts +1 -1
  1271. package/test/helpers/live-agent-test.ts +537 -551
  1272. package/test/helpers/live-provider.test.ts +4 -4
  1273. package/test/helpers/live-provider.ts +41 -7
  1274. package/test/helpers/live-runtime-server.ts +4 -4
  1275. package/test/helpers/pglite-runtime.ts +1 -1
  1276. package/test/helpers/real-runtime.ts +54 -15
  1277. package/test/helpers/trajectory-harness.ts +11 -7
  1278. package/test/scripts/start-eliza-live.ts +9 -0
  1279. package/test/scripts/test-parallel.mjs +1 -1
  1280. package/test/scripts/test-root-unit.mjs +6 -7
  1281. package/ui-compat.d.ts +13 -2
  1282. package/ui-compat.d.ts.map +1 -1
  1283. package/ui-compat.js +19 -3
  1284. package/api/auth-pairing-compat-routes.d.ts +0 -17
  1285. package/api/auth-pairing-compat-routes.d.ts.map +0 -1
  1286. package/api/auth-pairing-compat-routes.js +0 -301
  1287. package/api/local-inference-compat-routes.d.ts +0 -16
  1288. package/api/local-inference-compat-routes.d.ts.map +0 -1
  1289. package/api/local-inference-compat-routes.js +0 -617
  1290. package/api/onboarding-compat-routes.d.ts +0 -4
  1291. package/api/onboarding-compat-routes.d.ts.map +0 -1
  1292. package/api/onboarding-compat-routes.js +0 -207
  1293. package/api/plugins-compat-routes.d.ts +0 -103
  1294. package/api/plugins-compat-routes.d.ts.map +0 -1
  1295. package/api/plugins-compat-routes.js +0 -1181
  1296. package/api/server-onboarding-compat.d.ts +0 -31
  1297. package/api/server-onboarding-compat.d.ts.map +0 -1
  1298. package/api/server-onboarding-compat.js +0 -283
  1299. package/benchmark/cua-routes.d.ts +0 -10
  1300. package/benchmark/cua-routes.d.ts.map +0 -1
  1301. package/benchmark/cua-routes.js +0 -179
  1302. package/benchmark/mock-plugin-base.d.ts +0 -9
  1303. package/benchmark/mock-plugin-base.d.ts.map +0 -1
  1304. package/benchmark/mock-plugin-base.js +0 -325
  1305. package/cli/parse-duration.d.ts +0 -5
  1306. package/cli/parse-duration.d.ts.map +0 -1
  1307. package/cli/parse-duration.js +0 -27
  1308. package/patches/llama-cpp-capacitor@0.1.5.patch +0 -2387
  1309. package/platform/agent-browser-stub.d.ts +0 -27
  1310. package/platform/agent-browser-stub.d.ts.map +0 -1
  1311. package/platform/agent-browser-stub.js +0 -16
  1312. package/platforms/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +0 -26
  1313. package/platforms/android/app/src/main/res/drawable/ic_launcher_background.xml +0 -170
  1314. package/platforms/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -34
  1315. package/platforms/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +0 -18
  1316. package/platforms/electrobun/assets/appIcon.iconset/icon_512x512@2x.png +0 -0
  1317. package/platforms/electrobun/assets/appIcon.png +0 -0
  1318. package/platforms/electrobun/scripts/build-whisper-universal.sh +0 -137
  1319. package/platforms/electrobun/scripts/build-whisper.sh +0 -95
  1320. package/platforms/electrobun/src/libMacWindowEffects.dylib +0 -0
  1321. package/platforms/electrobun/src/native/whisper.ts +0 -280
  1322. package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
  1323. package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
  1324. package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
  1325. package/registry/generate-apps.d.ts +0 -2
  1326. package/registry/generate-apps.d.ts.map +0 -1
  1327. package/registry/generate-apps.js +0 -338
  1328. package/registry/generate.d.ts +0 -2
  1329. package/registry/generate.d.ts.map +0 -1
  1330. package/registry/generate.js +0 -506
  1331. package/runtime/embedding-manager-support.d.ts +0 -77
  1332. package/runtime/embedding-manager-support.d.ts.map +0 -1
  1333. package/runtime/embedding-manager-support.js +0 -309
  1334. package/runtime/embedding-presets.d.ts +0 -5
  1335. package/runtime/embedding-presets.d.ts.map +0 -1
  1336. package/runtime/embedding-presets.js +0 -47
  1337. package/runtime/embedding-warmup-policy.d.ts +0 -13
  1338. package/runtime/embedding-warmup-policy.d.ts.map +0 -1
  1339. package/runtime/embedding-warmup-policy.js +0 -33
  1340. package/runtime/ensure-local-inference-handler.d.ts +0 -25
  1341. package/runtime/ensure-local-inference-handler.d.ts.map +0 -1
  1342. package/runtime/ensure-local-inference-handler.js +0 -389
  1343. package/runtime/mobile-local-inference-gate.d.ts +0 -21
  1344. package/runtime/mobile-local-inference-gate.d.ts.map +0 -1
  1345. package/runtime/mobile-local-inference-gate.js +0 -24
  1346. package/scripts/aosp/avd-test.mjs +0 -403
  1347. package/scripts/aosp/boot-validate.mjs +0 -536
  1348. package/scripts/aosp/build-aosp.mjs +0 -448
  1349. package/scripts/aosp/build-bootanimation.mjs +0 -178
  1350. package/scripts/aosp/capture-screens.mjs +0 -325
  1351. package/scripts/aosp/e2e-validate.mjs +0 -225
  1352. package/scripts/aosp/lint-init-rc.mjs +0 -258
  1353. package/scripts/aosp/llama-shim/eliza_llama_shim.c +0 -276
  1354. package/scripts/aosp/sim.mjs +0 -277
  1355. package/scripts/aosp/sync-to-aosp.mjs +0 -134
  1356. package/scripts/aosp/validate.mjs +0 -1273
  1357. package/scripts/build-llama-cpp-dflash.mjs +0 -1866
  1358. package/scripts/generate-onboarding-voicelines.mjs +0 -194
  1359. package/scripts/generated/static-asset-manifest.json +0 -4
  1360. package/scripts/normalize-parallax-capture.ts +0 -97
  1361. package/scripts/omnivoice-fuse/Makefile +0 -44
  1362. package/scripts/omnivoice-fuse/README.md +0 -266
  1363. package/scripts/omnivoice-fuse/cmake-graft.mjs +0 -180
  1364. package/scripts/omnivoice-fuse/ffi-stub.c +0 -222
  1365. package/scripts/omnivoice-fuse/ffi.h +0 -158
  1366. package/scripts/omnivoice-fuse/libelizainference_stub.dylib +0 -0
  1367. package/scripts/omnivoice-fuse/verify-symbols.mjs +0 -138
  1368. package/security/cloud-secret-store.d.ts +0 -34
  1369. package/security/cloud-secret-store.d.ts.map +0 -1
  1370. package/security/cloud-secret-store.js +0 -65
  1371. package/security/export-guard.d.ts +0 -34
  1372. package/security/export-guard.d.ts.map +0 -1
  1373. package/security/export-guard.js +0 -127
  1374. package/services/local-inference/__stress__/cache-stress-helpers.d.ts +0 -76
  1375. package/services/local-inference/__stress__/cache-stress-helpers.d.ts.map +0 -1
  1376. package/services/local-inference/__stress__/cache-stress-helpers.js +0 -238
  1377. package/services/local-inference/active-model.d.ts +0 -180
  1378. package/services/local-inference/active-model.d.ts.map +0 -1
  1379. package/services/local-inference/active-model.js +0 -362
  1380. package/services/local-inference/assignments.d.ts +0 -58
  1381. package/services/local-inference/assignments.d.ts.map +0 -1
  1382. package/services/local-inference/assignments.js +0 -179
  1383. package/services/local-inference/backend.d.ts +0 -200
  1384. package/services/local-inference/backend.d.ts.map +0 -1
  1385. package/services/local-inference/backend.js +0 -242
  1386. package/services/local-inference/bundled-models.d.ts +0 -34
  1387. package/services/local-inference/bundled-models.d.ts.map +0 -1
  1388. package/services/local-inference/bundled-models.js +0 -104
  1389. package/services/local-inference/cache-bridge.d.ts +0 -184
  1390. package/services/local-inference/cache-bridge.d.ts.map +0 -1
  1391. package/services/local-inference/cache-bridge.js +0 -333
  1392. package/services/local-inference/catalog.d.ts +0 -57
  1393. package/services/local-inference/catalog.d.ts.map +0 -1
  1394. package/services/local-inference/catalog.js +0 -262
  1395. package/services/local-inference/conversation-registry.d.ts +0 -122
  1396. package/services/local-inference/conversation-registry.d.ts.map +0 -1
  1397. package/services/local-inference/conversation-registry.js +0 -182
  1398. package/services/local-inference/device-bridge.d.ts +0 -139
  1399. package/services/local-inference/device-bridge.d.ts.map +0 -1
  1400. package/services/local-inference/device-bridge.js +0 -774
  1401. package/services/local-inference/dflash-doctor.d.ts +0 -27
  1402. package/services/local-inference/dflash-doctor.d.ts.map +0 -1
  1403. package/services/local-inference/dflash-doctor.js +0 -149
  1404. package/services/local-inference/dflash-server.d.ts +0 -248
  1405. package/services/local-inference/dflash-server.d.ts.map +0 -1
  1406. package/services/local-inference/dflash-server.js +0 -1076
  1407. package/services/local-inference/downloader.d.ts +0 -48
  1408. package/services/local-inference/downloader.d.ts.map +0 -1
  1409. package/services/local-inference/downloader.js +0 -688
  1410. package/services/local-inference/engine.d.ts +0 -282
  1411. package/services/local-inference/engine.d.ts.map +0 -1
  1412. package/services/local-inference/engine.js +0 -743
  1413. package/services/local-inference/external-scanner.d.ts +0 -17
  1414. package/services/local-inference/external-scanner.d.ts.map +0 -1
  1415. package/services/local-inference/external-scanner.js +0 -261
  1416. package/services/local-inference/handler-registry.d.ts +0 -72
  1417. package/services/local-inference/handler-registry.d.ts.map +0 -1
  1418. package/services/local-inference/handler-registry.js +0 -159
  1419. package/services/local-inference/hardware.d.ts +0 -26
  1420. package/services/local-inference/hardware.d.ts.map +0 -1
  1421. package/services/local-inference/hardware.js +0 -139
  1422. package/services/local-inference/hf-search.d.ts +0 -19
  1423. package/services/local-inference/hf-search.d.ts.map +0 -1
  1424. package/services/local-inference/hf-search.js +0 -169
  1425. package/services/local-inference/index.d.ts +0 -10
  1426. package/services/local-inference/index.d.ts.map +0 -1
  1427. package/services/local-inference/index.js +0 -7
  1428. package/services/local-inference/llama-server-metrics.d.ts +0 -108
  1429. package/services/local-inference/llama-server-metrics.d.ts.map +0 -1
  1430. package/services/local-inference/llama-server-metrics.js +0 -175
  1431. package/services/local-inference/manifest/index.d.ts +0 -4
  1432. package/services/local-inference/manifest/index.d.ts.map +0 -1
  1433. package/services/local-inference/manifest/index.js +0 -5
  1434. package/services/local-inference/manifest/schema.d.ts +0 -419
  1435. package/services/local-inference/manifest/schema.d.ts.map +0 -1
  1436. package/services/local-inference/manifest/schema.js +0 -227
  1437. package/services/local-inference/manifest/types.d.ts +0 -23
  1438. package/services/local-inference/manifest/types.d.ts.map +0 -1
  1439. package/services/local-inference/manifest/types.js +0 -5
  1440. package/services/local-inference/manifest/validator.d.ts +0 -43
  1441. package/services/local-inference/manifest/validator.d.ts.map +0 -1
  1442. package/services/local-inference/manifest/validator.js +0 -187
  1443. package/services/local-inference/paths.d.ts +0 -8
  1444. package/services/local-inference/paths.d.ts.map +0 -1
  1445. package/services/local-inference/paths.js +0 -7
  1446. package/services/local-inference/providers.d.ts +0 -61
  1447. package/services/local-inference/providers.d.ts.map +0 -1
  1448. package/services/local-inference/providers.js +0 -334
  1449. package/services/local-inference/ram-budget.d.ts +0 -57
  1450. package/services/local-inference/ram-budget.d.ts.map +0 -1
  1451. package/services/local-inference/ram-budget.js +0 -107
  1452. package/services/local-inference/readiness.d.ts +0 -9
  1453. package/services/local-inference/readiness.d.ts.map +0 -1
  1454. package/services/local-inference/readiness.js +0 -153
  1455. package/services/local-inference/recommendation.d.ts +0 -62
  1456. package/services/local-inference/recommendation.d.ts.map +0 -1
  1457. package/services/local-inference/recommendation.js +0 -309
  1458. package/services/local-inference/registry.d.ts +0 -35
  1459. package/services/local-inference/registry.d.ts.map +0 -1
  1460. package/services/local-inference/registry.js +0 -117
  1461. package/services/local-inference/router-handler.d.ts +0 -51
  1462. package/services/local-inference/router-handler.d.ts.map +0 -1
  1463. package/services/local-inference/router-handler.js +0 -165
  1464. package/services/local-inference/routing-policy.d.ts +0 -55
  1465. package/services/local-inference/routing-policy.d.ts.map +0 -1
  1466. package/services/local-inference/routing-policy.js +0 -195
  1467. package/services/local-inference/routing-preferences.d.ts +0 -8
  1468. package/services/local-inference/routing-preferences.d.ts.map +0 -1
  1469. package/services/local-inference/routing-preferences.js +0 -7
  1470. package/services/local-inference/service.d.ts +0 -88
  1471. package/services/local-inference/service.d.ts.map +0 -1
  1472. package/services/local-inference/service.js +0 -210
  1473. package/services/local-inference/session-pool.d.ts +0 -72
  1474. package/services/local-inference/session-pool.d.ts.map +0 -1
  1475. package/services/local-inference/session-pool.js +0 -125
  1476. package/services/local-inference/types.d.ts +0 -309
  1477. package/services/local-inference/types.d.ts.map +0 -1
  1478. package/services/local-inference/types.js +0 -23
  1479. package/services/local-inference/verify.d.ts +0 -8
  1480. package/services/local-inference/verify.d.ts.map +0 -1
  1481. package/services/local-inference/verify.js +0 -7
  1482. package/services/local-inference/voice/barge-in.d.ts +0 -15
  1483. package/services/local-inference/voice/barge-in.d.ts.map +0 -1
  1484. package/services/local-inference/voice/barge-in.js +0 -20
  1485. package/services/local-inference/voice/engine-bridge.d.ts +0 -256
  1486. package/services/local-inference/voice/engine-bridge.d.ts.map +0 -1
  1487. package/services/local-inference/voice/engine-bridge.js +0 -398
  1488. package/services/local-inference/voice/ffi-bindings.d.ts +0 -114
  1489. package/services/local-inference/voice/ffi-bindings.d.ts.map +0 -1
  1490. package/services/local-inference/voice/ffi-bindings.js +0 -281
  1491. package/services/local-inference/voice/index.d.ts +0 -51
  1492. package/services/local-inference/voice/index.d.ts.map +0 -1
  1493. package/services/local-inference/voice/index.js +0 -50
  1494. package/services/local-inference/voice/lifecycle.d.ts +0 -135
  1495. package/services/local-inference/voice/lifecycle.d.ts.map +0 -1
  1496. package/services/local-inference/voice/lifecycle.js +0 -189
  1497. package/services/local-inference/voice/phoneme-tokenizer.d.ts +0 -58
  1498. package/services/local-inference/voice/phoneme-tokenizer.d.ts.map +0 -1
  1499. package/services/local-inference/voice/phoneme-tokenizer.js +0 -53
  1500. package/services/local-inference/voice/phrase-cache.d.ts +0 -24
  1501. package/services/local-inference/voice/phrase-cache.d.ts.map +0 -1
  1502. package/services/local-inference/voice/phrase-cache.js +0 -32
  1503. package/services/local-inference/voice/phrase-chunker.d.ts +0 -20
  1504. package/services/local-inference/voice/phrase-chunker.d.ts.map +0 -1
  1505. package/services/local-inference/voice/phrase-chunker.js +0 -85
  1506. package/services/local-inference/voice/ring-buffer.d.ts +0 -40
  1507. package/services/local-inference/voice/ring-buffer.d.ts.map +0 -1
  1508. package/services/local-inference/voice/ring-buffer.js +0 -85
  1509. package/services/local-inference/voice/rollback-queue.d.ts +0 -24
  1510. package/services/local-inference/voice/rollback-queue.d.ts.map +0 -1
  1511. package/services/local-inference/voice/rollback-queue.js +0 -49
  1512. package/services/local-inference/voice/scheduler.d.ts +0 -47
  1513. package/services/local-inference/voice/scheduler.d.ts.map +0 -1
  1514. package/services/local-inference/voice/scheduler.js +0 -123
  1515. package/services/local-inference/voice/shared-resources.d.ts +0 -119
  1516. package/services/local-inference/voice/shared-resources.d.ts.map +0 -1
  1517. package/services/local-inference/voice/shared-resources.js +0 -83
  1518. package/services/local-inference/voice/speaker-preset-cache.d.ts +0 -28
  1519. package/services/local-inference/voice/speaker-preset-cache.d.ts.map +0 -1
  1520. package/services/local-inference/voice/speaker-preset-cache.js +0 -44
  1521. package/services/local-inference/voice/types.d.ts +0 -80
  1522. package/services/local-inference/voice/types.d.ts.map +0 -1
  1523. package/services/local-inference/voice/voice-preset-format.d.ts +0 -56
  1524. package/services/local-inference/voice/voice-preset-format.d.ts.map +0 -1
  1525. package/services/local-inference/voice/voice-preset-format.js +0 -184
  1526. package/services/plugin-installer.d.ts +0 -22
  1527. package/services/plugin-installer.d.ts.map +0 -1
  1528. package/services/plugin-installer.js +0 -41
  1529. package/test/scripts/task-agent-live-smoke.ts +0 -1335
  1530. /package/services/{local-inference/voice → ambient-audio}/types.js +0 -0
@@ -0,0 +1,1349 @@
1
+ // elizavoice-jni.cpp
2
+ //
3
+ // JNI bridge for the fused, NDK/bionic-built `libelizainference.so` (the
4
+ // omnivoice `elizainference` target — all four voice runtimes fused at ABI
5
+ // v7) running INSIDE the normal Android APK process (ai.elizaos.app,
6
+ // Capacitor/bionic), NOT the separate musl bun agent.
7
+ //
8
+ // Phase 3a proved the load + a single VAD op. Phase 3b wires the WHOLE
9
+ // mic→attributed-turn pipeline through this host:
10
+ //
11
+ // - Context lifecycle: contextCreate / contextDestroy.
12
+ // - The four fused classifier ops, each wrapping the matching
13
+ // `eliza_inference_*` symbols:
14
+ // VAD open / processBatch / reset / close
15
+ // wakeword open / scoreBatch / reset / close
16
+ // speaker open / embed / close
17
+ // diariz open / segment / close
18
+ // - A native streaming PIPELINE (pipelineOpen / pipelineProcess /
19
+ // pipelineFlush / pipelineReset / pipelineClose) that runs the VAD
20
+ // hot-loop + turn segmentation NATIVELY (no per-512-window JS↔native
21
+ // bridge call): JS hands it an audio-frame batch, it streams the PCM
22
+ // through VAD, applies the onset/offset/pause/end-hangover state machine
23
+ // (ported from VadDetector in vad.ts), buffers the turn PCM, and on
24
+ // speech-end runs speaker-embed + diariz natively and returns a
25
+ // TURN-LEVEL JSON result (speaker 256-float embedding + diariz int8
26
+ // labels) to JS. JS then applies the ambient gate + builds the
27
+ // voiceTurnSignal.
28
+ //
29
+ // PCM marshalling: Java `float[]` (16 kHz mono fp32 in [-1, 1]) in via
30
+ // GetFloatArrayElements (JNI_ABORT release — read-only, no copy-back).
31
+ // Outputs: the 256-float speaker embedding and the per-frame diariz int8
32
+ // labels are returned as Java arrays; turn metadata is returned as a JSON
33
+ // string the JS side parses.
34
+ //
35
+ // All sessions are reference-counted by an opaque jlong handle (the native
36
+ // pointer). Idempotent close. Errors surface as a thrown RuntimeException
37
+ // (so the Capacitor plugin rejects the call) — no swallow, no defaulted
38
+ // result (AGENTS.md §3, §9).
39
+
40
+ #include <jni.h>
41
+ #include <android/log.h>
42
+ #include <algorithm>
43
+ #include <cmath>
44
+ #include <cstdint>
45
+ #include <cstdlib>
46
+ #include <cstring>
47
+ #include <memory>
48
+ #include <string>
49
+ #include <vector>
50
+
51
+ #include "eliza-inference-ffi.h"
52
+
53
+ #define LOG_TAG "ElizaVoiceJni"
54
+ #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
55
+ #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
56
+
57
+ namespace {
58
+
59
+ // Sample-rate / window constants (must mirror the JS contract).
60
+ constexpr int kSampleRate = 16000;
61
+ constexpr size_t kVadWindow = 512; // Silero v5 window @ 16 kHz
62
+ constexpr size_t kWakeFrame = 1280; // openWakeWord 80 ms frame @ 16 kHz
63
+ constexpr size_t kSpeakerEmbeddingDim = 256;
64
+ constexpr size_t kDiarizWindow = 80000; // pyannote 5 s window @ 16 kHz
65
+ constexpr size_t kDiarizLabelCap = 2048;
66
+
67
+ jstring to_jstring(JNIEnv* env, const std::string& s) {
68
+ return env->NewStringUTF(s.c_str());
69
+ }
70
+
71
+ std::string from_jstring(JNIEnv* env, jstring js) {
72
+ if (js == nullptr) return std::string();
73
+ const char* chars = env->GetStringUTFChars(js, nullptr);
74
+ std::string out(chars ? chars : "");
75
+ if (chars) env->ReleaseStringUTFChars(js, chars);
76
+ return out;
77
+ }
78
+
79
+ // Throw a java.lang.RuntimeException; the Capacitor plugin maps that to a
80
+ // rejected call. Frees the heap-allocated C diagnostic when present.
81
+ void throw_runtime(JNIEnv* env, const std::string& stage, char* outError) {
82
+ std::string msg = "[elizavoice-jni] " + stage;
83
+ if (outError) {
84
+ msg += ": ";
85
+ msg += outError;
86
+ std::free(outError);
87
+ }
88
+ LOGE("%s", msg.c_str());
89
+ jclass cls = env->FindClass("java/lang/RuntimeException");
90
+ if (cls) env->ThrowNew(cls, msg.c_str());
91
+ }
92
+
93
+ // Copy a Java float[] into a std::vector<float> (read-only view, no copy-back).
94
+ std::vector<float> read_float_array(JNIEnv* env, jfloatArray arr) {
95
+ if (arr == nullptr) return {};
96
+ const jsize n = env->GetArrayLength(arr);
97
+ std::vector<float> out(static_cast<size_t>(n));
98
+ if (n > 0) {
99
+ env->GetFloatArrayRegion(arr, 0, n, out.data());
100
+ }
101
+ return out;
102
+ }
103
+
104
+ float rms_of(const float* pcm, size_t n) {
105
+ if (n == 0) return 0.0f;
106
+ double acc = 0.0;
107
+ for (size_t i = 0; i < n; ++i) acc += static_cast<double>(pcm[i]) * pcm[i];
108
+ return static_cast<float>(std::sqrt(acc / static_cast<double>(n)));
109
+ }
110
+
111
+ // --- Native turn-segmentation state machine (ports VadDetector core) ------
112
+ //
113
+ // Phases mirror vad.ts: idle → speaking → paused → (end) → idle. Thresholds
114
+ // are the LiveDiarizationSession defaults (onset 0.5, pause hangover 120 ms,
115
+ // end hangover 500 ms, min speech 250 ms). The adaptive-hangover (V4) and
116
+ // fast-endpoint (V1) refinements are intentionally NOT ported — this native
117
+ // loop only needs robust turn boundaries; the JS layer no longer runs the
118
+ // per-window detector when the native pipeline owns segmentation.
119
+ struct VadSegmenter {
120
+ float onsetThreshold = 0.5f;
121
+ float offsetThreshold = 0.35f; // onset - 0.15
122
+ double pauseHangoverMs = 120.0;
123
+ double endHangoverMs = 500.0;
124
+ double minSpeechMs = 250.0;
125
+ double windowDurationMs = 1000.0 * kVadWindow / kSampleRate; // 32 ms
126
+
127
+ enum Phase { Idle, Speaking, Paused } phase = Idle;
128
+ double clockMs = 0.0;
129
+ double speechStartMs = 0.0;
130
+ double lastSpeechMs = 0.0;
131
+ double pauseStartedMs = 0.0;
132
+
133
+ // Result flags set by step(): the caller acts on speechStarted /
134
+ // speechEnded between feeding windows.
135
+ bool speechStarted = false;
136
+ bool speechEnded = false;
137
+ double endedSpeechDurationMs = 0.0;
138
+
139
+ void reset() {
140
+ phase = Idle;
141
+ clockMs = 0.0;
142
+ speechStartMs = lastSpeechMs = pauseStartedMs = 0.0;
143
+ speechStarted = speechEnded = false;
144
+ endedSpeechDurationMs = 0.0;
145
+ }
146
+
147
+ // Advance one window's worth of clock with the VAD probability. Returns via
148
+ // speechStarted / speechEnded the boundary events for this window.
149
+ void step(float prob) {
150
+ speechStarted = false;
151
+ speechEnded = false;
152
+ clockMs += windowDurationMs;
153
+ const double now = clockMs;
154
+ const bool isSpeechFrame = prob >= onsetThreshold;
155
+ const bool aboveOffset = prob >= offsetThreshold;
156
+
157
+ switch (phase) {
158
+ case Idle:
159
+ if (isSpeechFrame) {
160
+ phase = Speaking;
161
+ speechStartMs = now - windowDurationMs;
162
+ lastSpeechMs = now;
163
+ speechStarted = true;
164
+ }
165
+ break;
166
+ case Speaking:
167
+ if (aboveOffset) lastSpeechMs = now;
168
+ if (now - lastSpeechMs >= pauseHangoverMs) {
169
+ phase = Paused;
170
+ pauseStartedMs = lastSpeechMs;
171
+ }
172
+ break;
173
+ case Paused:
174
+ if (isSpeechFrame) {
175
+ phase = Speaking;
176
+ lastSpeechMs = now;
177
+ } else if (now - pauseStartedMs >= endHangoverMs) {
178
+ endedSpeechDurationMs = lastSpeechMs - speechStartMs;
179
+ phase = Idle;
180
+ speechEnded = true;
181
+ }
182
+ break;
183
+ }
184
+ }
185
+
186
+ // Force-close an open turn (on flush). Returns true when a turn was open.
187
+ bool forceEnd() {
188
+ speechStarted = false;
189
+ speechEnded = false;
190
+ if (phase == Idle) return false;
191
+ endedSpeechDurationMs = lastSpeechMs - speechStartMs;
192
+ phase = Idle;
193
+ speechEnded = true;
194
+ return true;
195
+ }
196
+ };
197
+
198
+ // --- Pipeline session -----------------------------------------------------
199
+ //
200
+ // Owns one fused VAD + speaker + diariz session set anchored to a context,
201
+ // plus the native turn-segmentation state machine and the in-flight turn PCM
202
+ // buffer. Runs entirely in the bionic app process.
203
+ struct PipelineSession {
204
+ EliInferenceContext* ctx = nullptr; // borrowed (owned by the context handle)
205
+ EliVad* vad = nullptr;
206
+ EliSpeaker* speaker = nullptr;
207
+ EliDiariz* diariz = nullptr;
208
+
209
+ VadSegmenter seg;
210
+
211
+ // Carry-over PCM not yet aligned to a 512-window boundary.
212
+ std::vector<float> pending;
213
+ // The in-flight turn's PCM (between speech-start and speech-end), with a
214
+ // small pre-roll so the leading word is not clipped.
215
+ std::vector<float> turnPcm;
216
+ std::vector<float> preRoll; // ring of pre-speech-start PCM
217
+ size_t preRollSamples = static_cast<size_t>(0.3 * kSampleRate);
218
+ size_t maxTurnSamples = static_cast<size_t>(30 * kSampleRate);
219
+ bool capturing = false;
220
+ int turnSeq = 0;
221
+
222
+ // Completed turns produced by the last process()/flush() call, encoded as
223
+ // JSON the JS side parses. Drained by the caller.
224
+ std::vector<std::string> turns;
225
+ // Parallel arrays for the heavy payloads (embedding + labels) so JS can
226
+ // read them without re-parsing big JSON.
227
+ std::vector<std::vector<float>> turnEmbeddings;
228
+ std::vector<std::vector<int8_t>> turnLabels;
229
+ };
230
+
231
+ // Append `n` samples to a bounded pre-roll ring, dropping oldest beyond cap.
232
+ void push_preroll(PipelineSession* s, const float* pcm, size_t n) {
233
+ if (s->preRollSamples == 0) return;
234
+ s->preRoll.insert(s->preRoll.end(), pcm, pcm + n);
235
+ if (s->preRoll.size() > s->preRollSamples) {
236
+ const size_t drop = s->preRoll.size() - s->preRollSamples;
237
+ s->preRoll.erase(s->preRoll.begin(),
238
+ s->preRoll.begin() + static_cast<long>(drop));
239
+ }
240
+ }
241
+
242
+ // Run speaker-embed + diariz on a finalized turn and stage the JSON + payloads.
243
+ // Returns false (with *outError set) on a native op failure.
244
+ bool finalize_turn(PipelineSession* s, char** outError) {
245
+ if (s->turnPcm.empty()) return true;
246
+ const size_t samples = s->turnPcm.size();
247
+ const int turnId = s->turnSeq++;
248
+
249
+ // Speaker embedding over the whole turn (WeSpeaker min ~ 0.5 s; the JS
250
+ // attribution pipeline re-checks WESPEAKER_MIN_SAMPLES, but the native op
251
+ // needs enough audio — run it and let the value flow; too-short turns just
252
+ // yield a weak embedding the matcher discounts).
253
+ std::vector<float> embedding(kSpeakerEmbeddingDim, 0.0f);
254
+ bool haveEmbedding = false;
255
+ if (s->speaker && samples >= kSampleRate / 2) {
256
+ const int rc = eliza_inference_speaker_embed(
257
+ s->speaker, s->turnPcm.data(), samples, embedding.data(), outError);
258
+ if (rc != ELIZA_OK) return false;
259
+ haveEmbedding = true;
260
+ }
261
+
262
+ // Diarizer over a single 5 s window: pyannote takes exactly 80000 samples.
263
+ // Center-crop or zero-pad the turn to the fixed window (the JS reducer maps
264
+ // frame labels back to ms via the fixed stride, so the window is canonical).
265
+ std::vector<int8_t> labels;
266
+ bool haveLabels = false;
267
+ if (s->diariz) {
268
+ std::vector<float> window(kDiarizWindow, 0.0f);
269
+ const size_t copy = samples < kDiarizWindow ? samples : kDiarizWindow;
270
+ std::memcpy(window.data(), s->turnPcm.data(), copy * sizeof(float));
271
+ std::vector<int8_t> out(kDiarizLabelCap, 0);
272
+ size_t nLabels = out.size();
273
+ const int rc = eliza_inference_diariz_segment(
274
+ s->diariz, window.data(), window.size(), out.data(), &nLabels,
275
+ outError);
276
+ if (rc != ELIZA_OK) return false;
277
+ labels.assign(out.begin(), out.begin() + static_cast<long>(nLabels));
278
+ haveLabels = true;
279
+ }
280
+
281
+ const double durationMs = 1000.0 * static_cast<double>(samples) / kSampleRate;
282
+
283
+ // Log per-op turn evidence to logcat (the in-process verification channel:
284
+ // these lines are emitted by the ai.elizaos.app pid, proving all four ops —
285
+ // VAD segmentation + speaker embed + diariz — ran in the bionic app
286
+ // process, independent of the JS↔Capacitor result delivery).
287
+ double embNorm = 0.0, embAbsMax = 0.0;
288
+ for (size_t i = 0; i < embedding.size(); ++i) {
289
+ embNorm += static_cast<double>(embedding[i]) * embedding[i];
290
+ const double a = std::fabs(static_cast<double>(embedding[i]));
291
+ if (a > embAbsMax) embAbsMax = a;
292
+ }
293
+ embNorm = std::sqrt(embNorm);
294
+ // Diariz label histogram (how many distinct powerset classes fired).
295
+ int distinctLabels = 0;
296
+ bool seen[8] = {false, false, false, false, false, false, false, false};
297
+ for (int8_t l : labels) {
298
+ if (l >= 0 && l < 8 && !seen[l]) { seen[l] = true; distinctLabels++; }
299
+ }
300
+ LOGI("TURN jni_%d: samples=%zu (%.2fs) | speaker: embDim=%zu norm=%.4f "
301
+ "absMax=%.4f emb[0..3]=[%.4f,%.4f,%.4f,%.4f] | diariz: frames=%zu "
302
+ "distinctClasses=%d",
303
+ turnId, samples, durationMs / 1000.0,
304
+ haveEmbedding ? embedding.size() : 0, embNorm, embAbsMax,
305
+ embedding.size() > 0 ? embedding[0] : 0.0f,
306
+ embedding.size() > 1 ? embedding[1] : 0.0f,
307
+ embedding.size() > 2 ? embedding[2] : 0.0f,
308
+ embedding.size() > 3 ? embedding[3] : 0.0f,
309
+ labels.size(), distinctLabels);
310
+
311
+ std::string json = "{\"turnId\":\"jni_" + std::to_string(turnId) +
312
+ "\",\"samples\":" + std::to_string(samples) +
313
+ ",\"durationMs\":" + std::to_string(durationMs) +
314
+ ",\"hasEmbedding\":" + (haveEmbedding ? "true" : "false") +
315
+ ",\"embNorm\":" + std::to_string(embNorm) +
316
+ ",\"diarizFrames\":" + std::to_string(labels.size()) +
317
+ ",\"diarizDistinctClasses\":" +
318
+ std::to_string(distinctLabels) + "}";
319
+ s->turns.push_back(std::move(json));
320
+ s->turnEmbeddings.push_back(haveEmbedding ? std::move(embedding)
321
+ : std::vector<float>{});
322
+ s->turnLabels.push_back(haveLabels ? std::move(labels)
323
+ : std::vector<int8_t>{});
324
+ s->turnPcm.clear();
325
+ return true;
326
+ }
327
+
328
+ // Drain the pending buffer in 512-window steps, driving the VAD + segmenter.
329
+ bool drain_windows(PipelineSession* s, char** outError) {
330
+ while (s->pending.size() >= kVadWindow) {
331
+ float prob = -1.0f;
332
+ const int rc = eliza_inference_vad_process(
333
+ s->vad, s->pending.data(), kVadWindow, &prob, outError);
334
+ if (rc != ELIZA_OK) return false;
335
+
336
+ // Buffer this window into turn or pre-roll BEFORE the state transition
337
+ // so a speech-start seeds the turn with the pre-roll + this window.
338
+ const float* win = s->pending.data();
339
+ if (s->capturing) {
340
+ s->turnPcm.insert(s->turnPcm.end(), win, win + kVadWindow);
341
+ } else {
342
+ push_preroll(s, win, kVadWindow);
343
+ }
344
+
345
+ s->seg.step(prob);
346
+ if (s->seg.speechStarted) {
347
+ s->capturing = true;
348
+ // Seed the turn with the pre-roll (leading word) + this window.
349
+ s->turnPcm = s->preRoll;
350
+ s->turnPcm.insert(s->turnPcm.end(), win, win + kVadWindow);
351
+ s->preRoll.clear();
352
+ }
353
+ if (s->seg.speechEnded) {
354
+ s->capturing = false;
355
+ eliza_inference_vad_reset(s->vad, outError); // best-effort
356
+ if (!finalize_turn(s, outError)) return false;
357
+ }
358
+ // Hard cap on a runaway turn.
359
+ if (s->capturing && s->turnPcm.size() >= s->maxTurnSamples) {
360
+ s->capturing = false;
361
+ s->seg.forceEnd();
362
+ eliza_inference_vad_reset(s->vad, outError);
363
+ if (!finalize_turn(s, outError)) return false;
364
+ }
365
+
366
+ // Advance the pending window.
367
+ s->pending.erase(s->pending.begin(),
368
+ s->pending.begin() + static_cast<long>(kVadWindow));
369
+ }
370
+ return true;
371
+ }
372
+
373
+ // Build the JSON returned to JS for a process()/flush() call: the turns
374
+ // completed in this call. Embeddings + labels are exposed via the parallel
375
+ // getters so JS reads them per-index.
376
+ std::string drain_turns_json(PipelineSession* s) {
377
+ std::string out = "[";
378
+ for (size_t i = 0; i < s->turns.size(); ++i) {
379
+ if (i > 0) out += ",";
380
+ out += s->turns[i];
381
+ }
382
+ out += "]";
383
+ return out;
384
+ }
385
+
386
+ // Close a self-test session's classifier handles + its owning context.
387
+ void cleanup_session_for_selftest(PipelineSession* s, EliInferenceContext* ctx) {
388
+ if (s->diariz) eliza_inference_diariz_close(s->diariz);
389
+ if (s->speaker) eliza_inference_speaker_close(s->speaker);
390
+ if (s->vad) eliza_inference_vad_close(s->vad);
391
+ delete s;
392
+ if (ctx) eliza_inference_destroy(ctx);
393
+ }
394
+
395
+ } // namespace
396
+
397
+ extern "C" {
398
+
399
+ // ── ABI / capability probes (Phase 3a, retained) ─────────────────────────
400
+
401
+ JNIEXPORT jstring JNICALL
402
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeVoiceAbiVersion(JNIEnv* env, jclass) {
403
+ const char* abi = eliza_inference_abi_version();
404
+ LOGI("eliza_inference_abi_version() = %s", abi ? abi : "(null)");
405
+ return to_jstring(env, abi ? std::string(abi) : std::string());
406
+ }
407
+
408
+ JNIEXPORT jint JNICALL
409
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeVadSupported(JNIEnv*, jclass) {
410
+ return static_cast<jint>(eliza_inference_vad_supported());
411
+ }
412
+
413
+ JNIEXPORT jint JNICALL
414
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordSupported(JNIEnv*, jclass) {
415
+ return static_cast<jint>(eliza_inference_wakeword_supported());
416
+ }
417
+
418
+ JNIEXPORT jint JNICALL
419
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerSupported(JNIEnv*, jclass) {
420
+ return static_cast<jint>(eliza_inference_speaker_supported());
421
+ }
422
+
423
+ JNIEXPORT jint JNICALL
424
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizSupported(JNIEnv*, jclass) {
425
+ return static_cast<jint>(eliza_inference_diariz_supported());
426
+ }
427
+
428
+ // ── Context lifecycle ────────────────────────────────────────────────────
429
+
430
+ JNIEXPORT jlong JNICALL
431
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeContextCreate(JNIEnv* env, jclass,
432
+ jstring jBundleDir) {
433
+ const std::string bundleDir = from_jstring(env, jBundleDir);
434
+ if (bundleDir.empty()) {
435
+ throw_runtime(env, "contextCreate: empty bundle dir", nullptr);
436
+ return 0;
437
+ }
438
+ char* outError = nullptr;
439
+ EliInferenceContext* ctx =
440
+ eliza_inference_create(bundleDir.c_str(), &outError);
441
+ if (ctx == nullptr) {
442
+ throw_runtime(env, "eliza_inference_create returned null", outError);
443
+ return 0;
444
+ }
445
+ LOGI("contextCreate(%s) -> %p", bundleDir.c_str(), (void*)ctx);
446
+ return reinterpret_cast<jlong>(ctx);
447
+ }
448
+
449
+ JNIEXPORT void JNICALL
450
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeContextDestroy(JNIEnv*, jclass,
451
+ jlong handle) {
452
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(handle);
453
+ if (ctx) eliza_inference_destroy(ctx);
454
+ }
455
+
456
+ // ── VAD direct ops (evidence / self-test) ────────────────────────────────
457
+
458
+ JNIEXPORT jlong JNICALL
459
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeVadOpen(JNIEnv* env, jclass,
460
+ jlong ctxHandle) {
461
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
462
+ char* outError = nullptr;
463
+ EliVad* vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
464
+ if (!vad) {
465
+ throw_runtime(env, "vad_open returned null", outError);
466
+ return 0;
467
+ }
468
+ return reinterpret_cast<jlong>(vad);
469
+ }
470
+
471
+ // Process N 512-sample windows in one call; returns the per-window
472
+ // probabilities as a Java float[] (length floor(samples/512)). Zero per-window
473
+ // bridge calls — the whole batch runs natively.
474
+ JNIEXPORT jfloatArray JNICALL
475
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeVadProcessBatch(JNIEnv* env, jclass,
476
+ jlong vadHandle,
477
+ jfloatArray jPcm) {
478
+ auto* vad = reinterpret_cast<EliVad*>(vadHandle);
479
+ const std::vector<float> pcm = read_float_array(env, jPcm);
480
+ const size_t windows = pcm.size() / kVadWindow;
481
+ std::vector<float> probs(windows, 0.0f);
482
+ char* outError = nullptr;
483
+ for (size_t w = 0; w < windows; ++w) {
484
+ float p = -1.0f;
485
+ const int rc = eliza_inference_vad_process(
486
+ vad, pcm.data() + w * kVadWindow, kVadWindow, &p, &outError);
487
+ if (rc != ELIZA_OK) {
488
+ throw_runtime(env, "vad_process(batch)", outError);
489
+ return nullptr;
490
+ }
491
+ probs[w] = p;
492
+ }
493
+ jfloatArray out = env->NewFloatArray(static_cast<jsize>(windows));
494
+ if (out && windows > 0) {
495
+ env->SetFloatArrayRegion(out, 0, static_cast<jsize>(windows),
496
+ probs.data());
497
+ }
498
+ return out;
499
+ }
500
+
501
+ JNIEXPORT void JNICALL
502
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeVadReset(JNIEnv*, jclass,
503
+ jlong vadHandle) {
504
+ auto* vad = reinterpret_cast<EliVad*>(vadHandle);
505
+ char* outError = nullptr;
506
+ eliza_inference_vad_reset(vad, &outError);
507
+ if (outError) std::free(outError);
508
+ }
509
+
510
+ JNIEXPORT void JNICALL
511
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeVadClose(JNIEnv*, jclass,
512
+ jlong vadHandle) {
513
+ eliza_inference_vad_close(reinterpret_cast<EliVad*>(vadHandle));
514
+ }
515
+
516
+ // ── Wake-word ops ────────────────────────────────────────────────────────
517
+
518
+ JNIEXPORT jlong JNICALL
519
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordOpen(JNIEnv* env, jclass,
520
+ jlong ctxHandle,
521
+ jstring jHead) {
522
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
523
+ const std::string head = from_jstring(env, jHead);
524
+ char* outError = nullptr;
525
+ EliWakeWord* wake = eliza_inference_wakeword_open(
526
+ ctx, kSampleRate, head.empty() ? "hey-eliza" : head.c_str(), &outError);
527
+ if (!wake) {
528
+ throw_runtime(env, "wakeword_open returned null", outError);
529
+ return 0;
530
+ }
531
+ return reinterpret_cast<jlong>(wake);
532
+ }
533
+
534
+ // Score N 1280-sample frames in one call; returns the per-frame P(wake) as a
535
+ // Java float[] (length floor(samples/1280)).
536
+ JNIEXPORT jfloatArray JNICALL
537
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordScoreBatch(JNIEnv* env,
538
+ jclass,
539
+ jlong wakeHandle,
540
+ jfloatArray jPcm) {
541
+ auto* wake = reinterpret_cast<EliWakeWord*>(wakeHandle);
542
+ const std::vector<float> pcm = read_float_array(env, jPcm);
543
+ const size_t frames = pcm.size() / kWakeFrame;
544
+ std::vector<float> scores(frames, 0.0f);
545
+ char* outError = nullptr;
546
+ for (size_t f = 0; f < frames; ++f) {
547
+ float p = -1.0f;
548
+ const int rc = eliza_inference_wakeword_score(
549
+ wake, pcm.data() + f * kWakeFrame, kWakeFrame, &p, &outError);
550
+ if (rc != ELIZA_OK) {
551
+ throw_runtime(env, "wakeword_score(batch)", outError);
552
+ return nullptr;
553
+ }
554
+ scores[f] = p;
555
+ }
556
+ float maxScore = 0.0f;
557
+ for (float v : scores) maxScore = std::max(maxScore, v);
558
+ LOGI("wakeword scoreBatch: frames=%zu maxP=%.4f", frames, maxScore);
559
+ jfloatArray out = env->NewFloatArray(static_cast<jsize>(frames));
560
+ if (out && frames > 0) {
561
+ env->SetFloatArrayRegion(out, 0, static_cast<jsize>(frames),
562
+ scores.data());
563
+ }
564
+ return out;
565
+ }
566
+
567
+ JNIEXPORT void JNICALL
568
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordReset(JNIEnv*, jclass,
569
+ jlong wakeHandle) {
570
+ auto* wake = reinterpret_cast<EliWakeWord*>(wakeHandle);
571
+ char* outError = nullptr;
572
+ eliza_inference_wakeword_reset(wake, &outError);
573
+ if (outError) std::free(outError);
574
+ }
575
+
576
+ JNIEXPORT void JNICALL
577
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordClose(JNIEnv*, jclass,
578
+ jlong wakeHandle) {
579
+ eliza_inference_wakeword_close(reinterpret_cast<EliWakeWord*>(wakeHandle));
580
+ }
581
+
582
+ // ── Speaker encoder ops ──────────────────────────────────────────────────
583
+
584
+ JNIEXPORT jlong JNICALL
585
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerOpen(JNIEnv* env, jclass,
586
+ jlong ctxHandle,
587
+ jstring jGgufPath) {
588
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
589
+ const std::string gguf = from_jstring(env, jGgufPath);
590
+ char* outError = nullptr;
591
+ EliSpeaker* sp = eliza_inference_speaker_open(
592
+ ctx, gguf.empty() ? nullptr : gguf.c_str(), &outError);
593
+ if (!sp) {
594
+ throw_runtime(env, "speaker_open returned null", outError);
595
+ return 0;
596
+ }
597
+ return reinterpret_cast<jlong>(sp);
598
+ }
599
+
600
+ // Embed a turn's PCM into a 256-float L2-normalized speaker embedding.
601
+ JNIEXPORT jfloatArray JNICALL
602
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerEmbed(JNIEnv* env, jclass,
603
+ jlong spHandle,
604
+ jfloatArray jPcm) {
605
+ auto* sp = reinterpret_cast<EliSpeaker*>(spHandle);
606
+ const std::vector<float> pcm = read_float_array(env, jPcm);
607
+ std::vector<float> emb(kSpeakerEmbeddingDim, 0.0f);
608
+ char* outError = nullptr;
609
+ const int rc = eliza_inference_speaker_embed(sp, pcm.data(), pcm.size(),
610
+ emb.data(), &outError);
611
+ if (rc != ELIZA_OK) {
612
+ throw_runtime(env, "speaker_embed", outError);
613
+ return nullptr;
614
+ }
615
+ jfloatArray out = env->NewFloatArray(static_cast<jsize>(kSpeakerEmbeddingDim));
616
+ if (out) {
617
+ env->SetFloatArrayRegion(out, 0, static_cast<jsize>(kSpeakerEmbeddingDim),
618
+ emb.data());
619
+ }
620
+ return out;
621
+ }
622
+
623
+ JNIEXPORT void JNICALL
624
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeSpeakerClose(JNIEnv*, jclass,
625
+ jlong spHandle) {
626
+ eliza_inference_speaker_close(reinterpret_cast<EliSpeaker*>(spHandle));
627
+ }
628
+
629
+ // ── Diarizer ops ─────────────────────────────────────────────────────────
630
+
631
+ JNIEXPORT jlong JNICALL
632
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizOpen(JNIEnv* env, jclass,
633
+ jlong ctxHandle,
634
+ jstring jGgufPath) {
635
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
636
+ const std::string gguf = from_jstring(env, jGgufPath);
637
+ char* outError = nullptr;
638
+ EliDiariz* di = eliza_inference_diariz_open(
639
+ ctx, gguf.empty() ? nullptr : gguf.c_str(), &outError);
640
+ if (!di) {
641
+ throw_runtime(env, "diariz_open returned null", outError);
642
+ return 0;
643
+ }
644
+ return reinterpret_cast<jlong>(di);
645
+ }
646
+
647
+ // Segment a fixed 80000-sample (5 s) window into per-frame int8 powerset
648
+ // labels; returns the labels as a Java byte[].
649
+ JNIEXPORT jbyteArray JNICALL
650
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizSegment(JNIEnv* env, jclass,
651
+ jlong diHandle,
652
+ jfloatArray jPcm) {
653
+ auto* di = reinterpret_cast<EliDiariz*>(diHandle);
654
+ std::vector<float> pcm = read_float_array(env, jPcm);
655
+ // pyannote takes exactly 80000 samples — pad or crop.
656
+ std::vector<float> window(kDiarizWindow, 0.0f);
657
+ const size_t copy = pcm.size() < kDiarizWindow ? pcm.size() : kDiarizWindow;
658
+ std::memcpy(window.data(), pcm.data(), copy * sizeof(float));
659
+ std::vector<int8_t> out(kDiarizLabelCap, 0);
660
+ size_t nLabels = out.size();
661
+ char* outError = nullptr;
662
+ const int rc = eliza_inference_diariz_segment(
663
+ di, window.data(), window.size(), out.data(), &nLabels, &outError);
664
+ if (rc != ELIZA_OK) {
665
+ throw_runtime(env, "diariz_segment", outError);
666
+ return nullptr;
667
+ }
668
+ jbyteArray ja = env->NewByteArray(static_cast<jsize>(nLabels));
669
+ if (ja && nLabels > 0) {
670
+ env->SetByteArrayRegion(ja, 0, static_cast<jsize>(nLabels),
671
+ reinterpret_cast<const jbyte*>(out.data()));
672
+ }
673
+ return ja;
674
+ }
675
+
676
+ JNIEXPORT void JNICALL
677
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeDiarizClose(JNIEnv*, jclass,
678
+ jlong diHandle) {
679
+ eliza_inference_diariz_close(reinterpret_cast<EliDiariz*>(diHandle));
680
+ }
681
+
682
+ // ── Native streaming pipeline (the hot-loop owner) ───────────────────────
683
+
684
+ // Open a pipeline session on a context: opens VAD + speaker + diariz (each
685
+ // best-effort; a missing classifier is reported as null and that turn payload
686
+ // is empty). Returns an opaque handle.
687
+ JNIEXPORT jlong JNICALL
688
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineOpen(JNIEnv* env, jclass,
689
+ jlong ctxHandle) {
690
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
691
+ if (!ctx) {
692
+ throw_runtime(env, "pipelineOpen: null context", nullptr);
693
+ return 0;
694
+ }
695
+ auto* s = new PipelineSession();
696
+ s->ctx = ctx;
697
+ char* outError = nullptr;
698
+
699
+ s->vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
700
+ if (!s->vad) {
701
+ delete s;
702
+ throw_runtime(env, "pipelineOpen: vad_open returned null", outError);
703
+ return 0;
704
+ }
705
+ // Speaker + diariz are required for a real attributed turn; open both.
706
+ s->speaker = eliza_inference_speaker_open(ctx, nullptr, &outError);
707
+ if (!s->speaker) {
708
+ eliza_inference_vad_close(s->vad);
709
+ delete s;
710
+ throw_runtime(env, "pipelineOpen: speaker_open returned null", outError);
711
+ return 0;
712
+ }
713
+ s->diariz = eliza_inference_diariz_open(ctx, nullptr, &outError);
714
+ if (!s->diariz) {
715
+ eliza_inference_speaker_close(s->speaker);
716
+ eliza_inference_vad_close(s->vad);
717
+ delete s;
718
+ throw_runtime(env, "pipelineOpen: diariz_open returned null", outError);
719
+ return 0;
720
+ }
721
+ LOGI("pipelineOpen -> %p (vad+speaker+diariz)", (void*)s);
722
+ return reinterpret_cast<jlong>(s);
723
+ }
724
+
725
+ // Feed one audio-frame batch (16 kHz mono fp32) into the pipeline. Runs the VAD
726
+ // hot-loop + segmentation natively; on each speech-end runs speaker+diariz.
727
+ // Returns a JSON array of turns completed in THIS call (may be empty). The
728
+ // heavy embedding/labels payloads are read per-index via the getters below.
729
+ JNIEXPORT jstring JNICALL
730
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineProcess(JNIEnv* env, jclass,
731
+ jlong handle,
732
+ jfloatArray jPcm) {
733
+ auto* s = reinterpret_cast<PipelineSession*>(handle);
734
+ if (!s) {
735
+ throw_runtime(env, "pipelineProcess: null session", nullptr);
736
+ return nullptr;
737
+ }
738
+ s->turns.clear();
739
+ s->turnEmbeddings.clear();
740
+ s->turnLabels.clear();
741
+
742
+ const std::vector<float> pcm = read_float_array(env, jPcm);
743
+ s->pending.insert(s->pending.end(), pcm.begin(), pcm.end());
744
+ char* outError = nullptr;
745
+ if (!drain_windows(s, &outError)) {
746
+ throw_runtime(env, "pipelineProcess: drain", outError);
747
+ return nullptr;
748
+ }
749
+ if (!s->turns.empty()) {
750
+ LOGI("pipelineProcess: fed %zu samples, %zu turn(s) completed, "
751
+ "capturing=%d", pcm.size(), s->turns.size(), s->capturing ? 1 : 0);
752
+ }
753
+ return to_jstring(env, drain_turns_json(s));
754
+ }
755
+
756
+ // Force-finalize any open turn (call at end-of-capture). Returns the JSON array
757
+ // of any turn completed by the flush.
758
+ JNIEXPORT jstring JNICALL
759
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineFlush(JNIEnv* env, jclass,
760
+ jlong handle) {
761
+ auto* s = reinterpret_cast<PipelineSession*>(handle);
762
+ if (!s) {
763
+ throw_runtime(env, "pipelineFlush: null session", nullptr);
764
+ return nullptr;
765
+ }
766
+ s->turns.clear();
767
+ s->turnEmbeddings.clear();
768
+ s->turnLabels.clear();
769
+ if (s->seg.forceEnd()) {
770
+ s->capturing = false;
771
+ char* outError = nullptr;
772
+ eliza_inference_vad_reset(s->vad, &outError);
773
+ if (outError) std::free(outError);
774
+ outError = nullptr;
775
+ if (!finalize_turn(s, &outError)) {
776
+ throw_runtime(env, "pipelineFlush: finalize", outError);
777
+ return nullptr;
778
+ }
779
+ }
780
+ return to_jstring(env, drain_turns_json(s));
781
+ }
782
+
783
+ // Read the speaker embedding (256 floats) for the i-th turn produced by the
784
+ // last process()/flush() call. Empty array when that turn had no embedding.
785
+ JNIEXPORT jfloatArray JNICALL
786
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineTurnEmbedding(JNIEnv* env,
787
+ jclass,
788
+ jlong handle,
789
+ jint index) {
790
+ auto* s = reinterpret_cast<PipelineSession*>(handle);
791
+ if (!s || index < 0 ||
792
+ static_cast<size_t>(index) >= s->turnEmbeddings.size()) {
793
+ return env->NewFloatArray(0);
794
+ }
795
+ const auto& emb = s->turnEmbeddings[static_cast<size_t>(index)];
796
+ jfloatArray out = env->NewFloatArray(static_cast<jsize>(emb.size()));
797
+ if (out && !emb.empty()) {
798
+ env->SetFloatArrayRegion(out, 0, static_cast<jsize>(emb.size()),
799
+ emb.data());
800
+ }
801
+ return out;
802
+ }
803
+
804
+ // Read the diariz int8 frame labels for the i-th turn.
805
+ JNIEXPORT jbyteArray JNICALL
806
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineTurnLabels(JNIEnv* env,
807
+ jclass,
808
+ jlong handle,
809
+ jint index) {
810
+ auto* s = reinterpret_cast<PipelineSession*>(handle);
811
+ if (!s || index < 0 ||
812
+ static_cast<size_t>(index) >= s->turnLabels.size()) {
813
+ return env->NewByteArray(0);
814
+ }
815
+ const auto& labels = s->turnLabels[static_cast<size_t>(index)];
816
+ jbyteArray out = env->NewByteArray(static_cast<jsize>(labels.size()));
817
+ if (out && !labels.empty()) {
818
+ env->SetByteArrayRegion(out, 0, static_cast<jsize>(labels.size()),
819
+ reinterpret_cast<const jbyte*>(labels.data()));
820
+ }
821
+ return out;
822
+ }
823
+
824
+ JNIEXPORT void JNICALL
825
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineReset(JNIEnv*, jclass,
826
+ jlong handle) {
827
+ auto* s = reinterpret_cast<PipelineSession*>(handle);
828
+ if (!s) return;
829
+ s->seg.reset();
830
+ s->pending.clear();
831
+ s->turnPcm.clear();
832
+ s->preRoll.clear();
833
+ s->capturing = false;
834
+ char* outError = nullptr;
835
+ if (s->vad) eliza_inference_vad_reset(s->vad, &outError);
836
+ if (outError) std::free(outError);
837
+ }
838
+
839
+ JNIEXPORT void JNICALL
840
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineClose(JNIEnv*, jclass,
841
+ jlong handle) {
842
+ auto* s = reinterpret_cast<PipelineSession*>(handle);
843
+ if (!s) return;
844
+ if (s->diariz) eliza_inference_diariz_close(s->diariz);
845
+ if (s->speaker) eliza_inference_speaker_close(s->speaker);
846
+ if (s->vad) eliza_inference_vad_close(s->vad);
847
+ delete s;
848
+ }
849
+
850
+ // ── Pipeline self-test (one native call: ctx→open→feed→flush) ────────────
851
+ //
852
+ // Runs the WHOLE native pipeline on a complete PCM buffer in ONE call: creates
853
+ // a context, opens the VAD+speaker+diariz pipeline, streams the PCM through the
854
+ // native VAD hot-loop + turn segmentation, flushes, and returns the turn JSON
855
+ // (the per-op TURN logcat lines are the in-process evidence). Single call so it
856
+ // does not depend on chained Capacitor awaits. `feedSamples` chunks the feed to
857
+ // mimic the live audioFrame batching (0 = feed the whole buffer at once).
858
+ JNIEXPORT jstring JNICALL
859
+ Java_ai_elizaos_app_ElizaVoiceNative_nativePipelineSelfTest(JNIEnv* env, jclass,
860
+ jstring jBundleDir,
861
+ jfloatArray jPcm,
862
+ jint feedSamples) {
863
+ const std::string bundleDir = from_jstring(env, jBundleDir);
864
+ char* outError = nullptr;
865
+ EliInferenceContext* ctx =
866
+ eliza_inference_create(bundleDir.c_str(), &outError);
867
+ if (!ctx) {
868
+ throw_runtime(env, "pipelineSelfTest: create", outError);
869
+ return nullptr;
870
+ }
871
+ auto* s = new PipelineSession();
872
+ s->ctx = ctx;
873
+ s->vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
874
+ if (!s->vad) { delete s; eliza_inference_destroy(ctx);
875
+ throw_runtime(env, "pipelineSelfTest: vad_open", outError); return nullptr; }
876
+ s->speaker = eliza_inference_speaker_open(ctx, nullptr, &outError);
877
+ if (!s->speaker) { eliza_inference_vad_close(s->vad); delete s;
878
+ eliza_inference_destroy(ctx);
879
+ throw_runtime(env, "pipelineSelfTest: speaker_open", outError); return nullptr; }
880
+ s->diariz = eliza_inference_diariz_open(ctx, nullptr, &outError);
881
+ if (!s->diariz) { eliza_inference_speaker_close(s->speaker);
882
+ eliza_inference_vad_close(s->vad); delete s; eliza_inference_destroy(ctx);
883
+ throw_runtime(env, "pipelineSelfTest: diariz_open", outError); return nullptr; }
884
+
885
+ const std::vector<float> pcm = read_float_array(env, jPcm);
886
+ LOGI("pipelineSelfTest: feeding %zu samples (%.2fs), chunk=%d",
887
+ pcm.size(), pcm.size() / (double)kSampleRate, feedSamples);
888
+ const size_t chunk = feedSamples > 0 ? static_cast<size_t>(feedSamples)
889
+ : pcm.size();
890
+ std::vector<std::string> allTurns;
891
+ for (size_t off = 0; off < pcm.size(); off += chunk) {
892
+ const size_t end = std::min(off + chunk, pcm.size());
893
+ s->pending.insert(s->pending.end(), pcm.begin() + off, pcm.begin() + end);
894
+ s->turns.clear(); s->turnEmbeddings.clear(); s->turnLabels.clear();
895
+ if (!drain_windows(s, &outError)) {
896
+ cleanup_session_for_selftest(s, ctx);
897
+ throw_runtime(env, "pipelineSelfTest: drain", outError);
898
+ return nullptr;
899
+ }
900
+ for (auto& t : s->turns) allTurns.push_back(t);
901
+ }
902
+ // Flush any open turn (the speech-end via end-hangover may already have
903
+ // fired mid-stream; a force-flush catches a turn still open at EOF).
904
+ s->turns.clear(); s->turnEmbeddings.clear(); s->turnLabels.clear();
905
+ if (s->seg.forceEnd()) {
906
+ s->capturing = false;
907
+ eliza_inference_vad_reset(s->vad, &outError);
908
+ if (outError) { std::free(outError); outError = nullptr; }
909
+ if (finalize_turn(s, &outError)) {
910
+ for (auto& t : s->turns) allTurns.push_back(t);
911
+ } else if (outError) { std::free(outError); outError = nullptr; }
912
+ }
913
+ std::string json = "[";
914
+ for (size_t i = 0; i < allTurns.size(); ++i) {
915
+ if (i) json += ",";
916
+ json += allTurns[i];
917
+ }
918
+ json += "]";
919
+ LOGI("pipelineSelfTest: %zu total turn(s)", allTurns.size());
920
+ cleanup_session_for_selftest(s, ctx);
921
+ return to_jstring(env, json);
922
+ }
923
+
924
+ // ── Wake-word self-test (one native call: open + score pos + score neg) ──
925
+ //
926
+ // Scores two pre-decoded float[] clips through one wake-word session
927
+ // (reset between them) and logs both max P(wake) to logcat. Single call so the
928
+ // JS side does not chain awaits across the broken-under-CDP Capacitor result
929
+ // delivery — the in-process evidence is the logcat line.
930
+ JNIEXPORT jstring JNICALL
931
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeWakewordSelfTest(JNIEnv* env, jclass,
932
+ jstring jBundleDir,
933
+ jfloatArray jPos,
934
+ jfloatArray jNeg) {
935
+ const std::string bundleDir = from_jstring(env, jBundleDir);
936
+ char* outError = nullptr;
937
+ EliInferenceContext* ctx =
938
+ eliza_inference_create(bundleDir.c_str(), &outError);
939
+ if (!ctx) {
940
+ throw_runtime(env, "wakewordSelfTest: create", outError);
941
+ return nullptr;
942
+ }
943
+ EliWakeWord* wake =
944
+ eliza_inference_wakeword_open(ctx, kSampleRate, "hey-eliza", &outError);
945
+ if (!wake) {
946
+ eliza_inference_destroy(ctx);
947
+ throw_runtime(env, "wakewordSelfTest: wakeword_open", outError);
948
+ return nullptr;
949
+ }
950
+ auto scoreMax = [&](jfloatArray jPcm) -> float {
951
+ const std::vector<float> pcm = read_float_array(env, jPcm);
952
+ const size_t frames = pcm.size() / kWakeFrame;
953
+ float maxP = 0.0f;
954
+ for (size_t f = 0; f < frames; ++f) {
955
+ float p = -1.0f;
956
+ char* e = nullptr;
957
+ if (eliza_inference_wakeword_score(wake, pcm.data() + f * kWakeFrame,
958
+ kWakeFrame, &p, &e) == ELIZA_OK) {
959
+ maxP = std::max(maxP, p);
960
+ }
961
+ if (e) std::free(e);
962
+ }
963
+ return maxP;
964
+ };
965
+ const float posMax = scoreMax(jPos);
966
+ eliza_inference_wakeword_reset(wake, &outError);
967
+ if (outError) { std::free(outError); outError = nullptr; }
968
+ const float negMax = scoreMax(jNeg);
969
+ eliza_inference_wakeword_close(wake);
970
+ eliza_inference_destroy(ctx);
971
+ LOGI("WAKEWORD SELFTEST: posMax=%.4f negMax=%.4f (pos should >> neg)",
972
+ posMax, negMax);
973
+ std::string j = "{\"posMax\":" + std::to_string(posMax) +
974
+ ",\"negMax\":" + std::to_string(negMax) + "}";
975
+ return to_jstring(env, j);
976
+ }
977
+
978
+ // ── VAD self-test (Phase 3a, retained for the existing harness) ──────────
979
+
980
+ JNIEXPORT jstring JNICALL
981
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeVadSelfTest(JNIEnv* env, jclass,
982
+ jstring jBundleDir) {
983
+ const char* abi = eliza_inference_abi_version();
984
+ const std::string abiStr = abi ? std::string(abi) : std::string();
985
+ const int supported = eliza_inference_vad_supported();
986
+ const std::string bundleDir = from_jstring(env, jBundleDir);
987
+
988
+ auto fail = [&](const char* stage, const std::string& err) -> jstring {
989
+ std::string j = std::string("{\"ok\":false,\"stage\":\"") + stage +
990
+ "\",\"error\":\"" + err + "\",\"abi\":\"" + abiStr +
991
+ "\",\"supported\":" + std::to_string(supported) + "}";
992
+ LOGE("nativeVadSelfTest failed at %s: %s", stage, err.c_str());
993
+ return to_jstring(env, j);
994
+ };
995
+
996
+ if (bundleDir.empty()) return fail("bundle_dir", "empty bundle dir");
997
+
998
+ char* outError = nullptr;
999
+ EliInferenceContext* ctx =
1000
+ eliza_inference_create(bundleDir.c_str(), &outError);
1001
+ if (ctx == nullptr) {
1002
+ std::string err =
1003
+ outError ? std::string(outError) : std::string("create returned null");
1004
+ if (outError) std::free(outError);
1005
+ return fail("create", err);
1006
+ }
1007
+ EliVad* vad = eliza_inference_vad_open(ctx, kSampleRate, &outError);
1008
+ if (vad == nullptr) {
1009
+ std::string err = outError ? std::string(outError)
1010
+ : std::string("vad_open returned null");
1011
+ if (outError) std::free(outError);
1012
+ eliza_inference_destroy(ctx);
1013
+ return fail("vad_open", err);
1014
+ }
1015
+ std::vector<float> pcm(kVadWindow);
1016
+ for (size_t i = 0; i < pcm.size(); ++i) {
1017
+ pcm[i] = 0.25f *
1018
+ std::sin(2.0 * M_PI * 200.0 * (double)i / kSampleRate);
1019
+ }
1020
+ float probability = -1.0f;
1021
+ int rc = eliza_inference_vad_process(vad, pcm.data(), pcm.size(),
1022
+ &probability, &outError);
1023
+ if (rc != ELIZA_OK) {
1024
+ std::string err =
1025
+ outError ? std::string(outError) : ("rc=" + std::to_string(rc));
1026
+ if (outError) std::free(outError);
1027
+ eliza_inference_vad_close(vad);
1028
+ eliza_inference_destroy(ctx);
1029
+ return fail("vad_process", err);
1030
+ }
1031
+ if (outError) std::free(outError);
1032
+ eliza_inference_vad_close(vad);
1033
+ eliza_inference_destroy(ctx);
1034
+
1035
+ const bool finite = std::isfinite(probability);
1036
+ std::string j = std::string("{\"ok\":") + (finite ? "true" : "false") +
1037
+ ",\"probability\":" + std::to_string(probability) +
1038
+ ",\"abi\":\"" + abiStr + "\",\"supported\":" +
1039
+ std::to_string(supported) + "}";
1040
+ LOGI("nativeVadSelfTest ok: probability=%f abi=%s supported=%d", probability,
1041
+ abiStr.c_str(), supported);
1042
+ return to_jstring(env, j);
1043
+ }
1044
+
1045
+ // ── Text generation (LLM) ops — the GPU-accelerated text path ────────────
1046
+ //
1047
+ // Wrap the fused streaming-LLM ABI (eliza_inference_llm_stream_*), pooled
1048
+ // embeddings (eliza_inference_embed), end-of-turn scoring
1049
+ // (eliza_inference_llm_eot_score, ABI v11), and the tokenizer. When this JNI
1050
+ // host is built against the DYNAMIC-Vulkan libelizainference (libggml-vulkan.so
1051
+ // staged alongside it), llm_stream_open offloads the model to the GPU in the
1052
+ // bionic app process automatically — the path the musl bun agent cannot take.
1053
+
1054
+ JNIEXPORT jint JNICALL
1055
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamSupported(JNIEnv*, jclass) {
1056
+ return static_cast<jint>(eliza_inference_llm_stream_supported());
1057
+ }
1058
+
1059
+ JNIEXPORT jint JNICALL
1060
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeEmbedSupported(JNIEnv*, jclass) {
1061
+ return static_cast<jint>(eliza_inference_embed_supported());
1062
+ }
1063
+
1064
+ JNIEXPORT jint JNICALL
1065
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeEotSupported(JNIEnv*, jclass) {
1066
+ return static_cast<jint>(eliza_inference_llm_eot_supported());
1067
+ }
1068
+
1069
+ // Tokenize text -> int[] token ids. addSpecial adds BOS; parseSpecial renders
1070
+ // special tokens (<|im_start|> etc.) from the input.
1071
+ JNIEXPORT jintArray JNICALL
1072
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeTokenize(JNIEnv* env, jclass,
1073
+ jlong ctxHandle,
1074
+ jstring jText,
1075
+ jboolean addSpecial,
1076
+ jboolean parseSpecial) {
1077
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
1078
+ const std::string text = from_jstring(env, jText);
1079
+ int* toks = nullptr;
1080
+ size_t n = 0;
1081
+ char* outError = nullptr;
1082
+ const int rc = eliza_inference_tokenize(
1083
+ ctx, text.c_str(), text.size(), addSpecial ? 1 : 0,
1084
+ parseSpecial ? 1 : 0, &toks, &n, &outError);
1085
+ if (rc != ELIZA_OK) {
1086
+ throw_runtime(env, "tokenize", outError);
1087
+ return nullptr;
1088
+ }
1089
+ jintArray out = env->NewIntArray(static_cast<jsize>(n));
1090
+ if (out && n > 0) {
1091
+ env->SetIntArrayRegion(out, 0, static_cast<jsize>(n),
1092
+ reinterpret_cast<const jint*>(toks));
1093
+ }
1094
+ if (toks) eliza_inference_free_tokens(toks);
1095
+ return out;
1096
+ }
1097
+
1098
+ // Pooled, L2-normalized sentence embedding (pooling: 1=MEAN default) ->
1099
+ // float[n_embd].
1100
+ JNIEXPORT jfloatArray JNICALL
1101
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeEmbed(JNIEnv* env, jclass,
1102
+ jlong ctxHandle, jstring jText,
1103
+ jint pooling) {
1104
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
1105
+ const std::string text = from_jstring(env, jText);
1106
+ std::vector<float> out(4096, 0.0f);
1107
+ int dim = 0;
1108
+ char* outError = nullptr;
1109
+ const int rc = eliza_inference_embed(ctx, text.c_str(), text.size(),
1110
+ pooling > 0 ? pooling : 1, out.data(),
1111
+ out.size(), &dim, &outError);
1112
+ if (rc != ELIZA_OK) {
1113
+ throw_runtime(env, "embed", outError);
1114
+ return nullptr;
1115
+ }
1116
+ jfloatArray ja = env->NewFloatArray(dim);
1117
+ if (ja && dim > 0) env->SetFloatArrayRegion(ja, 0, dim, out.data());
1118
+ return ja;
1119
+ }
1120
+
1121
+ // End-of-turn score: next-token P(targetToken | tokens) -> float.
1122
+ JNIEXPORT jfloat JNICALL
1123
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeEotScore(JNIEnv* env, jclass,
1124
+ jlong ctxHandle,
1125
+ jintArray jTokens,
1126
+ jint targetToken) {
1127
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
1128
+ const jsize n = env->GetArrayLength(jTokens);
1129
+ std::vector<int32_t> toks(static_cast<size_t>(n));
1130
+ if (n > 0) {
1131
+ env->GetIntArrayRegion(jTokens, 0, n,
1132
+ reinterpret_cast<jint*>(toks.data()));
1133
+ }
1134
+ float prob = 0.0f, topProb = 0.0f;
1135
+ int32_t topTok = -1;
1136
+ char* outError = nullptr;
1137
+ const int rc = eliza_inference_llm_eot_score(ctx, toks.data(), toks.size(),
1138
+ targetToken, &prob, &topTok,
1139
+ &topProb, &outError);
1140
+ if (rc != ELIZA_OK) {
1141
+ throw_runtime(env, "eot_score", outError);
1142
+ return 0.0f;
1143
+ }
1144
+ return prob;
1145
+ }
1146
+
1147
+ // Open a streaming-LLM session. nGpuLayers: -1 = all-GPU (default), 0 = CPU
1148
+ // (the lib ignores 0 when libggml-vulkan is linked; the CPU/GPU choice is the
1149
+ // staged LIB VARIANT, see the per-device selection). drafterPath ("" = none)
1150
+ // enables MTP speculative decoding.
1151
+ JNIEXPORT jlong JNICALL
1152
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamOpen(
1153
+ JNIEnv* env, jclass, jlong ctxHandle, jint maxTokens, jfloat temperature,
1154
+ jfloat topP, jint topK, jint nGpuLayers, jstring jDrafterPath) {
1155
+ auto* ctx = reinterpret_cast<EliInferenceContext*>(ctxHandle);
1156
+ const std::string drafter = from_jstring(env, jDrafterPath);
1157
+ eliza_llm_stream_config_t cfg;
1158
+ std::memset(&cfg, 0, sizeof(cfg));
1159
+ cfg.max_tokens = maxTokens;
1160
+ cfg.temperature = temperature;
1161
+ cfg.top_p = topP > 0 ? topP : 1.0f;
1162
+ cfg.top_k = topK;
1163
+ cfg.repeat_penalty = 1.0f;
1164
+ cfg.n_gpu_layers = nGpuLayers;
1165
+ cfg.mtp_drafter_path = drafter.empty() ? nullptr : drafter.c_str();
1166
+ char* outError = nullptr;
1167
+ EliLlmStream* s = eliza_inference_llm_stream_open(ctx, &cfg, &outError);
1168
+ if (!s) {
1169
+ throw_runtime(env, "llm_stream_open returned null", outError);
1170
+ return 0;
1171
+ }
1172
+ return reinterpret_cast<jlong>(s);
1173
+ }
1174
+
1175
+ JNIEXPORT void JNICALL
1176
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamPrefill(JNIEnv* env, jclass,
1177
+ jlong streamHandle,
1178
+ jintArray jTokens) {
1179
+ auto* s = reinterpret_cast<EliLlmStream*>(streamHandle);
1180
+ const jsize n = env->GetArrayLength(jTokens);
1181
+ std::vector<int32_t> toks(static_cast<size_t>(n));
1182
+ if (n > 0) {
1183
+ env->GetIntArrayRegion(jTokens, 0, n,
1184
+ reinterpret_cast<jint*>(toks.data()));
1185
+ }
1186
+ char* outError = nullptr;
1187
+ const int rc = eliza_inference_llm_stream_prefill(s, toks.data(),
1188
+ toks.size(), &outError);
1189
+ if (rc != ELIZA_OK) throw_runtime(env, "llm_stream_prefill", outError);
1190
+ }
1191
+
1192
+ // Pull the next decode step. Returns JSON {text, done, drafted, accepted}:
1193
+ // `text` is the detokenized chunk (may span multiple committed tokens via MTP),
1194
+ // `done` true at the final step. `text` is JSON-escaped.
1195
+ JNIEXPORT jstring JNICALL
1196
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamNext(JNIEnv* env, jclass,
1197
+ jlong streamHandle) {
1198
+ auto* s = reinterpret_cast<EliLlmStream*>(streamHandle);
1199
+ int32_t toks[256];
1200
+ char text[4096];
1201
+ size_t nout = 0;
1202
+ int32_t drafted = 0, accepted = 0;
1203
+ char* outError = nullptr;
1204
+ const int rc = eliza_inference_llm_stream_next(
1205
+ s, toks, 256, &nout, text, sizeof(text), &drafted, &accepted, &outError);
1206
+ if (rc < 0) {
1207
+ throw_runtime(env, "llm_stream_next", outError);
1208
+ return nullptr;
1209
+ }
1210
+ std::string esc;
1211
+ for (const char* p = text; *p; ++p) {
1212
+ switch (*p) {
1213
+ case '"': esc += "\\\""; break;
1214
+ case '\\': esc += "\\\\"; break;
1215
+ case '\n': esc += "\\n"; break;
1216
+ case '\r': esc += "\\r"; break;
1217
+ case '\t': esc += "\\t"; break;
1218
+ default:
1219
+ if (static_cast<unsigned char>(*p) < 0x20) {
1220
+ char buf[8];
1221
+ std::snprintf(buf, sizeof(buf), "\\u%04x",
1222
+ static_cast<unsigned char>(*p));
1223
+ esc += buf;
1224
+ } else {
1225
+ esc += *p;
1226
+ }
1227
+ }
1228
+ }
1229
+ std::string json = "{\"text\":\"" + esc +
1230
+ "\",\"done\":" + (rc == 1 ? "true" : "false") +
1231
+ ",\"drafted\":" + std::to_string(drafted) +
1232
+ ",\"accepted\":" + std::to_string(accepted) + "}";
1233
+ return to_jstring(env, json);
1234
+ }
1235
+
1236
+ JNIEXPORT void JNICALL
1237
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmStreamClose(JNIEnv*, jclass,
1238
+ jlong streamHandle) {
1239
+ eliza_inference_llm_stream_close(
1240
+ reinterpret_cast<EliLlmStream*>(streamHandle));
1241
+ }
1242
+
1243
+ // ── LLM self-test (one native call: ctx→tokenize→stream→generate) ─────────
1244
+ //
1245
+ // THE KEYSTONE PROOF: runs a whole greedy text generation in ONE native call,
1246
+ // in the bionic app process, against whatever libelizainference.so is staged
1247
+ // into jniLibs. When that lib is the dynamic-Vulkan variant, ggml-vulkan logs
1248
+ // "Found 1 Vulkan devices: Mali-G715" + "offloaded N/N layers to GPU" to
1249
+ // logcat (the in-process GPU evidence). Returns JSON {ok,text,tokens,ms,tokS}.
1250
+ JNIEXPORT jstring JNICALL
1251
+ Java_ai_elizaos_app_ElizaVoiceNative_nativeLlmSelfTest(JNIEnv* env, jclass,
1252
+ jstring jBundleDir,
1253
+ jstring jPrompt,
1254
+ jint maxTokens) {
1255
+ const std::string bundleDir = from_jstring(env, jBundleDir);
1256
+ const std::string prompt = from_jstring(env, jPrompt);
1257
+ const int genCap = maxTokens > 0 ? maxTokens : 32;
1258
+ char* outError = nullptr;
1259
+
1260
+ EliInferenceContext* ctx =
1261
+ eliza_inference_create(bundleDir.c_str(), &outError);
1262
+ if (!ctx) { throw_runtime(env, "llmSelfTest: create", outError); return nullptr; }
1263
+
1264
+ int* tok = nullptr; size_t tn = 0;
1265
+ if (eliza_inference_tokenize(ctx, prompt.c_str(), prompt.size(), 1, 1, &tok,
1266
+ &tn, &outError) != ELIZA_OK) {
1267
+ eliza_inference_destroy(ctx);
1268
+ throw_runtime(env, "llmSelfTest: tokenize", outError);
1269
+ return nullptr;
1270
+ }
1271
+
1272
+ eliza_llm_stream_config_t cfg;
1273
+ std::memset(&cfg, 0, sizeof(cfg));
1274
+ cfg.max_tokens = genCap;
1275
+ cfg.temperature = 0.0f; // greedy, deterministic
1276
+ cfg.top_k = 1;
1277
+ cfg.top_p = 1.0f;
1278
+ cfg.repeat_penalty = 1.0f;
1279
+ cfg.n_gpu_layers = -1; // all-GPU when the vulkan lib is staged
1280
+ EliLlmStream* s = eliza_inference_llm_stream_open(ctx, &cfg, &outError);
1281
+ if (!s) {
1282
+ if (tok) eliza_inference_free_tokens(tok);
1283
+ eliza_inference_destroy(ctx);
1284
+ throw_runtime(env, "llmSelfTest: stream_open", outError);
1285
+ return nullptr;
1286
+ }
1287
+
1288
+ const double t0 = []() {
1289
+ timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);
1290
+ return ts.tv_sec * 1000.0 + ts.tv_nsec / 1e6;
1291
+ }();
1292
+ if (eliza_inference_llm_stream_prefill(s, reinterpret_cast<int32_t*>(tok),
1293
+ tn, &outError) != ELIZA_OK) {
1294
+ eliza_inference_llm_stream_close(s);
1295
+ if (tok) eliza_inference_free_tokens(tok);
1296
+ eliza_inference_destroy(ctx);
1297
+ throw_runtime(env, "llmSelfTest: prefill", outError);
1298
+ return nullptr;
1299
+ }
1300
+
1301
+ std::string text;
1302
+ int produced = 0;
1303
+ while (produced < genCap) {
1304
+ int32_t toks[256]; char chunk[4096]; size_t nout = 0;
1305
+ int32_t dd = 0, da = 0;
1306
+ const int rc = eliza_inference_llm_stream_next(
1307
+ s, toks, 256, &nout, chunk, sizeof(chunk), &dd, &da, &outError);
1308
+ if (rc < 0) break;
1309
+ text += chunk;
1310
+ produced += static_cast<int>(nout);
1311
+ if (rc == 1) break;
1312
+ }
1313
+ const double t1 = []() {
1314
+ timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);
1315
+ return ts.tv_sec * 1000.0 + ts.tv_nsec / 1e6;
1316
+ }();
1317
+ eliza_inference_llm_stream_close(s);
1318
+ if (tok) eliza_inference_free_tokens(tok);
1319
+ eliza_inference_destroy(ctx);
1320
+
1321
+ const double ms = t1 - t0;
1322
+ const double tokS = ms > 0 ? produced * 1000.0 / ms : 0.0;
1323
+ LOGI("LLM SELFTEST: generated %d tokens in %.0fms (%.2f tok/s) — \"%.80s\"",
1324
+ produced, ms, tokS, text.c_str());
1325
+
1326
+ // JSON-escape the generated text.
1327
+ std::string esc;
1328
+ for (char c : text) {
1329
+ switch (c) {
1330
+ case '"': esc += "\\\""; break;
1331
+ case '\\': esc += "\\\\"; break;
1332
+ case '\n': esc += "\\n"; break;
1333
+ case '\r': esc += "\\r"; break;
1334
+ case '\t': esc += "\\t"; break;
1335
+ default:
1336
+ if (static_cast<unsigned char>(c) < 0x20) {
1337
+ char b[8]; std::snprintf(b, sizeof(b), "\\u%04x",
1338
+ static_cast<unsigned char>(c));
1339
+ esc += b;
1340
+ } else esc += c;
1341
+ }
1342
+ }
1343
+ std::string json = "{\"ok\":true,\"tokens\":" + std::to_string(produced) +
1344
+ ",\"ms\":" + std::to_string(ms) + ",\"tokS\":" +
1345
+ std::to_string(tokS) + ",\"text\":\"" + esc + "\"}";
1346
+ return to_jstring(env, json);
1347
+ }
1348
+
1349
+ } // extern "C"