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

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 (360) hide show
  1. package/agent-bridge.d.ts +5 -5
  2. package/api/auth/audit.d.ts +1 -1
  3. package/api/auth/auth-context.d.ts +1 -1
  4. package/api/auth/bootstrap-token.d.ts +1 -1
  5. package/api/auth/sessions.d.ts +1 -1
  6. package/api/auth-bootstrap-routes.d.ts +1 -1
  7. package/api/auth-pairing-routes.d.ts +1 -1
  8. package/api/auth-pairing-routes.d.ts.map +1 -1
  9. package/api/auth-pairing-routes.js +2 -3
  10. package/api/auth-session-routes.d.ts +2 -2
  11. package/api/auth.d.ts +1 -1
  12. package/api/automations-compat-routes.d.ts +1 -1
  13. package/api/background-tasks-routes.d.ts +1 -1
  14. package/api/catalog-routes.d.ts +1 -1
  15. package/api/cloud-voice-routes.d.ts +1 -1
  16. package/api/compat-route-shared.d.ts +12 -5
  17. package/api/compat-route-shared.d.ts.map +1 -1
  18. package/api/compat-route-shared.js +22 -187
  19. package/api/database-rows-compat-routes.d.ts +1 -1
  20. package/api/dev-compat-routes.d.ts +1 -1
  21. package/api/dev-route-catalog.d.ts.map +1 -1
  22. package/api/dev-route-catalog.js +20 -0
  23. package/api/drop-status-compat-route.d.ts +3 -0
  24. package/api/drop-status-compat-route.d.ts.map +1 -0
  25. package/api/drop-status-compat-route.js +12 -0
  26. package/api/first-run-routes.d.ts +1 -1
  27. package/api/internal-routes.d.ts +1 -1
  28. package/api/runtime-mode-routes.d.ts +1 -1
  29. package/api/secrets-manager-routes.d.ts.map +1 -1
  30. package/api/sensitive-request-routes.d.ts +2 -2
  31. package/api/server-config-filter.d.ts.map +1 -1
  32. package/api/server-config-filter.js +0 -1
  33. package/api/server-first-run-helpers.d.ts.map +1 -1
  34. package/api/server-first-run-helpers.js +0 -3
  35. package/api/server.d.ts +8 -8
  36. package/api/server.d.ts.map +1 -1
  37. package/api/server.js +13 -59
  38. package/api/training-benchmarks.d.ts +1 -1
  39. package/api/training-benchmarks.d.ts.map +1 -1
  40. package/api/training-benchmarks.js +31 -9
  41. package/api/workbench-compat-routes.d.ts +1 -1
  42. package/benchmark/server-utils.d.ts +2 -2
  43. package/browser.d.ts +4 -4
  44. package/cli/plugins-cli.d.ts.map +1 -1
  45. package/cli/plugins-cli.js +5 -0
  46. package/cli/program/register.auth.d.ts +27 -1
  47. package/cli/program/register.auth.d.ts.map +1 -1
  48. package/cli/program/register.auth.js +187 -0
  49. package/cli/program/register.dashboard.d.ts.map +1 -1
  50. package/cli/program/register.dashboard.js +11 -1
  51. package/cli/program.d.ts +1 -1
  52. package/first-run/first-run-config.d.ts +1 -1
  53. package/index.d.ts +46 -47
  54. package/index.d.ts.map +1 -1
  55. package/index.js +3 -7
  56. package/package.json +42 -36
  57. package/packaging/PUBLISHING_GUIDE.md +20 -20
  58. package/platform/elizaos-agent-browser-stub.d.ts +0 -1
  59. package/platform/elizaos-agent-browser-stub.d.ts.map +1 -1
  60. package/platform/elizaos-agent-browser-stub.js +0 -1
  61. package/platform/ios-runtime-bridge.d.ts.map +1 -1
  62. package/platform/ios-runtime-bridge.js +0 -1
  63. package/platform/native-plugin-entrypoints.d.ts +2 -2
  64. package/platforms/android/app/build.gradle +30 -7
  65. package/platforms/android/app/src/main/elizavoice-jni/elizavoice-jni.cpp +179 -35
  66. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAgentService.java +60 -32
  67. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBionicInferenceServer.java +405 -65
  68. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceNative.java +35 -0
  69. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoicePlugin.java +13 -6
  70. package/platforms/android/app/src/main/res/drawable/splash.png +0 -0
  71. package/platforms/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
  72. package/platforms/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
  73. package/platforms/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
  74. package/platforms/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
  75. package/platforms/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
  76. package/platforms/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
  77. package/platforms/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
  78. package/platforms/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
  79. package/platforms/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
  80. package/platforms/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
  81. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  82. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
  83. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png +0 -0
  84. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  85. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  86. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
  87. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png +0 -0
  88. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  89. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  90. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
  91. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png +0 -0
  92. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  93. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  94. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
  95. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png +0 -0
  96. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  97. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  98. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
  99. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png +0 -0
  100. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  101. package/platforms/android/app/src/main/res/values/colors.xml +5 -1
  102. package/platforms/android/app/src/main/res/values/ic_launcher_background.xml +1 -1
  103. package/platforms/android/app/src/main/res/values/styles.xml +4 -1
  104. package/platforms/electrobun/electrobun.config.ts +0 -1
  105. package/platforms/electrobun/native/macos/window-effects.mm +4 -0
  106. package/platforms/electrobun/package.json +11 -9
  107. package/platforms/electrobun/remotes/local-model/src/bun/eliza1-catalog.ts +1 -1
  108. package/platforms/electrobun/remotes/runtime/src/dev/phase2-smoke.ts +10 -5
  109. package/platforms/electrobun/remotes/runtime/src/dev/phase3-smoke.ts +11 -15
  110. package/platforms/electrobun/src/application-menu.ts +0 -7
  111. package/platforms/electrobun/src/desktop-http-request.test.ts +30 -1
  112. package/platforms/electrobun/src/desktop-http-request.ts +14 -2
  113. package/platforms/electrobun/src/desktop-test-bridge-server.ts +28 -0
  114. package/platforms/electrobun/src/fatal-shutdown.test.ts +3 -7
  115. package/platforms/electrobun/src/index.ts +64 -13
  116. package/platforms/electrobun/src/lifecycle/api-base-owner.test.ts +83 -0
  117. package/platforms/electrobun/src/lifecycle/api-base-owner.ts +37 -16
  118. package/platforms/electrobun/src/native/agent.ts +28 -17
  119. package/platforms/electrobun/src/native/credentials.ts +6 -1
  120. package/platforms/electrobun/src/native/desktop-window.test.ts +142 -26
  121. package/platforms/electrobun/src/native/desktop.ts +8 -4
  122. package/platforms/electrobun/src/native/index.ts +6 -0
  123. package/platforms/electrobun/src/native/remote-plugin-host.ts +18 -8
  124. package/platforms/electrobun/src/preload.js +1 -1
  125. package/platforms/electrobun/src/voice/voice-live-validation.test.ts +10 -5
  126. package/platforms/electrobun/src/voice/voice-runtime-adapter.ts +3 -2
  127. package/platforms/electrobun/src/voice/voice-service.test.ts +26 -0
  128. package/platforms/electrobun/src/voice/voice-service.ts +57 -17
  129. package/platforms/electrobun/tsconfig.json +17 -1
  130. package/platforms/ios/App/App/Base.lproj/LaunchScreen.storyboard +4 -6
  131. package/registry/index.d.ts +1 -6
  132. package/registry/index.d.ts.map +1 -1
  133. package/registry/index.js +9 -101
  134. package/runtime/android-avf-microdroid-bridge.d.ts +1 -1
  135. package/runtime/bundled-fused-lib.d.ts +36 -0
  136. package/runtime/bundled-fused-lib.d.ts.map +1 -0
  137. package/runtime/bundled-fused-lib.js +77 -0
  138. package/runtime/channel-plugin-map.d.ts +1 -5
  139. package/runtime/channel-plugin-map.d.ts.map +1 -1
  140. package/runtime/channel-plugin-map.js +11 -31
  141. package/runtime/desktop/index.d.ts +5 -5
  142. package/runtime/dev-server.js +11 -2
  143. package/runtime/eliza.d.ts.map +1 -1
  144. package/runtime/eliza.js +18 -8
  145. package/runtime/mode/route-mode-guard.d.ts +1 -1
  146. package/runtime/mode/route-mode-matrix.d.ts +1 -1
  147. package/runtime/voice-warmup.d.ts +4 -19
  148. package/runtime/voice-warmup.d.ts.map +1 -1
  149. package/runtime/voice-warmup.js +4 -14
  150. package/scripts/aosp/README.md +10 -1
  151. package/scripts/aosp/compile-libllama-zig-pin.test.mjs +147 -0
  152. package/scripts/aosp/compile-libllama.mjs +446 -59
  153. package/scripts/aosp/compile-libllama.test.mjs +133 -0
  154. package/scripts/aosp/compile-shim.mjs +21 -1
  155. package/scripts/aosp/deploy-pixel.mjs +1 -1
  156. package/scripts/aosp/stage-default-models.mjs +24 -31
  157. package/scripts/aosp/stage-default-models.test.mjs +23 -0
  158. package/scripts/assert-required-bundled-packages.test.ts +22 -1
  159. package/scripts/build-helpers/verify-fused-symbols.mjs +33 -0
  160. package/scripts/build-helpers/verify-fused-symbols.test.mjs +0 -0
  161. package/scripts/build-image.sh +1 -3
  162. package/scripts/build-llama-cpp-mtp.mjs +17 -16
  163. package/scripts/check-i18n.mjs +0 -1
  164. package/scripts/copy-runtime-node-modules.ts +147 -0
  165. package/scripts/desktop-build.mjs +317 -4
  166. package/scripts/docker-ci-smoke.sh +33 -8
  167. package/scripts/ensure-type-package-aliases.mjs +1 -1
  168. package/scripts/ios-xcframework/run-physical-device-smoke.mjs +1 -1
  169. package/scripts/lib/agent-source-watcher.mjs +0 -1
  170. package/scripts/lib/artifact-staleness.d.mts +33 -0
  171. package/scripts/lib/artifact-staleness.mjs +122 -0
  172. package/scripts/lib/artifact-staleness.test.mts +98 -0
  173. package/scripts/lib/duet-bridge.mjs +1 -1
  174. package/scripts/lib/ios-plist-url-scheme.mjs +80 -0
  175. package/scripts/lib/mobile-build-decisions.mjs +97 -0
  176. package/scripts/lib/renderer-build-manifest.d.mts +65 -0
  177. package/scripts/lib/renderer-build-manifest.mjs +257 -0
  178. package/scripts/lib/renderer-build-manifest.test.mts +277 -0
  179. package/scripts/lib/stage-android-agent.mjs +13 -4
  180. package/scripts/lib/verify-ondevice-artifact.d.mts +16 -0
  181. package/scripts/lib/verify-ondevice-artifact.mjs +61 -0
  182. package/scripts/lib/verify-ondevice-artifact.test.mts +98 -0
  183. package/scripts/lib/websocket-pending-queue.ts +92 -0
  184. package/scripts/link-docker-local-app-packages.mjs +6 -0
  185. package/scripts/playwright-ui-live-stack.ts +430 -144
  186. package/scripts/playwright-ui-smoke-api-stub.mjs +160 -168
  187. package/scripts/run-local-plugin-live-smoke.mjs +1 -6
  188. package/scripts/run-mobile-build-brand-separation.test.mts +33 -0
  189. package/scripts/run-mobile-build-ios-engine-gate.test.mjs +85 -0
  190. package/scripts/run-mobile-build-mtp-staleness.test.mts +198 -0
  191. package/scripts/run-mobile-build.mjs +408 -86
  192. package/scripts/serve-real-local-agent.ts +72 -0
  193. package/scripts/stage-desktop-fused-lib.mjs +43 -14
  194. package/scripts/verify-ondevice-artifact.mjs +111 -0
  195. package/scripts/voice-attribution-smoke.ts +144 -38
  196. package/scripts/voice-duet.mjs +6 -6
  197. package/scripts/voice-e2e-hardware.ts +22 -16
  198. package/scripts/voice-interactive.mjs +16 -45
  199. package/security/agent-vault-id.d.ts +1 -1
  200. package/security/platform-secure-store-node.d.ts +1 -1
  201. package/services/ambient-audio/consent.d.ts +1 -1
  202. package/services/ambient-audio/index.d.ts +6 -6
  203. package/services/ambient-audio/replay-buffer.d.ts +1 -1
  204. package/services/ambient-audio/response-gate.d.ts +1 -1
  205. package/services/ambient-audio/service.d.ts +3 -3
  206. package/services/connector-target-catalog.d.ts +1 -1
  207. package/services/sensitive-requests/index.d.ts +6 -6
  208. package/services/steward-sidecar/wallet-setup.d.ts +1 -1
  209. package/services/steward-sidecar.d.ts +3 -3
  210. package/services/tunnel-to-mobile/index.d.ts +1 -1
  211. package/services/vault-bootstrap.d.ts.map +1 -1
  212. package/services/vault-bootstrap.js +14 -10
  213. package/services/voice-profiles/diarization-pipeline.d.ts +1 -1
  214. package/services/voice-profiles/index.d.ts +11 -11
  215. package/services/voice-profiles/owner-confidence.d.ts +1 -1
  216. package/services/voice-profiles/private-challenge.d.ts +1 -1
  217. package/services/voice-profiles/store.d.ts +1 -1
  218. package/test/helpers/live-provider.test.ts +91 -1
  219. package/test/helpers/live-provider.ts +195 -51
  220. package/test/scripts/websocket-pending-queue.test.ts +119 -0
  221. package/test-support/test-helpers.d.ts +0 -33
  222. package/test-support/test-helpers.d.ts.map +1 -1
  223. package/test-support/test-helpers.js +81 -189
  224. package/ui-compat.d.ts +1 -0
  225. package/ui-compat.d.ts.map +1 -1
  226. package/ui-compat.js +4 -0
  227. package/platforms/electrobun/docs/convergence-audit.json +0 -3505
  228. package/platforms/electrobun/docs/convergence-audit.md +0 -694
  229. package/platforms/electrobun/scripts/ensure-whisper-gguf.sh +0 -55
  230. package/platforms/electrobun/scripts/ensure-whisper-model.sh +0 -35
  231. package/platforms/electrobun/scripts/generate-convergence-audit.ts +0 -1203
  232. package/platforms/electrobun/src/native/whisper-env.test.ts +0 -71
  233. package/platforms/electrobun/src/native/whisper-env.ts +0 -68
  234. package/registry/app-registry.d.ts +0 -14
  235. package/registry/app-registry.d.ts.map +0 -1
  236. package/registry/app-registry.js +0 -29
  237. package/registry/entries/apps/app-polymarket.json +0 -31
  238. package/registry/entries/apps/clawville.json +0 -27
  239. package/registry/entries/apps/companion.json +0 -28
  240. package/registry/entries/apps/database-viewer.json +0 -27
  241. package/registry/entries/apps/defense-of-the-agents.json +0 -27
  242. package/registry/entries/apps/documents.json +0 -30
  243. package/registry/entries/apps/feed.json +0 -27
  244. package/registry/entries/apps/hyperliquid.json +0 -31
  245. package/registry/entries/apps/log-viewer.json +0 -27
  246. package/registry/entries/apps/memory-viewer.json +0 -27
  247. package/registry/entries/apps/model-tester.json +0 -31
  248. package/registry/entries/apps/plugin-viewer.json +0 -27
  249. package/registry/entries/apps/relationship-viewer.json +0 -27
  250. package/registry/entries/apps/runtime-debugger.json +0 -27
  251. package/registry/entries/apps/shopify.json +0 -31
  252. package/registry/entries/apps/skills-viewer.json +0 -27
  253. package/registry/entries/apps/steward.json +0 -31
  254. package/registry/entries/apps/training.json +0 -54
  255. package/registry/entries/apps/trajectory-viewer.json +0 -27
  256. package/registry/entries/apps/vincent.json +0 -31
  257. package/registry/entries/connectors/bluebubbles.json +0 -99
  258. package/registry/entries/connectors/bluesky.json +0 -173
  259. package/registry/entries/connectors/discord.json +0 -119
  260. package/registry/entries/connectors/farcaster.json +0 -174
  261. package/registry/entries/connectors/feishu.json +0 -79
  262. package/registry/entries/connectors/google-chat.json +0 -120
  263. package/registry/entries/connectors/google.json +0 -82
  264. package/registry/entries/connectors/imessage.json +0 -96
  265. package/registry/entries/connectors/instagram.json +0 -64
  266. package/registry/entries/connectors/line.json +0 -86
  267. package/registry/entries/connectors/matrix.json +0 -94
  268. package/registry/entries/connectors/mattermost.json +0 -110
  269. package/registry/entries/connectors/msteams.json +0 -104
  270. package/registry/entries/connectors/nextcloud-talk.json +0 -104
  271. package/registry/entries/connectors/nostr.json +0 -70
  272. package/registry/entries/connectors/signal.json +0 -81
  273. package/registry/entries/connectors/slack.json +0 -102
  274. package/registry/entries/connectors/telegram.json +0 -71
  275. package/registry/entries/connectors/tlon.json +0 -94
  276. package/registry/entries/connectors/twitch.json +0 -110
  277. package/registry/entries/connectors/whatsapp.json +0 -113
  278. package/registry/entries/connectors/x.json +0 -231
  279. package/registry/entries/connectors/zalo.json +0 -112
  280. package/registry/entries/connectors/zalouser.json +0 -122
  281. package/registry/entries/plugins/agent-orchestrator.json +0 -33
  282. package/registry/entries/plugins/agent-skills.json +0 -72
  283. package/registry/entries/plugins/anthropic.json +0 -73
  284. package/registry/entries/plugins/app-control.json +0 -23
  285. package/registry/entries/plugins/auto-trader.json +0 -203
  286. package/registry/entries/plugins/background-runner.json +0 -26
  287. package/registry/entries/plugins/blooio.json +0 -102
  288. package/registry/entries/plugins/browser.json +0 -75
  289. package/registry/entries/plugins/cli.json +0 -40
  290. package/registry/entries/plugins/clipboard.json +0 -44
  291. package/registry/entries/plugins/coding-tools.json +0 -71
  292. package/registry/entries/plugins/commands.json +0 -63
  293. package/registry/entries/plugins/computeruse.json +0 -74
  294. package/registry/entries/plugins/copilot-proxy.json +0 -93
  295. package/registry/entries/plugins/directives.json +0 -63
  296. package/registry/entries/plugins/edge-tts.json +0 -97
  297. package/registry/entries/plugins/elevenlabs.json +0 -169
  298. package/registry/entries/plugins/elizacloud.json +0 -208
  299. package/registry/entries/plugins/evm.json +0 -134
  300. package/registry/entries/plugins/experience.json +0 -34
  301. package/registry/entries/plugins/facewear.json +0 -131
  302. package/registry/entries/plugins/form.json +0 -26
  303. package/registry/entries/plugins/github.json +0 -93
  304. package/registry/entries/plugins/gmail-watch.json +0 -25
  305. package/registry/entries/plugins/goals.json +0 -77
  306. package/registry/entries/plugins/google-genai.json +0 -106
  307. package/registry/entries/plugins/groq.json +0 -93
  308. package/registry/entries/plugins/hedera.json +0 -48
  309. package/registry/entries/plugins/inmemorydb.json +0 -25
  310. package/registry/entries/plugins/linear.json +0 -51
  311. package/registry/entries/plugins/local-inference.json +0 -137
  312. package/registry/entries/plugins/local-storage.json +0 -36
  313. package/registry/entries/plugins/localdb.json +0 -25
  314. package/registry/entries/plugins/mcp.json +0 -44
  315. package/registry/entries/plugins/memory.json +0 -124
  316. package/registry/entries/plugins/minecraft.json +0 -79
  317. package/registry/entries/plugins/moltbook.json +0 -83
  318. package/registry/entries/plugins/music.json +0 -155
  319. package/registry/entries/plugins/mysticism.json +0 -48
  320. package/registry/entries/plugins/nearai.json +0 -82
  321. package/registry/entries/plugins/ngrok.json +0 -69
  322. package/registry/entries/plugins/ollama.json +0 -96
  323. package/registry/entries/plugins/openai.json +0 -189
  324. package/registry/entries/plugins/openrouter.json +0 -188
  325. package/registry/entries/plugins/pdf.json +0 -26
  326. package/registry/entries/plugins/plugin-manager.json +0 -23
  327. package/registry/entries/plugins/prose.json +0 -48
  328. package/registry/entries/plugins/rlm.json +0 -26
  329. package/registry/entries/plugins/roblox.json +0 -88
  330. package/registry/entries/plugins/rss.json +0 -64
  331. package/registry/entries/plugins/s3-storage.json +0 -91
  332. package/registry/entries/plugins/scheduling.json +0 -35
  333. package/registry/entries/plugins/shell.json +0 -94
  334. package/registry/entries/plugins/social-alpha.json +0 -72
  335. package/registry/entries/plugins/tailscale.json +0 -81
  336. package/registry/entries/plugins/tee.json +0 -53
  337. package/registry/entries/plugins/todos.json +0 -26
  338. package/registry/entries/plugins/trajectory-logger.json +0 -33
  339. package/registry/entries/plugins/trust.json +0 -39
  340. package/registry/entries/plugins/tts.json +0 -71
  341. package/registry/entries/plugins/tunnel.json +0 -45
  342. package/registry/entries/plugins/twilio.json +0 -168
  343. package/registry/entries/plugins/vercel-ai-gateway.json +0 -128
  344. package/registry/entries/plugins/video.json +0 -23
  345. package/registry/entries/plugins/vision.json +0 -43
  346. package/registry/entries/plugins/webhooks.json +0 -23
  347. package/registry/entries/plugins/workflow.json +0 -25
  348. package/registry/entries/plugins/xai.json +0 -75
  349. package/registry/loader.d.ts +0 -28
  350. package/registry/loader.d.ts.map +0 -1
  351. package/registry/loader.js +0 -158
  352. package/registry/schema.d.ts +0 -1199
  353. package/registry/schema.d.ts.map +0 -1
  354. package/registry/schema.js +0 -300
  355. package/scripts/patches/llama-mobile-kokoro-tts.patch +0 -480
  356. package/scripts/release-workflow-drift.test.ts +0 -57
  357. package/test/helpers/i18n.ts +0 -5
  358. package/test/helpers/loopback.ts +0 -33
  359. package/test/helpers/react-test.ts +0 -40
  360. package/test/helpers/skip-without.ts +0 -53
@@ -1218,7 +1218,9 @@ export class RemotePluginHost {
1218
1218
  ): Promise<JsonValue> {
1219
1219
  switch (method) {
1220
1220
  case "list-remote-plugins":
1221
- return this.listRemotePlugins() as unknown as JsonValue;
1221
+ return JSON.parse(
1222
+ JSON.stringify(this.listRemotePlugins()),
1223
+ ) as JsonValue;
1222
1224
  case "start-remote-plugin": {
1223
1225
  this.requireManageRemotePlugins(callerId, "start-remote-plugin");
1224
1226
  const targetId = hostRequestStringField(params, "id");
@@ -1233,18 +1235,26 @@ export class RemotePluginHost {
1233
1235
  }
1234
1236
  case "agent-manager-start":
1235
1237
  this.requireManageRemotePlugins(callerId, "agent-manager-start");
1236
- return (await getAgentManager().start()) as unknown as JsonValue;
1238
+ return JSON.parse(
1239
+ JSON.stringify(await getAgentManager().start()),
1240
+ ) as JsonValue;
1237
1241
  case "agent-manager-stop": {
1238
1242
  this.requireManageRemotePlugins(callerId, "agent-manager-stop");
1239
1243
  await getAgentManager().stop();
1240
- return getAgentManager().getStatus() as unknown as JsonValue;
1244
+ return JSON.parse(
1245
+ JSON.stringify(getAgentManager().getStatus()),
1246
+ ) as JsonValue;
1241
1247
  }
1242
1248
  case "agent-manager-restart":
1243
1249
  this.requireManageRemotePlugins(callerId, "agent-manager-restart");
1244
- return (await getAgentManager().restart()) as unknown as JsonValue;
1250
+ return JSON.parse(
1251
+ JSON.stringify(await getAgentManager().restart()),
1252
+ ) as JsonValue;
1245
1253
  case "agent-manager-status":
1246
1254
  this.requireManageRemotePlugins(callerId, "agent-manager-status");
1247
- return getAgentManager().getStatus() as unknown as JsonValue;
1255
+ return JSON.parse(
1256
+ JSON.stringify(getAgentManager().getStatus()),
1257
+ ) as JsonValue;
1248
1258
  case "agent-manager-health":
1249
1259
  this.requireManageRemotePlugins(callerId, "agent-manager-health");
1250
1260
  return this.readAgentManagerHealth();
@@ -1383,7 +1393,7 @@ export class RemotePluginHost {
1383
1393
  path: "/api/health",
1384
1394
  status: null,
1385
1395
  error: "AgentManager has no active API port.",
1386
- agentStatus: status as unknown as JsonValue,
1396
+ agentStatus: JSON.parse(JSON.stringify(status)) as JsonValue,
1387
1397
  };
1388
1398
  }
1389
1399
  const apiBase = `http://127.0.0.1:${status.port}`;
@@ -1397,7 +1407,7 @@ export class RemotePluginHost {
1397
1407
  path: "/api/health",
1398
1408
  status: response.status,
1399
1409
  body: await response.text(),
1400
- agentStatus: status as unknown as JsonValue,
1410
+ agentStatus: JSON.parse(JSON.stringify(status)) as JsonValue,
1401
1411
  };
1402
1412
  } catch (error) {
1403
1413
  return {
@@ -1406,7 +1416,7 @@ export class RemotePluginHost {
1406
1416
  path: "/api/health",
1407
1417
  status: null,
1408
1418
  error: error instanceof Error ? error.message : String(error),
1409
- agentStatus: status as unknown as JsonValue,
1419
+ agentStatus: JSON.parse(JSON.stringify(status)) as JsonValue,
1410
1420
  };
1411
1421
  }
1412
1422
  }
@@ -1 +1 @@
1
- (()=>{function S(e,t){let r=e.map((n)=>`"${n}"`).join(", ");return Error(`This RPC instance cannot ${t} because the transport did not provide one or more of these methods: ${r}`)}function I(e={}){let t={},r={},n=void 0;function o(s){if(r.unregisterHandler)r.unregisterHandler();r=s,r.registerHandler?.($)}function c(s){if(typeof s==="function"){n=s;return}n=(i,u)=>{let p=s[i];if(p)return p(u);let g=s._;if(!g)throw Error(`The requested method has no handler: ${String(i)}`);return g(i,u)}}let{maxRequestTime:a=1000}=e;if(e.transport)o(e.transport);if(e.requestHandler)c(e.requestHandler);if(e._debugHooks)t=e._debugHooks;let R=0;function m(){if(R<=10000000000)return++R;return R=0}let d=new Map,l=new Map;function w(s,...i){let u=i[0];return new Promise((p,g)=>{if(!r.send)throw S(["send"],"make requests");let f=m(),B={type:"request",id:f,method:s,params:u};if(d.set(f,{resolve:p,reject:g}),a!==1/0)l.set(f,setTimeout(()=>{l.delete(f),d.delete(f),g(Error("RPC request timed out."))},a));t.onSend?.(B),r.send(B)})}let q=new Proxy(w,{get:(s,i,u)=>{if(i in s)return Reflect.get(s,i,u);return(p)=>w(i,p)}}),x=q;function T(s,...i){let u=i[0];if(!r.send)throw S(["send"],"send messages");let p={type:"message",id:s,payload:u};t.onSend?.(p),r.send(p)}let v=new Proxy(T,{get:(s,i,u)=>{if(i in s)return Reflect.get(s,i,u);return(p)=>T(i,p)}}),O=v,h=new Map,b=new Set;function Y(s,i){if(!r.registerHandler)throw S(["registerHandler"],"register message listeners");if(s==="*"){b.add(i);return}if(!h.has(s))h.set(s,new Set);h.get(s).add(i)}function U(s,i){if(s==="*"){b.delete(i);return}if(h.get(s)?.delete(i),h.get(s)?.size===0)h.delete(s)}async function $(s){if(t.onReceive?.(s),!("type"in s))throw Error("Message does not contain a type.");if(s.type==="request"){if(!r.send||!n)throw S(["send","requestHandler"],"handle requests");let{id:i,method:u,params:p}=s,g;try{g={type:"response",id:i,success:!0,payload:await n(u,p)}}catch(f){if(!(f instanceof Error))throw f;g={type:"response",id:i,success:!1,error:f.message}}t.onSend?.(g),r.send(g);return}if(s.type==="response"){let i=l.get(s.id);if(i!=null)clearTimeout(i);l.delete(s.id);let{resolve:u,reject:p}=d.get(s.id)??{};if(d.delete(s.id),!s.success)p?.(Error(s.error));else u?.(s.payload);return}if(s.type==="message"){for(let u of b)u(s.id,s.payload);let i=h.get(s.id);if(!i)return;for(let u of i)u(s.payload);return}throw Error(`Unexpected RPC message type: ${s.type}`)}return{setTransport:o,setRequestHandler:c,request:q,requestProxy:x,send:v,sendProxy:O,addMessageListener:Y,removeMessageListener:U,proxy:{send:O,request:x}}}function H(e,t){let r={maxRequestTime:t.maxRequestTime,requestHandler:{...t.handlers.requests,...t.extraRequestHandlers},transport:{registerHandler:()=>{}}},n=I(r),o=t.handlers.messages;if(o)n.addMessageListener("*",(c,a)=>{let R=o["*"];if(R)R(c,a);let m=o[c];if(m)m(a)});return n}var{__electrobunWebviewId:L,__electrobunRpcSocketPort:W}=window;class P{bunSocket;rpc;rpcHandler;constructor(e){this.rpc=e.rpc,this.init()}init(){if(this.initSocketToBun(),window.__electrobun.receiveMessageFromBun=this.receiveMessageFromBun.bind(this),this.rpc)this.rpc.setTransport(this.createTransport())}initSocketToBun(){if(!W||!L)return;let e=new WebSocket(`ws://localhost:${W}/socket?webviewId=${L}`);this.bunSocket=e,e.addEventListener("open",()=>{}),e.addEventListener("message",async(t)=>{let r=t.data;if(typeof r==="string")try{let n=JSON.parse(r),o=await window.__electrobun_decrypt(n.encryptedData,n.iv,n.tag);this.rpcHandler?.(JSON.parse(o))}catch(n){console.error("Error parsing bun message:",n)}else if(r instanceof Blob);else console.error("UNKNOWN DATA TYPE RECEIVED:",t.data)}),e.addEventListener("error",(t)=>{console.error("Socket error:",t)}),e.addEventListener("close",(t)=>{})}createTransport(){let e=this;return{send(t){try{let r=JSON.stringify(t);e.bunBridge(r)}catch(r){console.error("bun: failed to serialize message to webview",r)}},registerHandler(t){e.rpcHandler=t}}}async bunBridge(e){if(this.bunSocket?.readyState===WebSocket.OPEN)try{let{encryptedData:t,iv:r,tag:n}=await window.__electrobun_encrypt(e),c=JSON.stringify({encryptedData:t,iv:r,tag:n});this.bunSocket.send(c);return}catch(t){console.error("Error sending message to bun via socket:",t)}window.__electrobunBunBridge?.postMessage(e)}receiveMessageFromBun(e){if(this.rpcHandler)this.rpcHandler(e)}static defineRPC(e){return H("webview",{...e,extraRequestHandlers:{evaluateJavascriptWithResponse:({script:t})=>{return new Promise((r)=>{try{let o=Function(t)();if(o instanceof Promise)o.then((c)=>{r(c)}).catch((c)=>{console.error("bun: async script execution failed",c),r(String(c))});else r(o)}catch(n){console.error("bun: failed to eval script",n),r(String(n))}})}}})}}function C(e,t){if(e===404&&z(t))return null;return e>=500?"error":"warn"}function z(e){let t=e?.method?.toUpperCase()??"GET";if(t!=="GET"&&t!=="HEAD")return!1;let r=e?.url;if(!r)return!1;let n=r;try{n=new URL(r,"http://localhost").pathname}catch{n=r.split("?")[0]??r}return n==="/api/vincent/status"}var A={evaluate:async(e)=>({ok:!1,error:`BrowserWorkspaceView is not mounted — cannot evaluate tab ${e}`}),getTabRect:async()=>null};function E(){if(typeof window>"u")return A;return window.__ELIZA_BROWSER_TABS_REGISTRY__??A}var Z=Symbol.for("elizaos.app.boot-config"),F=Z;function N(e,t){let n={...e.__ELIZAOS_APP_BOOT_CONFIG__??e.__ELIZA_APP_BOOT_CONFIG__??e[F]?.current??{},...t};return e.__ELIZAOS_APP_BOOT_CONFIG__=n,e.__ELIZA_APP_BOOT_CONFIG__=n,e[F]={current:n},n}function D(){if(typeof window.__electrobun>"u")window.__electrobun={receiveMessageFromBun:(e)=>{},receiveInternalMessageFromBun:(e)=>{}}}var y={},K="__ELIZA_ELECTROBUN_LOG_MIRROR__";function G(e){if(!e||typeof e!=="object")throw Error("Electrobun RPC params must be an object");return e}function k(e,t){let r=e[t];if(typeof r!=="string")throw Error(`Electrobun RPC param "${t}" must be a string`);return r}function j(e,t){let r=e[t];if(typeof r!=="number"||!Number.isFinite(r))throw Error(`Electrobun RPC param "${t}" must be a finite number`);return r}D();function X(e,t){if(e==="apiBaseUpdate"){let n=t;if(window.__ELIZA_API_BASE__=n.base,n.token)Object.defineProperty(window,"__ELIZA_API_TOKEN__",{value:n.token,configurable:!0,writable:!0,enumerable:!1});N(window,{apiBase:n.base,...n.token?{apiToken:n.token}:{}})}let r=y[e];if(!r)return;for(let n of Array.from(r))try{n(t)}catch(o){console.error(`[ElectrobunBridge] Listener error for ${e}:`,o)}}function J(e,t){if(typeof e==="string")X(e,t)}var _=P.defineRPC({maxRequestTime:600000,handlers:{requests:{browserWorkspaceRendererEvaluate:async(e)=>{let t=G(e),r=k(t,"id"),n=k(t,"script"),o=j(t,"timeoutMs");return await E().evaluate(r,n,o)},browserWorkspaceRendererGetTabRect:async(e)=>{let t=G(e);return E().getTabRect(k(t,"id"))}},messages:{"*":J}}});new P({rpc:_});function M(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};return e}var V=new Proxy(_.request,{get(e,t,r){let n=Reflect.get(e,t,r);if(typeof n!=="function")return n;return async(o)=>{try{return await n.call(e,o)}catch(c){throw _.request.rendererReportDiagnostic({level:"error",source:"rpc",message:`Electrobun RPC request failed: ${String(t)}`,details:M(c)}).catch(()=>{}),c}}}}),Q={request:V,onMessage:(e,t)=>{if(!y[e])y[e]=new Set;y[e].add(t)},offMessage:(e,t)=>{if(y[e]?.delete(t),y[e]?.size===0)delete y[e]}};window.__ELIZA_ELECTROBUN_RPC__=Q;function ee(){let e=window;if(e[K])return;e[K]=!0;let t=(n,o,c,a)=>{_.request.rendererReportDiagnostic({level:n,source:o,message:c,details:a}).catch(()=>{})},r=["log","info","warn","error"];for(let n of r){let o=console[n].bind(console);console[n]=(...c)=>{o(...c),t(n,"console",c.map((a)=>{if(typeof a==="string")return a;try{return JSON.stringify(a)}catch{return String(a)}}).join(" "))}}if(window.addEventListener("error",(n)=>{let o=n.target;if(o&&(o.src||o.href)){t("error","resource","Failed to load resource",{tagName:o.tagName,src:o.src,href:o.href});return}t("error","window.onerror",n.message||"Unhandled window error",{filename:n.filename,lineno:n.lineno,colno:n.colno})},!0),window.addEventListener("unhandledrejection",(n)=>{t("error","unhandledrejection","Unhandled promise rejection",M(n.reason))}),typeof window.fetch==="function"){let n=window.fetch.bind(window);window.fetch=async(...o)=>{let c=Date.now(),a=o[0],R=o[1],m=typeof a==="string"?a:a instanceof Request?a.url:String(a),d=R?.method??(a instanceof Request?a.method:void 0)??"GET";try{let l=await n(...o),w=l.ok?null:C(l.status,{url:m,method:d});if(w)t(w,"fetch",`HTTP ${l.status} ${l.statusText}`,{url:m,method:d,durationMs:Date.now()-c});return l}catch(l){throw t("error","fetch","Fetch failed",{url:m,method:d,durationMs:Date.now()-c,error:M(l)}),l}}}if(typeof XMLHttpRequest<"u"){let n=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(c,a,...R){return this.__elizaDiag={method:c,url:String(a),startedAt:Date.now()},n.call(this,c,a,...R)},XMLHttpRequest.prototype.send=function(...c){let a=this,R=()=>{let d=a.__elizaDiag;if(!d)return;let l=a.status>=400?C(a.status,{url:d.url,method:d.method}):null;if(l)t(l,"xhr",`HTTP ${a.status}`,{url:d.url,method:d.method,durationMs:Date.now()-d.startedAt})},m=()=>{let d=a.__elizaDiag;t("error","xhr","XMLHttpRequest failed",{url:d?.url,method:d?.method,durationMs:d?Date.now()-d.startedAt:void 0})};return a.addEventListener("loadend",R,{once:!0}),a.addEventListener("error",m,{once:!0}),o.call(this,...c)}}}ee();})();
1
+ (()=>{function S(e,t){let r=e.map((n)=>`"${n}"`).join(", ");return Error(`This RPC instance cannot ${t} because the transport did not provide one or more of these methods: ${r}`)}function I(e={}){let t={},r={},n=void 0;function o(s){if(r.unregisterHandler)r.unregisterHandler();r=s,r.registerHandler?.($)}function c(s){if(typeof s==="function"){n=s;return}n=(i,u)=>{let p=s[i];if(p)return p(u);let g=s._;if(!g)throw Error(`The requested method has no handler: ${String(i)}`);return g(i,u)}}let{maxRequestTime:a=1000}=e;if(e.transport)o(e.transport);if(e.requestHandler)c(e.requestHandler);if(e._debugHooks)t=e._debugHooks;let R=0;function m(){if(R<=10000000000)return++R;return R=0}let d=new Map,l=new Map;function w(s,...i){let u=i[0];return new Promise((p,g)=>{if(!r.send)throw S(["send"],"make requests");let f=m(),B={type:"request",id:f,method:s,params:u};if(d.set(f,{resolve:p,reject:g}),a!==1/0)l.set(f,setTimeout(()=>{l.delete(f),d.delete(f),g(Error("RPC request timed out."))},a));t.onSend?.(B),r.send(B)})}let q=new Proxy(w,{get:(s,i,u)=>{if(i in s)return Reflect.get(s,i,u);return(p)=>w(i,p)}}),x=q;function T(s,...i){let u=i[0];if(!r.send)throw S(["send"],"send messages");let p={type:"message",id:s,payload:u};t.onSend?.(p),r.send(p)}let v=new Proxy(T,{get:(s,i,u)=>{if(i in s)return Reflect.get(s,i,u);return(p)=>T(i,p)}}),O=v,h=new Map,b=new Set;function Y(s,i){if(!r.registerHandler)throw S(["registerHandler"],"register message listeners");if(s==="*"){b.add(i);return}if(!h.has(s))h.set(s,new Set);h.get(s).add(i)}function U(s,i){if(s==="*"){b.delete(i);return}if(h.get(s)?.delete(i),h.get(s)?.size===0)h.delete(s)}async function $(s){if(t.onReceive?.(s),!("type"in s))throw Error("Message does not contain a type.");if(s.type==="request"){if(!r.send||!n)throw S(["send","requestHandler"],"handle requests");let{id:i,method:u,params:p}=s,g;try{g={type:"response",id:i,success:!0,payload:await n(u,p)}}catch(f){if(!(f instanceof Error))throw f;g={type:"response",id:i,success:!1,error:f.message}}t.onSend?.(g),r.send(g);return}if(s.type==="response"){let i=l.get(s.id);if(i!=null)clearTimeout(i);l.delete(s.id);let{resolve:u,reject:p}=d.get(s.id)??{};if(d.delete(s.id),!s.success)p?.(Error(s.error));else u?.(s.payload);return}if(s.type==="message"){for(let u of b)u(s.id,s.payload);let i=h.get(s.id);if(!i)return;for(let u of i)u(s.payload);return}throw Error(`Unexpected RPC message type: ${s.type}`)}return{setTransport:o,setRequestHandler:c,request:q,requestProxy:x,send:v,sendProxy:O,addMessageListener:Y,removeMessageListener:U,proxy:{send:O,request:x}}}function H(e,t){let r={maxRequestTime:t.maxRequestTime,requestHandler:{...t.handlers.requests,...t.extraRequestHandlers},transport:{registerHandler:()=>{}}},n=I(r),o=t.handlers.messages;if(o)n.addMessageListener("*",(c,a)=>{let R=o["*"];if(R)R(c,a);let m=o[c];if(m)m(a)});return n}var{__electrobunWebviewId:L,__electrobunRpcSocketPort:W}=window;class P{bunSocket;rpc;rpcHandler;constructor(e){this.rpc=e.rpc,this.init()}init(){if(this.initSocketToBun(),window.__electrobun.receiveMessageFromBun=this.receiveMessageFromBun.bind(this),this.rpc)this.rpc.setTransport(this.createTransport())}initSocketToBun(){if(!W||!L)return;let e=new WebSocket(`ws://localhost:${W}/socket?webviewId=${L}`);this.bunSocket=e,e.addEventListener("open",()=>{}),e.addEventListener("message",async(t)=>{let r=t.data;if(typeof r==="string")try{let n=JSON.parse(r),o=await window.__electrobun_decrypt(n.encryptedData,n.iv,n.tag);this.rpcHandler?.(JSON.parse(o))}catch(n){console.error("Error parsing bun message:",n)}else if(r instanceof Blob);else console.error("UNKNOWN DATA TYPE RECEIVED:",t.data)}),e.addEventListener("error",(t)=>{console.error("Socket error:",t)}),e.addEventListener("close",(t)=>{})}createTransport(){let e=this;return{send(t){try{let r=JSON.stringify(t);e.bunBridge(r)}catch(r){console.error("bun: failed to serialize message to webview",r)}},registerHandler(t){e.rpcHandler=t}}}async bunBridge(e){if(this.bunSocket?.readyState===WebSocket.OPEN)try{let{encryptedData:t,iv:r,tag:n}=await window.__electrobun_encrypt(e),c=JSON.stringify({encryptedData:t,iv:r,tag:n});this.bunSocket.send(c);return}catch(t){console.error("Error sending message to bun via socket:",t)}window.__electrobunBunBridge?.postMessage(e)}receiveMessageFromBun(e){if(this.rpcHandler)this.rpcHandler(e)}static defineRPC(e){return H("webview",{...e,extraRequestHandlers:{evaluateJavascriptWithResponse:({script:t})=>new Promise((r)=>{try{let o=Function(t)();if(o instanceof Promise)o.then((c)=>{r(c)}).catch((c)=>{console.error("bun: async script execution failed",c),r(String(c))});else r(o)}catch(n){console.error("bun: failed to eval script",n),r(String(n))}})}})}}function C(e,t){if(e===404&&z(t))return null;return e>=500?"error":"warn"}function z(e){let t=e?.method?.toUpperCase()??"GET";if(t!=="GET"&&t!=="HEAD")return!1;let r=e?.url;if(!r)return!1;let n=r;try{n=new URL(r,"http://localhost").pathname}catch{n=r.split("?")[0]??r}return n==="/api/vincent/status"}var A={evaluate:async(e)=>({ok:!1,error:`BrowserWorkspaceView is not mounted — cannot evaluate tab ${e}`}),getTabRect:async()=>null};function E(){if(typeof window>"u")return A;return window.__ELIZA_BROWSER_TABS_REGISTRY__??A}var Z=Symbol.for("elizaos.app.boot-config"),F=Z;function N(e,t){let n={...e.__ELIZAOS_APP_BOOT_CONFIG__??e.__ELIZA_APP_BOOT_CONFIG__??e[F]?.current??{},...t};return e.__ELIZAOS_APP_BOOT_CONFIG__=n,e.__ELIZA_APP_BOOT_CONFIG__=n,e[F]={current:n},n}function D(){if(typeof window.__electrobun>"u")window.__electrobun={receiveMessageFromBun:(e)=>{},receiveInternalMessageFromBun:(e)=>{}}}var y={},K="__ELIZA_ELECTROBUN_LOG_MIRROR__";function G(e){if(!e||typeof e!=="object")throw Error("Electrobun RPC params must be an object");return e}function k(e,t){let r=e[t];if(typeof r!=="string")throw Error(`Electrobun RPC param "${t}" must be a string`);return r}function j(e,t){let r=e[t];if(typeof r!=="number"||!Number.isFinite(r))throw Error(`Electrobun RPC param "${t}" must be a finite number`);return r}D();function X(e,t){if(e==="apiBaseUpdate"){let n=t;if(window.__ELIZA_API_BASE__=n.base,n.token)Object.defineProperty(window,"__ELIZA_API_TOKEN__",{value:n.token,configurable:!0,writable:!0,enumerable:!1});N(window,{apiBase:n.base,...n.token?{apiToken:n.token}:{}})}let r=y[e];if(!r)return;for(let n of Array.from(r))try{n(t)}catch(o){console.error(`[ElectrobunBridge] Listener error for ${e}:`,o)}}function J(e,t){if(typeof e==="string")X(e,t)}var _=P.defineRPC({maxRequestTime:600000,handlers:{requests:{browserWorkspaceRendererEvaluate:async(e)=>{let t=G(e),r=k(t,"id"),n=k(t,"script"),o=j(t,"timeoutMs");return await E().evaluate(r,n,o)},browserWorkspaceRendererGetTabRect:async(e)=>{let t=G(e);return E().getTabRect(k(t,"id"))}},messages:{"*":J}}});new P({rpc:_});function M(e){if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack};return e}var V=new Proxy(_.request,{get(e,t,r){let n=Reflect.get(e,t,r);if(typeof n!=="function")return n;return async(o)=>{try{return await n.call(e,o)}catch(c){throw _.request.rendererReportDiagnostic({level:"error",source:"rpc",message:`Electrobun RPC request failed: ${String(t)}`,details:M(c)}).catch(()=>{}),c}}}}),Q={request:V,onMessage:(e,t)=>{if(!y[e])y[e]=new Set;y[e].add(t)},offMessage:(e,t)=>{if(y[e]?.delete(t),y[e]?.size===0)delete y[e]}};window.__ELIZA_ELECTROBUN_RPC__=Q;function ee(){let e=window;if(e[K])return;e[K]=!0;let t=(n,o,c,a)=>{_.request.rendererReportDiagnostic({level:n,source:o,message:c,details:a}).catch(()=>{})},r=["log","info","warn","error"];for(let n of r){let o=console[n].bind(console);console[n]=(...c)=>{o(...c),t(n,"console",c.map((a)=>{if(typeof a==="string")return a;try{return JSON.stringify(a)}catch{return String(a)}}).join(" "))}}if(window.addEventListener("error",(n)=>{let o=n.target;if(o&&(o.src||o.href)){t("error","resource","Failed to load resource",{tagName:o.tagName,src:o.src,href:o.href});return}t("error","window.onerror",n.message||"Unhandled window error",{filename:n.filename,lineno:n.lineno,colno:n.colno})},!0),window.addEventListener("unhandledrejection",(n)=>{t("error","unhandledrejection","Unhandled promise rejection",M(n.reason))}),typeof window.fetch==="function"){let n=window.fetch.bind(window);window.fetch=async(...o)=>{let c=Date.now(),a=o[0],R=o[1],m=typeof a==="string"?a:a instanceof Request?a.url:String(a),d=R?.method??(a instanceof Request?a.method:void 0)??"GET";try{let l=await n(...o),w=l.ok?null:C(l.status,{url:m,method:d});if(w)t(w,"fetch",`HTTP ${l.status} ${l.statusText}`,{url:m,method:d,durationMs:Date.now()-c});return l}catch(l){throw t("error","fetch","Fetch failed",{url:m,method:d,durationMs:Date.now()-c,error:M(l)}),l}}}if(typeof XMLHttpRequest<"u"){let n=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(c,a,...R){return this.__elizaDiag={method:c,url:String(a),startedAt:Date.now()},n.call(this,c,a,...R)},XMLHttpRequest.prototype.send=function(...c){let a=this,R=()=>{let d=a.__elizaDiag;if(!d)return;let l=a.status>=400?C(a.status,{url:d.url,method:d.method}):null;if(l)t(l,"xhr",`HTTP ${a.status}`,{url:d.url,method:d.method,durationMs:Date.now()-d.startedAt})},m=()=>{let d=a.__elizaDiag;t("error","xhr","XMLHttpRequest failed",{url:d?.url,method:d?.method,durationMs:d?Date.now()-d.startedAt:void 0})};return a.addEventListener("loadend",R,{once:!0}),a.addEventListener("error",m,{once:!0}),o.call(this,...c)}}}ee();})();
@@ -315,11 +315,16 @@ describe("runVoiceLiveValidation", () => {
315
315
  });
316
316
 
317
317
  expect(report.mode).toBe("full");
318
- expect(
319
- report.budgetResults?.find(
320
- (result) => result.stage === "runtime_to_first_token",
321
- ),
322
- ).toMatchObject({ ok: false, actualMs: 30, budgetMs: 1 });
318
+ const runtimeBudget = report.budgetResults?.find(
319
+ (result) => result.stage === "runtime_to_first_token",
320
+ );
321
+ expect(runtimeBudget).toMatchObject({
322
+ ok: false,
323
+ stage: "runtime_to_first_token",
324
+ budgetMs: 1,
325
+ });
326
+ expect(runtimeBudget?.actualMs).toEqual(expect.any(Number));
327
+ expect(runtimeBudget?.actualMs).toBeGreaterThan(1);
323
328
  expect(
324
329
  report.recommendations.some((item) =>
325
330
  item.includes("runtime_to_first_token missed budget"),
@@ -666,12 +666,13 @@ export async function* parseVoiceSseStream(
666
666
  const { value, done } = await reader.read();
667
667
  if (done) break;
668
668
  buffer += decoder.decode(value, { stream: true });
669
- let nl: number;
670
- while ((nl = buffer.indexOf("\n")) >= 0) {
669
+ let nl = buffer.indexOf("\n");
670
+ while (nl >= 0) {
671
671
  const line = buffer.slice(0, nl);
672
672
  buffer = buffer.slice(nl + 1);
673
673
  const frame = handle(line);
674
674
  if (frame) yield frame;
675
+ nl = buffer.indexOf("\n");
675
676
  }
676
677
  }
677
678
  const tail = handle(buffer);
@@ -58,6 +58,7 @@ class MockVoiceRuntimeAdapter implements VoiceRuntimeAdapter {
58
58
  played = false;
59
59
  runtimeHandedOff = false;
60
60
  runtimeHandoffCount = 0;
61
+ lastHandoffParams: VoiceRuntimeHandoffParams | undefined;
61
62
  playbackAvailable = true;
62
63
  asrAvailable = true;
63
64
  ttsAvailable = true;
@@ -179,6 +180,7 @@ class MockVoiceRuntimeAdapter implements VoiceRuntimeAdapter {
179
180
  ): Promise<VoiceRuntimeHandoffResult> {
180
181
  this.runtimeHandedOff = true;
181
182
  this.runtimeHandoffCount += 1;
183
+ this.lastHandoffParams = params;
182
184
  return {
183
185
  firstTokenText: "ok",
184
186
  responseText: `response:${params.text}`,
@@ -462,6 +464,30 @@ describe("VoiceService", () => {
462
464
  expect(adapter.runtimeHandoffCount).toBe(1);
463
465
  });
464
466
 
467
+ it("hands the final transcript off as VOICE_DM with a COMPUTED turn signal (#8786)", async () => {
468
+ const { voice, adapter } = harness({
469
+ ELIZA_VOICE_LIVE_RUNTIME: "1",
470
+ });
471
+
472
+ await voice.start({ mode: "local-runtime" });
473
+ adapter.emitAsrFinal({ text: "what is on my calendar today" });
474
+ await flushVoiceEvents();
475
+
476
+ expect(adapter.runtimeHandedOff).toBe(true);
477
+ // The signal must be COMPUTED by voice-service from the transcript — not
478
+ // injected by the caller — so the server voice gate
479
+ // (core.voice_turn_signal / _confirm) actually has something to read on
480
+ // desktop. Before #8786 this path sent a bare { text } and the gate was inert.
481
+ const signal = adapter.lastHandoffParams?.metadata?.voiceTurnSignal as
482
+ | Record<string, unknown>
483
+ | undefined;
484
+ expect(signal).toBeDefined();
485
+ expect(typeof signal?.endOfTurnProbability).toBe("number");
486
+ expect(signal?.agentShouldSpeak).toBe(true);
487
+ expect(["agent", "user", "unknown"]).toContain(signal?.nextSpeaker);
488
+ expect(String(signal?.source)).toMatch(/^client-ambient/);
489
+ });
490
+
465
491
  it("starts live audio mode with a mocked adapter", async () => {
466
492
  const { voice, adapter } = harness({
467
493
  ELIZA_VOICE_LIVE_AUDIO: "1",
@@ -1,4 +1,5 @@
1
1
  import type { JsonValue } from "@elizaos/plugin-remote-manifest";
2
+ import { buildVoiceTurnSignal } from "@elizaos/shared/voice/respond-gate";
2
3
  import type { TraceService } from "../trace/trace-service";
3
4
  import { VoiceError } from "./errors";
4
5
  import type {
@@ -11,6 +12,7 @@ import type {
11
12
  VoicePipelineId,
12
13
  VoicePipelineSnapshot,
13
14
  VoicePipelineStatus,
15
+ VoiceRuntimeHandoffParams,
14
16
  VoiceRuntimeStatus,
15
17
  VoiceSpeakParams,
16
18
  VoiceStartParams,
@@ -165,6 +167,9 @@ export class VoiceService {
165
167
  private traceSessionReady: Promise<void> | null = null;
166
168
  private readonly unsubscriptions: Array<() => void> = [];
167
169
  private runtimeCommitTurnId: VoiceTurnId | null = null;
170
+ /** Agent's most recent spoken reply + when it landed — feeds the echo guard. */
171
+ private lastAgentReply: string | undefined;
172
+ private lastAgentReplyAtMs: number | undefined;
168
173
 
169
174
  constructor(options: VoiceServiceOptions = {}) {
170
175
  this.traceService = options.traceService ?? null;
@@ -774,6 +779,36 @@ export class VoiceService {
774
779
  text,
775
780
  });
776
781
 
782
+ // Build the client voice-turn signal from the final transcript so the
783
+ // server voice gate (`core.voice_turn_signal` / `_confirm`) actually runs on
784
+ // desktop — matching the web `useShellController` path (#8786). Without it
785
+ // `getVoiceTurnSignalMetadata` returns null and both gates are inert, so
786
+ // desktop voice silently bypasses the turn-taking authority. The echo guard
787
+ // uses the agent's most recent spoken reply (recorded below).
788
+ // At handoff the agent is "thinking" (the user just finished), so echo
789
+ // suppression keys off how recently the agent last spoke, not a live
790
+ // agentSpeaking flag (which is always false here).
791
+ const signal = buildVoiceTurnSignal(text, {
792
+ recentAgentReply: this.lastAgentReply,
793
+ replyAgeMs:
794
+ this.lastAgentReplyAtMs !== undefined
795
+ ? this.now().getTime() - this.lastAgentReplyAtMs
796
+ : undefined,
797
+ });
798
+ const handoff: VoiceRuntimeHandoffParams = {
799
+ text,
800
+ // Spelled out as a JSON-safe literal (the signal is an interface, which is
801
+ // not assignable to Record<string, JsonValue> without an index signature).
802
+ metadata: {
803
+ voiceTurnSignal: {
804
+ endOfTurnProbability: signal.endOfTurnProbability,
805
+ nextSpeaker: signal.nextSpeaker,
806
+ agentShouldSpeak: signal.agentShouldSpeak,
807
+ source: signal.source,
808
+ },
809
+ },
810
+ };
811
+
777
812
  // Streaming handoff: consume the reply token-by-token so the first_token
778
813
  // mark reflects the true time-to-first-token (not full-reply latency) and
779
814
  // so a future phrase-by-phrase synth can begin before generation finishes.
@@ -789,29 +824,26 @@ export class VoiceService {
789
824
  try {
790
825
  let firstMarked = false;
791
826
  let accumulated = "";
792
- const result = await streamFn.call(
793
- this.runtimeAdapter,
794
- { text },
795
- {
796
- onTextDelta: (_delta: string, fullText: string) => {
797
- accumulated = fullText;
798
- if (!firstMarked) {
799
- firstMarked = true;
800
- // Mark at first-delta wall time (mark() stamps now()).
801
- void this.markModelFirstToken(fullText.slice(0, 32) || "…");
802
- }
803
- },
804
- onDone: ({ fullText }: { fullText: string }) => {
805
- if (fullText) accumulated = fullText;
806
- },
827
+ const result = await streamFn.call(this.runtimeAdapter, handoff, {
828
+ onTextDelta: (_delta: string, fullText: string) => {
829
+ accumulated = fullText;
830
+ if (!firstMarked) {
831
+ firstMarked = true;
832
+ // Mark at first-delta wall time (mark() stamps now()).
833
+ void this.markModelFirstToken(fullText.slice(0, 32) || "…");
834
+ }
807
835
  },
808
- );
836
+ onDone: ({ fullText }: { fullText: string }) => {
837
+ if (fullText) accumulated = fullText;
838
+ },
839
+ });
809
840
  const responseText = result.responseText ?? accumulated;
810
841
  if (!firstMarked) {
811
842
  await this.markModelFirstToken(responseText.slice(0, 32) || "…");
812
843
  }
813
844
  if (responseText) {
814
845
  this.requireActiveTurn().responseText = responseText;
846
+ this.recordAgentReply(responseText);
815
847
  }
816
848
  return;
817
849
  } catch {
@@ -827,11 +859,12 @@ export class VoiceService {
827
859
  (this.mode === "local-runtime" || this.mode === "live-audio") &&
828
860
  this.runtimeAdapter.sendRuntimeMessage
829
861
  ) {
830
- const result = await this.runtimeAdapter.sendRuntimeMessage({ text });
862
+ const result = await this.runtimeAdapter.sendRuntimeMessage(handoff);
831
863
  firstTokenText = result.firstTokenText ?? result.responseText ?? "";
832
864
  responseText = result.responseText;
833
865
  raw = result.raw;
834
866
  }
867
+ if (responseText) this.recordAgentReply(responseText);
835
868
  const modelMark = await this.markModelFirstToken(
836
869
  firstTokenText,
837
870
  raw ?? null,
@@ -850,6 +883,13 @@ export class VoiceService {
850
883
  }
851
884
  }
852
885
 
886
+ /** Remember the agent's last spoken reply so the next turn's echo guard can
887
+ * suppress the agent's own TTS bleeding back into an always-on mic (#8786). */
888
+ private recordAgentReply(reply: string): void {
889
+ this.lastAgentReply = reply;
890
+ this.lastAgentReplyAtMs = this.now().getTime();
891
+ }
892
+
853
893
  private async handleTtsResult(
854
894
  params: VoiceSynthesizeSpeechParams,
855
895
  result: VoiceSynthesisResult,
@@ -45,8 +45,12 @@
45
45
  "@elizaos/agent/*": ["../../../agent/src/*"],
46
46
  "@elizaos/core": ["../../../core/src/index.node.ts"],
47
47
  "@elizaos/core/*": ["../../../core/src/*"],
48
+ "@elizaos/logger": ["../../../logger/src/index.ts"],
49
+ "@elizaos/logger/*": ["../../../logger/src/*"],
48
50
  "@elizaos/shared": ["../../../shared/src/index.ts"],
49
51
  "@elizaos/shared/*": ["../../../shared/src/*"],
52
+ "@elizaos/security": ["../../../security/src/index.ts"],
53
+ "@elizaos/security/*": ["../../../security/src/*"],
50
54
  "@elizaos/ui": ["../../../ui/src/index.ts"],
51
55
  "@elizaos/ui/*": ["../../../ui/src/*"],
52
56
  "@elizaos/plugin-elizacloud": [
@@ -63,6 +67,12 @@
63
67
  "@elizaos/plugin-coding-tools/*": [
64
68
  "../../../../plugins/plugin-coding-tools/src/*"
65
69
  ],
70
+ "@elizaos/plugin-capacitor-bridge": [
71
+ "../../../../plugins/plugin-capacitor-bridge/src/index.ts"
72
+ ],
73
+ "@elizaos/plugin-capacitor-bridge/*": [
74
+ "../../../../plugins/plugin-capacitor-bridge/src/*"
75
+ ],
66
76
  "@elizaos/plugin-local-inference": [
67
77
  "../../../../plugins/plugin-local-inference/src/index.ts"
68
78
  ],
@@ -122,7 +132,13 @@
122
132
  "@elizaos/plugin-sql": [
123
133
  "../../../../plugins/plugin-sql/src/index.node.ts"
124
134
  ],
125
- "@elizaos/plugin-sql/*": ["../../../../plugins/plugin-sql/src/*"]
135
+ "@elizaos/plugin-sql/*": ["../../../../plugins/plugin-sql/src/*"],
136
+ "@elizaos/plugin-streaming": [
137
+ "../../../../plugins/plugin-streaming/src/index.ts"
138
+ ],
139
+ "@elizaos/plugin-streaming/*": [
140
+ "../../../../plugins/plugin-streaming/src/*"
141
+ ]
126
142
  }
127
143
  },
128
144
  "include": [
@@ -12,18 +12,16 @@
12
12
  <scene sceneID="EHf-IW-A2E">
13
13
  <objects>
14
14
  <viewController id="01J-lp-oVM" sceneMemberID="viewController">
15
- <imageView key="view" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Splash" id="snD-IY-ifK">
15
+ <view key="view" contentMode="scaleToFill" id="snD-IY-ifK">
16
16
  <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
17
17
  <autoresizingMask key="autoresizingMask"/>
18
- <color key="backgroundColor" red="1.0" green="0.345" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
19
- </imageView>
18
+ <!-- #ef5a1f (default home-background orange) in sRGB to 3 decimals: matches the React home so the launch screen does not flash a different orange (issue #9565). -->
19
+ <color key="backgroundColor" red="0.937" green="0.353" blue="0.122" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
20
+ </view>
20
21
  </viewController>
21
22
  <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
22
23
  </objects>
23
24
  <point key="canvasLocation" x="53" y="375"/>
24
25
  </scene>
25
26
  </scenes>
26
- <resources>
27
- <image name="Splash" width="1366" height="1366"/>
28
- </resources>
29
27
  </document>
@@ -1,7 +1,2 @@
1
- import { type LoadedRegistry } from "./loader";
2
- export * from "./app-registry";
3
- export { getApps, getConnectors, getEntry, getEntryByNpmName, getPlugins, indexEntries, type LoadedRegistry, mergeWithRuntime, normalizeConnectorAuth, type RegistryValidationError, } from "./loader";
4
- export * from "./schema";
5
- export declare function loadRegistry(): LoadedRegistry;
6
- export declare function clearRegistryCacheForTests(): void;
1
+ export * from "@elizaos/registry/first-party";
7
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/registry/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAA8B,MAAM,UAAU,CAAC;AAE3E,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,OAAO,EACP,aAAa,EACb,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,KAAK,cAAc,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,UAAU,CAAC;AAClB,cAAc,UAAU,CAAC;AA6DzB,wBAAgB,YAAY,IAAI,cAAc,CAgC7C;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAMjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/registry/index.ts"],"names":[],"mappings":"AASA,cAAc,+BAA+B,CAAC"}
package/registry/index.js CHANGED
@@ -1,102 +1,10 @@
1
- // Runtime entry point. Reads JSON entries from data/, validates, caches, and
2
- // exposes typed accessors. The single import path the rest of the codebase
3
- // uses to consume the registry.
4
- import { existsSync, readdirSync, readFileSync } from "node:fs";
5
- import { dirname, join, resolve } from "node:path";
6
- import { fileURLToPath } from "node:url";
7
- import { loadRegistryFromRawEntries } from "./loader.js";
8
- export * from "./app-registry.js";
9
- export { getApps, getConnectors, getEntry, getEntryByNpmName, getPlugins, indexEntries, mergeWithRuntime, normalizeConnectorAuth, } from "./loader.js";
10
- export * from "./schema.js";
11
- // Bun.build collapses these top-level `const` declarations into `var`s
12
- // inside an `__esm` wrapper, and `import.meta.url` inside that wrapper
13
- // can resolve to `undefined` on the on-device runtime when the registry
14
- // module is initialised through the `Promise.resolve().then(() => init_xxx())`
15
- // adapter the bundler emits for dynamic-import re-exports of `@elizaos/app-core`.
16
- // The fallback to `process.argv[1]` matches the bundle's own entrypoint
17
- // (e.g. `/data/data/.../agent-bundle.js`) so the registry sits at
18
- // `<bundle-dir>/entries/`. Phase A asset extraction stages the `entries/`
19
- // payload alongside the bundle.
20
- function resolveEntriesDir() {
21
- const url = typeof import.meta.url === "string" && import.meta.url
22
- ? import.meta.url
23
- : null;
24
- let moduleDir;
25
- if (url) {
26
- try {
27
- moduleDir = dirname(fileURLToPath(url));
28
- }
29
- catch {
30
- moduleDir = dirname(process.argv[1] ?? process.cwd());
31
- }
32
- }
33
- else {
34
- moduleDir = dirname(process.argv[1] ?? process.cwd());
35
- }
36
- const distEntries = join(moduleDir, "entries");
37
- // When running from a freshly-cloned workspace (dist/ not built yet) the
38
- // module sits at `packages/app-core/dist/registry/index.js` but the entries
39
- // haven't been copied across yet. Fall back to the colocated source tree at
40
- // `packages/app-core/src/registry/entries/` so dev boots survive missing
41
- // builds. Packaged builds (where moduleDir resolves under .../dist/...) and
42
- // the on-device runtime (where there is no `src/` sibling) keep using
43
- // `distEntries` as before.
44
- if (!existsSync(distEntries)) {
45
- const sourceFallback = resolve(moduleDir, "..", "..", "src", "registry", "entries");
46
- if (existsSync(sourceFallback)) {
47
- return sourceFallback;
48
- }
49
- }
50
- return distEntries;
51
- }
52
- // TDZ-hardening (see also packages/app-core/src/services/vault-mirror.ts).
53
- // This module's cached registry slot must survive being re-entered during
54
- // circular-import partial evaluation on Bun's strict ESM runtime. A bare
55
- // `let cache = null` would still be in the temporal dead zone when an
56
- // import cycle re-enters `loadRegistry()`, throwing
57
- // `Cannot access 'cache' before initialization` and bricking boot
58
- // (observed: vault-bootstrap → sensitiveKeysFromRegistry → loadRegistry
59
- // during agent startup on the elizaOS live USB).
1
+ // Backwards-compatibility shim.
60
2
  //
61
- var cacheSlot = { value: null };
62
- export function loadRegistry() {
63
- // Self-heal: if a cycle re-entered us before the module-top initializer
64
- // ran, hoisted `cacheSlot` is `undefined`. Lazily initialize so we never
65
- // throw and downstream callers see a stable `{ value: null }`.
66
- if (!cacheSlot) {
67
- cacheSlot = { value: null };
68
- }
69
- if (cacheSlot.value)
70
- return cacheSlot.value;
71
- const entriesDir = resolveEntriesDir();
72
- const raws = [];
73
- for (const kind of ["apps", "plugins", "connectors"]) {
74
- const kindDir = join(entriesDir, kind);
75
- let entries;
76
- try {
77
- entries = readdirSync(kindDir);
78
- }
79
- catch {
80
- // In packaged desktop builds the registry entries may not be bundled.
81
- // Log and continue rather than crashing the agent subprocess.
82
- console.warn(`[registry] ${kind} directory missing: ${kindDir}`);
83
- continue;
84
- }
85
- for (const filename of entries) {
86
- if (!filename.endsWith(".json"))
87
- continue;
88
- const file = join(kindDir, filename);
89
- const data = JSON.parse(readFileSync(file, "utf-8"));
90
- raws.push({ file, data });
91
- }
92
- }
93
- cacheSlot.value = loadRegistryFromRawEntries(raws);
94
- return cacheSlot.value;
95
- }
96
- export function clearRegistryCacheForTests() {
97
- if (!cacheSlot) {
98
- cacheSlot = { value: null };
99
- return;
100
- }
101
- cacheSlot.value = null;
102
- }
3
+ // The first-party curated registry (schema, loader, entries, and the runtime
4
+ // registration overlay) moved to `@elizaos/registry/first-party`. This re-export
5
+ // keeps the `@elizaos/app-core/registry` subpath and the `@elizaos/app-core`
6
+ // barrel re-exports stable for existing consumers (plugin-registry,
7
+ // plugin-capacitor-bridge, app-core's own catalog/eliza/vault-bootstrap).
8
+ //
9
+ // New code should import directly from `@elizaos/registry/first-party`.
10
+ export * from "@elizaos/registry/first-party";
@@ -1,4 +1,4 @@
1
- import type { AndroidAvfMicrodroidBoundary, AndroidAvfMicrodroidCapabilityState, MobileSafeRuntimeFeatureProbe } from "./mobile-safe-runtime";
1
+ import type { AndroidAvfMicrodroidBoundary, AndroidAvfMicrodroidCapabilityState, MobileSafeRuntimeFeatureProbe } from "./mobile-safe-runtime.js";
2
2
  export declare const ANDROID_AVF_MICRODROID_REQUEST_CONTRACT_VERSION = 1;
3
3
  export interface AndroidVirtualizationNativeBridge {
4
4
  getAndroidVirtualization?: () => string | null | undefined;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Locate + wire the fused `libelizainference` that ships INSIDE a packaged
3
+ * desktop app, so a compiled app serves local inference with no env wiring and
4
+ * no separate download.
5
+ *
6
+ * The desktop packaging (`packages/app-core/scripts/desktop-build.mjs` →
7
+ * `stage-desktop-fused-lib.mjs`) stages the fused set into
8
+ * `<eliza-dist>/local-inference/lib/`, and the Electrobun build copies the
9
+ * whole `dist` tree to `Resources/app/eliza-dist/`. At runtime this module
10
+ * lives at `<eliza-dist>/node_modules/@elizaos/app-core/dist/runtime/…`, so we
11
+ * walk up looking for a `local-inference/lib/<fused>` that actually exists.
12
+ */
13
+ /**
14
+ * Candidate filenames for the fused library, per platform. Mirrors
15
+ * `plugin-local-inference`'s `resolveFusedLibraryPath` / the FFI loader so the
16
+ * probe and the runtime agree on what counts as "the fused lib is here".
17
+ */
18
+ export declare function fusedLibraryFilenames(): string[];
19
+ /**
20
+ * Walk up from `startUrl`'s directory looking for a `local-inference/lib`
21
+ * directory that already contains a platform fused lib. Self-validating (only
22
+ * matches where the artifact is), so there is no layout ambiguity. Returns null
23
+ * in dev (run from source, nothing staged) and on mobile (native lib ships via
24
+ * jniLibs / xcframework). Best-effort; never throws.
25
+ */
26
+ export declare function findBundledFusedLibDir(startUrl?: string): string | null;
27
+ /**
28
+ * Point the local-inference runtime at the app-bundled fused lib when one is
29
+ * present. Respects an explicit operator override (`ELIZA_INFERENCE_LIBRARY` /
30
+ * `ELIZA_INFERENCE_LIB_DIR`) and is a no-op when nothing is bundled (dev,
31
+ * mobile) — `resolveFusedLibraryPath` then falls back to
32
+ * `<stateDir>/local-inference/lib` as before. Idempotent. Returns the dir it
33
+ * wired (or already-set override), else null.
34
+ */
35
+ export declare function ensureBundledFusedLibDir(env?: NodeJS.ProcessEnv, startUrl?: string): string | null;
36
+ //# sourceMappingURL=bundled-fused-lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-fused-lib.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/bundled-fused-lib.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAKhD;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,GAAE,MAAwB,GACjC,MAAM,GAAG,IAAI,CAiBf;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAwB,GACjC,MAAM,GAAG,IAAI,CAYf"}