@elizaos/app-core 2.0.0-beta.2 → 2.0.3-beta.2

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