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

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 (361) 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-paths.mjs +110 -0
  152. package/scripts/aosp/compile-libllama-zig-pin.test.mjs +147 -0
  153. package/scripts/aosp/compile-libllama.mjs +377 -81
  154. package/scripts/aosp/compile-libllama.test.mjs +133 -0
  155. package/scripts/aosp/compile-shim.mjs +21 -1
  156. package/scripts/aosp/deploy-pixel.mjs +1 -1
  157. package/scripts/aosp/stage-default-models.mjs +24 -31
  158. package/scripts/aosp/stage-default-models.test.mjs +23 -0
  159. package/scripts/assert-required-bundled-packages.test.ts +22 -1
  160. package/scripts/build-helpers/verify-fused-symbols.mjs +33 -0
  161. package/scripts/build-helpers/verify-fused-symbols.test.mjs +0 -0
  162. package/scripts/build-image.sh +1 -3
  163. package/scripts/build-llama-cpp-mtp.mjs +17 -16
  164. package/scripts/check-i18n.mjs +0 -1
  165. package/scripts/copy-runtime-node-modules.ts +147 -0
  166. package/scripts/desktop-build.mjs +317 -4
  167. package/scripts/docker-ci-smoke.sh +33 -8
  168. package/scripts/ensure-type-package-aliases.mjs +1 -1
  169. package/scripts/ios-xcframework/run-physical-device-smoke.mjs +1 -1
  170. package/scripts/lib/agent-source-watcher.mjs +0 -1
  171. package/scripts/lib/artifact-staleness.d.mts +33 -0
  172. package/scripts/lib/artifact-staleness.mjs +122 -0
  173. package/scripts/lib/artifact-staleness.test.mts +98 -0
  174. package/scripts/lib/duet-bridge.mjs +1 -1
  175. package/scripts/lib/ios-plist-url-scheme.mjs +80 -0
  176. package/scripts/lib/mobile-build-decisions.mjs +97 -0
  177. package/scripts/lib/renderer-build-manifest.d.mts +65 -0
  178. package/scripts/lib/renderer-build-manifest.mjs +257 -0
  179. package/scripts/lib/renderer-build-manifest.test.mts +277 -0
  180. package/scripts/lib/stage-android-agent.mjs +13 -4
  181. package/scripts/lib/verify-ondevice-artifact.d.mts +16 -0
  182. package/scripts/lib/verify-ondevice-artifact.mjs +61 -0
  183. package/scripts/lib/verify-ondevice-artifact.test.mts +98 -0
  184. package/scripts/lib/websocket-pending-queue.ts +92 -0
  185. package/scripts/link-docker-local-app-packages.mjs +6 -0
  186. package/scripts/playwright-ui-live-stack.ts +430 -144
  187. package/scripts/playwright-ui-smoke-api-stub.mjs +160 -168
  188. package/scripts/run-local-plugin-live-smoke.mjs +1 -6
  189. package/scripts/run-mobile-build-brand-separation.test.mts +33 -0
  190. package/scripts/run-mobile-build-ios-engine-gate.test.mjs +85 -0
  191. package/scripts/run-mobile-build-mtp-staleness.test.mts +198 -0
  192. package/scripts/run-mobile-build.mjs +408 -86
  193. package/scripts/serve-real-local-agent.ts +72 -0
  194. package/scripts/stage-desktop-fused-lib.mjs +43 -14
  195. package/scripts/verify-ondevice-artifact.mjs +111 -0
  196. package/scripts/voice-attribution-smoke.ts +144 -38
  197. package/scripts/voice-duet.mjs +6 -6
  198. package/scripts/voice-e2e-hardware.ts +22 -16
  199. package/scripts/voice-interactive.mjs +16 -45
  200. package/security/agent-vault-id.d.ts +1 -1
  201. package/security/platform-secure-store-node.d.ts +1 -1
  202. package/services/ambient-audio/consent.d.ts +1 -1
  203. package/services/ambient-audio/index.d.ts +6 -6
  204. package/services/ambient-audio/replay-buffer.d.ts +1 -1
  205. package/services/ambient-audio/response-gate.d.ts +1 -1
  206. package/services/ambient-audio/service.d.ts +3 -3
  207. package/services/connector-target-catalog.d.ts +1 -1
  208. package/services/sensitive-requests/index.d.ts +6 -6
  209. package/services/steward-sidecar/wallet-setup.d.ts +1 -1
  210. package/services/steward-sidecar.d.ts +3 -3
  211. package/services/tunnel-to-mobile/index.d.ts +1 -1
  212. package/services/vault-bootstrap.d.ts.map +1 -1
  213. package/services/vault-bootstrap.js +14 -10
  214. package/services/voice-profiles/diarization-pipeline.d.ts +1 -1
  215. package/services/voice-profiles/index.d.ts +11 -11
  216. package/services/voice-profiles/owner-confidence.d.ts +1 -1
  217. package/services/voice-profiles/private-challenge.d.ts +1 -1
  218. package/services/voice-profiles/store.d.ts +1 -1
  219. package/test/helpers/live-provider.test.ts +91 -1
  220. package/test/helpers/live-provider.ts +195 -51
  221. package/test/scripts/websocket-pending-queue.test.ts +119 -0
  222. package/test-support/test-helpers.d.ts +0 -33
  223. package/test-support/test-helpers.d.ts.map +1 -1
  224. package/test-support/test-helpers.js +81 -189
  225. package/ui-compat.d.ts +1 -0
  226. package/ui-compat.d.ts.map +1 -1
  227. package/ui-compat.js +4 -0
  228. package/platforms/electrobun/docs/convergence-audit.json +0 -3505
  229. package/platforms/electrobun/docs/convergence-audit.md +0 -694
  230. package/platforms/electrobun/scripts/ensure-whisper-gguf.sh +0 -55
  231. package/platforms/electrobun/scripts/ensure-whisper-model.sh +0 -35
  232. package/platforms/electrobun/scripts/generate-convergence-audit.ts +0 -1203
  233. package/platforms/electrobun/src/native/whisper-env.test.ts +0 -71
  234. package/platforms/electrobun/src/native/whisper-env.ts +0 -68
  235. package/registry/app-registry.d.ts +0 -14
  236. package/registry/app-registry.d.ts.map +0 -1
  237. package/registry/app-registry.js +0 -29
  238. package/registry/entries/apps/app-polymarket.json +0 -31
  239. package/registry/entries/apps/clawville.json +0 -27
  240. package/registry/entries/apps/companion.json +0 -28
  241. package/registry/entries/apps/database-viewer.json +0 -27
  242. package/registry/entries/apps/defense-of-the-agents.json +0 -27
  243. package/registry/entries/apps/documents.json +0 -30
  244. package/registry/entries/apps/feed.json +0 -27
  245. package/registry/entries/apps/hyperliquid.json +0 -31
  246. package/registry/entries/apps/log-viewer.json +0 -27
  247. package/registry/entries/apps/memory-viewer.json +0 -27
  248. package/registry/entries/apps/model-tester.json +0 -31
  249. package/registry/entries/apps/plugin-viewer.json +0 -27
  250. package/registry/entries/apps/relationship-viewer.json +0 -27
  251. package/registry/entries/apps/runtime-debugger.json +0 -27
  252. package/registry/entries/apps/shopify.json +0 -31
  253. package/registry/entries/apps/skills-viewer.json +0 -27
  254. package/registry/entries/apps/steward.json +0 -31
  255. package/registry/entries/apps/training.json +0 -54
  256. package/registry/entries/apps/trajectory-viewer.json +0 -27
  257. package/registry/entries/apps/vincent.json +0 -31
  258. package/registry/entries/connectors/bluebubbles.json +0 -99
  259. package/registry/entries/connectors/bluesky.json +0 -173
  260. package/registry/entries/connectors/discord.json +0 -119
  261. package/registry/entries/connectors/farcaster.json +0 -174
  262. package/registry/entries/connectors/feishu.json +0 -79
  263. package/registry/entries/connectors/google-chat.json +0 -120
  264. package/registry/entries/connectors/google.json +0 -82
  265. package/registry/entries/connectors/imessage.json +0 -96
  266. package/registry/entries/connectors/instagram.json +0 -64
  267. package/registry/entries/connectors/line.json +0 -86
  268. package/registry/entries/connectors/matrix.json +0 -94
  269. package/registry/entries/connectors/mattermost.json +0 -110
  270. package/registry/entries/connectors/msteams.json +0 -104
  271. package/registry/entries/connectors/nextcloud-talk.json +0 -104
  272. package/registry/entries/connectors/nostr.json +0 -70
  273. package/registry/entries/connectors/signal.json +0 -81
  274. package/registry/entries/connectors/slack.json +0 -102
  275. package/registry/entries/connectors/telegram.json +0 -71
  276. package/registry/entries/connectors/tlon.json +0 -94
  277. package/registry/entries/connectors/twitch.json +0 -110
  278. package/registry/entries/connectors/whatsapp.json +0 -113
  279. package/registry/entries/connectors/x.json +0 -231
  280. package/registry/entries/connectors/zalo.json +0 -112
  281. package/registry/entries/connectors/zalouser.json +0 -122
  282. package/registry/entries/plugins/agent-orchestrator.json +0 -33
  283. package/registry/entries/plugins/agent-skills.json +0 -72
  284. package/registry/entries/plugins/anthropic.json +0 -73
  285. package/registry/entries/plugins/app-control.json +0 -23
  286. package/registry/entries/plugins/auto-trader.json +0 -203
  287. package/registry/entries/plugins/background-runner.json +0 -26
  288. package/registry/entries/plugins/blooio.json +0 -102
  289. package/registry/entries/plugins/browser.json +0 -75
  290. package/registry/entries/plugins/cli.json +0 -40
  291. package/registry/entries/plugins/clipboard.json +0 -44
  292. package/registry/entries/plugins/coding-tools.json +0 -71
  293. package/registry/entries/plugins/commands.json +0 -63
  294. package/registry/entries/plugins/computeruse.json +0 -74
  295. package/registry/entries/plugins/copilot-proxy.json +0 -93
  296. package/registry/entries/plugins/directives.json +0 -63
  297. package/registry/entries/plugins/edge-tts.json +0 -97
  298. package/registry/entries/plugins/elevenlabs.json +0 -169
  299. package/registry/entries/plugins/elizacloud.json +0 -208
  300. package/registry/entries/plugins/evm.json +0 -134
  301. package/registry/entries/plugins/experience.json +0 -34
  302. package/registry/entries/plugins/facewear.json +0 -131
  303. package/registry/entries/plugins/form.json +0 -26
  304. package/registry/entries/plugins/github.json +0 -93
  305. package/registry/entries/plugins/gmail-watch.json +0 -25
  306. package/registry/entries/plugins/goals.json +0 -77
  307. package/registry/entries/plugins/google-genai.json +0 -106
  308. package/registry/entries/plugins/groq.json +0 -93
  309. package/registry/entries/plugins/hedera.json +0 -48
  310. package/registry/entries/plugins/inmemorydb.json +0 -25
  311. package/registry/entries/plugins/linear.json +0 -51
  312. package/registry/entries/plugins/local-inference.json +0 -137
  313. package/registry/entries/plugins/local-storage.json +0 -36
  314. package/registry/entries/plugins/localdb.json +0 -25
  315. package/registry/entries/plugins/mcp.json +0 -44
  316. package/registry/entries/plugins/memory.json +0 -124
  317. package/registry/entries/plugins/minecraft.json +0 -79
  318. package/registry/entries/plugins/moltbook.json +0 -83
  319. package/registry/entries/plugins/music.json +0 -155
  320. package/registry/entries/plugins/mysticism.json +0 -48
  321. package/registry/entries/plugins/nearai.json +0 -82
  322. package/registry/entries/plugins/ngrok.json +0 -69
  323. package/registry/entries/plugins/ollama.json +0 -96
  324. package/registry/entries/plugins/openai.json +0 -189
  325. package/registry/entries/plugins/openrouter.json +0 -188
  326. package/registry/entries/plugins/pdf.json +0 -26
  327. package/registry/entries/plugins/plugin-manager.json +0 -23
  328. package/registry/entries/plugins/prose.json +0 -48
  329. package/registry/entries/plugins/rlm.json +0 -26
  330. package/registry/entries/plugins/roblox.json +0 -88
  331. package/registry/entries/plugins/rss.json +0 -64
  332. package/registry/entries/plugins/s3-storage.json +0 -91
  333. package/registry/entries/plugins/scheduling.json +0 -35
  334. package/registry/entries/plugins/shell.json +0 -94
  335. package/registry/entries/plugins/social-alpha.json +0 -72
  336. package/registry/entries/plugins/tailscale.json +0 -81
  337. package/registry/entries/plugins/tee.json +0 -53
  338. package/registry/entries/plugins/todos.json +0 -26
  339. package/registry/entries/plugins/trajectory-logger.json +0 -33
  340. package/registry/entries/plugins/trust.json +0 -39
  341. package/registry/entries/plugins/tts.json +0 -71
  342. package/registry/entries/plugins/tunnel.json +0 -45
  343. package/registry/entries/plugins/twilio.json +0 -168
  344. package/registry/entries/plugins/vercel-ai-gateway.json +0 -128
  345. package/registry/entries/plugins/video.json +0 -23
  346. package/registry/entries/plugins/vision.json +0 -43
  347. package/registry/entries/plugins/webhooks.json +0 -23
  348. package/registry/entries/plugins/workflow.json +0 -25
  349. package/registry/entries/plugins/xai.json +0 -75
  350. package/registry/loader.d.ts +0 -28
  351. package/registry/loader.d.ts.map +0 -1
  352. package/registry/loader.js +0 -158
  353. package/registry/schema.d.ts +0 -1199
  354. package/registry/schema.d.ts.map +0 -1
  355. package/registry/schema.js +0 -300
  356. package/scripts/patches/llama-mobile-kokoro-tts.patch +0 -480
  357. package/scripts/release-workflow-drift.test.ts +0 -57
  358. package/test/helpers/i18n.ts +0 -5
  359. package/test/helpers/loopback.ts +0 -33
  360. package/test/helpers/react-test.ts +0 -40
  361. package/test/helpers/skip-without.ts +0 -53
@@ -20,7 +20,6 @@ import path from "node:path";
20
20
  export const HOT_RELOAD_FRONTEND_PACKAGES = new Set([
21
21
  "ui",
22
22
  "app",
23
- "cloud-frontend",
24
23
  "os-homepage",
25
24
  "homepage",
26
25
  "docs",
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Type declarations for `artifact-staleness.mjs` — generic source-vs-artifact
3
+ * staleness used by the iOS MTP slice, iOS agent bundle, and desktop runtime
4
+ * package reuse gates (issue #9309).
5
+ */
6
+
7
+ export function maxMtimeUnder(
8
+ dir: string,
9
+ opts?: {
10
+ exclude?: Set<string>;
11
+ exts?: Set<string> | null;
12
+ maxDepth?: number;
13
+ },
14
+ ): number;
15
+
16
+ export function fileMtime(filePath: string): number;
17
+
18
+ export interface ArtifactStaleness {
19
+ stale: boolean;
20
+ reason: string;
21
+ artifactMtime: number;
22
+ newestSourceMtime: number;
23
+ newestSource: string | null;
24
+ }
25
+
26
+ export function artifactStaleness(
27
+ artifactPath: string,
28
+ opts?: {
29
+ sourceDirs?: string[];
30
+ sourceFiles?: string[];
31
+ exts?: Set<string> | null;
32
+ },
33
+ ): ArtifactStaleness;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Generic source-vs-artifact staleness check (issue #9309).
3
+ *
4
+ * Several on-device build inputs are cached and reused across builds (the iOS
5
+ * llama.cpp MTP slice, the iOS agent bundle, desktop runtime packages). Each had
6
+ * a presence-only reuse gate that could silently reuse a STALE artifact after
7
+ * its sources changed. This module turns "reuse when present" into "reuse only
8
+ * when the artifact is newer than every source it was built from", so a changed
9
+ * input forces a rebuild instead of shipping old code.
10
+ *
11
+ * mtime is the right granularity here: these artifacts are heavy native/bundle
12
+ * builds keyed off large source trees, and the build host writes both, so an
13
+ * artifact older than any source file is unambiguously stale.
14
+ */
15
+ import fs from "node:fs";
16
+ import path from "node:path";
17
+
18
+ const DEFAULT_EXCLUDE = new Set([
19
+ "node_modules",
20
+ "dist",
21
+ "build",
22
+ ".git",
23
+ ".turbo",
24
+ "out",
25
+ ]);
26
+
27
+ /**
28
+ * Largest mtime (ms) of any file under `dir`, skipping build/dep dirs.
29
+ * @param {string} dir
30
+ * @param {{ exclude?: Set<string>, exts?: Set<string>|null, maxDepth?: number }} [opts]
31
+ */
32
+ export function maxMtimeUnder(
33
+ dir,
34
+ { exclude = DEFAULT_EXCLUDE, exts = null, maxDepth = 25 } = {},
35
+ ) {
36
+ let max = 0;
37
+ const walk = (current, depth) => {
38
+ if (depth > maxDepth) return;
39
+ let entries;
40
+ try {
41
+ entries = fs.readdirSync(current, { withFileTypes: true });
42
+ } catch {
43
+ return;
44
+ }
45
+ for (const entry of entries) {
46
+ if (exclude.has(entry.name)) continue;
47
+ const full = path.join(current, entry.name);
48
+ if (entry.isDirectory()) {
49
+ walk(full, depth + 1);
50
+ continue;
51
+ }
52
+ if (exts && !exts.has(path.extname(entry.name))) continue;
53
+ try {
54
+ max = Math.max(max, fs.statSync(full).mtimeMs);
55
+ } catch {
56
+ /* ignore unreadable entries */
57
+ }
58
+ }
59
+ };
60
+ if (fs.existsSync(dir)) walk(dir, 0);
61
+ return max;
62
+ }
63
+
64
+ /** mtime (ms) of a single file, or 0 if missing/unreadable. */
65
+ export function fileMtime(filePath) {
66
+ try {
67
+ return fs.statSync(filePath).mtimeMs;
68
+ } catch {
69
+ return 0;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Is `artifactPath` stale relative to its source dirs/files?
75
+ *
76
+ * @param {string} artifactPath the built artifact (or its marker file)
77
+ * @param {{ sourceDirs?: string[], sourceFiles?: string[], exts?: Set<string>|null }} [opts]
78
+ * @returns {{ stale: boolean, reason: string, artifactMtime: number,
79
+ * newestSourceMtime: number, newestSource: string|null }}
80
+ */
81
+ export function artifactStaleness(
82
+ artifactPath,
83
+ { sourceDirs = [], sourceFiles = [], exts = null } = {},
84
+ ) {
85
+ const artifactMtime = fileMtime(artifactPath);
86
+ if (!artifactMtime) {
87
+ return {
88
+ stale: true,
89
+ reason: `artifact missing: ${artifactPath}`,
90
+ artifactMtime: 0,
91
+ newestSourceMtime: 0,
92
+ newestSource: null,
93
+ };
94
+ }
95
+ let newestSourceMtime = 0;
96
+ let newestSource = null;
97
+ const consider = (mtime, label) => {
98
+ if (mtime > newestSourceMtime) {
99
+ newestSourceMtime = mtime;
100
+ newestSource = label;
101
+ }
102
+ };
103
+ for (const dir of sourceDirs) consider(maxMtimeUnder(dir, { exts }), dir);
104
+ for (const file of sourceFiles) consider(fileMtime(file), file);
105
+
106
+ if (newestSourceMtime > artifactMtime) {
107
+ return {
108
+ stale: true,
109
+ reason: `source newer than artifact (${newestSource})`,
110
+ artifactMtime,
111
+ newestSourceMtime,
112
+ newestSource,
113
+ };
114
+ }
115
+ return {
116
+ stale: false,
117
+ reason: "fresh",
118
+ artifactMtime,
119
+ newestSourceMtime,
120
+ newestSource,
121
+ };
122
+ }
@@ -0,0 +1,98 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+
6
+ import {
7
+ artifactStaleness,
8
+ fileMtime,
9
+ maxMtimeUnder,
10
+ } from "./artifact-staleness.mjs";
11
+
12
+ let tmp: string;
13
+
14
+ beforeEach(() => {
15
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "artifact-staleness-"));
16
+ });
17
+
18
+ afterEach(() => {
19
+ fs.rmSync(tmp, { recursive: true, force: true });
20
+ });
21
+
22
+ function touch(file: string, mtimeMs: number) {
23
+ fs.mkdirSync(path.dirname(file), { recursive: true });
24
+ fs.writeFileSync(file, "x");
25
+ fs.utimesSync(file, mtimeMs / 1000, mtimeMs / 1000);
26
+ }
27
+
28
+ describe("maxMtimeUnder", () => {
29
+ it("returns the newest file mtime and skips build/dep dirs", () => {
30
+ touch(path.join(tmp, "src", "a.ts"), 1_000_000);
31
+ touch(path.join(tmp, "src", "nested", "b.ts"), 3_000_000);
32
+ touch(path.join(tmp, "node_modules", "junk.js"), 9_000_000);
33
+ touch(path.join(tmp, "dist", "out.js"), 9_000_000);
34
+ expect(maxMtimeUnder(path.join(tmp, "src"))).toBe(3_000_000);
35
+ });
36
+
37
+ it("honors an extension filter", () => {
38
+ touch(path.join(tmp, "src", "a.ts"), 2_000_000);
39
+ touch(path.join(tmp, "src", "a.png"), 5_000_000);
40
+ expect(
41
+ maxMtimeUnder(path.join(tmp, "src"), { exts: new Set([".ts"]) }),
42
+ ).toBe(2_000_000);
43
+ });
44
+
45
+ it("returns 0 for a missing dir", () => {
46
+ expect(maxMtimeUnder(path.join(tmp, "nope"))).toBe(0);
47
+ });
48
+ });
49
+
50
+ describe("fileMtime", () => {
51
+ it("returns the mtime of an existing file and 0 for a missing one", () => {
52
+ touch(path.join(tmp, "f"), 4_000_000);
53
+ expect(fileMtime(path.join(tmp, "f"))).toBe(4_000_000);
54
+ expect(fileMtime(path.join(tmp, "missing"))).toBe(0);
55
+ });
56
+ });
57
+
58
+ describe("artifactStaleness", () => {
59
+ it("is stale when the artifact is missing", () => {
60
+ const result = artifactStaleness(path.join(tmp, "art"), {
61
+ sourceDirs: [tmp],
62
+ });
63
+ expect(result.stale).toBe(true);
64
+ expect(result.reason).toMatch(/artifact missing/);
65
+ });
66
+
67
+ it("is stale when a source dir is newer than the artifact", () => {
68
+ touch(path.join(tmp, "artifact"), 2_000_000);
69
+ touch(path.join(tmp, "src", "code.ts"), 5_000_000);
70
+ const result = artifactStaleness(path.join(tmp, "artifact"), {
71
+ sourceDirs: [path.join(tmp, "src")],
72
+ });
73
+ expect(result.stale).toBe(true);
74
+ expect(result.reason).toMatch(/source newer than artifact/);
75
+ expect(result.newestSource).toBe(path.join(tmp, "src"));
76
+ });
77
+
78
+ it("is stale when a source FILE is newer than the artifact", () => {
79
+ touch(path.join(tmp, "artifact"), 2_000_000);
80
+ touch(path.join(tmp, "build-script.mjs"), 6_000_000);
81
+ const result = artifactStaleness(path.join(tmp, "artifact"), {
82
+ sourceFiles: [path.join(tmp, "build-script.mjs")],
83
+ });
84
+ expect(result.stale).toBe(true);
85
+ });
86
+
87
+ it("is fresh when the artifact is newer than all sources", () => {
88
+ touch(path.join(tmp, "src", "code.ts"), 2_000_000);
89
+ touch(path.join(tmp, "build-script.mjs"), 1_000_000);
90
+ touch(path.join(tmp, "artifact"), 5_000_000);
91
+ const result = artifactStaleness(path.join(tmp, "artifact"), {
92
+ sourceDirs: [path.join(tmp, "src")],
93
+ sourceFiles: [path.join(tmp, "build-script.mjs")],
94
+ });
95
+ expect(result.stale).toBe(false);
96
+ expect(result.reason).toBe("fresh");
97
+ });
98
+ });
@@ -8,7 +8,7 @@
8
8
  * A.scheduler.sink ── DuetSink(aToB) ──→ PcmRingBuffer ──→ B.micSource.push
9
9
  * B.scheduler.sink ── DuetSink(bToA) ──→ PcmRingBuffer ──→ A.micSource.push
10
10
  *
11
- * The TTS emits 24 kHz mono; the VAD + Qwen3-ASR want 16 kHz mono — one
11
+ * The TTS emits 24 kHz mono; the VAD + local ASR want 16 kHz mono — one
12
12
  * linear-interpolation resample in the `DuetSink`, zero file writes.
13
13
  *
14
14
  * `DuetSink` also reports the **`peer-utterance-end`** instant: when the
@@ -0,0 +1,80 @@
1
+ function escapeXmlText(value) {
2
+ return String(value)
3
+ .replace(/&/g, "&amp;")
4
+ .replace(/</g, "&lt;")
5
+ .replace(/>/g, "&gt;")
6
+ .replace(/"/g, "&quot;")
7
+ .replace(/'/g, "&apos;");
8
+ }
9
+
10
+ function insertBeforeRootPlistDictClose(content, insertion) {
11
+ const rootClose = "\n</dict>\n</plist>";
12
+ const index = content.lastIndexOf(rootClose);
13
+ if (index >= 0) {
14
+ return `${content.slice(0, index)}\n${insertion}${content.slice(index + "\n</dict>".length)}`;
15
+ }
16
+ const fallbackIndex = content.lastIndexOf("</dict>");
17
+ if (fallbackIndex < 0) {
18
+ throw new Error("Info.plist: could not locate top-level </dict>");
19
+ }
20
+ return `${content.slice(0, fallbackIndex)}${insertion}${content.slice(fallbackIndex + "</dict>".length)}`;
21
+ }
22
+
23
+ function findUrlTypesArrayRange(content) {
24
+ const keyIndex = content.indexOf("<key>CFBundleURLTypes</key>");
25
+ if (keyIndex < 0) return null;
26
+ const openMatch = /<array\b[^>]*>/g;
27
+ openMatch.lastIndex = keyIndex;
28
+ const firstOpen = openMatch.exec(content);
29
+ if (!firstOpen) {
30
+ throw new Error("Info.plist: CFBundleURLTypes has no array value");
31
+ }
32
+
33
+ const tagRe = /<\/?array\b[^>]*>/g;
34
+ tagRe.lastIndex = firstOpen.index;
35
+ let depth = 0;
36
+ for (let match = tagRe.exec(content); match; match = tagRe.exec(content)) {
37
+ if (match[0].startsWith("</")) {
38
+ depth -= 1;
39
+ if (depth === 0) return { start: firstOpen.index, close: match.index };
40
+ if (depth < 0) break;
41
+ } else {
42
+ depth += 1;
43
+ }
44
+ }
45
+
46
+ throw new Error("Info.plist: CFBundleURLTypes array is not closed");
47
+ }
48
+
49
+ export function ensurePlistUrlScheme(content, urlScheme) {
50
+ const trimmedScheme = String(urlScheme).trim();
51
+ if (!trimmedScheme) {
52
+ throw new Error("Cannot patch iOS Info.plist without a URL scheme");
53
+ }
54
+
55
+ const escapedScheme = escapeXmlText(trimmedScheme);
56
+ const entry = `
57
+ <dict>
58
+ <key>CFBundleURLName</key>
59
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
60
+ <key>CFBundleURLSchemes</key>
61
+ <array>
62
+ <string>${escapedScheme}</string>
63
+ </array>
64
+ </dict>`;
65
+ const urlTypesArrayRange = findUrlTypesArrayRange(content);
66
+ if (urlTypesArrayRange === null) {
67
+ return insertBeforeRootPlistDictClose(
68
+ content,
69
+ `\t<key>CFBundleURLTypes</key>\n\t<array>${entry}\n\t</array>\n</dict>`,
70
+ );
71
+ }
72
+ const urlTypesContent = content.slice(
73
+ urlTypesArrayRange.start,
74
+ urlTypesArrayRange.close,
75
+ );
76
+ if (urlTypesContent.includes(`<string>${escapedScheme}</string>`)) {
77
+ return content;
78
+ }
79
+ return `${content.slice(0, urlTypesArrayRange.close)}${entry}${content.slice(urlTypesArrayRange.close)}`;
80
+ }
@@ -0,0 +1,97 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ import { artifactStaleness } from "./artifact-staleness.mjs";
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const appCoreScriptsDir = path.resolve(__dirname, "..");
9
+
10
+ /**
11
+ * Brand-separation invariant (issue #9309): the shared canonical Android tree
12
+ * is used only for the elizaOS app itself. Whitelabel builds use appDir/android
13
+ * so identity overlays cannot corrupt another brand's native project.
14
+ */
15
+ export function androidUsesAppDirFor(appId, env = process.env) {
16
+ return env.ELIZA_ANDROID_USE_APP_DIR === "1" || appId !== "ai.elizaos.app";
17
+ }
18
+
19
+ const MTP_BUILD_SCRIPT = path.resolve(
20
+ appCoreScriptsDir,
21
+ "build-llama-cpp-mtp.mjs",
22
+ );
23
+
24
+ // The builder derives its repo root from packages/app-core/scripts, not from
25
+ // run-mobile-build's configurable repoRoot. Keep this identical so the
26
+ // staleness gate checks the same source tree the builder compiles.
27
+ export const mtpBuilderRepoRoot = path.resolve(
28
+ appCoreScriptsDir,
29
+ "..",
30
+ "..",
31
+ "..",
32
+ );
33
+
34
+ export const MTP_FORK_SRC_CANDIDATES = [
35
+ process.env.ELIZA_MTP_LLAMA_CPP_SRC?.trim(),
36
+ path.join(
37
+ mtpBuilderRepoRoot,
38
+ "plugins",
39
+ "plugin-local-inference",
40
+ "native",
41
+ "llama.cpp",
42
+ ),
43
+ path.join(
44
+ mtpBuilderRepoRoot,
45
+ "packages",
46
+ "native",
47
+ "ios-deps",
48
+ "llama.cpp",
49
+ "src",
50
+ ),
51
+ ].filter(Boolean);
52
+
53
+ /**
54
+ * Decide whether a staged MTP slice can be reused or is stale relative to the
55
+ * fork it was built from.
56
+ */
57
+ export function mtpSliceReuse(capabilitiesPath, forkSrc, currentRevision) {
58
+ if (!fs.existsSync(capabilitiesPath)) {
59
+ return { reusable: false, reason: "no CAPABILITIES.json" };
60
+ }
61
+ let recordedRevision = null;
62
+ try {
63
+ recordedRevision = JSON.parse(fs.readFileSync(capabilitiesPath, "utf8"))
64
+ ?.fork?.revision;
65
+ } catch {
66
+ return { reusable: false, reason: "unreadable CAPABILITIES.json" };
67
+ }
68
+ if (recordedRevision === "unknown") recordedRevision = null;
69
+ if (
70
+ recordedRevision &&
71
+ currentRevision &&
72
+ recordedRevision !== currentRevision
73
+ ) {
74
+ return {
75
+ reusable: false,
76
+ reason: `fork revision changed (${recordedRevision} -> ${currentRevision})`,
77
+ };
78
+ }
79
+ if (forkSrc) {
80
+ const staleness = artifactStaleness(capabilitiesPath, {
81
+ sourceDirs: [
82
+ path.join(forkSrc, "ggml"),
83
+ path.join(forkSrc, "src"),
84
+ path.join(forkSrc, "common"),
85
+ ],
86
+ sourceFiles: [path.join(forkSrc, "CMakeLists.txt"), MTP_BUILD_SCRIPT],
87
+ });
88
+ if (staleness.stale) {
89
+ return { reusable: false, reason: staleness.reason };
90
+ }
91
+ }
92
+ return { reusable: true, reason: "fresh" };
93
+ }
94
+
95
+ export function mtpForceRebuildRequested(reuse, env = process.env) {
96
+ return env.ELIZA_IOS_REBUILD_MTP === "1" || !reuse.reusable;
97
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Type declarations for `renderer-build-manifest.mjs` — the deterministic build
3
+ * stamp for the web/renderer bundle (issue #9309). Imported by the vite
4
+ * `renderer-build-manifest` plugin and the platform build orchestrators.
5
+ */
6
+
7
+ export const RENDERER_BUILD_MANIFEST_FILENAME: "eliza-renderer-build.json";
8
+ export const RENDERER_BUILD_MANIFEST_SCHEMA: "elizaos.renderer.build/v1";
9
+
10
+ export interface RendererBuildManifest {
11
+ schema: string;
12
+ buildId: string;
13
+ indexHtmlSha256: string;
14
+ assetCount: number;
15
+ builtAt: string;
16
+ commit: string | null;
17
+ variant: string | null;
18
+ capacitorTarget: string | null;
19
+ runtimeMode: string | null;
20
+ }
21
+
22
+ export interface RendererBuildManifestMeta {
23
+ builtAt?: string;
24
+ commit?: string | null;
25
+ variant?: string | null;
26
+ capacitorTarget?: string | null;
27
+ runtimeMode?: string | null;
28
+ }
29
+
30
+ export function computeRendererFingerprint(distDir: string): {
31
+ buildId: string;
32
+ indexHtmlSha256: string;
33
+ assetCount: number;
34
+ };
35
+
36
+ export function buildRendererManifest(
37
+ distDir: string,
38
+ meta?: RendererBuildManifestMeta,
39
+ ): RendererBuildManifest;
40
+
41
+ export function writeRendererBuildManifest(
42
+ distDir: string,
43
+ meta?: RendererBuildManifestMeta,
44
+ ): RendererBuildManifest;
45
+
46
+ export function readRendererBuildManifest(
47
+ dir: string,
48
+ ): RendererBuildManifest | null;
49
+
50
+ export function assertStagedRendererMatchesBuild(
51
+ freshDistDir: string,
52
+ stagedDir: string,
53
+ opts?: { label?: string },
54
+ ): RendererBuildManifest;
55
+
56
+ export function overlayFreshRendererIntoPublic(
57
+ freshDistDir: string,
58
+ targetPublicDir: string,
59
+ opts?: { label?: string },
60
+ ): RendererBuildManifest;
61
+
62
+ export function assertRendererRebuiltSince(
63
+ distDir: string,
64
+ opts: { notBefore: number; expectVariant?: string | null; label?: string },
65
+ ): RendererBuildManifest;