@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
@@ -1,1203 +0,0 @@
1
- import { execFileSync } from "node:child_process";
2
- import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
3
- import path from "node:path";
4
-
5
- type JsonPrimitive = string | number | boolean | null;
6
- type JsonValue =
7
- | JsonPrimitive
8
- | { readonly [key: string]: JsonValue }
9
- | readonly JsonValue[];
10
- type JsonObject = { readonly [key: string]: JsonValue };
11
-
12
- type Category =
13
- | "core-runtime"
14
- | "desktop-shell"
15
- | "production-ui"
16
- | "app-plugin"
17
- | "connector-plugin"
18
- | "model-plugin"
19
- | "voice-plugin"
20
- | "native-semantic-plugin"
21
- | "desktop-capability"
22
- | "data-memory-plugin"
23
- | "dev-tooling"
24
- | "provider-plugin"
25
- | "obsolete-or-duplicate"
26
- | "unknown";
27
-
28
- type KeepAs =
29
- | "core"
30
- | "plugin"
31
- | "app-plugin"
32
- | "connector"
33
- | "remote"
34
- | "dynamic-view-template"
35
- | "trace-source"
36
- | "voice-pipeline-participant"
37
- | "model-pipeline-participant"
38
- | "delete-candidate"
39
- | "needs-review";
40
-
41
- type RelatedRemote =
42
- | "eliza.runtime"
43
- | "eliza.fs"
44
- | "eliza.pty"
45
- | "eliza.git"
46
- | "eliza.local-model";
47
-
48
- type RelatedLayer =
49
- | "dynamic-views"
50
- | "trace"
51
- | "voice"
52
- | "local-inference"
53
- | "production-app"
54
- | "electrobun-shell"
55
- | "agent-runtime";
56
-
57
- type RecommendedNextAction =
58
- | "leave-alone"
59
- | "add-trace-hooks"
60
- | "add-dynamic-view-manifest"
61
- | "route-through-runtime-broker"
62
- | "connect-to-voice-pipeline"
63
- | "connect-to-local-model"
64
- | "dedupe-with-existing-plugin"
65
- | "deprecate"
66
- | "delete-after-confirmation"
67
- | "needs-owner-decision";
68
-
69
- type Risk = "low" | "medium" | "high";
70
-
71
- type ConvergenceAuditEntry = {
72
- id: string;
73
- path: string;
74
- category: Category;
75
- currentPurpose: string;
76
- keepAs: KeepAs;
77
- shouldBecomeRemote: boolean;
78
- shouldRegisterDynamicViews: boolean;
79
- shouldEmitTraceEvents: boolean;
80
- shouldUseRuntimeBroker: boolean;
81
- shouldStayOutOfElectrobun: boolean;
82
- relatedRemotes?: RelatedRemote[];
83
- relatedLayers?: RelatedLayer[];
84
- recommendedNextAction: RecommendedNextAction;
85
- risk: Risk;
86
- ownerDecisionNeeded?: boolean;
87
- notes: string;
88
- };
89
-
90
- type DeletionCandidate = {
91
- path: string;
92
- reason: string;
93
- confidence: "low" | "medium" | "high";
94
- safeToDeleteNow: boolean;
95
- requiresOwnerDecision: boolean;
96
- validationNeeded: string[];
97
- };
98
-
99
- type PackageJson = {
100
- name?: string;
101
- description?: string;
102
- };
103
-
104
- type AuditDocument = {
105
- generatedAt: string;
106
- branch: string;
107
- aheadBehind: string;
108
- dirtyStatus: string[];
109
- entries: ConvergenceAuditEntry[];
110
- deletionCandidates: DeletionCandidate[];
111
- summaries: {
112
- byCategory: Record<Category, number>;
113
- byRecommendedNextAction: Record<RecommendedNextAction, number>;
114
- hardNoMigration: string[];
115
- currentRemotes: string[];
116
- futureRemoteCandidates: string[];
117
- traceFirstCandidates: string[];
118
- dynamicViewCandidates: string[];
119
- voiceLocalModelCandidates: string[];
120
- runtimeBrokerCandidates: string[];
121
- ownerDecisionItems: string[];
122
- };
123
- };
124
-
125
- const SCRIPT_DIR = path.dirname(new URL(import.meta.url).pathname);
126
- const ELECTROBUN_ROOT = path.resolve(SCRIPT_DIR, "..");
127
- const REPO_ROOT = path.resolve(ELECTROBUN_ROOT, "../../../..");
128
- const DOCS_DIR = path.join(ELECTROBUN_ROOT, "docs");
129
-
130
- const CATEGORY_ORDER: readonly Category[] = [
131
- "core-runtime",
132
- "desktop-shell",
133
- "production-ui",
134
- "app-plugin",
135
- "connector-plugin",
136
- "model-plugin",
137
- "voice-plugin",
138
- "native-semantic-plugin",
139
- "desktop-capability",
140
- "data-memory-plugin",
141
- "dev-tooling",
142
- "provider-plugin",
143
- "obsolete-or-duplicate",
144
- "unknown",
145
- ];
146
-
147
- const ACTION_ORDER: readonly RecommendedNextAction[] = [
148
- "leave-alone",
149
- "add-trace-hooks",
150
- "add-dynamic-view-manifest",
151
- "route-through-runtime-broker",
152
- "connect-to-voice-pipeline",
153
- "connect-to-local-model",
154
- "dedupe-with-existing-plugin",
155
- "deprecate",
156
- "delete-after-confirmation",
157
- "needs-owner-decision",
158
- ];
159
-
160
- const CONNECTOR_NAMES = new Set([
161
- "plugin-bluebubbles",
162
- "plugin-bluesky",
163
- "plugin-calendly",
164
- "plugin-discord",
165
- "plugin-discord-local",
166
- "plugin-farcaster",
167
- "plugin-feishu",
168
- "plugin-github",
169
- "plugin-google",
170
- "plugin-google-chat",
171
- "plugin-google-meet-cute",
172
- "plugin-imessage",
173
- "plugin-instagram",
174
- "plugin-line",
175
- "plugin-linear",
176
- "plugin-matrix",
177
- "plugin-mcp",
178
- "plugin-messages",
179
- "plugin-ngrok",
180
- "plugin-nostr",
181
- "plugin-shopify",
182
- "plugin-signal",
183
- "plugin-slack",
184
- "plugin-social-alpha",
185
- "plugin-tailscale",
186
- "plugin-telegram",
187
- "plugin-tunnel",
188
- "plugin-twitch",
189
- "plugin-vincent",
190
- "plugin-web-search",
191
- "plugin-wechat",
192
- "plugin-whatsapp",
193
- "plugin-x",
194
- "plugin-x402",
195
- "plugin-xmtp",
196
- ]);
197
-
198
- const PROVIDER_NAMES = new Set([
199
- "plugin-anthropic",
200
- "plugin-anthropic-proxy",
201
- "plugin-google-genai",
202
- "plugin-groq",
203
- "plugin-openai",
204
- "plugin-openrouter",
205
- "plugin-xai",
206
- "plugin-zai",
207
- ]);
208
-
209
- const MODEL_NAMES = new Set([
210
- "plugin-aosp-local-inference",
211
- "plugin-local-inference",
212
- "plugin-lmstudio",
213
- "plugin-native-llama",
214
- "plugin-ollama",
215
- "plugin-rlm",
216
- ]);
217
-
218
- const VOICE_NAMES = new Set([
219
- "plugin-edge-tts",
220
- "plugin-elevenlabs",
221
- "plugin-native-talkmode",
222
- ]);
223
-
224
- const DATA_NAMES = new Set([
225
- "plugin-inmemorydb",
226
- "plugin-local-storage",
227
- "plugin-localdb",
228
- "plugin-sql",
229
- ]);
230
-
231
- const APP_PLUGIN_NAMES = new Set([
232
- "app-model-tester",
233
- "plugin-app-control",
234
- "plugin-app-manager",
235
- "plugin-browser",
236
- "plugin-feed",
237
- "plugin-clawville",
238
- "plugin-companion",
239
- "plugin-defense-of-the-agents",
240
- "plugin-documents",
241
- "plugin-eliza-classic",
242
- "plugin-elizacloud",
243
- "plugin-elizamaker",
244
- "plugin-form",
245
- "plugin-health",
246
- "plugin-hyperliquid-app",
247
- "plugin-personal-assistant",
248
- "plugin-minecraft",
249
- "plugin-music",
250
- "plugin-mysticism",
251
- "plugin-pdf",
252
- "plugin-phone",
253
- "plugin-polymarket-app",
254
- "plugin-roblox",
255
- "plugin-shopify-ui",
256
- "plugin-steward-app",
257
- "plugin-suno",
258
- "plugin-task-coordinator",
259
- "plugin-todos",
260
- "plugin-training",
261
- "plugin-video",
262
- "plugin-vision",
263
- "plugin-wallet",
264
- "plugin-wallet-ui",
265
- "plugin-workflow",
266
- ]);
267
-
268
- const DEV_TOOL_NAMES = new Set([
269
- "plugin-action-bench",
270
- "plugin-agent-orchestrator",
271
- "plugin-agent-skills",
272
- "plugin-background-runner",
273
- "plugin-benchmarks",
274
- "plugin-cli",
275
- "plugin-codex-cli",
276
- "plugin-coding-tools",
277
- "plugin-commands",
278
- "plugin-registry",
279
- "plugin-streaming",
280
- "plugin-tee",
281
- "plugin-trajectory-logger",
282
- ]);
283
-
284
- const DYNAMIC_VIEW_NAMES = new Set([
285
- "app-model-tester",
286
- "plugin-agent-orchestrator",
287
- "plugin-agent-skills",
288
- "plugin-browser",
289
- "plugin-coding-tools",
290
- "plugin-computeruse",
291
- "plugin-documents",
292
- "plugin-github",
293
- "plugin-native-canvas",
294
- "plugin-native-screencapture",
295
- "plugin-task-coordinator",
296
- "plugin-training",
297
- "plugin-workflow",
298
- ]);
299
-
300
- const RUNTIME_BROKER_NAMES = new Set([
301
- "plugin-browser",
302
- "plugin-codex-cli",
303
- "plugin-coding-tools",
304
- "plugin-computeruse",
305
- "plugin-device-filesystem",
306
- "plugin-device-settings",
307
- "plugin-native-activity-tracker",
308
- "plugin-native-appblocker",
309
- "plugin-native-bun-runtime",
310
- "plugin-native-calendar",
311
- "plugin-native-camera",
312
- "plugin-native-canvas",
313
- "plugin-native-contacts",
314
- "plugin-native-desktop",
315
- "plugin-native-location",
316
- "plugin-native-macosalarm",
317
- "plugin-native-messages",
318
- "plugin-native-phone",
319
- "plugin-native-screencapture",
320
- "plugin-native-system",
321
- "plugin-native-wifi",
322
- "plugin-screenshare",
323
- "plugin-shell",
324
- "plugin-contacts",
325
- "plugin-capacitor-bridge",
326
- "plugin-wifi",
327
- ]);
328
-
329
- const TRACE_FIRST_NAMES = new Set([
330
- "plugin-agent-orchestrator",
331
- "plugin-agent-skills",
332
- "plugin-browser",
333
- "plugin-coding-tools",
334
- "plugin-computeruse",
335
- "plugin-discord",
336
- "plugin-documents",
337
- "plugin-github",
338
- "plugin-local-inference",
339
- "plugin-native-screencapture",
340
- "plugin-native-talkmode",
341
- "plugin-task-coordinator",
342
- "plugin-training",
343
- "plugin-workflow",
344
- ]);
345
-
346
- const REMOTE_IDS = new Map([
347
- ["runtime", "eliza.runtime"],
348
- ["fs", "eliza.fs"],
349
- ["pty", "eliza.pty"],
350
- ["git", "eliza.git"],
351
- ["local-model", "eliza.local-model"],
352
- ["surface", "eliza.surface"],
353
- ]);
354
-
355
- const REMOTE_RELATED = new Map<string, RelatedRemote[]>([
356
- ["runtime", ["eliza.runtime"]],
357
- ["fs", ["eliza.fs"]],
358
- ["pty", ["eliza.pty"]],
359
- ["git", ["eliza.git"]],
360
- ["local-model", ["eliza.local-model"]],
361
- ["surface", ["eliza.runtime"]],
362
- ]);
363
-
364
- const AUDIT_OUTPUT_PATHS = new Set([
365
- "packages/app-core/platforms/electrobun/docs/convergence-audit.json",
366
- "packages/app-core/platforms/electrobun/docs/convergence-audit.md",
367
- "packages/app-core/platforms/electrobun/scripts/generate-convergence-audit.ts",
368
- ]);
369
-
370
- const AUDIT_OUTPUT_PREFIXES = ["packages/app-core/platforms/electrobun/docs/"];
371
-
372
- function relativePath(absolutePath: string): string {
373
- return path.relative(REPO_ROOT, absolutePath);
374
- }
375
-
376
- function isJsonObject(value: JsonValue): value is JsonObject {
377
- return value !== null && typeof value === "object" && !Array.isArray(value);
378
- }
379
-
380
- async function pathExists(targetPath: string): Promise<boolean> {
381
- try {
382
- await stat(path.join(REPO_ROOT, targetPath));
383
- return true;
384
- } catch {
385
- return false;
386
- }
387
- }
388
-
389
- async function readPackageJson(directory: string): Promise<PackageJson | null> {
390
- const filePath = path.join(REPO_ROOT, directory, "package.json");
391
- try {
392
- const raw = await readFile(filePath, "utf8");
393
- const parsed = JSON.parse(raw) as JsonValue;
394
- if (!isJsonObject(parsed)) return null;
395
- const name = parsed.name;
396
- const description = parsed.description;
397
- return {
398
- name: typeof name === "string" ? name : undefined,
399
- description: typeof description === "string" ? description : undefined,
400
- };
401
- } catch {
402
- return null;
403
- }
404
- }
405
-
406
- function git(args: string[]): string {
407
- try {
408
- return execFileSync("git", args, {
409
- cwd: REPO_ROOT,
410
- encoding: "utf8",
411
- stdio: ["ignore", "pipe", "ignore"],
412
- }).trim();
413
- } catch {
414
- return "unavailable";
415
- }
416
- }
417
-
418
- function countBy<T extends string>(
419
- values: readonly T[],
420
- items: readonly T[],
421
- ): Record<T, number> {
422
- const result = Object.fromEntries(
423
- values.map((value) => [value, 0]),
424
- ) as Record<T, number>;
425
- for (const item of items) result[item] += 1;
426
- return result;
427
- }
428
-
429
- function packagePurpose(
430
- packageJson: PackageJson | null,
431
- fallback: string,
432
- ): string {
433
- return packageJson?.description?.trim() || fallback;
434
- }
435
-
436
- function nativeRelatedRemote(id: string): RelatedRemote[] | undefined {
437
- if (id.includes("filesystem")) return ["eliza.fs"];
438
- if (id.includes("shell") || id.includes("terminal")) return ["eliza.pty"];
439
- if (id.includes("coding-tools") || id.includes("codex")) {
440
- return ["eliza.runtime", "eliza.fs", "eliza.pty", "eliza.git"];
441
- }
442
- if (id.includes("local-inference") || id.includes("llama")) {
443
- return ["eliza.local-model"];
444
- }
445
- if (id.includes("computeruse") || id.includes("browser")) {
446
- return ["eliza.runtime"];
447
- }
448
- if (id.includes("screen") || id.includes("camera")) {
449
- return ["eliza.runtime"];
450
- }
451
- return undefined;
452
- }
453
-
454
- function classifyPlugin(id: string): {
455
- category: Category;
456
- keepAs: KeepAs;
457
- action: RecommendedNextAction;
458
- risk: Risk;
459
- } {
460
- if (VOICE_NAMES.has(id)) {
461
- return {
462
- category: "voice-plugin",
463
- keepAs: "voice-pipeline-participant",
464
- action: "connect-to-voice-pipeline",
465
- risk: "medium",
466
- };
467
- }
468
- if (MODEL_NAMES.has(id)) {
469
- return {
470
- category: "model-plugin",
471
- keepAs: "model-pipeline-participant",
472
- action: "connect-to-local-model",
473
- risk: "medium",
474
- };
475
- }
476
- if (CONNECTOR_NAMES.has(id)) {
477
- return {
478
- category: "connector-plugin",
479
- keepAs: "connector",
480
- action: "add-trace-hooks",
481
- risk: "medium",
482
- };
483
- }
484
- if (PROVIDER_NAMES.has(id)) {
485
- return {
486
- category: "provider-plugin",
487
- keepAs: "plugin",
488
- action: "leave-alone",
489
- risk: "low",
490
- };
491
- }
492
- if (
493
- id.startsWith("plugin-native-") ||
494
- id.startsWith("plugin-device-") ||
495
- RUNTIME_BROKER_NAMES.has(id)
496
- ) {
497
- return {
498
- category: "native-semantic-plugin",
499
- keepAs: "plugin",
500
- action: RUNTIME_BROKER_NAMES.has(id)
501
- ? "route-through-runtime-broker"
502
- : "add-trace-hooks",
503
- risk: "medium",
504
- };
505
- }
506
- if (DATA_NAMES.has(id)) {
507
- return {
508
- category: "data-memory-plugin",
509
- keepAs: "plugin",
510
- action: "leave-alone",
511
- risk: "low",
512
- };
513
- }
514
- if (APP_PLUGIN_NAMES.has(id) || id.endsWith("-app")) {
515
- return {
516
- category: "app-plugin",
517
- keepAs: "app-plugin",
518
- action: DYNAMIC_VIEW_NAMES.has(id)
519
- ? "add-dynamic-view-manifest"
520
- : "add-trace-hooks",
521
- risk: "medium",
522
- };
523
- }
524
- if (DEV_TOOL_NAMES.has(id)) {
525
- return {
526
- category: "dev-tooling",
527
- keepAs: "plugin",
528
- action: TRACE_FIRST_NAMES.has(id) ? "add-trace-hooks" : "leave-alone",
529
- risk: "medium",
530
- };
531
- }
532
- if (id === "plugin-computeruse" || id === "plugin-screenshare") {
533
- return {
534
- category: "native-semantic-plugin",
535
- keepAs: "plugin",
536
- action: "route-through-runtime-broker",
537
- risk: "medium",
538
- };
539
- }
540
- return {
541
- category: "unknown",
542
- keepAs: "needs-review",
543
- action: "needs-owner-decision",
544
- risk: "medium",
545
- };
546
- }
547
-
548
- function pluginNotes(id: string, category: Category): string {
549
- if (CONNECTOR_NAMES.has(id)) {
550
- return "Keep as a connector plugin. Add trace hooks for ingress, action execution, reply, rate limit, and failure events where useful.";
551
- }
552
- if (DYNAMIC_VIEW_NAMES.has(id)) {
553
- return "Keep existing plugin boundary. Add contextual dynamic views only for task-specific inspection, not a fixed dashboard.";
554
- }
555
- if (VOICE_NAMES.has(id)) {
556
- return "Keep as a runtime voice participant. Wire availability, ASR/TTS/turn events, and latency into eliza.voice and trace.";
557
- }
558
- if (MODEL_NAMES.has(id)) {
559
- return "Keep as model/local-inference integration. Use eliza.local-model and voice validation as control and observability wrappers.";
560
- }
561
- if (category === "native-semantic-plugin") {
562
- return "Keep as the agent-facing semantic plugin. Route host/system execution through Electrobun or an existing Remote when needed.";
563
- }
564
- if (category === "provider-plugin") {
565
- return "Keep as a provider plugin. Do not move provider routing into Electrobun or a Remote.";
566
- }
567
- if (category === "data-memory-plugin") {
568
- return "Keep as a data or memory plugin. Do not duplicate storage semantics in Electrobun.";
569
- }
570
- return "Needs owner review before any migration, deletion, or dynamic-view work.";
571
- }
572
-
573
- async function pluginEntry(directory: string): Promise<ConvergenceAuditEntry> {
574
- const id = path.basename(directory);
575
- const packageJson = await readPackageJson(directory);
576
- const classification = classifyPlugin(id);
577
- const shouldRegisterDynamicViews = DYNAMIC_VIEW_NAMES.has(id);
578
- const shouldEmitTraceEvents =
579
- TRACE_FIRST_NAMES.has(id) ||
580
- CONNECTOR_NAMES.has(id) ||
581
- classification.category === "native-semantic-plugin";
582
- const shouldUseRuntimeBroker = RUNTIME_BROKER_NAMES.has(id);
583
- const relatedRemotes = nativeRelatedRemote(id);
584
- const relatedLayers: RelatedLayer[] = [];
585
- if (shouldRegisterDynamicViews) relatedLayers.push("dynamic-views");
586
- if (shouldEmitTraceEvents) relatedLayers.push("trace");
587
- if (VOICE_NAMES.has(id)) relatedLayers.push("voice");
588
- if (MODEL_NAMES.has(id)) relatedLayers.push("local-inference");
589
- return {
590
- id,
591
- path: directory,
592
- category: classification.category,
593
- currentPurpose: packagePurpose(packageJson, `Plugin package ${id}.`),
594
- keepAs: classification.keepAs,
595
- shouldBecomeRemote: false,
596
- shouldRegisterDynamicViews,
597
- shouldEmitTraceEvents,
598
- shouldUseRuntimeBroker,
599
- shouldStayOutOfElectrobun:
600
- classification.category === "connector-plugin" ||
601
- classification.category === "provider-plugin" ||
602
- classification.category === "app-plugin",
603
- relatedRemotes,
604
- relatedLayers: relatedLayers.length > 0 ? relatedLayers : undefined,
605
- recommendedNextAction: shouldRegisterDynamicViews
606
- ? "add-dynamic-view-manifest"
607
- : classification.action,
608
- risk: classification.risk,
609
- ownerDecisionNeeded: classification.category === "unknown" || undefined,
610
- notes: pluginNotes(id, classification.category),
611
- };
612
- }
613
-
614
- async function directDirectories(parent: string): Promise<string[]> {
615
- const absoluteParent = path.join(REPO_ROOT, parent);
616
- const entries = await readdir(absoluteParent, { withFileTypes: true });
617
- return entries
618
- .filter((entry) => entry.isDirectory())
619
- .map((entry) => path.join(parent, entry.name))
620
- .sort();
621
- }
622
-
623
- async function packageEntry(params: {
624
- id: string;
625
- path: string;
626
- category: Category;
627
- keepAs: KeepAs;
628
- action: RecommendedNextAction;
629
- notes: string;
630
- currentPurpose: string;
631
- risk?: Risk;
632
- shouldRegisterDynamicViews?: boolean;
633
- shouldEmitTraceEvents?: boolean;
634
- shouldUseRuntimeBroker?: boolean;
635
- shouldStayOutOfElectrobun?: boolean;
636
- relatedRemotes?: RelatedRemote[];
637
- relatedLayers?: RelatedLayer[];
638
- shouldBecomeRemote?: boolean;
639
- ownerDecisionNeeded?: boolean;
640
- }): Promise<ConvergenceAuditEntry> {
641
- const packageJson = await readPackageJson(params.path);
642
- return {
643
- id: params.id,
644
- path: params.path,
645
- category: params.category,
646
- currentPurpose: packagePurpose(packageJson, params.currentPurpose),
647
- keepAs: params.keepAs,
648
- shouldBecomeRemote: params.shouldBecomeRemote ?? false,
649
- shouldRegisterDynamicViews: params.shouldRegisterDynamicViews ?? false,
650
- shouldEmitTraceEvents: params.shouldEmitTraceEvents ?? false,
651
- shouldUseRuntimeBroker: params.shouldUseRuntimeBroker ?? false,
652
- shouldStayOutOfElectrobun: params.shouldStayOutOfElectrobun ?? false,
653
- relatedRemotes: params.relatedRemotes,
654
- relatedLayers: params.relatedLayers,
655
- recommendedNextAction: params.action,
656
- risk: params.risk ?? "low",
657
- ownerDecisionNeeded: params.ownerDecisionNeeded,
658
- notes: params.notes,
659
- };
660
- }
661
-
662
- async function remoteEntries(): Promise<ConvergenceAuditEntry[]> {
663
- const directories = await directDirectories(
664
- "packages/app-core/platforms/electrobun/remotes",
665
- );
666
- return Promise.all(
667
- directories.map(async (directory) => {
668
- const basename = path.basename(directory);
669
- const id = REMOTE_IDS.get(basename) ?? `eliza.${basename}`;
670
- const packageJson = await readPackageJson(directory);
671
- return {
672
- id,
673
- path: directory,
674
- category: basename === "surface" ? "dev-tooling" : "desktop-capability",
675
- currentPurpose: packagePurpose(
676
- packageJson,
677
- `${id} first-party Electrobun Remote.`,
678
- ),
679
- keepAs: "remote",
680
- shouldBecomeRemote: false,
681
- shouldRegisterDynamicViews: basename === "surface",
682
- shouldEmitTraceEvents: basename !== "surface",
683
- shouldUseRuntimeBroker: basename !== "surface",
684
- shouldStayOutOfElectrobun: false,
685
- relatedRemotes: REMOTE_RELATED.get(basename),
686
- relatedLayers:
687
- basename === "surface"
688
- ? ["dynamic-views", "trace"]
689
- : ["electrobun-shell", "agent-runtime"],
690
- recommendedNextAction: "leave-alone",
691
- risk: basename === "surface" ? "medium" : "low",
692
- notes:
693
- basename === "surface"
694
- ? "Dev/admin only. Do not turn into production UI."
695
- : "Already a desktop/system capability provider. Keep scoped and brokered through host APIs.",
696
- };
697
- }),
698
- );
699
- }
700
-
701
- async function deletionCandidates(): Promise<DeletionCandidate[]> {
702
- const candidates: DeletionCandidate[] = [];
703
- const generatedPaths = [
704
- "packages/app-core/platforms/electrobun/build",
705
- "packages/app-core/platforms/electrobun/native/.build",
706
- "dist",
707
- ];
708
- for (const candidatePath of generatedPaths) {
709
- if (await pathExists(candidatePath)) {
710
- candidates.push({
711
- path: candidatePath,
712
- reason:
713
- "Generated local build output. It should not be part of architecture or PR review scope.",
714
- confidence: "medium",
715
- safeToDeleteNow: false,
716
- requiresOwnerDecision: false,
717
- validationNeeded: [
718
- "confirm ignored/untracked status",
719
- "rerun build if removed",
720
- ],
721
- });
722
- }
723
- }
724
- const pluginDirectories = await directDirectories("plugins");
725
- for (const directory of pluginDirectories) {
726
- if (
727
- (path.basename(directory).startsWith("plugin-") ||
728
- path.basename(directory).startsWith("app-")) &&
729
- !(await pathExists(path.join(directory, "package.json")))
730
- ) {
731
- candidates.push({
732
- path: directory,
733
- reason:
734
- "Plugin-shaped directory without package.json. Needs owner review before deletion or restoration.",
735
- confidence: "low",
736
- safeToDeleteNow: false,
737
- requiresOwnerDecision: true,
738
- validationNeeded: [
739
- "search imports",
740
- "check package registry references",
741
- ],
742
- });
743
- }
744
- }
745
- return candidates;
746
- }
747
-
748
- async function buildEntries(): Promise<ConvergenceAuditEntry[]> {
749
- const manualEntries = await Promise.all([
750
- packageEntry({
751
- id: "repo-root",
752
- path: ".",
753
- category: "core-runtime",
754
- keepAs: "core",
755
- action: "leave-alone",
756
- currentPurpose: "Workspace root and monorepo coordination.",
757
- notes:
758
- "Keep as workspace root. Do not use Electrobun convergence to change global repo ownership.",
759
- relatedLayers: ["agent-runtime"],
760
- }),
761
- packageEntry({
762
- id: "packages/core",
763
- path: "packages/core",
764
- category: "core-runtime",
765
- keepAs: "core",
766
- action: "leave-alone",
767
- currentPurpose: "Core Eliza agent runtime package.",
768
- notes: "Hard no-migration item. Runtime semantics stay here.",
769
- shouldStayOutOfElectrobun: true,
770
- relatedLayers: ["agent-runtime"],
771
- }),
772
- packageEntry({
773
- id: "packages/agent",
774
- path: "packages/agent",
775
- category: "core-runtime",
776
- keepAs: "core",
777
- action: "leave-alone",
778
- currentPurpose: "Agent runtime/server package.",
779
- notes:
780
- "AgentManager/Electrobun may own lifecycle, but agent runtime code stays in runtime packages.",
781
- shouldStayOutOfElectrobun: true,
782
- relatedLayers: ["agent-runtime"],
783
- }),
784
- packageEntry({
785
- id: "packages/app",
786
- path: "packages/app",
787
- category: "production-ui",
788
- keepAs: "core",
789
- action: "leave-alone",
790
- currentPurpose: "Cross-platform production app UI.",
791
- notes:
792
- "Hard no-migration item. Do not replace with eliza.surface or fixed dynamic-view panels.",
793
- shouldStayOutOfElectrobun: true,
794
- relatedLayers: ["production-app"],
795
- }),
796
- packageEntry({
797
- id: "packages/app-core",
798
- path: "packages/app-core",
799
- category: "core-runtime",
800
- keepAs: "core",
801
- action: "leave-alone",
802
- currentPurpose: "Shared app shell/core package.",
803
- notes:
804
- "Hard no-migration item. Electrobun platform code can add host docs, not absorb app-core ownership.",
805
- relatedLayers: ["production-app", "electrobun-shell"],
806
- }),
807
- packageEntry({
808
- id: "packages/app-core/platforms/electrobun",
809
- path: "packages/app-core/platforms/electrobun",
810
- category: "desktop-shell",
811
- keepAs: "core",
812
- action: "leave-alone",
813
- currentPurpose: "Electrobun native desktop shell.",
814
- notes:
815
- "Electrobun is the shell, not the agent runtime. Keep AgentManager as runtime lifecycle owner.",
816
- relatedLayers: ["electrobun-shell", "dynamic-views", "trace"],
817
- }),
818
- packageEntry({
819
- id: "packages/electrobun-remote-plugins",
820
- path: "packages/electrobun-remote-plugins",
821
- category: "desktop-shell",
822
- keepAs: "core",
823
- action: "leave-alone",
824
- currentPurpose: "Electrobun module/Remote package substrate.",
825
- notes:
826
- "Keep as module runtime substrate. Do not turn into a second plugin system.",
827
- relatedLayers: ["electrobun-shell"],
828
- }),
829
- packageEntry({
830
- id: "packages/shared/src/local-inference",
831
- path: "packages/shared/src/local-inference",
832
- category: "model-plugin",
833
- keepAs: "model-pipeline-participant",
834
- action: "connect-to-local-model",
835
- currentPurpose:
836
- "Shared local-inference model catalog, routing, paths, and voice metadata.",
837
- notes:
838
- "Source of truth for Eliza-1 and voice metadata. Do not duplicate in Electrobun.",
839
- shouldEmitTraceEvents: true,
840
- shouldStayOutOfElectrobun: true,
841
- relatedRemotes: ["eliza.local-model"],
842
- relatedLayers: ["local-inference", "voice"],
843
- risk: "medium",
844
- }),
845
- packageEntry({
846
- id: "packages/app-core/platforms/electrobun/src/dynamic-views",
847
- path: "packages/app-core/platforms/electrobun/src/dynamic-views",
848
- category: "desktop-shell",
849
- keepAs: "core",
850
- action: "leave-alone",
851
- currentPurpose: "Dynamic view registry/session infrastructure.",
852
- notes:
853
- "Contextual view substrate only. Do not convert into dashboard navigation.",
854
- shouldRegisterDynamicViews: true,
855
- relatedLayers: ["dynamic-views", "electrobun-shell"],
856
- }),
857
- packageEntry({
858
- id: "packages/app-core/platforms/electrobun/src/trace",
859
- path: "packages/app-core/platforms/electrobun/src/trace",
860
- category: "desktop-shell",
861
- keepAs: "core",
862
- action: "leave-alone",
863
- currentPurpose: "Trace service and dynamic trace view infrastructure.",
864
- notes:
865
- "Observability spine. Plugins should emit trace events; trace should not become a static dashboard.",
866
- shouldRegisterDynamicViews: true,
867
- shouldEmitTraceEvents: true,
868
- relatedLayers: ["trace", "dynamic-views"],
869
- }),
870
- packageEntry({
871
- id: "packages/app-core/platforms/electrobun/src/voice",
872
- path: "packages/app-core/platforms/electrobun/src/voice",
873
- category: "desktop-shell",
874
- keepAs: "core",
875
- action: "leave-alone",
876
- currentPurpose:
877
- "Voice pipeline instrumentation, adapter, and validation layer.",
878
- notes:
879
- "Voice is a pipeline. Keep live behavior gated and report through trace.",
880
- shouldRegisterDynamicViews: true,
881
- shouldEmitTraceEvents: true,
882
- relatedLayers: ["voice", "trace", "dynamic-views", "local-inference"],
883
- }),
884
- packageEntry({
885
- id: "future.eliza.computer",
886
- path: "packages/app-core/platforms/electrobun/remotes/computer",
887
- category: "desktop-capability",
888
- keepAs: "needs-review",
889
- action: "needs-owner-decision",
890
- currentPurpose:
891
- "Potential future broker for screen/browser/camera/computer context if existing host APIs need a Remote boundary.",
892
- notes:
893
- "Only future Remote candidate. Do not create until a concrete host capability boundary is required.",
894
- shouldBecomeRemote: true,
895
- shouldEmitTraceEvents: true,
896
- shouldUseRuntimeBroker: true,
897
- relatedLayers: ["electrobun-shell", "trace", "dynamic-views"],
898
- risk: "medium",
899
- ownerDecisionNeeded: true,
900
- }),
901
- ]);
902
-
903
- const pluginDirectories = (await directDirectories("plugins")).filter(
904
- (directory) =>
905
- path.basename(directory).startsWith("plugin-") ||
906
- path.basename(directory).startsWith("app-"),
907
- );
908
- const pluginEntries = await Promise.all(pluginDirectories.map(pluginEntry));
909
- return [...manualEntries, ...(await remoteEntries()), ...pluginEntries].sort(
910
- (left, right) => left.id.localeCompare(right.id),
911
- );
912
- }
913
-
914
- function list(
915
- entries: readonly ConvergenceAuditEntry[],
916
- predicate: (entry: ConvergenceAuditEntry) => boolean,
917
- ): string[] {
918
- return entries
919
- .filter(predicate)
920
- .map((entry) => entry.id)
921
- .sort();
922
- }
923
-
924
- function buildSummaries(
925
- entries: ConvergenceAuditEntry[],
926
- ): AuditDocument["summaries"] {
927
- return {
928
- byCategory: countBy(
929
- CATEGORY_ORDER,
930
- entries.map((entry) => entry.category),
931
- ),
932
- byRecommendedNextAction: countBy(
933
- ACTION_ORDER,
934
- entries.map((entry) => entry.recommendedNextAction),
935
- ),
936
- hardNoMigration: [
937
- "packages/app",
938
- "packages/core",
939
- "packages/agent",
940
- "packages/app-core",
941
- "packages/app-core/platforms/electrobun core shell",
942
- "packages/electrobun-remote-plugins",
943
- "connector plugins",
944
- "provider plugins",
945
- "app plugins",
946
- "core runtime plugins",
947
- ],
948
- currentRemotes: list(entries, (entry) => entry.keepAs === "remote"),
949
- futureRemoteCandidates: list(entries, (entry) => entry.shouldBecomeRemote),
950
- traceFirstCandidates: list(
951
- entries,
952
- (entry) => entry.shouldEmitTraceEvents && entry.keepAs !== "remote",
953
- ),
954
- dynamicViewCandidates: list(
955
- entries,
956
- (entry) => entry.shouldRegisterDynamicViews,
957
- ),
958
- voiceLocalModelCandidates: list(
959
- entries,
960
- (entry) =>
961
- entry.relatedLayers?.includes("voice") === true ||
962
- entry.relatedLayers?.includes("local-inference") === true,
963
- ),
964
- runtimeBrokerCandidates: list(
965
- entries,
966
- (entry) => entry.shouldUseRuntimeBroker,
967
- ),
968
- ownerDecisionItems: list(
969
- entries,
970
- (entry) =>
971
- entry.ownerDecisionNeeded === true ||
972
- entry.recommendedNextAction === "needs-owner-decision",
973
- ),
974
- };
975
- }
976
-
977
- function markdownList(items: readonly string[]): string {
978
- if (items.length === 0) return "- None";
979
- return items.map((item) => `- ${item}`).join("\n");
980
- }
981
-
982
- function summaryTable(counts: Record<string, number>): string {
983
- return Object.entries(counts)
984
- .filter(([, count]) => count > 0)
985
- .map(([key, count]) => `| ${key} | ${count} |`)
986
- .join("\n");
987
- }
988
-
989
- function entriesTable(entries: readonly ConvergenceAuditEntry[]): string {
990
- const rows = entries.map((entry) =>
991
- [
992
- entry.id,
993
- entry.category,
994
- entry.keepAs,
995
- entry.recommendedNextAction,
996
- entry.shouldRegisterDynamicViews ? "yes" : "no",
997
- entry.shouldEmitTraceEvents ? "yes" : "no",
998
- entry.shouldUseRuntimeBroker ? "yes" : "no",
999
- entry.risk,
1000
- entry.notes.replace(/\|/g, "\\|"),
1001
- ].join(" | "),
1002
- );
1003
- return [
1004
- "| ID | Category | Keep As | Next Action | Dynamic View | Trace | Broker | Risk | Notes |",
1005
- "| --- | --- | --- | --- | --- | --- | --- | --- | --- |",
1006
- ...rows.map((row) => `| ${row} |`),
1007
- ].join("\n");
1008
- }
1009
-
1010
- function deletionTable(candidates: readonly DeletionCandidate[]): string {
1011
- if (candidates.length === 0) return "No deletion candidates were found.";
1012
- return [
1013
- "| Path | Reason | Confidence | Safe Now | Owner Decision | Validation |",
1014
- "| --- | --- | --- | --- | --- | --- |",
1015
- ...candidates.map((candidate) =>
1016
- [
1017
- candidate.path,
1018
- candidate.reason,
1019
- candidate.confidence,
1020
- candidate.safeToDeleteNow ? "yes" : "no",
1021
- candidate.requiresOwnerDecision ? "yes" : "no",
1022
- candidate.validationNeeded.join(", "),
1023
- ].join(" | "),
1024
- ),
1025
- ]
1026
- .map((line) => line.replace(/\| undefined/g, "|"))
1027
- .join("\n");
1028
- }
1029
-
1030
- function buildMarkdown(document: AuditDocument): string {
1031
- const s = document.summaries;
1032
- return `# Convergence, Annotation, and Deletion Audit
1033
-
1034
- Generated: ${document.generatedAt}
1035
-
1036
- Branch: ${document.branch}
1037
-
1038
- Ahead/behind origin/develop: ${document.aheadBehind}
1039
-
1040
- Dirty status at generation:
1041
-
1042
- ${markdownList(document.dirtyStatus.length > 0 ? document.dirtyStatus : ["clean"])}
1043
-
1044
- ## Executive Summary
1045
-
1046
- This audit stops the infrastructure-building spiral. Plugins stay plugins, app plugins stay app/product bundles, connectors stay connector plugins, Electrobun remains the desktop shell, AgentManager remains the runtime owner, and Remotes remain limited to desktop/system capability providers.
1047
-
1048
- The current local branch may still contain multiple phases, but it should not be pushed blindly as a broad mega-PR unless maintainers explicitly want that review shape. The stack recommendation below keeps the work reviewable without changing the architectural boundary decisions.
1049
-
1050
- No Swift host/controller path is part of this architecture. The only retained boundary pattern is typed RPC/local API/SSE between layers.
1051
-
1052
- ## Summary Counts
1053
-
1054
- ### By Category
1055
-
1056
- | Category | Count |
1057
- | --- | --- |
1058
- ${summaryTable(s.byCategory)}
1059
-
1060
- ### By Recommended Next Action
1061
-
1062
- | Action | Count |
1063
- | --- | --- |
1064
- ${summaryTable(s.byRecommendedNextAction)}
1065
-
1066
- ## Hard No-Migration List
1067
-
1068
- ${markdownList(s.hardNoMigration)}
1069
-
1070
- ## Current Remotes
1071
-
1072
- ${markdownList(s.currentRemotes)}
1073
-
1074
- eliza.surface remains dev/admin only and is not a production UI replacement.
1075
-
1076
- ## Future Remote Candidates
1077
-
1078
- ${markdownList(s.futureRemoteCandidates)}
1079
-
1080
- This list is intentionally short. Do not turn connector, provider, or app plugins into Remotes.
1081
-
1082
- ## Trace-First Candidates
1083
-
1084
- ${markdownList(s.traceFirstCandidates)}
1085
-
1086
- ## Dynamic-View Candidates
1087
-
1088
- ${markdownList(s.dynamicViewCandidates)}
1089
-
1090
- ## Voice/Local-Model Candidates
1091
-
1092
- ${markdownList(s.voiceLocalModelCandidates)}
1093
-
1094
- ## Runtime-Broker Candidates
1095
-
1096
- ${markdownList(s.runtimeBrokerCandidates)}
1097
-
1098
- ## Delete/Deprecate Candidates
1099
-
1100
- ${deletionTable(document.deletionCandidates)}
1101
-
1102
- ## Owner-Decision Items
1103
-
1104
- ${markdownList(s.ownerDecisionItems)}
1105
-
1106
- ## Proposed Annotation Plan
1107
-
1108
- - Add README-level role annotations to trace-first candidates before wiring behavior.
1109
- - Use \`docs/trace-first-annotations.md\` as the first review-boundary map for top trace-first packages.
1110
- - Add dynamic-view manifests only for contextual inspection surfaces, not fixed dashboards.
1111
- - Keep connector/provider package metadata unchanged unless maintainers already have a metadata convention.
1112
- - Keep Remote manifests focused on capability boundaries and trusted/full-permission status.
1113
- - Do not add source comments unless a hidden constraint or security boundary would otherwise be unclear.
1114
-
1115
- ## PR Stack Recommendation
1116
-
1117
- Do not blindly push every local phase into the platform convergence PR unless maintainers explicitly ask for a mega-PR. Recommended stack:
1118
-
1119
- 1. Platform convergence PR
1120
- - first-party Remotes
1121
- - AgentManager-backed eliza.runtime
1122
- - worker invoke/event bridge
1123
- - dynamic view registry/session infrastructure
1124
-
1125
- 2. Trace PR
1126
- - TraceStore and TraceService
1127
- - dynamic agent.run.trace view
1128
- - runtime and capability trace hooks
1129
-
1130
- 3. Voice instrumentation PR
1131
- - VoiceService
1132
- - mock/text pipeline
1133
- - voice trace integration
1134
-
1135
- 4. Live voice adapter PR
1136
- - VoiceRuntimeAdapter
1137
- - live flags
1138
- - ASR/TTS runtime route wiring
1139
-
1140
- 5. Voice latency PR
1141
- - latency budgets
1142
- - stream coordinator
1143
- - TTS chunker
1144
- - barge-in semantics
1145
-
1146
- 6. Voice validation PR
1147
- - voice:validate scripts
1148
- - structured validation reports
1149
-
1150
- 7. Convergence audit PR
1151
- - this matrix and generator
1152
- - no migration or production code changes
1153
-
1154
- ## Full Matrix
1155
-
1156
- ${entriesTable(document.entries)}
1157
- `;
1158
- }
1159
-
1160
- async function main(): Promise<void> {
1161
- await mkdir(DOCS_DIR, { recursive: true });
1162
- const entries = await buildEntries();
1163
- const document: AuditDocument = {
1164
- generatedAt: new Date().toISOString(),
1165
- branch: git(["branch", "--show-current"]),
1166
- aheadBehind: git([
1167
- "rev-list",
1168
- "--left-right",
1169
- "--count",
1170
- "HEAD...origin/develop",
1171
- ]),
1172
- dirtyStatus: git(["status", "--short"])
1173
- .split("\n")
1174
- .map((line) => line.trim())
1175
- .filter((line) => {
1176
- const filePath = line.slice(3);
1177
- return (
1178
- !AUDIT_OUTPUT_PATHS.has(filePath) &&
1179
- !AUDIT_OUTPUT_PREFIXES.some((prefix) => filePath.startsWith(prefix))
1180
- );
1181
- })
1182
- .filter((line) => line.length > 0),
1183
- entries,
1184
- deletionCandidates: await deletionCandidates(),
1185
- summaries: buildSummaries(entries),
1186
- };
1187
- await writeFile(
1188
- path.join(DOCS_DIR, "convergence-audit.json"),
1189
- `${JSON.stringify(document, null, 2)}\n`,
1190
- );
1191
- await writeFile(
1192
- path.join(DOCS_DIR, "convergence-audit.md"),
1193
- buildMarkdown(document),
1194
- );
1195
- process.stdout.write(
1196
- `Wrote ${relativePath(path.join(DOCS_DIR, "convergence-audit.json"))}\n`,
1197
- );
1198
- process.stdout.write(
1199
- `Wrote ${relativePath(path.join(DOCS_DIR, "convergence-audit.md"))}\n`,
1200
- );
1201
- }
1202
-
1203
- await main();