@elizaos/app-core 2.0.0-beta.2 → 2.0.11-beta.5

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 (1534) hide show
  1. package/agent-bridge.d.ts +27 -0
  2. package/agent-bridge.d.ts.map +1 -0
  3. package/agent-bridge.js +26 -0
  4. package/api/__tests__/sandbox-test-helpers.js +1 -1
  5. package/api/auth/audit.js +1 -1
  6. package/api/auth/auth-context.js +1 -1
  7. package/api/auth/bootstrap-token.js +2 -2
  8. package/api/auth/index.d.ts +9 -10
  9. package/api/auth/index.d.ts.map +1 -1
  10. package/api/auth/index.js +9 -10
  11. package/api/auth/passwords.js +2 -2
  12. package/api/auth/sensitive-rate-limit.d.ts +1 -4
  13. package/api/auth/sensitive-rate-limit.d.ts.map +1 -1
  14. package/api/auth/sensitive-rate-limit.js +6 -6
  15. package/api/auth/sessions.js +2 -2
  16. package/api/auth-bootstrap-routes.d.ts +6 -13
  17. package/api/auth-bootstrap-routes.d.ts.map +1 -1
  18. package/api/auth-bootstrap-routes.js +14 -27
  19. package/api/auth-pairing-routes.d.ts +17 -0
  20. package/api/auth-pairing-routes.d.ts.map +1 -0
  21. package/api/auth-pairing-routes.js +300 -0
  22. package/api/auth-session-routes.d.ts.map +1 -1
  23. package/api/auth-session-routes.js +36 -15
  24. package/api/auth.d.ts +12 -19
  25. package/api/auth.d.ts.map +1 -1
  26. package/api/auth.js +32 -27
  27. package/api/automations-compat-routes.d.ts.map +1 -1
  28. package/api/automations-compat-routes.js +5 -5
  29. package/api/background-tasks-routes.d.ts +4 -0
  30. package/api/background-tasks-routes.d.ts.map +1 -0
  31. package/api/background-tasks-routes.js +63 -0
  32. package/api/catalog-routes.js +3 -3
  33. package/api/cloud-pair-route.d.ts +26 -0
  34. package/api/cloud-pair-route.d.ts.map +1 -0
  35. package/api/cloud-pair-route.js +222 -0
  36. package/api/cloud-voice-routes.d.ts +52 -0
  37. package/api/cloud-voice-routes.d.ts.map +1 -0
  38. package/api/cloud-voice-routes.js +50 -0
  39. package/api/compat-route-shared.d.ts +2 -2
  40. package/api/compat-route-shared.d.ts.map +1 -1
  41. package/api/compat-route-shared.js +11 -7
  42. package/api/credential-resolver.d.ts +2 -2
  43. package/api/credential-resolver.d.ts.map +1 -1
  44. package/api/credential-resolver.js +8 -2
  45. package/api/database-rows-compat-routes.d.ts.map +1 -1
  46. package/api/database-rows-compat-routes.js +69 -31
  47. package/api/dev-boot-history.d.ts +26 -0
  48. package/api/dev-boot-history.d.ts.map +1 -0
  49. package/api/dev-boot-history.js +69 -0
  50. package/api/dev-compat-routes.d.ts +5 -0
  51. package/api/dev-compat-routes.d.ts.map +1 -1
  52. package/api/dev-compat-routes.js +127 -4
  53. package/api/dev-console-log.d.ts +2 -2
  54. package/api/dev-console-log.d.ts.map +1 -1
  55. package/api/dev-console-log.js +8 -5
  56. package/api/dev-route-catalog.d.ts +58 -0
  57. package/api/dev-route-catalog.d.ts.map +1 -0
  58. package/api/dev-route-catalog.js +447 -0
  59. package/api/dev-stack.d.ts.map +1 -1
  60. package/api/dev-stack.js +6 -9
  61. package/api/first-run-routes.d.ts +4 -0
  62. package/api/first-run-routes.d.ts.map +1 -0
  63. package/api/first-run-routes.js +208 -0
  64. package/api/first-run-tts-route.d.ts +19 -0
  65. package/api/first-run-tts-route.d.ts.map +1 -0
  66. package/api/first-run-tts-route.js +59 -0
  67. package/api/internal-routes.d.ts +23 -0
  68. package/api/internal-routes.d.ts.map +1 -0
  69. package/api/internal-routes.js +203 -0
  70. package/api/ios-local-agent-transport.d.ts +36 -0
  71. package/api/ios-local-agent-transport.d.ts.map +1 -0
  72. package/api/ios-local-agent-transport.js +566 -0
  73. package/api/onboarding-voice-lines.d.ts +23 -0
  74. package/api/onboarding-voice-lines.d.ts.map +1 -0
  75. package/api/onboarding-voice-lines.js +8 -0
  76. package/api/perf-instrument.d.ts +43 -0
  77. package/api/perf-instrument.d.ts.map +1 -0
  78. package/api/perf-instrument.js +113 -0
  79. package/api/response.d.ts.map +1 -1
  80. package/api/response.js +14 -14
  81. package/api/runtime-mode-routes.d.ts.map +1 -1
  82. package/api/runtime-mode-routes.js +2 -2
  83. package/api/secrets-inventory-routes.js +2 -2
  84. package/api/secrets-manager-routes.d.ts +1 -1
  85. package/api/secrets-manager-routes.d.ts.map +1 -1
  86. package/api/secrets-manager-routes.js +9 -10
  87. package/api/sensitive-request-routes.d.ts.map +1 -1
  88. package/api/sensitive-request-routes.js +5 -5
  89. package/api/sensitive-request-store.d.ts +12 -3
  90. package/api/sensitive-request-store.d.ts.map +1 -1
  91. package/api/server-cors.d.ts.map +1 -1
  92. package/api/server-cors.js +13 -2
  93. package/api/server-first-run-helpers.d.ts +26 -0
  94. package/api/server-first-run-helpers.d.ts.map +1 -0
  95. package/api/server-first-run-helpers.js +271 -0
  96. package/api/server-security.js +1 -1
  97. package/api/server-startup.d.ts.map +1 -1
  98. package/api/server-startup.js +3 -4
  99. package/api/server-wallet-trade.js +1 -1
  100. package/api/server.d.ts +4 -4
  101. package/api/server.d.ts.map +1 -1
  102. package/api/server.js +222 -88
  103. package/api/setup-contract.d.ts +63 -0
  104. package/api/setup-contract.d.ts.map +1 -0
  105. package/api/setup-contract.js +39 -0
  106. package/api/training-benchmarks.d.ts +97 -0
  107. package/api/training-benchmarks.d.ts.map +1 -0
  108. package/api/training-benchmarks.js +307 -0
  109. package/api/workbench-compat-routes.js +2 -2
  110. package/benchmark/cerebras-autowire.d.ts +28 -0
  111. package/benchmark/cerebras-autowire.d.ts.map +1 -0
  112. package/benchmark/cerebras-autowire.js +62 -0
  113. package/benchmark/lifeops-bench-handler.d.ts +36 -0
  114. package/benchmark/lifeops-bench-handler.d.ts.map +1 -1
  115. package/benchmark/lifeops-bench-handler.js +63 -1
  116. package/benchmark/lifeops-fake-backend.d.ts +39 -0
  117. package/benchmark/lifeops-fake-backend.d.ts.map +1 -1
  118. package/benchmark/lifeops-fake-backend.js +993 -21
  119. package/benchmark/mock-plugin.d.ts.map +1 -1
  120. package/benchmark/mock-plugin.js +0 -24
  121. package/benchmark/plugin.d.ts +2 -1
  122. package/benchmark/plugin.d.ts.map +1 -1
  123. package/benchmark/plugin.js +989 -68
  124. package/benchmark/replay-capture.d.ts +2 -2
  125. package/benchmark/replay-capture.d.ts.map +1 -1
  126. package/benchmark/replay-capture.js +3 -3
  127. package/benchmark/server-utils.d.ts +162 -9
  128. package/benchmark/server-utils.d.ts.map +1 -1
  129. package/benchmark/server-utils.js +625 -62
  130. package/benchmark/server.d.ts.map +1 -1
  131. package/benchmark/server.js +1962 -118
  132. package/boot-profile.d.ts +3 -0
  133. package/boot-profile.d.ts.map +1 -0
  134. package/boot-profile.js +30 -0
  135. package/browser.d.ts +23 -1
  136. package/browser.d.ts.map +1 -1
  137. package/browser.js +20 -1
  138. package/cli/argv.js +1 -1
  139. package/cli/banner.js +1 -1
  140. package/cli/command-format.js +2 -2
  141. package/cli/doctor/checks.d.ts.map +1 -1
  142. package/cli/doctor/checks.js +6 -6
  143. package/cli/plugins-cli.d.ts.map +1 -1
  144. package/cli/plugins-cli.js +77 -32
  145. package/cli/profile.d.ts.map +1 -1
  146. package/cli/profile.js +5 -4
  147. package/cli/program/build-program.js +4 -4
  148. package/cli/program/command-registry.d.ts.map +1 -1
  149. package/cli/program/command-registry.js +13 -11
  150. package/cli/program/help.js +5 -5
  151. package/cli/program/preaction.js +5 -5
  152. package/cli/program/register.auth.d.ts.map +1 -1
  153. package/cli/program/register.auth.js +6 -12
  154. package/cli/program/register.capability-router.d.ts +29 -0
  155. package/cli/program/register.capability-router.d.ts.map +1 -0
  156. package/cli/program/register.capability-router.js +568 -0
  157. package/cli/program/register.config.js +1 -1
  158. package/cli/program/register.configure.d.ts.map +1 -1
  159. package/cli/program/register.configure.js +1 -1
  160. package/cli/program/register.dashboard.d.ts.map +1 -1
  161. package/cli/program/register.dashboard.js +6 -7
  162. package/cli/program/register.db.d.ts.map +1 -1
  163. package/cli/program/register.db.js +3 -4
  164. package/cli/program/register.doctor.js +7 -7
  165. package/cli/program/register.setup.d.ts.map +1 -1
  166. package/cli/program/register.setup.js +14 -10
  167. package/cli/program/register.start.d.ts.map +1 -1
  168. package/cli/program/register.start.js +5 -3
  169. package/cli/program/register.subclis.js +3 -3
  170. package/cli/program/register.update.d.ts +6 -0
  171. package/cli/program/register.update.d.ts.map +1 -1
  172. package/cli/program/register.update.js +58 -6
  173. package/cli/program.js +1 -1
  174. package/cli/run-main.js +4 -4
  175. package/config/app-config.d.ts +2 -0
  176. package/config/app-config.d.ts.map +1 -0
  177. package/config/app-config.js +1 -0
  178. package/connectors/capacitor-jsc.d.ts.map +1 -1
  179. package/connectors/capacitor-jsc.js +16 -10
  180. package/connectors/capacitor-quickjs.d.ts.map +1 -1
  181. package/connectors/capacitor-quickjs.js +18 -13
  182. package/connectors/capacitor-sqlite.d.ts.map +1 -1
  183. package/connectors/capacitor-sqlite.js +27 -12
  184. package/dispatch/approval-queue.d.ts +37 -0
  185. package/dispatch/approval-queue.d.ts.map +1 -0
  186. package/dispatch/approval-queue.js +25 -0
  187. package/dispatch/channel-registry.d.ts +30 -0
  188. package/dispatch/channel-registry.d.ts.map +1 -0
  189. package/dispatch/channel-registry.js +22 -0
  190. package/dispatch/connector-registry.d.ts +39 -0
  191. package/dispatch/connector-registry.d.ts.map +1 -0
  192. package/dispatch/connector-registry.js +24 -0
  193. package/dispatch/index.d.ts +14 -0
  194. package/dispatch/index.d.ts.map +1 -0
  195. package/dispatch/index.js +13 -0
  196. package/dispatch/send-policy.d.ts +36 -0
  197. package/dispatch/send-policy.d.ts.map +1 -0
  198. package/dispatch/send-policy.js +16 -0
  199. package/entry.js +28 -11
  200. package/first-run/first-run-config.d.ts +55 -0
  201. package/first-run/first-run-config.d.ts.map +1 -0
  202. package/first-run/first-run-config.js +178 -0
  203. package/first-run/runtime-target.d.ts +4 -0
  204. package/first-run/runtime-target.d.ts.map +1 -0
  205. package/first-run/runtime-target.js +13 -0
  206. package/index.d.ts +16 -3
  207. package/index.d.ts.map +1 -1
  208. package/index.js +57 -33
  209. package/package.json +159 -50
  210. package/packaging/debian/apt-repo-config/README.md +18 -0
  211. package/packaging/debian/apt-repo-config/conf/distributions +11 -0
  212. package/packaging/flatpak/README.md +26 -16
  213. package/packaging/flatpak/ai.elizaos.App.metainfo.xml +17 -12
  214. package/packaging/flatpak/ai.elizaos.App.store.yml +5 -5
  215. package/packaging/flatpak/ai.elizaos.App.yml +10 -24
  216. package/packaging/flatpak/elizaos-app-wrapper.store.sh +2 -2
  217. package/packaging/flatpak/generate-sources.sh +74 -0
  218. package/packaging/flatpak/node-sources.json +7930 -0
  219. package/packaging/inno/build-inno.ps1 +34 -9
  220. package/packaging/msix/AppxManifest.store.xml +1 -1
  221. package/packaging/msix/README.md +39 -19
  222. package/packaging/msix/build-msix.ps1 +44 -14
  223. package/packaging/snap/snapcraft.yaml +22 -21
  224. package/packaging/test-packaging.sh +2 -2
  225. package/permissions/types.d.ts +1 -1
  226. package/permissions/types.js +1 -1
  227. package/platform/elizaos-agent-browser-stub.d.ts +144 -0
  228. package/platform/elizaos-agent-browser-stub.d.ts.map +1 -0
  229. package/platform/elizaos-agent-browser-stub.js +158 -0
  230. package/platform/elizaos-plugin-elizacloud-browser-stub.d.ts +34 -0
  231. package/platform/elizaos-plugin-elizacloud-browser-stub.d.ts.map +1 -0
  232. package/platform/elizaos-plugin-elizacloud-browser-stub.js +51 -0
  233. package/platform/empty-node-module.d.ts +148 -0
  234. package/platform/empty-node-module.d.ts.map +1 -1
  235. package/platform/empty-node-module.js +140 -3
  236. package/platform/ios-runtime-backends.d.ts +83 -0
  237. package/platform/ios-runtime-backends.d.ts.map +1 -0
  238. package/platform/ios-runtime-backends.js +133 -0
  239. package/platform/ios-runtime-bridge.d.ts +15 -0
  240. package/platform/ios-runtime-bridge.d.ts.map +1 -0
  241. package/platform/ios-runtime-bridge.js +527 -0
  242. package/platform/native-library-policy.d.ts +23 -0
  243. package/platform/native-library-policy.d.ts.map +1 -0
  244. package/platform/native-library-policy.js +112 -0
  245. package/platform/native-plugin-entrypoints.d.ts +19 -0
  246. package/platform/native-plugin-entrypoints.d.ts.map +1 -0
  247. package/platform/native-plugin-entrypoints.js +29 -0
  248. package/platforms/android/README.md +68 -10
  249. package/platforms/android/app/build.gradle +268 -3
  250. package/platforms/android/app/capacitor.build.gradle +18 -1
  251. package/platforms/android/app/proguard-rules.pro +17 -2
  252. package/platforms/android/app/src/androidTest/java/ai/elizaos/app/ElizaOsInstrumentedTest.java +1 -1
  253. package/platforms/android/app/src/main/AndroidManifest.xml +334 -17
  254. package/platforms/android/app/src/main/assets/runners/eliza-tasks.js +177 -0
  255. package/platforms/android/app/src/main/elizavoice-jni/CMakeLists.txt +75 -0
  256. package/platforms/android/app/src/main/elizavoice-jni/elizavoice-jni.cpp +1045 -0
  257. package/platforms/android/app/src/main/java/ai/elizaos/app/AgentPlugin.java +111 -171
  258. package/platforms/android/app/src/main/java/ai/elizaos/app/AndroidVirtualizationBridge.java +284 -0
  259. package/platforms/android/app/src/main/java/ai/elizaos/app/BatteryOptimizationPlugin.java +95 -0
  260. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAccessibilityService.java +55 -0
  261. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAgentService.java +1198 -141
  262. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAndroidSystemBridge.java +83 -0
  263. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaAssistActivity.java +50 -1
  264. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBootReceiver.java +90 -8
  265. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaBrowserActivity.java +2 -2
  266. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaCalendarActivity.java +1 -1
  267. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaCameraActivity.java +1 -1
  268. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaClockActivity.java +2 -2
  269. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaContactsActivity.java +1 -1
  270. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaDialActivity.java +1 -1
  271. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaInCallService.java +1 -1
  272. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaMmsReceiver.java +1 -1
  273. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaNativeBridge.java +22 -0
  274. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaNotificationListenerService.java +45 -0
  275. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaQuickActionsWidgetProvider.java +68 -0
  276. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaShareActivity.java +132 -0
  277. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsComposeActivity.java +1 -1
  278. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsGatewayService.java +268 -0
  279. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaSmsReceiver.java +12 -1
  280. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaTasksWorker.java +194 -0
  281. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceCaptureService.java +198 -0
  282. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceNative.java +160 -0
  283. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoicePlugin.java +450 -0
  284. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaVoiceTileService.java +39 -0
  285. package/platforms/android/app/src/main/java/ai/elizaos/app/ElizaWorkScheduler.java +60 -0
  286. package/platforms/android/app/src/main/java/ai/elizaos/app/GatewayConnectionService.java +53 -19
  287. package/platforms/android/app/src/main/java/ai/elizaos/app/MainActivity.java +160 -33
  288. package/platforms/android/app/src/main/java/ai/elizaos/app/ResourceProbePlugin.java +169 -0
  289. package/platforms/android/app/src/main/java/ai/elizaos/app/VoiceCapturePlugin.java +119 -0
  290. package/platforms/android/app/src/main/res/drawable/eliza_widget_background.xml +10 -0
  291. package/platforms/android/app/src/main/res/drawable/eliza_widget_button_background.xml +13 -0
  292. package/platforms/android/app/src/main/res/drawable/splash.png +0 -0
  293. package/platforms/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
  294. package/platforms/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
  295. package/platforms/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
  296. package/platforms/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
  297. package/platforms/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
  298. package/platforms/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
  299. package/platforms/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
  300. package/platforms/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
  301. package/platforms/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
  302. package/platforms/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
  303. package/platforms/android/app/src/main/res/layout/eliza_quick_actions_widget.xml +86 -0
  304. package/platforms/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +2 -1
  305. package/platforms/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +2 -1
  306. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  307. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
  308. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png +0 -0
  309. package/platforms/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  310. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  311. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
  312. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png +0 -0
  313. package/platforms/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  314. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  315. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
  316. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png +0 -0
  317. package/platforms/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  318. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  319. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
  320. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png +0 -0
  321. package/platforms/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  322. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  323. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
  324. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png +0 -0
  325. package/platforms/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  326. package/platforms/android/app/src/main/res/values/android_app_actions.xml +48 -0
  327. package/platforms/android/app/src/main/res/values/colors.xml +8 -0
  328. package/platforms/android/app/src/main/res/values/ic_launcher_background.xml +2 -2
  329. package/platforms/android/app/src/main/res/values/strings.xml +2 -2
  330. package/platforms/android/app/src/main/res/values/styles.xml +25 -1
  331. package/platforms/android/app/src/main/res/xml/eliza_accessibility_service.xml +9 -0
  332. package/platforms/android/app/src/main/res/xml/eliza_quick_actions_widget.xml +13 -0
  333. package/platforms/android/app/src/main/res/xml/shortcuts.xml +121 -0
  334. package/platforms/android/build.gradle +2 -2
  335. package/platforms/android/capacitor-cordova-android-plugins/build.gradle +9 -3
  336. package/platforms/android/capacitor-cordova-android-plugins/cordova.variables.gradle +6 -2
  337. package/platforms/android/capacitor-cordova-android-plugins/src/main/AndroidManifest.xml +7 -2
  338. package/platforms/android/capacitor-cordova-android-plugins/src/main/java/.gitkeep +0 -1
  339. package/platforms/android/capacitor.settings.gradle +66 -16
  340. package/platforms/android/gradle.properties +1 -0
  341. package/platforms/android/update-manifest/generate-manifest.mjs +97 -0
  342. package/platforms/android/update-manifest/schema.json +26 -0
  343. package/platforms/apple-store-entitlements.reviewed.json +155 -0
  344. package/platforms/electrobun/.generated/brand-config.json +3 -2
  345. package/platforms/electrobun/LICENSE +21 -0
  346. package/platforms/electrobun/README.md +15 -1
  347. package/platforms/electrobun/assets/appIcon.icns +0 -0
  348. package/platforms/electrobun/assets/appIcon.ico +0 -0
  349. package/platforms/electrobun/assets/appIcon.iconset/icon_128x128.png +0 -0
  350. package/platforms/electrobun/assets/appIcon.iconset/icon_128x128@2x.png +0 -0
  351. package/platforms/electrobun/assets/appIcon.iconset/icon_16x16.png +0 -0
  352. package/platforms/electrobun/assets/appIcon.iconset/icon_16x16@2x.png +0 -0
  353. package/platforms/electrobun/assets/appIcon.iconset/icon_256x256.png +0 -0
  354. package/platforms/electrobun/assets/appIcon.iconset/icon_256x256@2x.png +0 -0
  355. package/platforms/electrobun/assets/appIcon.iconset/icon_32x32.png +0 -0
  356. package/platforms/electrobun/assets/appIcon.iconset/icon_32x32@2x.png +0 -0
  357. package/platforms/electrobun/assets/appIcon.iconset/icon_512x512.png +0 -0
  358. package/platforms/electrobun/assets/brand-config.json +6 -6
  359. package/platforms/electrobun/biome.json +9 -9
  360. package/platforms/electrobun/docs/capability-collapse-matrix.json +318 -0
  361. package/platforms/electrobun/docs/capability-collapse-matrix.md +129 -0
  362. package/platforms/electrobun/docs/capability-routing.md +86 -0
  363. package/platforms/electrobun/docs/convergence-audit.json +3505 -0
  364. package/platforms/electrobun/docs/convergence-audit.md +694 -0
  365. package/platforms/electrobun/docs/database-boot-policy.md +90 -0
  366. package/platforms/electrobun/docs/riscv64-port.md +175 -0
  367. package/platforms/electrobun/docs/startup-first-run-cleanup.md +18 -0
  368. package/platforms/electrobun/docs/trace-first-annotations.md +52 -0
  369. package/platforms/electrobun/docs/ui-boundary-audit.json +580 -0
  370. package/platforms/electrobun/docs/ui-boundary-audit.md +257 -0
  371. package/platforms/electrobun/electrobun.config.ts +592 -364
  372. package/platforms/electrobun/entitlements/JUSTIFICATIONS.md +141 -0
  373. package/platforms/electrobun/entitlements/README.md +34 -6
  374. package/platforms/electrobun/entitlements/mas-bun.entitlements +15 -0
  375. package/platforms/electrobun/entitlements/mas.entitlements +6 -4
  376. package/platforms/electrobun/native/macos/window-effects.mm +1522 -0
  377. package/platforms/electrobun/package.json +18 -12
  378. package/platforms/electrobun/remotes/fs/README.md +70 -0
  379. package/platforms/electrobun/remotes/fs/electrobun.config.ts +38 -0
  380. package/platforms/electrobun/remotes/fs/package.json +12 -0
  381. package/platforms/electrobun/remotes/fs/plugin.json +25 -0
  382. package/platforms/electrobun/remotes/fs/src/bun/errors.ts +57 -0
  383. package/platforms/electrobun/remotes/fs/src/bun/file-limits.ts +50 -0
  384. package/platforms/electrobun/remotes/fs/src/bun/fs-service.ts +389 -0
  385. package/platforms/electrobun/remotes/fs/src/bun/path-guard.ts +270 -0
  386. package/platforms/electrobun/remotes/fs/src/bun/protocol.ts +149 -0
  387. package/platforms/electrobun/remotes/fs/src/bun/worker.ts +174 -0
  388. package/platforms/electrobun/remotes/fs/src/dev/phase5-smoke.ts +171 -0
  389. package/platforms/electrobun/remotes/fs/src/web/index.html +8 -0
  390. package/platforms/electrobun/remotes/git/README.md +75 -0
  391. package/platforms/electrobun/remotes/git/electrobun.config.ts +44 -0
  392. package/platforms/electrobun/remotes/git/package.json +12 -0
  393. package/platforms/electrobun/remotes/git/plugin.json +31 -0
  394. package/platforms/electrobun/remotes/git/src/bun/errors.ts +69 -0
  395. package/platforms/electrobun/remotes/git/src/bun/git-command.ts +156 -0
  396. package/platforms/electrobun/remotes/git/src/bun/git-service.ts +446 -0
  397. package/platforms/electrobun/remotes/git/src/bun/operation-history.ts +124 -0
  398. package/platforms/electrobun/remotes/git/src/bun/protocol.ts +252 -0
  399. package/platforms/electrobun/remotes/git/src/bun/worker.ts +316 -0
  400. package/platforms/electrobun/remotes/git/src/dev/phase7-smoke.ts +141 -0
  401. package/platforms/electrobun/remotes/git/src/web/index.html +8 -0
  402. package/platforms/electrobun/remotes/local-model/README.md +138 -0
  403. package/platforms/electrobun/remotes/local-model/electrobun.config.ts +46 -0
  404. package/platforms/electrobun/remotes/local-model/package.json +12 -0
  405. package/platforms/electrobun/remotes/local-model/plugin.json +33 -0
  406. package/platforms/electrobun/remotes/local-model/src/bun/download-state.ts +115 -0
  407. package/platforms/electrobun/remotes/local-model/src/bun/eliza1-catalog.ts +425 -0
  408. package/platforms/electrobun/remotes/local-model/src/bun/errors.ts +74 -0
  409. package/platforms/electrobun/remotes/local-model/src/bun/hf-eliza1-client.ts +169 -0
  410. package/platforms/electrobun/remotes/local-model/src/bun/local-inference-api-client.ts +245 -0
  411. package/platforms/electrobun/remotes/local-model/src/bun/model-service.ts +490 -0
  412. package/platforms/electrobun/remotes/local-model/src/bun/protocol.ts +301 -0
  413. package/platforms/electrobun/remotes/local-model/src/bun/worker.ts +248 -0
  414. package/platforms/electrobun/remotes/local-model/src/dev/phase8-smoke.ts +117 -0
  415. package/platforms/electrobun/remotes/local-model/src/web/index.html +13 -0
  416. package/platforms/electrobun/remotes/pty/README.md +65 -0
  417. package/platforms/electrobun/remotes/pty/electrobun.config.ts +47 -0
  418. package/platforms/electrobun/remotes/pty/package.json +12 -0
  419. package/platforms/electrobun/remotes/pty/plugin.json +34 -0
  420. package/platforms/electrobun/remotes/pty/src/bun/errors.ts +57 -0
  421. package/platforms/electrobun/remotes/pty/src/bun/output-buffer.ts +127 -0
  422. package/platforms/electrobun/remotes/pty/src/bun/protocol.ts +192 -0
  423. package/platforms/electrobun/remotes/pty/src/bun/pty-service.ts +562 -0
  424. package/platforms/electrobun/remotes/pty/src/bun/worker.ts +218 -0
  425. package/platforms/electrobun/remotes/pty/src/dev/phase6-smoke.ts +127 -0
  426. package/platforms/electrobun/remotes/pty/src/web/index.html +8 -0
  427. package/platforms/electrobun/remotes/runtime/README.md +370 -0
  428. package/platforms/electrobun/remotes/runtime/electrobun.config.ts +48 -0
  429. package/platforms/electrobun/remotes/runtime/package.json +14 -0
  430. package/platforms/electrobun/remotes/runtime/plugin.json +30 -0
  431. package/platforms/electrobun/remotes/runtime/src/bun/api-client.ts +620 -0
  432. package/platforms/electrobun/remotes/runtime/src/bun/errors.ts +45 -0
  433. package/platforms/electrobun/remotes/runtime/src/bun/log-buffer.ts +33 -0
  434. package/platforms/electrobun/remotes/runtime/src/bun/protocol.ts +366 -0
  435. package/platforms/electrobun/remotes/runtime/src/bun/route-discovery.ts +419 -0
  436. package/platforms/electrobun/remotes/runtime/src/bun/runtime-manager.ts +423 -0
  437. package/platforms/electrobun/remotes/runtime/src/bun/sse-parser.ts +99 -0
  438. package/platforms/electrobun/remotes/runtime/src/bun/stream-manager.ts +887 -0
  439. package/platforms/electrobun/remotes/runtime/src/bun/worker.ts +1231 -0
  440. package/platforms/electrobun/remotes/runtime/src/dev/phase1-smoke.ts +34 -0
  441. package/platforms/electrobun/remotes/runtime/src/dev/phase2-smoke.ts +86 -0
  442. package/platforms/electrobun/remotes/runtime/src/dev/phase3-smoke.ts +141 -0
  443. package/platforms/electrobun/remotes/runtime/src/web/index.css +187 -0
  444. package/platforms/electrobun/remotes/runtime/src/web/index.html +76 -0
  445. package/platforms/electrobun/remotes/runtime/src/web/index.ts +192 -0
  446. package/platforms/electrobun/remotes/surface/README.md +201 -0
  447. package/platforms/electrobun/remotes/surface/electrobun.config.ts +38 -0
  448. package/platforms/electrobun/remotes/surface/package.json +12 -0
  449. package/platforms/electrobun/remotes/surface/plugin.json +28 -0
  450. package/platforms/electrobun/remotes/surface/src/bun/worker.ts +132 -0
  451. package/platforms/electrobun/remotes/surface/src/dev/phase4-smoke.ts +566 -0
  452. package/platforms/electrobun/remotes/surface/src/protocol/event-types.ts +84 -0
  453. package/platforms/electrobun/remotes/surface/src/protocol/runtime-client.ts +673 -0
  454. package/platforms/electrobun/remotes/surface/src/web/app.ts +595 -0
  455. package/platforms/electrobun/remotes/surface/src/web/index.css +460 -0
  456. package/platforms/electrobun/remotes/surface/src/web/index.html +466 -0
  457. package/platforms/electrobun/remotes/surface/src/web/index.ts +5 -0
  458. package/platforms/electrobun/remotes/surface/src/web/render.ts +455 -0
  459. package/platforms/electrobun/remotes/surface/src/web/state.ts +427 -0
  460. package/platforms/electrobun/scripts/build-macos-effects.sh +4 -0
  461. package/platforms/electrobun/scripts/ensure-build-folder.ts +28 -0
  462. package/platforms/electrobun/scripts/ensure-whisper-gguf.sh +55 -0
  463. package/platforms/electrobun/scripts/ensure-whisper-model.sh +22 -80
  464. package/platforms/electrobun/scripts/generate-convergence-audit.ts +1203 -0
  465. package/platforms/electrobun/scripts/local-adhoc-sign-macos.ts +159 -159
  466. package/platforms/electrobun/scripts/postwrap-diagnostics.ts +424 -339
  467. package/platforms/electrobun/scripts/postwrap-sign-runtime-macos.ts +302 -271
  468. package/platforms/electrobun/scripts/smoke-test-windows.ps1 +17 -16
  469. package/platforms/electrobun/scripts/smoke-test.sh +5 -7
  470. package/platforms/electrobun/scripts/sync-web-assets.mjs +13 -13
  471. package/platforms/electrobun/scripts/verify-rpc-handlers.ts +109 -110
  472. package/platforms/electrobun/scripts/verify-windows-installer-proof.ps1 +3 -8
  473. package/platforms/electrobun/src/__stubs__/bun-ffi.ts +31 -31
  474. package/platforms/electrobun/src/__stubs__/electrobun-bun.ts +1 -1
  475. package/platforms/electrobun/src/agent-ready-state.ts +8 -8
  476. package/platforms/electrobun/src/agent-reset-from-main.test.ts +162 -0
  477. package/platforms/electrobun/src/agent-reset-from-main.ts +62 -62
  478. package/platforms/electrobun/src/agent-status-rpc.test.ts +95 -0
  479. package/platforms/electrobun/src/agent-status-rpc.ts +156 -0
  480. package/platforms/electrobun/src/api-base.test.ts +247 -0
  481. package/platforms/electrobun/src/api-base.ts +202 -93
  482. package/platforms/electrobun/src/application-menu-action-registry.ts +9 -9
  483. package/platforms/electrobun/src/application-menu.ts +348 -348
  484. package/platforms/electrobun/src/background-notice.ts +36 -36
  485. package/platforms/electrobun/src/boot-progress.test.ts +188 -0
  486. package/platforms/electrobun/src/boot-progress.ts +111 -0
  487. package/platforms/electrobun/src/brand-config.test.ts +39 -0
  488. package/platforms/electrobun/src/brand-config.ts +141 -129
  489. package/platforms/electrobun/src/bridge/browser-tabs-renderer-registry.ts +28 -28
  490. package/platforms/electrobun/src/bridge/electrobun-boot-config.ts +42 -0
  491. package/platforms/electrobun/src/bridge/electrobun-crypto-ready.ts +120 -0
  492. package/platforms/electrobun/src/bridge/electrobun-direct-rpc.ts +342 -357
  493. package/platforms/electrobun/src/bridge/electrobun-stub.ts +13 -13
  494. package/platforms/electrobun/src/browser-workspace-bridge-server.ts +285 -243
  495. package/platforms/electrobun/src/cloud-auth-window.ts +136 -136
  496. package/platforms/electrobun/src/cloud-disconnect-from-main.ts +90 -90
  497. package/platforms/electrobun/src/config-and-auth-rpc.test.ts +256 -0
  498. package/platforms/electrobun/src/config-and-auth-rpc.ts +302 -0
  499. package/platforms/electrobun/src/conversations-and-character-rpc.test.ts +185 -0
  500. package/platforms/electrobun/src/conversations-and-character-rpc.ts +131 -0
  501. package/platforms/electrobun/src/dashboard-rpc.test.ts +200 -0
  502. package/platforms/electrobun/src/dashboard-rpc.ts +344 -0
  503. package/platforms/electrobun/src/database/database-lock.ts +141 -0
  504. package/platforms/electrobun/src/database/database-mode.ts +149 -0
  505. package/platforms/electrobun/src/database/database-recovery.ts +72 -0
  506. package/platforms/electrobun/src/database/database-snapshot.ts +190 -0
  507. package/platforms/electrobun/src/database/database.test.ts +196 -0
  508. package/platforms/electrobun/src/database/index.ts +5 -0
  509. package/platforms/electrobun/src/database/pglite-paths.ts +100 -0
  510. package/platforms/electrobun/src/desktop-deep-link-events.test.ts +30 -0
  511. package/platforms/electrobun/src/desktop-deep-link-events.ts +17 -0
  512. package/platforms/electrobun/src/desktop-http-request.test.ts +73 -73
  513. package/platforms/electrobun/src/desktop-http-request.ts +85 -85
  514. package/platforms/electrobun/src/desktop-pill-config.test.ts +27 -0
  515. package/platforms/electrobun/src/desktop-pill-config.ts +40 -0
  516. package/platforms/electrobun/src/desktop-test-bridge-server.ts +204 -204
  517. package/platforms/electrobun/src/desktop-tray-config.test.ts +87 -0
  518. package/platforms/electrobun/src/desktop-tray-config.ts +84 -0
  519. package/platforms/electrobun/src/devtools-layout.ts +41 -41
  520. package/platforms/electrobun/src/diagnostic-format.test.ts +71 -0
  521. package/platforms/electrobun/src/diagnostic-format.ts +75 -36
  522. package/platforms/electrobun/src/dynamic-view-rpc-schema.test.ts +37 -0
  523. package/platforms/electrobun/src/dynamic-views/README.md +44 -0
  524. package/platforms/electrobun/src/dynamic-views/demo/agent-run-trace.html +135 -0
  525. package/platforms/electrobun/src/dynamic-views/errors.ts +29 -0
  526. package/platforms/electrobun/src/dynamic-views/host.test.ts +353 -0
  527. package/platforms/electrobun/src/dynamic-views/host.ts +332 -0
  528. package/platforms/electrobun/src/dynamic-views/index.ts +57 -0
  529. package/platforms/electrobun/src/dynamic-views/kiosk-canvas.ts +89 -0
  530. package/platforms/electrobun/src/dynamic-views/registry.test.ts +139 -0
  531. package/platforms/electrobun/src/dynamic-views/registry.ts +196 -0
  532. package/platforms/electrobun/src/dynamic-views/session-manager.test.ts +355 -0
  533. package/platforms/electrobun/src/dynamic-views/session-manager.ts +348 -0
  534. package/platforms/electrobun/src/dynamic-views/types.ts +105 -0
  535. package/platforms/electrobun/src/electrobun-boot-config.test.ts +50 -0
  536. package/platforms/electrobun/src/electrobun-config.test.ts +62 -0
  537. package/platforms/electrobun/src/electrobun-crypto-ready.test.ts +65 -0
  538. package/platforms/electrobun/src/electrobun-window-options.ts +25 -0
  539. package/platforms/electrobun/src/extension-rpc.test.ts +88 -0
  540. package/platforms/electrobun/src/extension-rpc.ts +102 -0
  541. package/platforms/electrobun/src/fatal-shutdown.test.ts +10 -10
  542. package/platforms/electrobun/src/fatal-shutdown.ts +1 -1
  543. package/platforms/electrobun/src/first-party-remotes.test.ts +169 -0
  544. package/platforms/electrobun/src/first-party-remotes.ts +297 -0
  545. package/platforms/electrobun/src/first-run-rpc.test.ts +192 -0
  546. package/platforms/electrobun/src/first-run-rpc.ts +146 -0
  547. package/platforms/electrobun/src/floating-chat-window.ts +181 -181
  548. package/platforms/electrobun/src/inbox-rpc.test.ts +123 -0
  549. package/platforms/electrobun/src/inbox-rpc.ts +158 -0
  550. package/platforms/electrobun/src/index.ts +2555 -2096
  551. package/platforms/electrobun/src/kiosk-mode.ts +50 -0
  552. package/platforms/electrobun/src/launch/index.ts +4 -0
  553. package/platforms/electrobun/src/launch/launch-dynamic-view.ts +37 -0
  554. package/platforms/electrobun/src/launch/launch-orchestrator.test.ts +224 -0
  555. package/platforms/electrobun/src/launch/launch-orchestrator.ts +456 -0
  556. package/platforms/electrobun/src/launch/launch-store.test.ts +97 -0
  557. package/platforms/electrobun/src/launch/launch-store.ts +134 -0
  558. package/platforms/electrobun/src/launch/types.ts +103 -0
  559. package/platforms/electrobun/src/launch/views/launch-diagnostics.html +205 -0
  560. package/platforms/electrobun/src/lifecycle/agent-ready-publish.test.ts +50 -0
  561. package/platforms/electrobun/src/lifecycle/agent-ready-publish.ts +27 -0
  562. package/platforms/electrobun/src/lifecycle/api-base-owner.ts +42 -31
  563. package/platforms/electrobun/src/lifecycle/desktop-session-prime.ts +44 -44
  564. package/platforms/electrobun/src/logger.ts +14 -14
  565. package/platforms/electrobun/src/main-window-runtime.ts +83 -83
  566. package/platforms/electrobun/src/main-window-session.test.ts +109 -0
  567. package/platforms/electrobun/src/main-window-session.ts +87 -51
  568. package/platforms/electrobun/src/menu-reset-from-main.ts +158 -158
  569. package/platforms/electrobun/src/native/agent-env.test.ts +52 -0
  570. package/platforms/electrobun/src/native/agent-runtime-layout.test.ts +42 -0
  571. package/platforms/electrobun/src/native/agent-state-dir.test.ts +91 -0
  572. package/platforms/electrobun/src/native/agent.ts +2122 -1682
  573. package/platforms/electrobun/src/native/auth-bridge.test.ts +67 -0
  574. package/platforms/electrobun/src/native/auth-bridge.ts +464 -360
  575. package/platforms/electrobun/src/native/browser-workspace.ts +723 -471
  576. package/platforms/electrobun/src/native/camera.ts +50 -50
  577. package/platforms/electrobun/src/native/canvas.ts +444 -445
  578. package/platforms/electrobun/src/native/credentials.ts +673 -616
  579. package/platforms/electrobun/src/native/desktop-window.test.ts +300 -0
  580. package/platforms/electrobun/src/native/desktop.ts +2196 -2156
  581. package/platforms/electrobun/src/native/editor-bridge.ts +201 -201
  582. package/platforms/electrobun/src/native/file-watcher.ts +154 -154
  583. package/platforms/electrobun/src/native/gateway.ts +179 -180
  584. package/platforms/electrobun/src/native/gpu-window.ts +256 -256
  585. package/platforms/electrobun/src/native/index.ts +76 -74
  586. package/platforms/electrobun/src/native/location.test.ts +44 -0
  587. package/platforms/electrobun/src/native/location.ts +90 -80
  588. package/platforms/electrobun/src/native/loopback-port.ts +60 -60
  589. package/platforms/electrobun/src/native/mac-window-effects.ts +166 -104
  590. package/platforms/electrobun/src/native/music-player.ts +38 -38
  591. package/platforms/electrobun/src/native/permissions-shared.ts +249 -150
  592. package/platforms/electrobun/src/native/permissions.ts +301 -208
  593. package/platforms/electrobun/src/native/power-state.ts +129 -129
  594. package/platforms/electrobun/src/native/remote-plugin-host.test.ts +1394 -0
  595. package/platforms/electrobun/src/native/remote-plugin-host.ts +1531 -0
  596. package/platforms/electrobun/src/native/screencapture.ts +667 -573
  597. package/platforms/electrobun/src/native/steward.ts +207 -204
  598. package/platforms/electrobun/src/native/swabble.ts +68 -324
  599. package/platforms/electrobun/src/native/talkmode.ts +253 -422
  600. package/platforms/electrobun/src/native/webgpu-browser-support.test.ts +18 -0
  601. package/platforms/electrobun/src/native/webgpu-browser-support.ts +165 -147
  602. package/platforms/electrobun/src/native/whisper-env.test.ts +71 -0
  603. package/platforms/electrobun/src/native/whisper-env.ts +68 -0
  604. package/platforms/electrobun/src/native-onboarding.ts +270 -0
  605. package/platforms/electrobun/src/onboarding-overlay-window.ts +141 -0
  606. package/platforms/electrobun/src/persisted-deployment.ts +91 -0
  607. package/platforms/electrobun/src/pill-window.test.ts +91 -0
  608. package/platforms/electrobun/src/pill-window.ts +99 -0
  609. package/platforms/electrobun/src/preload-validation.ts +44 -44
  610. package/platforms/electrobun/src/preload.js +1 -1
  611. package/platforms/electrobun/src/print-electrobun-dev-settings-banner.ts +120 -120
  612. package/platforms/electrobun/src/renderer-api-proxy.test.ts +73 -0
  613. package/platforms/electrobun/src/renderer-api-proxy.ts +86 -0
  614. package/platforms/electrobun/src/renderer-static.test.ts +53 -0
  615. package/platforms/electrobun/src/renderer-static.ts +144 -57
  616. package/platforms/electrobun/src/rpc-handler-slices.ts +121 -0
  617. package/platforms/electrobun/src/rpc-handlers.test.ts +267 -0
  618. package/platforms/electrobun/src/rpc-handlers.ts +1306 -913
  619. package/platforms/electrobun/src/rpc-parse-utils.ts +57 -0
  620. package/platforms/electrobun/src/rpc-port-resolver.test.ts +45 -0
  621. package/platforms/electrobun/src/rpc-port-resolver.ts +31 -0
  622. package/platforms/electrobun/src/rpc-schema.ts +2556 -1619
  623. package/platforms/electrobun/src/runtime-layout.ts +105 -105
  624. package/platforms/electrobun/src/runtime-permissions.ts +95 -95
  625. package/platforms/electrobun/src/runtime-rpc.test.ts +126 -0
  626. package/platforms/electrobun/src/runtime-rpc.ts +237 -0
  627. package/platforms/electrobun/src/screenshot-dev-server.ts +87 -87
  628. package/platforms/electrobun/src/settings-mutations-rpc.test.ts +193 -0
  629. package/platforms/electrobun/src/settings-mutations-rpc.ts +220 -0
  630. package/platforms/electrobun/src/startup-trace.ts +274 -270
  631. package/platforms/electrobun/src/subscription-rpc.test.ts +89 -0
  632. package/platforms/electrobun/src/subscription-rpc.ts +192 -0
  633. package/platforms/electrobun/src/surface-windows.test.ts +355 -0
  634. package/platforms/electrobun/src/surface-windows.ts +410 -410
  635. package/platforms/electrobun/src/trace/README.md +73 -0
  636. package/platforms/electrobun/src/trace/errors.ts +21 -0
  637. package/platforms/electrobun/src/trace/index.ts +40 -0
  638. package/platforms/electrobun/src/trace/trace-dynamic-view.ts +40 -0
  639. package/platforms/electrobun/src/trace/trace-host-requests.ts +473 -0
  640. package/platforms/electrobun/src/trace/trace-service.test.ts +186 -0
  641. package/platforms/electrobun/src/trace/trace-service.ts +324 -0
  642. package/platforms/electrobun/src/trace/trace-store.test.ts +141 -0
  643. package/platforms/electrobun/src/trace/trace-store.ts +551 -0
  644. package/platforms/electrobun/src/trace/types.ts +250 -0
  645. package/platforms/electrobun/src/trace/views/agent-run-trace.html +311 -0
  646. package/platforms/electrobun/src/types/web-speech.d.ts +28 -28
  647. package/platforms/electrobun/src/types.ts +5 -5
  648. package/platforms/electrobun/src/update-availability.test.ts +72 -0
  649. package/platforms/electrobun/src/update-availability.ts +90 -0
  650. package/platforms/electrobun/src/update-rpc.test.ts +83 -0
  651. package/platforms/electrobun/src/update-rpc.ts +123 -0
  652. package/platforms/electrobun/src/voice/README.md +184 -0
  653. package/platforms/electrobun/src/voice/errors.ts +42 -0
  654. package/platforms/electrobun/src/voice/index.ts +78 -0
  655. package/platforms/electrobun/src/voice/types.ts +316 -0
  656. package/platforms/electrobun/src/voice/voice-host-requests.ts +259 -0
  657. package/platforms/electrobun/src/voice/voice-latency-budget.test.ts +66 -0
  658. package/platforms/electrobun/src/voice/voice-latency-budget.ts +243 -0
  659. package/platforms/electrobun/src/voice/voice-live-validation.test.ts +352 -0
  660. package/platforms/electrobun/src/voice/voice-live-validation.ts +838 -0
  661. package/platforms/electrobun/src/voice/voice-pipeline.ts +250 -0
  662. package/platforms/electrobun/src/voice/voice-playback-adapter.ts +31 -0
  663. package/platforms/electrobun/src/voice/voice-runtime-adapter.test.ts +213 -0
  664. package/platforms/electrobun/src/voice/voice-runtime-adapter.ts +686 -0
  665. package/platforms/electrobun/src/voice/voice-service.test.ts +561 -0
  666. package/platforms/electrobun/src/voice/voice-service.ts +1027 -0
  667. package/platforms/electrobun/src/voice/voice-stream-coordinator.test.ts +115 -0
  668. package/platforms/electrobun/src/voice/voice-stream-coordinator.ts +270 -0
  669. package/platforms/electrobun/src/voice/voice-trace.ts +97 -0
  670. package/platforms/electrobun/src/voice/voice-tts-chunker.test.ts +91 -0
  671. package/platforms/electrobun/src/voice/voice-tts-chunker.ts +194 -0
  672. package/platforms/electrobun/src/windows-cef-profile.ts +88 -88
  673. package/platforms/electrobun/tsconfig.json +73 -13
  674. package/platforms/electrobun/update-channels.json +22 -0
  675. package/platforms/electrobun/vitest.electrobun.config.ts +72 -42
  676. package/platforms/ios/App/App/App.entitlements +4 -0
  677. package/platforms/ios/App/App/AppDelegate.swift +80 -18
  678. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ios-marketing-1024.png +0 -0
  679. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20x20@1x.png +0 -0
  680. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-20x20@2x.png +0 -0
  681. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29x29@1x.png +0 -0
  682. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-29x29@2x.png +0 -0
  683. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40x40@1x.png +0 -0
  684. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-40x40@2x.png +0 -0
  685. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76x76@1x.png +0 -0
  686. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-76x76@2x.png +0 -0
  687. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-ipad-83_5x83_5@2x.png +0 -0
  688. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-20x20@2x.png +0 -0
  689. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-20x20@3x.png +0 -0
  690. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-29x29@2x.png +0 -0
  691. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-29x29@3x.png +0 -0
  692. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-40x40@2x.png +0 -0
  693. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-40x40@3x.png +0 -0
  694. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-60x60@2x.png +0 -0
  695. package/platforms/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-iphone-60x60@3x.png +0 -0
  696. package/platforms/ios/App/App/Base.lproj/LaunchScreen.storyboard +1 -4
  697. package/platforms/ios/App/App/ComputerUseBridge.swift +589 -0
  698. package/platforms/ios/App/App/DeviceActivityMonitorExtension/DeviceActivityMonitorExtension.entitlements +12 -0
  699. package/platforms/ios/App/App/DeviceActivityMonitorExtension/DeviceActivityMonitorExtension.swift +34 -0
  700. package/platforms/ios/App/App/DeviceActivityMonitorExtension/Info.plist +29 -0
  701. package/platforms/ios/App/App/DeviceActivityReportExtension/DeviceActivityReportExtension.entitlements +12 -0
  702. package/platforms/ios/App/App/DeviceActivityReportExtension/DeviceActivityReportExtension.swift +53 -0
  703. package/platforms/ios/App/App/DeviceActivityReportExtension/Info.plist +27 -0
  704. package/platforms/ios/App/App/ElizaAppIntents.swift +183 -0
  705. package/platforms/ios/App/App/ElizaIntentPlugin.swift +342 -5
  706. package/platforms/ios/App/App/Info.plist +17 -1
  707. package/platforms/ios/App/App/runners/eliza-tasks.js +177 -0
  708. package/platforms/ios/App/App.xcodeproj/project.pbxproj +262 -6
  709. package/platforms/ios/App/BroadcastExtension/SampleHandler.swift +100 -0
  710. package/platforms/ios/App/Podfile +5 -0
  711. package/platforms/ios/App/Podfile.lock +83 -59
  712. package/register-runtime-hooks.js +11 -5
  713. package/registry/app-registry.d.ts +14 -0
  714. package/registry/app-registry.d.ts.map +1 -0
  715. package/registry/app-registry.js +29 -0
  716. package/registry/entries/apps/app-polymarket.json +31 -0
  717. package/registry/entries/apps/clawville.json +27 -0
  718. package/registry/entries/apps/companion.json +28 -0
  719. package/registry/entries/apps/database-viewer.json +27 -0
  720. package/registry/entries/apps/defense-of-the-agents.json +27 -0
  721. package/registry/entries/apps/documents.json +30 -0
  722. package/registry/entries/apps/feed.json +27 -0
  723. package/registry/entries/apps/hyperliquid.json +31 -0
  724. package/registry/entries/apps/log-viewer.json +27 -0
  725. package/registry/entries/apps/memory-viewer.json +27 -0
  726. package/registry/entries/apps/model-tester.json +31 -0
  727. package/registry/entries/apps/plugin-viewer.json +27 -0
  728. package/registry/entries/apps/relationship-viewer.json +27 -0
  729. package/registry/entries/apps/runtime-debugger.json +27 -0
  730. package/registry/entries/apps/shopify.json +31 -0
  731. package/registry/entries/apps/skills-viewer.json +27 -0
  732. package/registry/entries/apps/steward.json +31 -0
  733. package/registry/entries/apps/training.json +54 -0
  734. package/registry/entries/apps/trajectory-viewer.json +27 -0
  735. package/registry/entries/apps/vincent.json +31 -0
  736. package/registry/entries/connectors/bluebubbles.json +99 -0
  737. package/registry/entries/connectors/bluesky.json +173 -0
  738. package/registry/entries/connectors/discord.json +119 -0
  739. package/registry/entries/connectors/farcaster.json +174 -0
  740. package/registry/entries/connectors/feishu.json +79 -0
  741. package/registry/entries/connectors/google-chat.json +120 -0
  742. package/registry/entries/connectors/google.json +82 -0
  743. package/registry/entries/connectors/imessage.json +96 -0
  744. package/registry/entries/connectors/instagram.json +64 -0
  745. package/registry/entries/connectors/line.json +86 -0
  746. package/registry/entries/connectors/matrix.json +94 -0
  747. package/registry/entries/connectors/mattermost.json +110 -0
  748. package/registry/entries/connectors/msteams.json +104 -0
  749. package/registry/entries/connectors/nextcloud-talk.json +104 -0
  750. package/registry/entries/connectors/nostr.json +70 -0
  751. package/registry/entries/connectors/signal.json +81 -0
  752. package/registry/entries/connectors/slack.json +102 -0
  753. package/registry/entries/connectors/telegram.json +71 -0
  754. package/registry/entries/connectors/tlon.json +94 -0
  755. package/registry/entries/connectors/twitch.json +110 -0
  756. package/registry/entries/connectors/whatsapp.json +113 -0
  757. package/registry/entries/connectors/x.json +231 -0
  758. package/registry/entries/connectors/zalo.json +112 -0
  759. package/registry/entries/connectors/zalouser.json +122 -0
  760. package/registry/entries/plugins/agent-orchestrator.json +33 -0
  761. package/registry/entries/plugins/agent-skills.json +72 -0
  762. package/registry/entries/plugins/anthropic.json +73 -0
  763. package/registry/entries/plugins/app-control.json +23 -0
  764. package/registry/entries/plugins/auto-trader.json +203 -0
  765. package/registry/entries/plugins/background-runner.json +26 -0
  766. package/registry/entries/plugins/blooio.json +102 -0
  767. package/registry/entries/plugins/browser.json +75 -0
  768. package/registry/entries/plugins/cli.json +40 -0
  769. package/registry/entries/plugins/clipboard.json +44 -0
  770. package/registry/entries/plugins/coding-tools.json +71 -0
  771. package/registry/entries/plugins/commands.json +63 -0
  772. package/registry/entries/plugins/computeruse.json +74 -0
  773. package/registry/entries/plugins/copilot-proxy.json +93 -0
  774. package/registry/entries/plugins/directives.json +63 -0
  775. package/registry/entries/plugins/edge-tts.json +97 -0
  776. package/registry/entries/plugins/elevenlabs.json +169 -0
  777. package/registry/entries/plugins/elizacloud.json +208 -0
  778. package/registry/entries/plugins/evm.json +134 -0
  779. package/registry/entries/plugins/experience.json +34 -0
  780. package/registry/entries/plugins/facewear.json +131 -0
  781. package/registry/entries/plugins/form.json +26 -0
  782. package/registry/entries/plugins/github.json +93 -0
  783. package/registry/entries/plugins/gmail-watch.json +25 -0
  784. package/registry/entries/plugins/goals.json +77 -0
  785. package/registry/entries/plugins/google-genai.json +106 -0
  786. package/registry/entries/plugins/groq.json +93 -0
  787. package/registry/entries/plugins/hedera.json +48 -0
  788. package/registry/entries/plugins/inmemorydb.json +25 -0
  789. package/registry/entries/plugins/linear.json +51 -0
  790. package/registry/entries/plugins/local-inference.json +142 -0
  791. package/registry/entries/plugins/local-storage.json +36 -0
  792. package/registry/entries/plugins/localdb.json +25 -0
  793. package/registry/entries/plugins/mcp.json +44 -0
  794. package/registry/entries/plugins/memory.json +124 -0
  795. package/registry/entries/plugins/minecraft.json +79 -0
  796. package/registry/entries/plugins/moltbook.json +83 -0
  797. package/registry/entries/plugins/music.json +155 -0
  798. package/registry/entries/plugins/mysticism.json +48 -0
  799. package/registry/entries/plugins/nearai.json +82 -0
  800. package/registry/entries/plugins/ngrok.json +69 -0
  801. package/registry/entries/plugins/ollama.json +96 -0
  802. package/registry/entries/plugins/openai.json +189 -0
  803. package/registry/entries/plugins/openrouter.json +188 -0
  804. package/registry/entries/plugins/pdf.json +26 -0
  805. package/registry/entries/plugins/plugin-manager.json +23 -0
  806. package/registry/entries/plugins/prose.json +48 -0
  807. package/registry/entries/plugins/rlm.json +26 -0
  808. package/registry/entries/plugins/roblox.json +88 -0
  809. package/registry/entries/plugins/rss.json +64 -0
  810. package/registry/entries/plugins/s3-storage.json +91 -0
  811. package/registry/entries/plugins/scheduling.json +35 -0
  812. package/registry/entries/plugins/shell.json +94 -0
  813. package/registry/entries/plugins/social-alpha.json +72 -0
  814. package/registry/entries/plugins/tailscale.json +81 -0
  815. package/registry/entries/plugins/tee.json +53 -0
  816. package/registry/entries/plugins/todos.json +26 -0
  817. package/registry/entries/plugins/trajectory-logger.json +33 -0
  818. package/registry/entries/plugins/trust.json +39 -0
  819. package/registry/entries/plugins/tts.json +71 -0
  820. package/registry/entries/plugins/tunnel.json +45 -0
  821. package/registry/entries/plugins/twilio.json +168 -0
  822. package/registry/entries/plugins/vercel-ai-gateway.json +128 -0
  823. package/registry/entries/plugins/video.json +23 -0
  824. package/registry/entries/plugins/vision.json +43 -0
  825. package/registry/entries/plugins/webhooks.json +23 -0
  826. package/registry/entries/plugins/workflow.json +25 -0
  827. package/registry/entries/plugins/xai.json +75 -0
  828. package/registry/index.d.ts +2 -1
  829. package/registry/index.d.ts.map +1 -1
  830. package/registry/index.js +46 -12
  831. package/registry/loader.d.ts +2 -1
  832. package/registry/loader.d.ts.map +1 -1
  833. package/registry/loader.js +49 -2
  834. package/registry/schema.d.ts +244 -34
  835. package/registry/schema.d.ts.map +1 -1
  836. package/registry/schema.js +36 -0
  837. package/runtime/android-avf-microdroid-bridge.d.ts +29 -0
  838. package/runtime/android-avf-microdroid-bridge.d.ts.map +1 -0
  839. package/runtime/android-avf-microdroid-bridge.js +149 -0
  840. package/runtime/api-dev-settings-banner.d.ts.map +1 -1
  841. package/runtime/api-dev-settings-banner.js +5 -13
  842. package/runtime/app-core-runtime-hooks.d.ts +21 -0
  843. package/runtime/app-core-runtime-hooks.d.ts.map +1 -0
  844. package/runtime/app-core-runtime-hooks.js +10 -0
  845. package/runtime/autonomy-policy.d.ts +2 -0
  846. package/runtime/autonomy-policy.d.ts.map +1 -0
  847. package/runtime/autonomy-policy.js +4 -0
  848. package/runtime/desktop/AppWindowRenderer.d.ts +17 -0
  849. package/runtime/desktop/AppWindowRenderer.d.ts.map +1 -0
  850. package/runtime/desktop/AppWindowRenderer.js +360 -0
  851. package/runtime/desktop/DesktopSurfaceNavigationRuntime.d.ts +2 -0
  852. package/runtime/desktop/DesktopSurfaceNavigationRuntime.d.ts.map +1 -0
  853. package/runtime/desktop/DesktopSurfaceNavigationRuntime.js +41 -0
  854. package/runtime/desktop/DesktopTrayRuntime.d.ts +2 -0
  855. package/runtime/desktop/DesktopTrayRuntime.d.ts.map +1 -0
  856. package/runtime/desktop/DesktopTrayRuntime.js +174 -0
  857. package/runtime/desktop/DetachedShellRoot.d.ts +10 -0
  858. package/runtime/desktop/DetachedShellRoot.d.ts.map +1 -0
  859. package/runtime/desktop/DetachedShellRoot.js +111 -0
  860. package/runtime/desktop/index.d.ts +6 -0
  861. package/runtime/desktop/index.d.ts.map +1 -0
  862. package/runtime/desktop/index.js +5 -0
  863. package/runtime/desktop/tray-menu.d.ts +20 -0
  864. package/runtime/desktop/tray-menu.d.ts.map +1 -0
  865. package/runtime/desktop/tray-menu.js +143 -0
  866. package/runtime/dev-server.d.ts +1 -1
  867. package/runtime/dev-server.d.ts.map +1 -1
  868. package/runtime/dev-server.js +93 -17
  869. package/runtime/eliza.d.ts +75 -1
  870. package/runtime/eliza.d.ts.map +1 -1
  871. package/runtime/eliza.js +596 -122
  872. package/runtime/ensure-text-to-speech-handler.d.ts.map +1 -1
  873. package/runtime/ensure-text-to-speech-handler.js +10 -3
  874. package/runtime/mobile-safe-runtime.d.ts +181 -2
  875. package/runtime/mobile-safe-runtime.d.ts.map +1 -1
  876. package/runtime/mobile-safe-runtime.js +1019 -12
  877. package/runtime/mode/remote-forwarder.d.ts.map +1 -1
  878. package/runtime/mode/remote-forwarder.js +2 -2
  879. package/runtime/mode/route-mode-guard.d.ts +1 -2
  880. package/runtime/mode/route-mode-guard.d.ts.map +1 -1
  881. package/runtime/mode/route-mode-guard.js +4 -5
  882. package/runtime/mode/route-mode-matrix.d.ts.map +1 -1
  883. package/runtime/mode/route-mode-matrix.js +14 -1
  884. package/runtime/mode/runtime-mode.d.ts +1 -1
  885. package/runtime/mode/runtime-mode.d.ts.map +1 -1
  886. package/runtime/mode/runtime-mode.js +15 -4
  887. package/runtime/runtime-bootstrap-policy.d.ts.map +1 -1
  888. package/runtime/runtime-bootstrap-policy.js +14 -2
  889. package/runtime/telegram-standalone-handler.d.ts.map +1 -1
  890. package/runtime/telegram-standalone-handler.js +10 -9
  891. package/runtime/tts-cache-wiring.d.ts +29 -0
  892. package/runtime/tts-cache-wiring.d.ts.map +1 -0
  893. package/runtime/tts-cache-wiring.js +114 -0
  894. package/runtime/voice-warmup.d.ts +81 -0
  895. package/runtime/voice-warmup.d.ts.map +1 -0
  896. package/runtime/voice-warmup.js +111 -0
  897. package/scripts/android-sms-gateway-template.test.mjs +1014 -0
  898. package/scripts/aosp/README.md +19 -15
  899. package/scripts/aosp/compile-libllama.mjs +1344 -248
  900. package/scripts/aosp/compile-shim.mjs +47 -18
  901. package/scripts/aosp/deploy-pixel.mjs +405 -0
  902. package/scripts/aosp/lib/load-variant-config.mjs +3 -3
  903. package/scripts/aosp/llama-cpp-patches/README.md +8 -8
  904. package/scripts/aosp/llama-cpp-patches/apply-patches.mjs +23 -6
  905. package/scripts/aosp/llama-cpp-patches/polarquant/README.md +37 -0
  906. package/scripts/aosp/llama-cpp-patches/qjl/README.md +37 -0
  907. package/scripts/aosp/seccomp-shim/sigsys-handler-arm64.c +169 -0
  908. package/scripts/aosp/seccomp-shim/sigsys-handler-riscv64.c +217 -0
  909. package/scripts/aosp/smoke-cuttlefish.mjs +34 -4
  910. package/scripts/aosp/stage-default-models.mjs +18 -18
  911. package/scripts/aosp/variant-config-schema.ts +2 -2
  912. package/scripts/assert-required-bundled-packages.test.ts +534 -0
  913. package/scripts/audit-apple-store-sandbox.mjs +146 -0
  914. package/scripts/audit-live-test-surface.mjs +5 -2
  915. package/scripts/build-capacitor-app.mjs +21 -0
  916. package/scripts/build-flatpak.mjs +5 -5
  917. package/scripts/build-helpers/arm64-simd.mjs +72 -0
  918. package/scripts/build-helpers/omnivoice-merged.mjs +87 -0
  919. package/scripts/build-helpers/verify-fused-symbols.mjs +567 -0
  920. package/scripts/build-image.sh +1 -1
  921. package/scripts/build-llama-cpp-mtp.mjs +487 -0
  922. package/scripts/build-native-plugins.mjs +230 -18
  923. package/scripts/build-patched-electrobun-cli.mjs +68 -10
  924. package/scripts/build-win.mjs +1 -1
  925. package/scripts/bun-riscv64/Dockerfile +418 -0
  926. package/scripts/bun-riscv64/README.md +316 -0
  927. package/scripts/bun-riscv64/build.sh +469 -0
  928. package/scripts/bun-riscv64/bun-patches/0001-config-add-riscv64-arch.patch +74 -0
  929. package/scripts/bun-riscv64/bun-patches/0002-flags-add-riscv64-march-mabi.patch +16 -0
  930. package/scripts/bun-riscv64/bun-patches/0003-zig-add-riscv64-target-triple-and-cpu.patch +26 -0
  931. package/scripts/bun-riscv64/bun-patches/0004-webkit-force-local-mode-on-riscv64.patch +33 -0
  932. package/scripts/bun-riscv64/bun-patches/0005-tinycc-disable-on-riscv64.patch +16 -0
  933. package/scripts/bun-riscv64/bun-patches/0006-build-add-riscv64-cli-validation.patch +15 -0
  934. package/scripts/bun-riscv64/bun-patches/0007-deps-per-dep-riscv64-checks.patch +24 -0
  935. package/scripts/bun-riscv64/bun-patches/0008-source-stabilize-riscv64-musl-build.patch +226 -0
  936. package/scripts/bun-riscv64/bun-patches/0009-disable-wasm-streaming-hooks-for-c-loop.patch +162 -0
  937. package/scripts/bun-riscv64/bun-patches/0010-disable-inspector-profiler-for-riscv64-c-loop.patch +80 -0
  938. package/scripts/bun-riscv64/bun-patches/0011-process-arch-add-riscv64.patch +23 -0
  939. package/scripts/bun-riscv64/bun-patches/0012-cpu-features-add-riscv64-fallback.patch +13 -0
  940. package/scripts/bun-riscv64/bun-patches/0013-disable-console-inspector-hooks-for-riscv64-c-loop.patch +43 -0
  941. package/scripts/bun-riscv64/bun-patches/0014-disable-custom-inspector-dispatchers-on-riscv64.patch +127 -0
  942. package/scripts/bun-riscv64/bun-patches/0015-disable-jsc-profiler-builtins-on-riscv64.patch +75 -0
  943. package/scripts/bun-riscv64/bun-patches/0016-node-vm-disable-jit-cached-data-on-riscv64-c-loop.patch +96 -0
  944. package/scripts/bun-riscv64/bun-patches/0017-disable-performance-domjit-signature-on-riscv64-c-loop.patch +34 -0
  945. package/scripts/bun-riscv64/bun-patches/0018-fix-serialized-script-identifier-big-endian-path.patch +19 -0
  946. package/scripts/bun-riscv64/bun-patches/0019-add-wtf-timer-fire-bridge-for-c-loop.patch +24 -0
  947. package/scripts/bun-riscv64/bun-patches/0020-run-riscv64-smoke-test-under-qemu.patch +13 -0
  948. package/scripts/bun-riscv64/bun-patches/0021-fix-riscv64-linux-open-flags.patch +25 -0
  949. package/scripts/bun-riscv64/bun-patches/0022-zlib-riscv64-generic-kernels.patch +25 -0
  950. package/scripts/bun-riscv64/bun-patches/README.md +127 -0
  951. package/scripts/bun-riscv64/bun-version.json +202 -0
  952. package/scripts/bun-riscv64/run-build.sh +162 -0
  953. package/scripts/bun-riscv64/rust-core/0001-riscv64-rust-core-port.patch +868 -0
  954. package/scripts/bun-riscv64/rust-core/0002-second-wave-riscv64-source-gaps.patch +130 -0
  955. package/scripts/bun-riscv64/rust-core/0003-third-wave-riscv64-crash-handler-gaps.patch +78 -0
  956. package/scripts/bun-riscv64/rust-core/0004-rust-target-cpu-riscv64.patch +39 -0
  957. package/scripts/bun-riscv64/rust-core/0005-fifth-wave-riscv64-source-gaps.patch +96 -0
  958. package/scripts/bun-riscv64/rust-core/0006-cpp-wasm-and-inspector-guards-riscv64.patch +91 -0
  959. package/scripts/bun-riscv64/rust-core/0007-bun-alloc-max-align-t-riscv64.patch +36 -0
  960. package/scripts/bun-riscv64/rust-core/0008-workspace-lints-warn-not-deny-riscv64.patch +75 -0
  961. package/scripts/bun-riscv64/rust-core/0009-zigglobalobject-wasm-streaming-guards-riscv64.patch +109 -0
  962. package/scripts/bun-riscv64/rust-core/0010-tcc-externs-stub-on-riscv64.patch +62 -0
  963. package/scripts/bun-riscv64/rust-core/0011-clippy-ptr-cast-lints-warn-riscv64.patch +61 -0
  964. package/scripts/bun-riscv64/rust-core/README.md +80 -0
  965. package/scripts/bun-riscv64/rust-core/webkit-patches/0003-disable-dfg-ftl-on-riscv64.patch +60 -0
  966. package/scripts/bun-riscv64/rust-core/webkit-patches/0004-riscv64-do-not-force-wasm-in-c-loop.patch +31 -0
  967. package/scripts/bun-riscv64/rust-core/webkit-patches/0005-domjit-effect-allow-no-dfg-c-loop.patch +40 -0
  968. package/scripts/bun-riscv64/rust-core/webkit-patches/0006-disable-usewasm-when-webassembly-compiled-out.patch +33 -0
  969. package/scripts/bun-riscv64/rust-core/webkit-patches/0007-restore-dropped-includes-and-llint-fwd-decl.patch +31 -0
  970. package/scripts/bun-riscv64/validate.sh +264 -0
  971. package/scripts/bun-riscv64/webkit-patches/0001-cherry-pick-llint-riscv64.recipe +155 -0
  972. package/scripts/bun-riscv64/webkit-patches/0002-cherry-pick-baseline-jit-riscv64.recipe +40 -0
  973. package/scripts/bun-riscv64/webkit-patches/0003-disable-dfg-ftl-on-riscv64.patch +60 -0
  974. package/scripts/bun-riscv64/webkit-patches/0004-riscv64-do-not-force-wasm-in-c-loop.patch +31 -0
  975. package/scripts/bun-riscv64/webkit-patches/0005-domjit-effect-allow-no-dfg-c-loop.patch +40 -0
  976. package/scripts/bun-riscv64/webkit-patches/0006-disable-usewasm-when-webassembly-compiled-out.patch +33 -0
  977. package/scripts/bun-riscv64/webkit-patches/0007-restore-dropped-includes-and-llint-fwd-decl.patch +72 -0
  978. package/scripts/bun-riscv64/webkit-patches/README.md +146 -0
  979. package/scripts/check-homepage-public-readiness.mjs +353 -0
  980. package/scripts/check-homepage-release-data.mjs +110 -0
  981. package/scripts/check-i18n.mjs +2 -1
  982. package/scripts/check-real-local-chat.ts +147 -0
  983. package/scripts/check-real-local-provisioning.ts +104 -0
  984. package/scripts/check-real-local-reset.ts +249 -0
  985. package/scripts/check-sms-gateway-completion-audit.mjs +428 -0
  986. package/scripts/check-sms-gateway-readiness.mjs +266 -0
  987. package/scripts/clean-repo.mjs +5 -5
  988. package/scripts/codesign-mas.mjs +222 -16
  989. package/scripts/collect-docker-runtime-deps.mjs +229 -0
  990. package/scripts/continue-sms-gateway-work.mjs +121 -0
  991. package/scripts/copy-runtime-node-modules.ts +903 -195
  992. package/scripts/deploy-cloud-api-production-gateway.mjs +52 -0
  993. package/scripts/desktop-build.mjs +655 -101
  994. package/scripts/dev-platform.mjs +346 -102
  995. package/scripts/dev-startup-smoke.mjs +248 -0
  996. package/scripts/dev-ui.mjs +418 -176
  997. package/scripts/disable-local-eliza-workspace.mjs +35 -0
  998. package/scripts/docker-ci-smoke.sh +298 -96
  999. package/scripts/docker-entrypoint.sh +62 -1
  1000. package/scripts/docker-entrypoint.test.ts +283 -0
  1001. package/scripts/ensure-avatars.mjs +2 -2
  1002. package/scripts/ensure-electrobun-core.mjs +1 -1
  1003. package/scripts/ensure-generated-core-proto-js.mjs +1 -1
  1004. package/scripts/ensure-type-package-aliases.mjs +62 -5
  1005. package/scripts/ensure-vision-deps.mjs +20 -1
  1006. package/scripts/entry.ts +1 -1
  1007. package/scripts/ffi-stub/Makefile +64 -0
  1008. package/scripts/ffi-stub/README.md +391 -0
  1009. package/scripts/ffi-stub/asr-ffi-smoke.ts +139 -0
  1010. package/scripts/ffi-stub/ffi-stub.c +539 -0
  1011. package/scripts/ffi-stub/ffi.h +538 -0
  1012. package/scripts/ffi-stub/libelizainference_stub.so +0 -0
  1013. package/scripts/ffi-stub/tts-stream-ffi-smoke.ts +349 -0
  1014. package/scripts/generate-first-run-voicelines.mjs +194 -0
  1015. package/scripts/generate-plugin-index.js +4 -3
  1016. package/scripts/generate-static-asset-manifest.mjs +1 -1
  1017. package/scripts/i18n-dynamic-keys.json +5 -5
  1018. package/scripts/init-submodules.mjs +2 -2
  1019. package/scripts/install-android-sms-gateway.md +177 -0
  1020. package/scripts/install-android-sms-gateway.mjs +1088 -0
  1021. package/scripts/ios-xcframework/README.md +74 -72
  1022. package/scripts/ios-xcframework/build-xcframework.mjs +204 -43
  1023. package/scripts/ios-xcframework/run-physical-device-smoke.mjs +1943 -0
  1024. package/scripts/ios-xcframework/runtime-symbol-shim.c +450 -0
  1025. package/scripts/kernel-patches/cpu-polar-kernels.mjs +441 -0
  1026. package/scripts/kernel-patches/cpu-simd-kernels.mjs +253 -0
  1027. package/scripts/kernel-patches/cpu-thread-parallelism.mjs +368 -0
  1028. package/scripts/kernel-patches/cuda-kernels.mjs +117 -0
  1029. package/scripts/kernel-patches/metal-kernels.mjs +1698 -109
  1030. package/scripts/kernel-patches/server-omnivoice-route.mjs +718 -0
  1031. package/scripts/kernel-patches/server-structured-output.mjs +279 -0
  1032. package/scripts/kernel-patches/vulkan-dispatch-log.mjs +166 -0
  1033. package/scripts/kernel-patches/vulkan-dispatch-log.test.mjs +50 -0
  1034. package/scripts/kernel-patches/vulkan-dispatch-patches/01-vulkan-shaders-gen.patch +30 -16
  1035. package/scripts/kernel-patches/vulkan-dispatch-patches/02-ggml-vulkan-pipelines.patch +75 -30
  1036. package/scripts/kernel-patches/vulkan-kernels.mjs +800 -49
  1037. package/scripts/lib/agent-source-watcher.mjs +174 -0
  1038. package/scripts/lib/agent-source-watcher.test.mjs +184 -0
  1039. package/scripts/lib/api-supervisor.mjs +78 -9
  1040. package/scripts/lib/api-supervisor.test.mjs +121 -0
  1041. package/scripts/lib/app-dir.mjs +2 -16
  1042. package/scripts/lib/apple-entitlement-audit.mjs +655 -0
  1043. package/scripts/lib/apple-entitlement-audit.test.mjs +144 -0
  1044. package/scripts/lib/bun-version-guard.mjs +13 -13
  1045. package/scripts/lib/capacitor-plugin-build-needed.mjs +4 -3
  1046. package/scripts/lib/capacitor-plugin-names.mjs +30 -14
  1047. package/scripts/lib/desktop-preflight.mjs +9 -5
  1048. package/scripts/lib/desktop-startup-embedding-warmup-policy.mjs +51 -0
  1049. package/scripts/lib/desktop-startup-embedding-warmup-policy.test.mjs +55 -0
  1050. package/scripts/lib/duet-bridge.d.mts +63 -0
  1051. package/scripts/lib/duet-bridge.mjs +193 -0
  1052. package/scripts/lib/node-path-env.mjs +4 -2
  1053. package/scripts/lib/orchestrator-desktop-dev-banner.mjs +12 -3
  1054. package/scripts/lib/patch-bun-exports.mjs +90 -27
  1055. package/scripts/lib/patch-bun-exports.test.mjs +79 -0
  1056. package/scripts/lib/renderer-build-action.mjs +35 -0
  1057. package/scripts/lib/renderer-build-action.test.mjs +70 -0
  1058. package/scripts/lib/stage-android-agent.mjs +748 -99
  1059. package/scripts/lib/sync-eliza-env-aliases.mjs +3 -25
  1060. package/scripts/lib/ui-smoke-stub-decision.mjs +33 -0
  1061. package/scripts/lib/ui-smoke-stub-decision.test.mjs +46 -0
  1062. package/scripts/lib/vite-renderer-dist-stale.mjs +5 -0
  1063. package/scripts/lib/voice-latency-report.mjs +154 -0
  1064. package/scripts/lifeops-prompt-benchmark.ts +21 -12
  1065. package/scripts/link-docker-local-app-packages.mjs +89 -36
  1066. package/scripts/local-stt-bench.ts +192 -0
  1067. package/scripts/maintain-cloud-api-production-gateway.mjs +54 -0
  1068. package/scripts/mas-smoke.mjs +459 -0
  1069. package/scripts/mas-smoke.test.mjs +220 -0
  1070. package/scripts/mobile-auth-simulator-smoke.mjs +0 -1
  1071. package/scripts/normalize-eliza-capture.ts +97 -0
  1072. package/scripts/omnivoice-fuse/prepare.mjs +2543 -23
  1073. package/scripts/pack-upstreams.mjs +65 -5
  1074. package/scripts/package-electrobun-linux.mjs +303 -0
  1075. package/scripts/patch-deps.mjs +5 -3
  1076. package/scripts/patches/llama-mobile-kokoro-tts.patch +480 -0
  1077. package/scripts/playwright-ui-live-stack.ts +194 -49
  1078. package/scripts/playwright-ui-smoke-api-stub.mjs +3501 -109
  1079. package/scripts/pre-review-local.mjs +2 -2
  1080. package/scripts/prepare-ios-cocoapods.sh +41 -3
  1081. package/scripts/release-check.ts +180 -84
  1082. package/scripts/release-workflow-drift.test.ts +57 -0
  1083. package/scripts/relink-workspace-packages-to-dist.mjs +21 -4
  1084. package/scripts/rt.mjs +16 -1
  1085. package/scripts/run-biome-check.mjs +1 -1
  1086. package/scripts/run-coding-agent-e2e.mjs +3 -3
  1087. package/scripts/run-eliza-app-core-script.mjs +34 -0
  1088. package/scripts/run-local-plugin-live-smoke.mjs +71 -2
  1089. package/scripts/run-mobile-build-android-app-actions.test.mjs +426 -0
  1090. package/scripts/run-mobile-build.mjs +4757 -607
  1091. package/scripts/run-node-runtime.mjs +184 -7
  1092. package/scripts/run-node-runtime.test.mjs +167 -0
  1093. package/scripts/run-node-tsx.mjs +80 -33
  1094. package/scripts/run-node.mjs +41 -1
  1095. package/scripts/run-production-build.mjs +34 -27
  1096. package/scripts/run-release-check.mjs +19 -0
  1097. package/scripts/run-release-contract-suite.mjs +107 -14
  1098. package/scripts/run-ui-smoke-playwright-suite.mjs +0 -2
  1099. package/scripts/runtime-package-manifest.ts +21 -3
  1100. package/scripts/setup-upstreams.mjs +42 -1
  1101. package/scripts/sms-gateway-status.mjs +194 -0
  1102. package/scripts/stage-android-agent.test.mjs +97 -0
  1103. package/scripts/stage-elizavoice-lib.mjs +203 -0
  1104. package/scripts/startup-integration-script-drift.test.ts +82 -4
  1105. package/scripts/streaming-pipeline-bench.ts +543 -0
  1106. package/scripts/sync-homepage-porkbun-dns.mjs +262 -0
  1107. package/scripts/test-sms-gateway-software.mjs +100 -0
  1108. package/scripts/type-audit.mjs +1 -1
  1109. package/scripts/validate-bluebubbles-outbound.mjs +293 -0
  1110. package/scripts/validate-cdn-assets.mjs +15 -7
  1111. package/scripts/validate-regression-matrix.mjs +109 -8
  1112. package/scripts/verify-android-sms-gateway-e2e.mjs +362 -0
  1113. package/scripts/verify-bluebubbles-gateway-e2e.mjs +191 -0
  1114. package/scripts/verify-bluebubbles-inbound-readiness.mjs +88 -0
  1115. package/scripts/verify-cloud-api-production-deploy.mjs +87 -0
  1116. package/scripts/verify-cloud-sms-onboarding-flow.mjs +336 -0
  1117. package/scripts/voice/freeze-voice.mjs +521 -0
  1118. package/scripts/voice-attribution-smoke.ts +538 -0
  1119. package/scripts/voice-create-profile.mjs +379 -0
  1120. package/scripts/voice-duet.mjs +1355 -0
  1121. package/scripts/voice-e2e-hardware.ts +871 -0
  1122. package/scripts/voice-interactive.mjs +1750 -0
  1123. package/scripts/voice-latency-report.mjs +96 -0
  1124. package/scripts/voice-latency-report.test.ts +176 -0
  1125. package/scripts/voice-preset/build-default-voice-preset.mjs +249 -0
  1126. package/scripts/voice-preset/build-onboarding-voice.mjs +281 -0
  1127. package/scripts/watch-sms-gateway-readiness.mjs +303 -0
  1128. package/scripts/write-homepage-release-data.mjs +458 -26
  1129. package/security/agent-vault-id.d.ts +1 -1
  1130. package/security/agent-vault-id.js +1 -1
  1131. package/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -1
  1132. package/security/hydrate-wallet-keys-from-platform-store.js +23 -14
  1133. package/security/platform-secure-store-node.d.ts +2 -2
  1134. package/security/platform-secure-store-node.js +3 -3
  1135. package/security/wallet-os-store-actions.d.ts +0 -9
  1136. package/security/wallet-os-store-actions.d.ts.map +1 -1
  1137. package/security/wallet-os-store-actions.js +3 -10
  1138. package/services/account-pool.d.ts +23 -14
  1139. package/services/account-pool.d.ts.map +1 -1
  1140. package/services/account-pool.js +86 -24
  1141. package/services/account-usage.d.ts.map +1 -1
  1142. package/services/account-usage.js +2 -5
  1143. package/services/ambient-audio/consent.d.ts +9 -0
  1144. package/services/ambient-audio/consent.d.ts.map +1 -0
  1145. package/services/ambient-audio/consent.js +28 -0
  1146. package/services/ambient-audio/index.d.ts +7 -0
  1147. package/services/ambient-audio/index.d.ts.map +1 -0
  1148. package/services/ambient-audio/index.js +4 -0
  1149. package/services/ambient-audio/replay-buffer.d.ts +14 -0
  1150. package/services/ambient-audio/replay-buffer.d.ts.map +1 -0
  1151. package/services/ambient-audio/replay-buffer.js +66 -0
  1152. package/services/ambient-audio/response-gate.d.ts +3 -0
  1153. package/services/ambient-audio/response-gate.d.ts.map +1 -0
  1154. package/services/ambient-audio/response-gate.js +33 -0
  1155. package/services/ambient-audio/service.d.ts +22 -0
  1156. package/services/ambient-audio/service.d.ts.map +1 -0
  1157. package/services/ambient-audio/service.js +47 -0
  1158. package/services/ambient-audio/types.d.ts +42 -0
  1159. package/services/ambient-audio/types.d.ts.map +1 -0
  1160. package/services/app-updates/update-policy.d.ts +64 -0
  1161. package/services/app-updates/update-policy.d.ts.map +1 -0
  1162. package/services/app-updates/update-policy.js +228 -0
  1163. package/services/auth-store.d.ts +37 -1
  1164. package/services/auth-store.d.ts.map +1 -1
  1165. package/services/auth-store.js +59 -26
  1166. package/services/cloud-jwks-store.d.ts +3 -3
  1167. package/services/cloud-jwks-store.d.ts.map +1 -1
  1168. package/services/cloud-jwks-store.js +5 -8
  1169. package/services/coding-account-bridge.d.ts +71 -0
  1170. package/services/coding-account-bridge.d.ts.map +1 -0
  1171. package/services/coding-account-bridge.js +267 -0
  1172. package/services/connector-target-catalog.d.ts +10 -3
  1173. package/services/connector-target-catalog.d.ts.map +1 -1
  1174. package/services/connector-target-catalog.js +7 -4
  1175. package/services/credential-tunnel-service.d.ts +66 -0
  1176. package/services/credential-tunnel-service.d.ts.map +1 -0
  1177. package/services/credential-tunnel-service.js +227 -0
  1178. package/services/github-credentials.d.ts +1 -1
  1179. package/services/github-credentials.js +1 -1
  1180. package/services/inference-abort.d.ts +47 -0
  1181. package/services/inference-abort.d.ts.map +1 -0
  1182. package/services/inference-abort.js +76 -0
  1183. package/services/persistence.d.ts +2 -3
  1184. package/services/persistence.d.ts.map +1 -1
  1185. package/services/persistence.js +2 -3
  1186. package/services/phrase-chunked-tts.d.ts +136 -0
  1187. package/services/phrase-chunked-tts.d.ts.map +1 -0
  1188. package/services/phrase-chunked-tts.js +208 -0
  1189. package/services/sandbox-registry.d.ts +78 -0
  1190. package/services/sandbox-registry.d.ts.map +1 -0
  1191. package/services/sandbox-registry.js +323 -0
  1192. package/services/secrets-manager-installer.d.ts +8 -1
  1193. package/services/secrets-manager-installer.d.ts.map +1 -1
  1194. package/services/secrets-manager-installer.js +27 -2
  1195. package/services/sensitive-requests/cloud-link-adapter.d.ts +15 -0
  1196. package/services/sensitive-requests/cloud-link-adapter.d.ts.map +1 -0
  1197. package/services/sensitive-requests/cloud-link-adapter.js +73 -0
  1198. package/services/sensitive-requests/index.d.ts +27 -0
  1199. package/services/sensitive-requests/index.d.ts.map +1 -0
  1200. package/services/sensitive-requests/index.js +51 -0
  1201. package/services/sensitive-requests/instruct-dm-only-adapter.d.ts +14 -0
  1202. package/services/sensitive-requests/instruct-dm-only-adapter.d.ts.map +1 -0
  1203. package/services/sensitive-requests/instruct-dm-only-adapter.js +22 -0
  1204. package/services/sensitive-requests/owner-app-inline-adapter.d.ts +3 -0
  1205. package/services/sensitive-requests/owner-app-inline-adapter.d.ts.map +1 -0
  1206. package/services/sensitive-requests/owner-app-inline-adapter.js +146 -0
  1207. package/services/sensitive-requests/owner-app-oauth-adapter.d.ts +3 -0
  1208. package/services/sensitive-requests/owner-app-oauth-adapter.d.ts.map +1 -0
  1209. package/services/sensitive-requests/owner-app-oauth-adapter.js +156 -0
  1210. package/services/sensitive-requests/public-link-adapter.d.ts +14 -0
  1211. package/services/sensitive-requests/public-link-adapter.d.ts.map +1 -0
  1212. package/services/sensitive-requests/public-link-adapter.js +86 -0
  1213. package/services/sensitive-requests/tunnel-link-adapter.d.ts +17 -0
  1214. package/services/sensitive-requests/tunnel-link-adapter.d.ts.map +1 -0
  1215. package/services/sensitive-requests/tunnel-link-adapter.js +38 -0
  1216. package/services/steward-credentials.d.ts +1 -1
  1217. package/services/steward-credentials.d.ts.map +1 -1
  1218. package/services/steward-credentials.js +10 -6
  1219. package/services/steward-sidecar/health-check.d.ts.map +1 -1
  1220. package/services/steward-sidecar/health-check.js +4 -3
  1221. package/services/steward-sidecar/process-management.d.ts +1 -1
  1222. package/services/steward-sidecar/process-management.d.ts.map +1 -1
  1223. package/services/steward-sidecar/process-management.js +9 -3
  1224. package/services/steward-sidecar/types.d.ts +1 -1
  1225. package/services/steward-sidecar/types.d.ts.map +1 -1
  1226. package/services/steward-sidecar/wallet-setup.d.ts.map +1 -1
  1227. package/services/steward-sidecar/wallet-setup.js +8 -7
  1228. package/services/steward-sidecar.d.ts +2 -2
  1229. package/services/steward-sidecar.d.ts.map +1 -1
  1230. package/services/steward-sidecar.js +27 -19
  1231. package/services/task-host-capabilities.d.ts +60 -0
  1232. package/services/task-host-capabilities.d.ts.map +1 -0
  1233. package/services/task-host-capabilities.js +122 -0
  1234. package/services/tool-call-cache/index.d.ts +2 -2
  1235. package/services/tool-call-cache/index.d.ts.map +1 -1
  1236. package/services/tool-call-cache/index.js +1 -1
  1237. package/services/trigger-event-bridge.js +1 -1
  1238. package/services/tunnel-to-mobile/index.d.ts +2 -0
  1239. package/services/tunnel-to-mobile/index.d.ts.map +1 -0
  1240. package/services/tunnel-to-mobile/index.js +1 -0
  1241. package/services/tunnel-to-mobile/tunnel-to-mobile-client.d.ts +105 -0
  1242. package/services/tunnel-to-mobile/tunnel-to-mobile-client.d.ts.map +1 -0
  1243. package/services/tunnel-to-mobile/tunnel-to-mobile-client.js +190 -0
  1244. package/services/vault-bootstrap.d.ts.map +1 -1
  1245. package/services/vault-bootstrap.js +48 -21
  1246. package/services/vault-mirror.d.ts +1 -1
  1247. package/services/vault-mirror.d.ts.map +1 -1
  1248. package/services/vault-mirror.js +29 -6
  1249. package/services/voice-profiles/diarization-pipeline.d.ts +6 -0
  1250. package/services/voice-profiles/diarization-pipeline.d.ts.map +1 -0
  1251. package/services/voice-profiles/diarization-pipeline.js +20 -0
  1252. package/services/voice-profiles/index.d.ts +12 -0
  1253. package/services/voice-profiles/index.d.ts.map +1 -0
  1254. package/services/voice-profiles/index.js +5 -0
  1255. package/services/voice-profiles/nickname-evaluator.d.ts +14 -0
  1256. package/services/voice-profiles/nickname-evaluator.d.ts.map +1 -0
  1257. package/services/voice-profiles/nickname-evaluator.js +46 -0
  1258. package/services/voice-profiles/owner-confidence.d.ts +10 -0
  1259. package/services/voice-profiles/owner-confidence.d.ts.map +1 -0
  1260. package/services/voice-profiles/owner-confidence.js +38 -0
  1261. package/services/voice-profiles/private-challenge.d.ts +20 -0
  1262. package/services/voice-profiles/private-challenge.d.ts.map +1 -0
  1263. package/services/voice-profiles/private-challenge.js +44 -0
  1264. package/services/voice-profiles/store.d.ts +21 -0
  1265. package/services/voice-profiles/store.d.ts.map +1 -0
  1266. package/services/voice-profiles/store.js +50 -0
  1267. package/services/voice-profiles/types.d.ts +38 -0
  1268. package/services/voice-profiles/types.d.ts.map +1 -0
  1269. package/services/voice-profiles/types.js +1 -0
  1270. package/styles/electrobun-mac-window-drag.css +4 -4
  1271. package/test/helpers/__tests__/live-agent-test.smoke.test.ts +43 -70
  1272. package/test/helpers/browser-mocks.ts +2 -2
  1273. package/test/helpers/conditional-tests.ts +2 -2
  1274. package/test/helpers/i18n.ts +1 -1
  1275. package/test/helpers/live-agent-test.ts +537 -551
  1276. package/test/helpers/live-provider.test.ts +4 -4
  1277. package/test/helpers/live-provider.ts +41 -7
  1278. package/test/helpers/live-runtime-server.ts +4 -4
  1279. package/test/helpers/pglite-runtime.ts +1 -1
  1280. package/test/helpers/real-runtime.ts +54 -15
  1281. package/test/helpers/trajectory-harness.ts +11 -7
  1282. package/test/scripts/start-eliza-live.ts +9 -0
  1283. package/test/scripts/test-parallel.mjs +1 -1
  1284. package/test/scripts/test-root-unit.mjs +6 -7
  1285. package/ui-compat.d.ts +13 -2
  1286. package/ui-compat.d.ts.map +1 -1
  1287. package/ui-compat.js +19 -3
  1288. package/api/auth-pairing-compat-routes.d.ts +0 -17
  1289. package/api/auth-pairing-compat-routes.d.ts.map +0 -1
  1290. package/api/auth-pairing-compat-routes.js +0 -301
  1291. package/api/local-inference-compat-routes.d.ts +0 -16
  1292. package/api/local-inference-compat-routes.d.ts.map +0 -1
  1293. package/api/local-inference-compat-routes.js +0 -617
  1294. package/api/onboarding-compat-routes.d.ts +0 -4
  1295. package/api/onboarding-compat-routes.d.ts.map +0 -1
  1296. package/api/onboarding-compat-routes.js +0 -207
  1297. package/api/plugins-compat-routes.d.ts +0 -103
  1298. package/api/plugins-compat-routes.d.ts.map +0 -1
  1299. package/api/plugins-compat-routes.js +0 -1181
  1300. package/api/server-onboarding-compat.d.ts +0 -31
  1301. package/api/server-onboarding-compat.d.ts.map +0 -1
  1302. package/api/server-onboarding-compat.js +0 -283
  1303. package/benchmark/cua-routes.d.ts +0 -10
  1304. package/benchmark/cua-routes.d.ts.map +0 -1
  1305. package/benchmark/cua-routes.js +0 -179
  1306. package/benchmark/mock-plugin-base.d.ts +0 -9
  1307. package/benchmark/mock-plugin-base.d.ts.map +0 -1
  1308. package/benchmark/mock-plugin-base.js +0 -325
  1309. package/cli/parse-duration.d.ts +0 -5
  1310. package/cli/parse-duration.d.ts.map +0 -1
  1311. package/cli/parse-duration.js +0 -27
  1312. package/patches/llama-cpp-capacitor@0.1.5.patch +0 -2387
  1313. package/platform/agent-browser-stub.d.ts +0 -27
  1314. package/platform/agent-browser-stub.d.ts.map +0 -1
  1315. package/platform/agent-browser-stub.js +0 -16
  1316. package/platforms/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +0 -26
  1317. package/platforms/android/app/src/main/res/drawable/ic_launcher_background.xml +0 -170
  1318. package/platforms/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +0 -34
  1319. package/platforms/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +0 -18
  1320. package/platforms/electrobun/assets/appIcon.iconset/icon_512x512@2x.png +0 -0
  1321. package/platforms/electrobun/assets/appIcon.png +0 -0
  1322. package/platforms/electrobun/scripts/build-whisper-universal.sh +0 -137
  1323. package/platforms/electrobun/scripts/build-whisper.sh +0 -95
  1324. package/platforms/electrobun/src/libMacWindowEffects.dylib +0 -0
  1325. package/platforms/electrobun/src/native/whisper.ts +0 -280
  1326. package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
  1327. package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
  1328. package/platforms/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
  1329. package/registry/generate-apps.d.ts +0 -2
  1330. package/registry/generate-apps.d.ts.map +0 -1
  1331. package/registry/generate-apps.js +0 -338
  1332. package/registry/generate.d.ts +0 -2
  1333. package/registry/generate.d.ts.map +0 -1
  1334. package/registry/generate.js +0 -506
  1335. package/runtime/embedding-manager-support.d.ts +0 -77
  1336. package/runtime/embedding-manager-support.d.ts.map +0 -1
  1337. package/runtime/embedding-manager-support.js +0 -309
  1338. package/runtime/embedding-presets.d.ts +0 -5
  1339. package/runtime/embedding-presets.d.ts.map +0 -1
  1340. package/runtime/embedding-presets.js +0 -47
  1341. package/runtime/embedding-warmup-policy.d.ts +0 -13
  1342. package/runtime/embedding-warmup-policy.d.ts.map +0 -1
  1343. package/runtime/embedding-warmup-policy.js +0 -33
  1344. package/runtime/ensure-local-inference-handler.d.ts +0 -25
  1345. package/runtime/ensure-local-inference-handler.d.ts.map +0 -1
  1346. package/runtime/ensure-local-inference-handler.js +0 -389
  1347. package/runtime/mobile-local-inference-gate.d.ts +0 -21
  1348. package/runtime/mobile-local-inference-gate.d.ts.map +0 -1
  1349. package/runtime/mobile-local-inference-gate.js +0 -24
  1350. package/scripts/aosp/avd-test.mjs +0 -403
  1351. package/scripts/aosp/boot-validate.mjs +0 -536
  1352. package/scripts/aosp/build-aosp.mjs +0 -448
  1353. package/scripts/aosp/build-bootanimation.mjs +0 -178
  1354. package/scripts/aosp/capture-screens.mjs +0 -325
  1355. package/scripts/aosp/e2e-validate.mjs +0 -225
  1356. package/scripts/aosp/lint-init-rc.mjs +0 -258
  1357. package/scripts/aosp/llama-shim/eliza_llama_shim.c +0 -276
  1358. package/scripts/aosp/sim.mjs +0 -277
  1359. package/scripts/aosp/sync-to-aosp.mjs +0 -134
  1360. package/scripts/aosp/validate.mjs +0 -1273
  1361. package/scripts/build-llama-cpp-dflash.mjs +0 -1866
  1362. package/scripts/generate-onboarding-voicelines.mjs +0 -194
  1363. package/scripts/generated/static-asset-manifest.json +0 -4
  1364. package/scripts/normalize-parallax-capture.ts +0 -97
  1365. package/scripts/omnivoice-fuse/Makefile +0 -44
  1366. package/scripts/omnivoice-fuse/README.md +0 -266
  1367. package/scripts/omnivoice-fuse/cmake-graft.mjs +0 -180
  1368. package/scripts/omnivoice-fuse/ffi-stub.c +0 -222
  1369. package/scripts/omnivoice-fuse/ffi.h +0 -158
  1370. package/scripts/omnivoice-fuse/libelizainference_stub.dylib +0 -0
  1371. package/scripts/omnivoice-fuse/verify-symbols.mjs +0 -138
  1372. package/security/cloud-secret-store.d.ts +0 -34
  1373. package/security/cloud-secret-store.d.ts.map +0 -1
  1374. package/security/cloud-secret-store.js +0 -65
  1375. package/security/export-guard.d.ts +0 -34
  1376. package/security/export-guard.d.ts.map +0 -1
  1377. package/security/export-guard.js +0 -127
  1378. package/services/local-inference/__stress__/cache-stress-helpers.d.ts +0 -76
  1379. package/services/local-inference/__stress__/cache-stress-helpers.d.ts.map +0 -1
  1380. package/services/local-inference/__stress__/cache-stress-helpers.js +0 -238
  1381. package/services/local-inference/active-model.d.ts +0 -180
  1382. package/services/local-inference/active-model.d.ts.map +0 -1
  1383. package/services/local-inference/active-model.js +0 -362
  1384. package/services/local-inference/assignments.d.ts +0 -58
  1385. package/services/local-inference/assignments.d.ts.map +0 -1
  1386. package/services/local-inference/assignments.js +0 -179
  1387. package/services/local-inference/backend.d.ts +0 -200
  1388. package/services/local-inference/backend.d.ts.map +0 -1
  1389. package/services/local-inference/backend.js +0 -242
  1390. package/services/local-inference/bundled-models.d.ts +0 -34
  1391. package/services/local-inference/bundled-models.d.ts.map +0 -1
  1392. package/services/local-inference/bundled-models.js +0 -104
  1393. package/services/local-inference/cache-bridge.d.ts +0 -184
  1394. package/services/local-inference/cache-bridge.d.ts.map +0 -1
  1395. package/services/local-inference/cache-bridge.js +0 -333
  1396. package/services/local-inference/catalog.d.ts +0 -57
  1397. package/services/local-inference/catalog.d.ts.map +0 -1
  1398. package/services/local-inference/catalog.js +0 -262
  1399. package/services/local-inference/conversation-registry.d.ts +0 -122
  1400. package/services/local-inference/conversation-registry.d.ts.map +0 -1
  1401. package/services/local-inference/conversation-registry.js +0 -182
  1402. package/services/local-inference/device-bridge.d.ts +0 -139
  1403. package/services/local-inference/device-bridge.d.ts.map +0 -1
  1404. package/services/local-inference/device-bridge.js +0 -774
  1405. package/services/local-inference/dflash-doctor.d.ts +0 -27
  1406. package/services/local-inference/dflash-doctor.d.ts.map +0 -1
  1407. package/services/local-inference/dflash-doctor.js +0 -149
  1408. package/services/local-inference/dflash-server.d.ts +0 -248
  1409. package/services/local-inference/dflash-server.d.ts.map +0 -1
  1410. package/services/local-inference/dflash-server.js +0 -1076
  1411. package/services/local-inference/downloader.d.ts +0 -48
  1412. package/services/local-inference/downloader.d.ts.map +0 -1
  1413. package/services/local-inference/downloader.js +0 -688
  1414. package/services/local-inference/engine.d.ts +0 -282
  1415. package/services/local-inference/engine.d.ts.map +0 -1
  1416. package/services/local-inference/engine.js +0 -743
  1417. package/services/local-inference/external-scanner.d.ts +0 -17
  1418. package/services/local-inference/external-scanner.d.ts.map +0 -1
  1419. package/services/local-inference/external-scanner.js +0 -261
  1420. package/services/local-inference/handler-registry.d.ts +0 -72
  1421. package/services/local-inference/handler-registry.d.ts.map +0 -1
  1422. package/services/local-inference/handler-registry.js +0 -159
  1423. package/services/local-inference/hardware.d.ts +0 -26
  1424. package/services/local-inference/hardware.d.ts.map +0 -1
  1425. package/services/local-inference/hardware.js +0 -139
  1426. package/services/local-inference/hf-search.d.ts +0 -19
  1427. package/services/local-inference/hf-search.d.ts.map +0 -1
  1428. package/services/local-inference/hf-search.js +0 -169
  1429. package/services/local-inference/index.d.ts +0 -10
  1430. package/services/local-inference/index.d.ts.map +0 -1
  1431. package/services/local-inference/index.js +0 -7
  1432. package/services/local-inference/llama-server-metrics.d.ts +0 -108
  1433. package/services/local-inference/llama-server-metrics.d.ts.map +0 -1
  1434. package/services/local-inference/llama-server-metrics.js +0 -175
  1435. package/services/local-inference/manifest/index.d.ts +0 -4
  1436. package/services/local-inference/manifest/index.d.ts.map +0 -1
  1437. package/services/local-inference/manifest/index.js +0 -5
  1438. package/services/local-inference/manifest/schema.d.ts +0 -419
  1439. package/services/local-inference/manifest/schema.d.ts.map +0 -1
  1440. package/services/local-inference/manifest/schema.js +0 -227
  1441. package/services/local-inference/manifest/types.d.ts +0 -23
  1442. package/services/local-inference/manifest/types.d.ts.map +0 -1
  1443. package/services/local-inference/manifest/types.js +0 -5
  1444. package/services/local-inference/manifest/validator.d.ts +0 -43
  1445. package/services/local-inference/manifest/validator.d.ts.map +0 -1
  1446. package/services/local-inference/manifest/validator.js +0 -180
  1447. package/services/local-inference/paths.d.ts +0 -8
  1448. package/services/local-inference/paths.d.ts.map +0 -1
  1449. package/services/local-inference/paths.js +0 -7
  1450. package/services/local-inference/providers.d.ts +0 -61
  1451. package/services/local-inference/providers.d.ts.map +0 -1
  1452. package/services/local-inference/providers.js +0 -334
  1453. package/services/local-inference/ram-budget.d.ts +0 -57
  1454. package/services/local-inference/ram-budget.d.ts.map +0 -1
  1455. package/services/local-inference/ram-budget.js +0 -107
  1456. package/services/local-inference/readiness.d.ts +0 -9
  1457. package/services/local-inference/readiness.d.ts.map +0 -1
  1458. package/services/local-inference/readiness.js +0 -153
  1459. package/services/local-inference/recommendation.d.ts +0 -62
  1460. package/services/local-inference/recommendation.d.ts.map +0 -1
  1461. package/services/local-inference/recommendation.js +0 -309
  1462. package/services/local-inference/registry.d.ts +0 -35
  1463. package/services/local-inference/registry.d.ts.map +0 -1
  1464. package/services/local-inference/registry.js +0 -117
  1465. package/services/local-inference/router-handler.d.ts +0 -51
  1466. package/services/local-inference/router-handler.d.ts.map +0 -1
  1467. package/services/local-inference/router-handler.js +0 -165
  1468. package/services/local-inference/routing-policy.d.ts +0 -55
  1469. package/services/local-inference/routing-policy.d.ts.map +0 -1
  1470. package/services/local-inference/routing-policy.js +0 -195
  1471. package/services/local-inference/routing-preferences.d.ts +0 -8
  1472. package/services/local-inference/routing-preferences.d.ts.map +0 -1
  1473. package/services/local-inference/routing-preferences.js +0 -7
  1474. package/services/local-inference/service.d.ts +0 -88
  1475. package/services/local-inference/service.d.ts.map +0 -1
  1476. package/services/local-inference/service.js +0 -210
  1477. package/services/local-inference/session-pool.d.ts +0 -72
  1478. package/services/local-inference/session-pool.d.ts.map +0 -1
  1479. package/services/local-inference/session-pool.js +0 -125
  1480. package/services/local-inference/types.d.ts +0 -309
  1481. package/services/local-inference/types.d.ts.map +0 -1
  1482. package/services/local-inference/types.js +0 -23
  1483. package/services/local-inference/verify.d.ts +0 -8
  1484. package/services/local-inference/verify.d.ts.map +0 -1
  1485. package/services/local-inference/verify.js +0 -7
  1486. package/services/local-inference/voice/barge-in.d.ts +0 -15
  1487. package/services/local-inference/voice/barge-in.d.ts.map +0 -1
  1488. package/services/local-inference/voice/barge-in.js +0 -20
  1489. package/services/local-inference/voice/engine-bridge.d.ts +0 -256
  1490. package/services/local-inference/voice/engine-bridge.d.ts.map +0 -1
  1491. package/services/local-inference/voice/engine-bridge.js +0 -398
  1492. package/services/local-inference/voice/ffi-bindings.d.ts +0 -114
  1493. package/services/local-inference/voice/ffi-bindings.d.ts.map +0 -1
  1494. package/services/local-inference/voice/ffi-bindings.js +0 -281
  1495. package/services/local-inference/voice/index.d.ts +0 -51
  1496. package/services/local-inference/voice/index.d.ts.map +0 -1
  1497. package/services/local-inference/voice/index.js +0 -50
  1498. package/services/local-inference/voice/lifecycle.d.ts +0 -135
  1499. package/services/local-inference/voice/lifecycle.d.ts.map +0 -1
  1500. package/services/local-inference/voice/lifecycle.js +0 -189
  1501. package/services/local-inference/voice/phoneme-tokenizer.d.ts +0 -58
  1502. package/services/local-inference/voice/phoneme-tokenizer.d.ts.map +0 -1
  1503. package/services/local-inference/voice/phoneme-tokenizer.js +0 -53
  1504. package/services/local-inference/voice/phrase-cache.d.ts +0 -24
  1505. package/services/local-inference/voice/phrase-cache.d.ts.map +0 -1
  1506. package/services/local-inference/voice/phrase-cache.js +0 -32
  1507. package/services/local-inference/voice/phrase-chunker.d.ts +0 -20
  1508. package/services/local-inference/voice/phrase-chunker.d.ts.map +0 -1
  1509. package/services/local-inference/voice/phrase-chunker.js +0 -85
  1510. package/services/local-inference/voice/ring-buffer.d.ts +0 -40
  1511. package/services/local-inference/voice/ring-buffer.d.ts.map +0 -1
  1512. package/services/local-inference/voice/ring-buffer.js +0 -85
  1513. package/services/local-inference/voice/rollback-queue.d.ts +0 -24
  1514. package/services/local-inference/voice/rollback-queue.d.ts.map +0 -1
  1515. package/services/local-inference/voice/rollback-queue.js +0 -49
  1516. package/services/local-inference/voice/scheduler.d.ts +0 -47
  1517. package/services/local-inference/voice/scheduler.d.ts.map +0 -1
  1518. package/services/local-inference/voice/scheduler.js +0 -123
  1519. package/services/local-inference/voice/shared-resources.d.ts +0 -119
  1520. package/services/local-inference/voice/shared-resources.d.ts.map +0 -1
  1521. package/services/local-inference/voice/shared-resources.js +0 -83
  1522. package/services/local-inference/voice/speaker-preset-cache.d.ts +0 -28
  1523. package/services/local-inference/voice/speaker-preset-cache.d.ts.map +0 -1
  1524. package/services/local-inference/voice/speaker-preset-cache.js +0 -44
  1525. package/services/local-inference/voice/types.d.ts +0 -80
  1526. package/services/local-inference/voice/types.d.ts.map +0 -1
  1527. package/services/local-inference/voice/voice-preset-format.d.ts +0 -56
  1528. package/services/local-inference/voice/voice-preset-format.d.ts.map +0 -1
  1529. package/services/local-inference/voice/voice-preset-format.js +0 -184
  1530. package/services/plugin-installer.d.ts +0 -22
  1531. package/services/plugin-installer.d.ts.map +0 -1
  1532. package/services/plugin-installer.js +0 -41
  1533. package/test/scripts/task-agent-live-smoke.ts +0 -1335
  1534. /package/services/{local-inference/voice → ambient-audio}/types.js +0 -0
@@ -0,0 +1,1531 @@
1
+ /**
2
+ * Electrobun remote-plugin host runtime — manages install, start, stop, and
3
+ * lifecycle for `mode: "background"` and `mode: "window"` remote plugins, plus
4
+ * the host-side dispatcher for `bridge.requestHost(...)` host actions.
5
+ */
6
+ import * as fs from "node:fs";
7
+ import path from "node:path";
8
+ import { pathToFileURL } from "node:url";
9
+ import type {
10
+ HostActionMessage,
11
+ HostRequestMessage,
12
+ HostResponseMessage,
13
+ InstalledRemotePlugin,
14
+ InstalledRemotePluginSnapshot,
15
+ JsonValue,
16
+ RemotePluginInstallRecord,
17
+ RemotePluginListEntry,
18
+ RemotePluginPermissionGrant,
19
+ RemotePluginRuntimeContext,
20
+ RemotePluginStoreSnapshot,
21
+ RemotePluginWorkerMessage,
22
+ WorkerEventMessage,
23
+ WorkerInitMessage,
24
+ WorkerResponseMessage,
25
+ } from "@elizaos/plugin-remote-manifest";
26
+ import {
27
+ buildRemotePluginRuntimeContext,
28
+ ensureRemotePluginSourceDirectory,
29
+ hasHostPermission,
30
+ installPrebuiltRemotePlugin,
31
+ loadInstalledRemotePlugin,
32
+ loadRemotePluginListEntries,
33
+ loadRemotePluginStoreSnapshot,
34
+ toInstalledRemotePluginSnapshot,
35
+ toRemotePluginListEntry,
36
+ uninstallInstalledRemotePlugin,
37
+ } from "@elizaos/plugin-remote-manifest";
38
+ import { resolveApiToken } from "@elizaos/shared";
39
+ import { BrowserView, BrowserWindow } from "electrobun/bun";
40
+ import type { DynamicViewHost } from "../dynamic-views/host";
41
+ import { logger } from "../logger.js";
42
+ import type { TraceHost } from "../trace/trace-host-requests";
43
+ import type { SendToWebview } from "../types.js";
44
+ import type { VoiceHost } from "../voice/voice-host-requests";
45
+ import { getAgentManager, getDiagnosticLogPath } from "./agent";
46
+ import { resolveStateDir } from "./auth-bridge";
47
+
48
+ type RemotePluginWindowInstance = InstanceType<typeof BrowserWindow>;
49
+
50
+ export type RemotePluginWorkerState =
51
+ | "stopped"
52
+ | "starting"
53
+ | "running"
54
+ | "error";
55
+
56
+ export interface RemotePluginWorkerStatus {
57
+ id: string;
58
+ state: RemotePluginWorkerState;
59
+ startedAt: number | null;
60
+ stoppedAt: number | null;
61
+ error: string | null;
62
+ }
63
+
64
+ export interface RemotePluginInstallFromDirectoryOptions {
65
+ sourceDir: string;
66
+ devMode?: boolean;
67
+ permissionsGranted?: RemotePluginPermissionGrant;
68
+ currentHash?: string | null;
69
+ }
70
+
71
+ export interface RemotePluginUninstallResult {
72
+ removed: boolean;
73
+ remotePlugin: RemotePluginListEntry | null;
74
+ }
75
+
76
+ export interface RemotePluginLogsSnapshot {
77
+ id: string;
78
+ path: string;
79
+ text: string;
80
+ truncated: boolean;
81
+ }
82
+
83
+ export interface RemotePluginWorkerEventRecord {
84
+ remotePluginId: string;
85
+ sequence: number;
86
+ name: string;
87
+ payload: JsonValue | null;
88
+ timestamp: string;
89
+ }
90
+
91
+ export interface RemotePluginWorkerEventsTailSnapshot {
92
+ id: string;
93
+ events: RemotePluginWorkerEventRecord[];
94
+ nextSequence: number;
95
+ minimumSequence: number | null;
96
+ gapBeforeSequence: number | null;
97
+ }
98
+
99
+ export interface RemotePluginWorkerHandle {
100
+ postMessage(message: RemotePluginWorkerMessage): void;
101
+ terminate(): void;
102
+ onMessage(listener: (message: RemotePluginWorkerMessage) => void): void;
103
+ onError(listener: (error: Error) => void): void;
104
+ }
105
+
106
+ export interface RemotePluginWorkerRunner {
107
+ start(remotePlugin: InstalledRemotePlugin): RemotePluginWorkerHandle;
108
+ }
109
+
110
+ interface RemotePluginWorkerRecord {
111
+ status: RemotePluginWorkerStatus;
112
+ handle: RemotePluginWorkerHandle | null;
113
+ context: RemotePluginRuntimeContext | null;
114
+ window: RemotePluginWindowInstance | null;
115
+ }
116
+
117
+ interface RemotePluginHostEvents {
118
+ storeChanged?: (snapshot: RemotePluginStoreSnapshot) => void;
119
+ workerChanged?: (status: RemotePluginWorkerStatus) => void;
120
+ }
121
+
122
+ export interface RemotePluginHostOptions {
123
+ storeRoot?: string;
124
+ workerRunner?: RemotePluginWorkerRunner;
125
+ now?: () => number;
126
+ maxWorkerEvents?: number;
127
+ events?: RemotePluginHostEvents;
128
+ dynamicViewHost?: DynamicViewHost;
129
+ traceHost?: TraceHost;
130
+ voiceHost?: VoiceHost;
131
+ }
132
+
133
+ const REMOTE_PLUGIN_STORE_ENV_KEYS = [
134
+ "ELIZA_REMOTE_PLUGIN_STORE_DIR",
135
+ // Deprecated: kept for backward compatibility with operators using the
136
+ // old "carrot" vocabulary; remove after one release cycle.
137
+ "ELIZA_CARROT_STORE_DIR",
138
+ ] as const;
139
+
140
+ function isRecord(value: unknown): value is Record<string, unknown> {
141
+ return typeof value === "object" && value !== null && !Array.isArray(value);
142
+ }
143
+
144
+ function formatRemotePluginError(value: unknown, fallback: string): string {
145
+ if (value instanceof Error) return value.message || value.name;
146
+ if (typeof value === "string" && value.trim()) return value;
147
+ if (isRecord(value)) {
148
+ const message = value.message;
149
+ const code = value.code;
150
+ if (typeof message === "string" && message.trim()) {
151
+ return typeof code === "string" && code.trim()
152
+ ? `${code}: ${message}`
153
+ : message;
154
+ }
155
+ try {
156
+ return JSON.stringify(value);
157
+ } catch {
158
+ return fallback;
159
+ }
160
+ }
161
+ return fallback;
162
+ }
163
+
164
+ export function resolveRemotePluginStoreRoot(
165
+ env: NodeJS.ProcessEnv = process.env,
166
+ ): string {
167
+ for (const key of REMOTE_PLUGIN_STORE_ENV_KEYS) {
168
+ const value = env[key]?.trim();
169
+ if (value) return path.resolve(value);
170
+ }
171
+ return path.join(resolveStateDir(env), "remote-plugins");
172
+ }
173
+
174
+ class BrowserWorkerHandle implements RemotePluginWorkerHandle {
175
+ constructor(private readonly worker: Worker) {}
176
+
177
+ postMessage(message: RemotePluginWorkerMessage): void {
178
+ this.worker.postMessage(message);
179
+ }
180
+
181
+ terminate(): void {
182
+ this.worker.terminate();
183
+ }
184
+
185
+ onMessage(listener: (message: RemotePluginWorkerMessage) => void): void {
186
+ this.worker.addEventListener("message", (event) => {
187
+ listener(event.data as RemotePluginWorkerMessage);
188
+ });
189
+ }
190
+
191
+ onError(listener: (error: Error) => void): void {
192
+ this.worker.addEventListener("error", (event) => {
193
+ listener(
194
+ new Error(
195
+ typeof event.message === "string"
196
+ ? event.message
197
+ : "Remote plugin worker failed.",
198
+ ),
199
+ );
200
+ });
201
+ }
202
+ }
203
+
204
+ class BrowserRemotePluginWorkerRunner implements RemotePluginWorkerRunner {
205
+ start(remotePlugin: InstalledRemotePlugin): RemotePluginWorkerHandle {
206
+ return new BrowserWorkerHandle(
207
+ new Worker(pathToFileURL(remotePlugin.workerPath).href, {
208
+ type: "module",
209
+ }),
210
+ );
211
+ }
212
+ }
213
+
214
+ /**
215
+ * Subprocess worker handle for `isolation: "isolated-process"`. Spawns
216
+ * the worker entry as a fresh Bun subprocess with newline-delimited
217
+ * JSON over stdio for the wire envelope and inherits stderr to the host
218
+ * log. A panic in the worker only crashes itself; the host process is
219
+ * unaffected.
220
+ *
221
+ * Termination policy: `terminate()` sends SIGTERM, schedules SIGKILL
222
+ * after a 2-second grace window. The grace window gives the worker time
223
+ * to flush any in-flight `worker-rpc-result` replies before being torn
224
+ * down.
225
+ */
226
+ class SubprocessWorkerHandle implements RemotePluginWorkerHandle {
227
+ private readonly proc: ReturnType<typeof Bun.spawn>;
228
+ private readonly listeners = new Set<
229
+ (message: RemotePluginWorkerMessage) => void
230
+ >();
231
+ private readonly errorListeners = new Set<(error: Error) => void>();
232
+ private readonly decoder = new TextDecoder();
233
+ private pendingLineBuffer = "";
234
+ private killTimer: ReturnType<typeof setTimeout> | undefined;
235
+
236
+ constructor(
237
+ workerEntry: string,
238
+ runtimeContext: { cwd: string; env: Record<string, string> },
239
+ ) {
240
+ this.proc = Bun.spawn({
241
+ cmd: [process.execPath, workerEntry],
242
+ stdin: "pipe",
243
+ stdout: "pipe",
244
+ stderr: "inherit",
245
+ cwd: runtimeContext.cwd,
246
+ env: runtimeContext.env,
247
+ });
248
+ void this.readStdout();
249
+ void this.proc.exited.then((code) => {
250
+ for (const listener of this.errorListeners) {
251
+ listener(
252
+ new Error(
253
+ code === 0
254
+ ? "Remote plugin worker exited."
255
+ : `Remote plugin worker exited with code ${code}.`,
256
+ ),
257
+ );
258
+ }
259
+ });
260
+ }
261
+
262
+ postMessage(message: RemotePluginWorkerMessage): void {
263
+ if (!this.proc.stdin) return;
264
+ const writer = this.proc.stdin as unknown as { write(data: string): void };
265
+ writer.write(`${JSON.stringify(message)}\n`);
266
+ }
267
+
268
+ terminate(): void {
269
+ if (this.killTimer) return;
270
+ try {
271
+ this.proc.kill("SIGTERM");
272
+ } catch {
273
+ // already dead
274
+ }
275
+ this.killTimer = setTimeout(() => {
276
+ try {
277
+ this.proc.kill("SIGKILL");
278
+ } catch {
279
+ // already dead
280
+ }
281
+ }, 2_000);
282
+ }
283
+
284
+ onMessage(listener: (message: RemotePluginWorkerMessage) => void): void {
285
+ this.listeners.add(listener);
286
+ }
287
+
288
+ onError(listener: (error: Error) => void): void {
289
+ this.errorListeners.add(listener);
290
+ }
291
+
292
+ private async readStdout(): Promise<void> {
293
+ if (!this.proc.stdout) return;
294
+ const reader = (
295
+ this.proc.stdout as unknown as ReadableStream<Uint8Array>
296
+ ).getReader();
297
+ try {
298
+ // eslint-disable-next-line no-constant-condition
299
+ while (true) {
300
+ const { value, done } = await reader.read();
301
+ if (done) break;
302
+ if (!value) continue;
303
+ this.pendingLineBuffer += this.decoder.decode(value, { stream: true });
304
+ let newlineIndex = this.pendingLineBuffer.indexOf("\n");
305
+ while (newlineIndex !== -1) {
306
+ const line = this.pendingLineBuffer.slice(0, newlineIndex);
307
+ this.pendingLineBuffer = this.pendingLineBuffer.slice(
308
+ newlineIndex + 1,
309
+ );
310
+ if (line.trim()) {
311
+ try {
312
+ const message = JSON.parse(line) as RemotePluginWorkerMessage;
313
+ for (const listener of this.listeners) listener(message);
314
+ } catch (parseError) {
315
+ for (const listener of this.errorListeners) {
316
+ listener(
317
+ new Error(
318
+ `Remote plugin worker emitted malformed JSON: ${(parseError as Error).message}`,
319
+ ),
320
+ );
321
+ }
322
+ }
323
+ }
324
+ newlineIndex = this.pendingLineBuffer.indexOf("\n");
325
+ }
326
+ }
327
+ } finally {
328
+ reader.releaseLock?.();
329
+ }
330
+ }
331
+ }
332
+
333
+ /**
334
+ * Worker runner that uses Bun.spawn for the `isolated-process`
335
+ * isolation tier. Today's bootstrapped {@link RemotePluginHost} can opt
336
+ * into this by constructing with `{ workerRunner: new IsolatedProcessWorkerRunner() }`
337
+ * (and shipping a subprocess-aware
338
+ * `@elizaos/plugin-worker-runtime/bootstrap` build for the worker side).
339
+ */
340
+ export class IsolatedProcessWorkerRunner implements RemotePluginWorkerRunner {
341
+ start(remotePlugin: InstalledRemotePlugin): RemotePluginWorkerHandle {
342
+ return new SubprocessWorkerHandle(remotePlugin.workerPath, {
343
+ cwd: remotePlugin.currentDir,
344
+ env: {
345
+ ...process.env,
346
+ ELIZA_REMOTE_PLUGIN_ID: remotePlugin.manifest.id,
347
+ ELIZA_REMOTE_PLUGIN_STATE_DIR: remotePlugin.stateDir,
348
+ ELIZA_REMOTE_PLUGIN_CHANNEL: "stdio",
349
+ } as Record<string, string>,
350
+ });
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Runner that picks shared-worker vs isolated-process per remote-plugin
356
+ * manifest. Used as the default by {@link RemotePluginHost} so plugins
357
+ * that declare `isolation: "isolated-process"` actually get a separate
358
+ * process.
359
+ */
360
+ export class AdaptiveWorkerRunner implements RemotePluginWorkerRunner {
361
+ private readonly browser = new BrowserRemotePluginWorkerRunner();
362
+ private readonly subprocess = new IsolatedProcessWorkerRunner();
363
+
364
+ start(remotePlugin: InstalledRemotePlugin): RemotePluginWorkerHandle {
365
+ return remotePlugin.install.permissionsGranted.isolation ===
366
+ "isolated-process"
367
+ ? this.subprocess.start(remotePlugin)
368
+ : this.browser.start(remotePlugin);
369
+ }
370
+ }
371
+
372
+ function stoppedStatus(id: string): RemotePluginWorkerStatus {
373
+ return {
374
+ id,
375
+ state: "stopped",
376
+ startedAt: null,
377
+ stoppedAt: null,
378
+ error: null,
379
+ };
380
+ }
381
+
382
+ function buildWorkerInitMessage(
383
+ remotePlugin: InstalledRemotePlugin,
384
+ context: RemotePluginRuntimeContext,
385
+ ): WorkerInitMessage {
386
+ return {
387
+ type: "init",
388
+ manifest: remotePlugin.manifest,
389
+ context: {
390
+ statePath: context.statePath,
391
+ logsPath: context.logsPath,
392
+ permissions: context.permissions,
393
+ grantedPermissions: context.grantedPermissions,
394
+ },
395
+ };
396
+ }
397
+
398
+ function hostRequestStringField(
399
+ params: JsonValue | undefined,
400
+ key: string,
401
+ ): string {
402
+ if (!isRecord(params)) {
403
+ throw new Error(`Host request missing params object (expected ${key})`);
404
+ }
405
+ const value = params[key];
406
+ if (typeof value !== "string" || value.length === 0) {
407
+ throw new Error(`Host request missing or invalid ${key}`);
408
+ }
409
+ return value;
410
+ }
411
+
412
+ function actionLogPayload(message: HostActionMessage): string | null {
413
+ if (message.action !== "log" || !isRecord(message.payload)) return null;
414
+ const level = message.payload.level;
415
+ const text = message.payload.message;
416
+ if (typeof text !== "string" || text.length === 0) return null;
417
+ return typeof level === "string" && level.length > 0
418
+ ? `[${level}] ${text}`
419
+ : text;
420
+ }
421
+
422
+ interface PendingInvoke {
423
+ callerId: string;
424
+ callerHandle: RemotePluginWorkerHandle;
425
+ targetId: string;
426
+ originalRequestId: number;
427
+ timeout: ReturnType<typeof setTimeout>;
428
+ }
429
+
430
+ interface PendingDirectInvoke {
431
+ targetId: string;
432
+ resolve: (payload: JsonValue | null) => void;
433
+ reject: (error: Error) => void;
434
+ timeout: ReturnType<typeof setTimeout>;
435
+ }
436
+
437
+ const INVOKE_TIMEOUT_MS = 30_000;
438
+ const DEFAULT_WORKER_EVENT_BUFFER_LIMIT = 1_000;
439
+ const DEFAULT_WORKER_EVENT_TAIL_LIMIT = 100;
440
+ const MAX_WORKER_EVENT_TAIL_LIMIT = 500;
441
+
442
+ function resolveInvokeTimeoutMs(value: number | undefined): number {
443
+ return typeof value === "number" && Number.isFinite(value) && value > 0
444
+ ? value
445
+ : INVOKE_TIMEOUT_MS;
446
+ }
447
+
448
+ function resolveWorkerEventBufferLimit(
449
+ env: NodeJS.ProcessEnv = process.env,
450
+ ): number {
451
+ const raw =
452
+ env.ELIZA_REMOTE_PLUGIN_MAX_WORKER_EVENTS ??
453
+ env.ELIZA_CARROT_MAX_WORKER_EVENTS;
454
+ if (raw === undefined || raw.trim().length === 0) {
455
+ return DEFAULT_WORKER_EVENT_BUFFER_LIMIT;
456
+ }
457
+ const value = Number(raw);
458
+ if (!Number.isFinite(value) || value < 1) {
459
+ throw new Error("ELIZA_REMOTE_PLUGIN_MAX_WORKER_EVENTS must be positive.");
460
+ }
461
+ return Math.floor(value);
462
+ }
463
+
464
+ function cloneEventPayload(payload: JsonValue | undefined): JsonValue | null {
465
+ if (payload === undefined) return null;
466
+ try {
467
+ return JSON.parse(JSON.stringify(payload)) as JsonValue;
468
+ } catch (error) {
469
+ return {
470
+ error: "EVENT_PAYLOAD_UNSERIALIZABLE",
471
+ message: error instanceof Error ? error.message : String(error),
472
+ };
473
+ }
474
+ }
475
+
476
+ export class RemotePluginHost {
477
+ private readonly storeRoot: string;
478
+ private readonly workerRunner: RemotePluginWorkerRunner;
479
+ private readonly now: () => number;
480
+ private readonly maxWorkerEvents: number;
481
+ private events: RemotePluginHostEvents;
482
+ private readonly workers = new Map<string, RemotePluginWorkerRecord>();
483
+ private readonly workerEvents = new Map<
484
+ string,
485
+ RemotePluginWorkerEventRecord[]
486
+ >();
487
+ private readonly workerEventSequences = new Map<string, number>();
488
+ private readonly pendingInvokes = new Map<number, PendingInvoke>();
489
+ private readonly pendingDirectInvokes = new Map<
490
+ number,
491
+ PendingDirectInvoke
492
+ >();
493
+ private dynamicViewHost: DynamicViewHost | null;
494
+ private traceHost: TraceHost | null;
495
+ private voiceHost: VoiceHost | null;
496
+ private nextInvokeId = 1;
497
+
498
+ constructor(options: RemotePluginHostOptions = {}) {
499
+ this.storeRoot = options.storeRoot ?? resolveRemotePluginStoreRoot();
500
+ this.workerRunner = options.workerRunner ?? new AdaptiveWorkerRunner();
501
+ this.now = options.now ?? Date.now;
502
+ this.maxWorkerEvents =
503
+ options.maxWorkerEvents ?? resolveWorkerEventBufferLimit();
504
+ this.events = options.events ?? {};
505
+ this.dynamicViewHost = options.dynamicViewHost ?? null;
506
+ this.traceHost = options.traceHost ?? null;
507
+ this.voiceHost = options.voiceHost ?? null;
508
+ }
509
+
510
+ setEvents(events: RemotePluginHostEvents): void {
511
+ this.events = events;
512
+ }
513
+
514
+ setDynamicViewHost(host: DynamicViewHost | null): void {
515
+ this.dynamicViewHost = host;
516
+ }
517
+
518
+ setTraceHost(host: TraceHost | null): void {
519
+ this.traceHost = host;
520
+ }
521
+
522
+ setVoiceHost(host: VoiceHost | null): void {
523
+ this.voiceHost = host;
524
+ }
525
+
526
+ getStoreRoot(): string {
527
+ return this.storeRoot;
528
+ }
529
+
530
+ listRemotePlugins(): RemotePluginListEntry[] {
531
+ return loadRemotePluginListEntries(this.storeRoot);
532
+ }
533
+
534
+ getStoreSnapshot(): RemotePluginStoreSnapshot {
535
+ return loadRemotePluginStoreSnapshot(this.storeRoot);
536
+ }
537
+
538
+ getRemotePlugin(id: string): InstalledRemotePluginSnapshot | null {
539
+ const remotePlugin = loadInstalledRemotePlugin(this.storeRoot, id);
540
+ return remotePlugin ? toInstalledRemotePluginSnapshot(remotePlugin) : null;
541
+ }
542
+
543
+ installFromDirectory(
544
+ options: RemotePluginInstallFromDirectoryOptions,
545
+ ): InstalledRemotePluginSnapshot {
546
+ const sourceDir = ensureRemotePluginSourceDirectory(options.sourceDir);
547
+ const remotePlugin = installPrebuiltRemotePlugin(
548
+ this.storeRoot,
549
+ sourceDir,
550
+ {
551
+ devMode: options.devMode === true,
552
+ permissionsGranted: options.permissionsGranted,
553
+ currentHash: options.currentHash,
554
+ source: { kind: "local", path: sourceDir },
555
+ now: this.now,
556
+ },
557
+ );
558
+ this.emitStoreChanged();
559
+ return toInstalledRemotePluginSnapshot(remotePlugin);
560
+ }
561
+
562
+ uninstall(id: string): RemotePluginUninstallResult {
563
+ const remotePlugin = loadInstalledRemotePlugin(this.storeRoot, id);
564
+ const entry = remotePlugin ? toRemotePluginListEntry(remotePlugin) : null;
565
+ if (remotePlugin) {
566
+ this.stopWorker(id);
567
+ }
568
+ const record = uninstallInstalledRemotePlugin(this.storeRoot, id);
569
+ if (record) {
570
+ this.workers.delete(id);
571
+ this.workerEvents.delete(id);
572
+ this.workerEventSequences.delete(id);
573
+ this.emitStoreChanged();
574
+ }
575
+ return { removed: record !== null, remotePlugin: entry };
576
+ }
577
+
578
+ startWorker(id: string): RemotePluginWorkerStatus {
579
+ const existing = this.workers.get(id);
580
+ if (existing?.status.state === "running") return existing.status;
581
+ if (existing?.status.state === "starting") return existing.status;
582
+
583
+ const remotePlugin = loadInstalledRemotePlugin(this.storeRoot, id);
584
+ if (!remotePlugin) {
585
+ throw new Error(`Remote plugin is not installed: ${id}`);
586
+ }
587
+
588
+ fs.mkdirSync(remotePlugin.stateDir, { recursive: true });
589
+ // Isolation is honored by the AdaptiveWorkerRunner (default):
590
+ // - "shared-worker" → BrowserRemotePluginWorkerRunner (Bun Worker)
591
+ // - "isolated-process" → IsolatedProcessWorkerRunner (Bun.spawn)
592
+ // Both speak the same wire envelope; the worker bootstrap detects
593
+ // ELIZA_REMOTE_PLUGIN_CHANNEL=stdio to choose the subprocess channel.
594
+ const context = buildRemotePluginRuntimeContext(
595
+ remotePlugin.currentDir,
596
+ remotePlugin.stateDir,
597
+ remotePlugin.manifest.id,
598
+ remotePlugin.install.permissionsGranted,
599
+ );
600
+ const status: RemotePluginWorkerStatus = {
601
+ id,
602
+ state: "starting",
603
+ startedAt: this.now(),
604
+ stoppedAt: null,
605
+ error: null,
606
+ };
607
+ const record: RemotePluginWorkerRecord = {
608
+ status,
609
+ handle: null,
610
+ context,
611
+ window: null,
612
+ };
613
+ this.workers.set(id, record);
614
+ this.workerEvents.set(id, []);
615
+ this.workerEventSequences.set(id, 0);
616
+ this.emitWorkerChanged(status);
617
+
618
+ try {
619
+ const handle = this.workerRunner.start(remotePlugin);
620
+ record.handle = handle;
621
+ handle.onMessage((message) =>
622
+ this.handleWorkerMessage(id, handle, message),
623
+ );
624
+ handle.onError((error) => this.markWorkerError(id, handle, error));
625
+ handle.postMessage(buildWorkerInitMessage(remotePlugin, context));
626
+ if (remotePlugin.manifest.mode === "window") {
627
+ record.window = this.openRemotePluginWindow(remotePlugin);
628
+ }
629
+ status.state = "running";
630
+ this.emitWorkerChanged(status);
631
+ return status;
632
+ } catch (error) {
633
+ status.state = "error";
634
+ status.error = error instanceof Error ? error.message : String(error);
635
+ status.stoppedAt = this.now();
636
+ this.emitWorkerChanged(status);
637
+ return status;
638
+ }
639
+ }
640
+
641
+ /**
642
+ * Open the remote plugin's view window. Used for `mode: "window"` remote plugins; the
643
+ * remote-plugin's `view/index.html` (and friends) is served via Electrobun's
644
+ * `views://` scheme rooted at `remotePlugin.currentDir`. Background remote plugins
645
+ * never call this.
646
+ *
647
+ * Guarded against test stubs: vitest replaces `electrobun/bun` with a
648
+ * non-constructor stub, so `BrowserWindow` won't be callable in the
649
+ * test environment. We typeof-check before constructing and log a
650
+ * warning if the runtime can't open windows (which is harmless in
651
+ * tests and informative in dev where the host hasn't initialized FFI).
652
+ */
653
+ private openRemotePluginWindow(
654
+ remotePlugin: InstalledRemotePlugin,
655
+ ): RemotePluginWindowInstance | null {
656
+ if (
657
+ typeof BrowserWindow !== "function" ||
658
+ typeof BrowserView !== "function"
659
+ ) {
660
+ logger.warn(
661
+ `[remote-plugin] ${remotePlugin.manifest.id}: skipping window-mode open — Electrobun BrowserWindow not available in this runtime (typeof=${typeof BrowserWindow}).`,
662
+ );
663
+ return null;
664
+ }
665
+
666
+ const { width, height, title, titleBarStyle, transparent } =
667
+ remotePlugin.manifest.view;
668
+ try {
669
+ const win = new BrowserWindow({
670
+ title,
671
+ url: null,
672
+ preload: null,
673
+ frame: { x: 120, y: 120, width, height },
674
+ ...(titleBarStyle === undefined ? {} : { titleBarStyle }),
675
+ ...(transparent === undefined ? {} : { transparent }),
676
+ });
677
+ try {
678
+ win.webview.remove();
679
+ } catch {
680
+ // Some Electrobun builds expose webview lazily; safe to ignore.
681
+ }
682
+ new BrowserView({
683
+ url: remotePlugin.viewUrl,
684
+ viewsRoot: remotePlugin.currentDir,
685
+ renderer: "cef",
686
+ frame: { x: 0, y: 0, width, height },
687
+ windowId: win.id,
688
+ });
689
+ win.on("close", () => {
690
+ this.handleRemotePluginWindowClosed(remotePlugin.manifest.id);
691
+ });
692
+ return win;
693
+ } catch (error) {
694
+ logger.warn(
695
+ `[remote-plugin] ${remotePlugin.manifest.id}: failed to open window — ${
696
+ error instanceof Error ? error.message : String(error)
697
+ }`,
698
+ );
699
+ return null;
700
+ }
701
+ }
702
+
703
+ private handleRemotePluginWindowClosed(id: string): void {
704
+ const record = this.workers.get(id);
705
+ if (!record) return;
706
+ record.window = null;
707
+ // Closing the window stops the underlying worker — `mode: "window"`
708
+ // remote plugins have no UI-less lifetime.
709
+ if (
710
+ record.status.state === "running" ||
711
+ record.status.state === "starting"
712
+ ) {
713
+ this.stopWorker(id);
714
+ }
715
+ }
716
+
717
+ stopWorker(id: string): RemotePluginWorkerStatus {
718
+ const record = this.workers.get(id);
719
+ if (!record) {
720
+ const status = stoppedStatus(id);
721
+ this.emitWorkerChanged(status);
722
+ return status;
723
+ }
724
+ this.rejectPendingInvokesForWorker(id);
725
+ record.handle?.terminate();
726
+ if (record.window) {
727
+ try {
728
+ record.window.close();
729
+ } catch {
730
+ // BrowserWindow.close() may throw if already destroyed.
731
+ }
732
+ }
733
+ const status: RemotePluginWorkerStatus = {
734
+ id,
735
+ state: "stopped",
736
+ startedAt: record.status.startedAt,
737
+ stoppedAt: this.now(),
738
+ error: null,
739
+ };
740
+ this.workers.set(id, {
741
+ status,
742
+ handle: null,
743
+ context: record.context,
744
+ window: null,
745
+ });
746
+ this.workerEvents.delete(id);
747
+ this.workerEventSequences.delete(id);
748
+ this.emitWorkerChanged(status);
749
+ return status;
750
+ }
751
+
752
+ getWorkerStatus(id: string): RemotePluginWorkerStatus | null {
753
+ const record = this.workers.get(id);
754
+ if (record) return record.status;
755
+ return loadInstalledRemotePlugin(this.storeRoot, id)
756
+ ? stoppedStatus(id)
757
+ : null;
758
+ }
759
+
760
+ listWorkerStatuses(): RemotePluginWorkerStatus[] {
761
+ const statuses = new Map<string, RemotePluginWorkerStatus>();
762
+ for (const remotePlugin of this.listRemotePlugins()) {
763
+ statuses.set(remotePlugin.id, stoppedStatus(remotePlugin.id));
764
+ }
765
+ for (const [id, record] of this.workers) {
766
+ statuses.set(id, record.status);
767
+ }
768
+ return Array.from(statuses.values()).sort((left, right) =>
769
+ left.id.localeCompare(right.id),
770
+ );
771
+ }
772
+
773
+ getLogs(id: string, maxBytes = 64 * 1024): RemotePluginLogsSnapshot {
774
+ const remotePlugin = loadInstalledRemotePlugin(this.storeRoot, id);
775
+ if (!remotePlugin) {
776
+ throw new Error(`Remote plugin is not installed: ${id}`);
777
+ }
778
+ const context = buildRemotePluginRuntimeContext(
779
+ remotePlugin.currentDir,
780
+ remotePlugin.stateDir,
781
+ remotePlugin.manifest.id,
782
+ remotePlugin.install.permissionsGranted,
783
+ );
784
+ if (!fs.existsSync(context.logsPath)) {
785
+ return {
786
+ id,
787
+ path: context.logsPath,
788
+ text: "",
789
+ truncated: false,
790
+ };
791
+ }
792
+ const stat = fs.statSync(context.logsPath);
793
+ const size = Math.max(0, stat.size);
794
+ const limit = Math.max(1, maxBytes);
795
+ const start = Math.max(0, size - limit);
796
+ const length = size - start;
797
+ const buffer = Buffer.alloc(length);
798
+ const fd = fs.openSync(context.logsPath, "r");
799
+ try {
800
+ fs.readSync(fd, buffer, 0, length, start);
801
+ } finally {
802
+ fs.closeSync(fd);
803
+ }
804
+ return {
805
+ id,
806
+ path: context.logsPath,
807
+ text: buffer.toString("utf8"),
808
+ truncated: start > 0,
809
+ };
810
+ }
811
+
812
+ invokeWorker(options: {
813
+ id: string;
814
+ method: string;
815
+ params?: JsonValue;
816
+ windowId?: string;
817
+ timeoutMs?: number;
818
+ }): Promise<JsonValue | null> {
819
+ if (options.id.length === 0) {
820
+ throw new Error("remote-plugin invoke: invalid id.");
821
+ }
822
+ if (options.method.length === 0) {
823
+ throw new Error("remote-plugin invoke: invalid method.");
824
+ }
825
+ const target = this.workers.get(options.id);
826
+ if (!target?.handle || target.status.state !== "running") {
827
+ throw new Error(
828
+ `remote-plugin invoke: target ${options.id} is not running.`,
829
+ );
830
+ }
831
+ const requestId = ++this.nextInvokeId;
832
+ const timeoutMs = resolveInvokeTimeoutMs(options.timeoutMs);
833
+ const timeout = setTimeout(() => {
834
+ const pending = this.pendingDirectInvokes.get(requestId);
835
+ if (!pending) return;
836
+ this.pendingDirectInvokes.delete(requestId);
837
+ pending.reject(
838
+ new Error(
839
+ `remote-plugin invoke: target ${options.id} did not respond within ${timeoutMs}ms`,
840
+ ),
841
+ );
842
+ }, timeoutMs);
843
+
844
+ const promise = new Promise<JsonValue | null>((resolve, reject) => {
845
+ this.pendingDirectInvokes.set(requestId, {
846
+ targetId: options.id,
847
+ resolve,
848
+ reject,
849
+ timeout,
850
+ });
851
+ });
852
+ target.handle.postMessage({
853
+ type: "request",
854
+ requestId,
855
+ method: options.method,
856
+ ...(options.params === undefined ? {} : { params: options.params }),
857
+ ...(typeof options.windowId === "string"
858
+ ? { windowId: options.windowId }
859
+ : {}),
860
+ });
861
+ return promise;
862
+ }
863
+
864
+ tailWorkerEvents(options: {
865
+ id: string;
866
+ afterSequence?: number;
867
+ limit?: number;
868
+ }): RemotePluginWorkerEventsTailSnapshot {
869
+ const record = this.workers.get(options.id);
870
+ if (!record?.handle || record.status.state !== "running") {
871
+ throw new Error(
872
+ `remote-plugin events: target ${options.id} is not running.`,
873
+ );
874
+ }
875
+ const limit = this.normalizeEventTailLimit(options.limit);
876
+ const events = this.workerEvents.get(options.id) ?? [];
877
+ const afterSequence = options.afterSequence;
878
+ const filtered =
879
+ typeof afterSequence === "number"
880
+ ? events.filter((event) => event.sequence > afterSequence)
881
+ : events.slice(-limit);
882
+ const selected = filtered.slice(0, limit);
883
+ const currentSequence = this.workerEventSequences.get(options.id) ?? 0;
884
+ const minimumSequence = events[0]?.sequence ?? null;
885
+ const gapBeforeSequence =
886
+ typeof afterSequence === "number" &&
887
+ minimumSequence !== null &&
888
+ afterSequence < minimumSequence - 1
889
+ ? minimumSequence
890
+ : null;
891
+ return {
892
+ id: options.id,
893
+ events: selected,
894
+ nextSequence:
895
+ selected.length > 0
896
+ ? selected[selected.length - 1].sequence
897
+ : (afterSequence ?? currentSequence),
898
+ minimumSequence,
899
+ gapBeforeSequence,
900
+ };
901
+ }
902
+
903
+ dispose(): void {
904
+ for (const id of this.workers.keys()) {
905
+ this.stopWorker(id);
906
+ }
907
+ this.events = {};
908
+ }
909
+
910
+ private handleWorkerMessage(
911
+ id: string,
912
+ handle: RemotePluginWorkerHandle,
913
+ message: RemotePluginWorkerMessage,
914
+ ): void {
915
+ const record = this.workers.get(id);
916
+ if (record?.handle !== handle) return;
917
+
918
+ if (message.type === "ready") {
919
+ record.status.state = "running";
920
+ record.status.error = null;
921
+ this.emitWorkerChanged(record.status);
922
+ return;
923
+ }
924
+
925
+ if (message.type === "host-request") {
926
+ this.handleHostRequest(id, handle, message);
927
+ return;
928
+ }
929
+
930
+ if (message.type === "response") {
931
+ this.handleWorkerResponse(id, handle, message);
932
+ return;
933
+ }
934
+
935
+ if (message.type === "event") {
936
+ this.recordWorkerEvent(id, message);
937
+ return;
938
+ }
939
+
940
+ if (message.type !== "action") return;
941
+ if (!record.context) return;
942
+
943
+ const logLine = actionLogPayload(message);
944
+ if (logLine) {
945
+ fs.mkdirSync(path.dirname(record.context.logsPath), { recursive: true });
946
+ fs.appendFileSync(record.context.logsPath, `${logLine}\n`, "utf8");
947
+ return;
948
+ }
949
+
950
+ if (message.action === "stop-remote-plugin") {
951
+ this.stopWorker(id);
952
+ return;
953
+ }
954
+
955
+ if (message.action === "emit-remote-plugin-event") {
956
+ this.dispatchEmitRemotePluginEvent(id, message.payload);
957
+ }
958
+ }
959
+
960
+ private dispatchEmitRemotePluginEvent(
961
+ callerId: string,
962
+ payload: JsonValue | undefined,
963
+ ): void {
964
+ if (!isRecord(payload)) return;
965
+ const targetId = payload.remotePluginId;
966
+ const name = payload.name;
967
+ if (typeof targetId !== "string" || typeof name !== "string") return;
968
+ const target = this.workers.get(targetId);
969
+ if (!target?.handle || target.status.state !== "running") {
970
+ logger.warn(
971
+ `[remote-plugin] ${callerId} → emit-remote-plugin-event dropped: target ${targetId} is not running.`,
972
+ );
973
+ return;
974
+ }
975
+ target.handle.postMessage({
976
+ type: "event",
977
+ name,
978
+ ...(payload.payload === undefined ? {} : { payload: payload.payload }),
979
+ });
980
+ }
981
+
982
+ private recordWorkerEvent(id: string, message: WorkerEventMessage): void {
983
+ const sequence = (this.workerEventSequences.get(id) ?? 0) + 1;
984
+ this.workerEventSequences.set(id, sequence);
985
+ const event: RemotePluginWorkerEventRecord = {
986
+ remotePluginId: id,
987
+ sequence,
988
+ name: message.name,
989
+ payload: cloneEventPayload(message.payload),
990
+ timestamp: new Date(this.now()).toISOString(),
991
+ };
992
+ const events = this.workerEvents.get(id) ?? [];
993
+ events.push(event);
994
+ if (events.length > this.maxWorkerEvents) {
995
+ events.splice(0, events.length - this.maxWorkerEvents);
996
+ }
997
+ this.workerEvents.set(id, events);
998
+ }
999
+
1000
+ private normalizeEventTailLimit(limit: number | undefined): number {
1001
+ if (limit === undefined) return DEFAULT_WORKER_EVENT_TAIL_LIMIT;
1002
+ if (!Number.isFinite(limit) || limit < 1) {
1003
+ throw new Error("remote-plugin events: limit must be positive.");
1004
+ }
1005
+ return Math.min(Math.floor(limit), MAX_WORKER_EVENT_TAIL_LIMIT);
1006
+ }
1007
+
1008
+ private handleHostRequest(
1009
+ callerId: string,
1010
+ handle: RemotePluginWorkerHandle,
1011
+ request: HostRequestMessage,
1012
+ ): void {
1013
+ if (request.method === "invoke-remote-plugin") {
1014
+ try {
1015
+ this.startInvokeRemotePlugin(callerId, handle, request);
1016
+ } catch (error) {
1017
+ this.postHostResponse(handle, {
1018
+ type: "host-response",
1019
+ requestId: request.requestId,
1020
+ success: false,
1021
+ error: error instanceof Error ? error.message : String(error),
1022
+ });
1023
+ }
1024
+ return;
1025
+ }
1026
+
1027
+ void this.dispatchHostRequest(callerId, request.method, request.params)
1028
+ .then((payload) => {
1029
+ this.postHostResponse(handle, {
1030
+ type: "host-response",
1031
+ requestId: request.requestId,
1032
+ success: true,
1033
+ payload,
1034
+ });
1035
+ })
1036
+ .catch((error: unknown) => {
1037
+ this.postHostResponse(handle, {
1038
+ type: "host-response",
1039
+ requestId: request.requestId,
1040
+ success: false,
1041
+ error: error instanceof Error ? error.message : String(error),
1042
+ });
1043
+ });
1044
+ }
1045
+
1046
+ private startInvokeRemotePlugin(
1047
+ callerId: string,
1048
+ callerHandle: RemotePluginWorkerHandle,
1049
+ request: HostRequestMessage,
1050
+ ): void {
1051
+ this.requireManageRemotePlugins(callerId, "invoke-remote-plugin");
1052
+ if (!isRecord(request.params)) {
1053
+ throw new Error("invoke-remote-plugin: missing params object.");
1054
+ }
1055
+ const targetId = request.params.remotePluginId;
1056
+ const method = request.params.method;
1057
+ if (typeof targetId !== "string" || targetId.length === 0) {
1058
+ throw new Error("invoke-remote-plugin: invalid remotePluginId.");
1059
+ }
1060
+ if (typeof method !== "string" || method.length === 0) {
1061
+ throw new Error("invoke-remote-plugin: invalid method.");
1062
+ }
1063
+ const target = this.workers.get(targetId);
1064
+ if (!target?.handle || target.status.state !== "running") {
1065
+ throw new Error(
1066
+ `invoke-remote-plugin: target ${targetId} is not running.`,
1067
+ );
1068
+ }
1069
+ const targetHandle = target.handle;
1070
+
1071
+ const invokeId = ++this.nextInvokeId;
1072
+ const timeout = setTimeout(() => {
1073
+ const pending = this.pendingInvokes.get(invokeId);
1074
+ if (!pending) return;
1075
+ this.pendingInvokes.delete(invokeId);
1076
+ this.postHostResponse(pending.callerHandle, {
1077
+ type: "host-response",
1078
+ requestId: pending.originalRequestId,
1079
+ success: false,
1080
+ error: `invoke-remote-plugin: target ${targetId} did not respond within ${INVOKE_TIMEOUT_MS}ms`,
1081
+ });
1082
+ }, INVOKE_TIMEOUT_MS);
1083
+
1084
+ this.pendingInvokes.set(invokeId, {
1085
+ callerId,
1086
+ callerHandle,
1087
+ targetId,
1088
+ originalRequestId: request.requestId,
1089
+ timeout,
1090
+ });
1091
+
1092
+ const requestParams = request.params.params;
1093
+ const windowId = request.params.windowId;
1094
+ const targetRequest: RemotePluginWorkerMessage = {
1095
+ type: "request",
1096
+ requestId: invokeId,
1097
+ method,
1098
+ ...(requestParams === undefined
1099
+ ? {}
1100
+ : { params: requestParams as JsonValue }),
1101
+ ...(typeof windowId === "string" ? { windowId } : {}),
1102
+ };
1103
+ targetHandle.postMessage(targetRequest);
1104
+ }
1105
+
1106
+ private handleWorkerResponse(
1107
+ id: string,
1108
+ handle: RemotePluginWorkerHandle,
1109
+ response: WorkerResponseMessage,
1110
+ ): void {
1111
+ const record = this.workers.get(id);
1112
+ if (record?.handle !== handle) return;
1113
+ const pending = this.pendingInvokes.get(response.requestId);
1114
+ if (!pending) {
1115
+ this.handleDirectWorkerResponse(response);
1116
+ return;
1117
+ }
1118
+ this.pendingInvokes.delete(response.requestId);
1119
+ clearTimeout(pending.timeout);
1120
+ this.postHostResponse(pending.callerHandle, {
1121
+ type: "host-response",
1122
+ requestId: pending.originalRequestId,
1123
+ success: response.success,
1124
+ ...(response.success
1125
+ ? response.payload === undefined
1126
+ ? {}
1127
+ : { payload: response.payload }
1128
+ : {
1129
+ error: formatRemotePluginError(
1130
+ response.error,
1131
+ "invoke-remote-plugin: target returned failure",
1132
+ ),
1133
+ }),
1134
+ });
1135
+ }
1136
+
1137
+ private handleDirectWorkerResponse(response: WorkerResponseMessage): void {
1138
+ const pending = this.pendingDirectInvokes.get(response.requestId);
1139
+ if (!pending) return;
1140
+ this.pendingDirectInvokes.delete(response.requestId);
1141
+ clearTimeout(pending.timeout);
1142
+ if (response.success) {
1143
+ pending.resolve(response.payload ?? null);
1144
+ } else {
1145
+ pending.reject(
1146
+ new Error(
1147
+ formatRemotePluginError(
1148
+ response.error,
1149
+ "remote-plugin invoke: target returned failure",
1150
+ ),
1151
+ ),
1152
+ );
1153
+ }
1154
+ }
1155
+
1156
+ private rejectPendingInvokesForWorker(id: string): void {
1157
+ for (const [invokeId, pending] of this.pendingInvokes) {
1158
+ if (pending.targetId === id) {
1159
+ this.pendingInvokes.delete(invokeId);
1160
+ clearTimeout(pending.timeout);
1161
+ this.postHostResponse(pending.callerHandle, {
1162
+ type: "host-response",
1163
+ requestId: pending.originalRequestId,
1164
+ success: false,
1165
+ error: `invoke-remote-plugin: target ${id} stopped before responding`,
1166
+ });
1167
+ } else if (pending.callerId === id) {
1168
+ this.pendingInvokes.delete(invokeId);
1169
+ clearTimeout(pending.timeout);
1170
+ }
1171
+ }
1172
+ for (const [invokeId, pending] of this.pendingDirectInvokes) {
1173
+ if (pending.targetId !== id) continue;
1174
+ this.pendingDirectInvokes.delete(invokeId);
1175
+ clearTimeout(pending.timeout);
1176
+ pending.reject(
1177
+ new Error(
1178
+ `remote-plugin invoke: target ${id} stopped before responding`,
1179
+ ),
1180
+ );
1181
+ }
1182
+ }
1183
+
1184
+ private postHostResponse(
1185
+ handle: RemotePluginWorkerHandle,
1186
+ response: HostResponseMessage,
1187
+ ): void {
1188
+ const record = [...this.workers.values()].find((r) => r.handle === handle);
1189
+ if (!record) return;
1190
+ handle.postMessage(response);
1191
+ }
1192
+
1193
+ private requireManageRemotePlugins(callerId: string, action: string): void {
1194
+ const record = this.workers.get(callerId);
1195
+ const grant = record?.context?.grantedPermissions ?? null;
1196
+ if (!hasHostPermission(grant, "manage-remote-plugins")) {
1197
+ throw new Error(
1198
+ `${action}: remote plugin "${callerId}" lacks host:manage-remote-plugins permission`,
1199
+ );
1200
+ }
1201
+ }
1202
+
1203
+ /**
1204
+ * Auth-token model (MVP): each remote plugin worker has its own
1205
+ * `context.authToken` stored in-process on the host. `get-auth-token` is
1206
+ * lazy — the first call seeds the slot from `resolveApiToken()` so a
1207
+ * remote plugin can call Eliza's HTTP API as the user without seeing the
1208
+ * underlying env var. `set-auth-token` lets a remote plugin REPLACE ITS OWN
1209
+ * token (Farm-login style flows); cross-remote plugin exfiltration is prevented
1210
+ * by keying read/write off the calling worker's id. The MVP forwards the
1211
+ * host token verbatim; the production hook is a per-remote plugin scoped JWT
1212
+ * issued by the auth pairing layer — schema unchanged.
1213
+ */
1214
+ private async dispatchHostRequest(
1215
+ callerId: string,
1216
+ method: string,
1217
+ params: JsonValue | undefined,
1218
+ ): Promise<JsonValue> {
1219
+ switch (method) {
1220
+ case "list-remote-plugins":
1221
+ return this.listRemotePlugins() as unknown as JsonValue;
1222
+ case "start-remote-plugin": {
1223
+ this.requireManageRemotePlugins(callerId, "start-remote-plugin");
1224
+ const targetId = hostRequestStringField(params, "id");
1225
+ this.startWorker(targetId);
1226
+ return { ok: true };
1227
+ }
1228
+ case "stop-remote-plugin": {
1229
+ this.requireManageRemotePlugins(callerId, "stop-remote-plugin");
1230
+ const targetId = hostRequestStringField(params, "id");
1231
+ this.stopWorker(targetId);
1232
+ return { ok: true };
1233
+ }
1234
+ case "agent-manager-start":
1235
+ this.requireManageRemotePlugins(callerId, "agent-manager-start");
1236
+ return (await getAgentManager().start()) as unknown as JsonValue;
1237
+ case "agent-manager-stop": {
1238
+ this.requireManageRemotePlugins(callerId, "agent-manager-stop");
1239
+ await getAgentManager().stop();
1240
+ return getAgentManager().getStatus() as unknown as JsonValue;
1241
+ }
1242
+ case "agent-manager-restart":
1243
+ this.requireManageRemotePlugins(callerId, "agent-manager-restart");
1244
+ return (await getAgentManager().restart()) as unknown as JsonValue;
1245
+ case "agent-manager-status":
1246
+ this.requireManageRemotePlugins(callerId, "agent-manager-status");
1247
+ return getAgentManager().getStatus() as unknown as JsonValue;
1248
+ case "agent-manager-health":
1249
+ this.requireManageRemotePlugins(callerId, "agent-manager-health");
1250
+ return this.readAgentManagerHealth();
1251
+ case "agent-manager-logs-tail":
1252
+ this.requireManageRemotePlugins(callerId, "agent-manager-logs-tail");
1253
+ return this.readAgentManagerLogsTail(params);
1254
+ case "get-auth-token": {
1255
+ const record = this.workers.get(callerId);
1256
+ if (!record?.context) {
1257
+ throw new Error(`Remote plugin has no runtime context.`);
1258
+ }
1259
+ if (record.context.authToken === null) {
1260
+ record.context.authToken = resolveApiToken();
1261
+ }
1262
+ return { token: record.context.authToken };
1263
+ }
1264
+ case "invoke-remote-plugin":
1265
+ throw new Error(
1266
+ "invoke-remote-plugin must be routed through startInvokeRemotePlugin",
1267
+ );
1268
+ case "dynamic-view-register":
1269
+ this.requireManageRemotePlugins(callerId, "dynamic-view-register");
1270
+ return this.requireDynamicViewHost(method).register(params);
1271
+ case "dynamic-view-unregister":
1272
+ this.requireManageRemotePlugins(callerId, "dynamic-view-unregister");
1273
+ return this.requireDynamicViewHost(method).unregister(params);
1274
+ case "dynamic-view-list":
1275
+ this.requireManageRemotePlugins(callerId, "dynamic-view-list");
1276
+ return this.requireDynamicViewHost(method).list();
1277
+ case "dynamic-view-open":
1278
+ this.requireManageRemotePlugins(callerId, "dynamic-view-open");
1279
+ return this.requireDynamicViewHost(method).open(params);
1280
+ case "dynamic-view-close":
1281
+ this.requireManageRemotePlugins(callerId, "dynamic-view-close");
1282
+ return this.requireDynamicViewHost(method).close(params);
1283
+ case "dynamic-view-push":
1284
+ this.requireManageRemotePlugins(callerId, "dynamic-view-push");
1285
+ return this.requireDynamicViewHost(method).push(params);
1286
+ case "dynamic-view-sessions":
1287
+ this.requireManageRemotePlugins(callerId, "dynamic-view-sessions");
1288
+ return this.requireDynamicViewHost(method).sessions();
1289
+ case "trace-session-start":
1290
+ this.requireManageRemotePlugins(callerId, "trace-session-start");
1291
+ return this.requireTraceHost(method).startSession(params);
1292
+ case "trace-session-complete":
1293
+ this.requireManageRemotePlugins(callerId, "trace-session-complete");
1294
+ return this.requireTraceHost(method).completeSession(params);
1295
+ case "trace-session-cancel":
1296
+ this.requireManageRemotePlugins(callerId, "trace-session-cancel");
1297
+ return this.requireTraceHost(method).cancelSession(params);
1298
+ case "trace-session-error":
1299
+ this.requireManageRemotePlugins(callerId, "trace-session-error");
1300
+ return this.requireTraceHost(method).errorSession(params);
1301
+ case "trace-event-record":
1302
+ this.requireManageRemotePlugins(callerId, "trace-event-record");
1303
+ return this.requireTraceHost(method).recordEvent(params);
1304
+ case "trace-session-list":
1305
+ this.requireManageRemotePlugins(callerId, "trace-session-list");
1306
+ return this.requireTraceHost(method).listSessions(params);
1307
+ case "trace-session-get":
1308
+ this.requireManageRemotePlugins(callerId, "trace-session-get");
1309
+ return this.requireTraceHost(method).getSession(params);
1310
+ case "trace-session-summary":
1311
+ this.requireManageRemotePlugins(callerId, "trace-session-summary");
1312
+ return this.requireTraceHost(method).summarizeSession(params);
1313
+ case "trace-events-tail":
1314
+ this.requireManageRemotePlugins(callerId, "trace-events-tail");
1315
+ return this.requireTraceHost(method).tailEvents(params);
1316
+ case "trace-events-search":
1317
+ this.requireManageRemotePlugins(callerId, "trace-events-search");
1318
+ return this.requireTraceHost(method).searchEvents(params);
1319
+ case "trace-view-open":
1320
+ this.requireManageRemotePlugins(callerId, "trace-view-open");
1321
+ return this.requireTraceHost(method).openTraceView(params);
1322
+ case "voice-status":
1323
+ this.requireManageRemotePlugins(callerId, "voice-status");
1324
+ return this.requireVoiceHost(method).status();
1325
+ case "voice-components":
1326
+ this.requireManageRemotePlugins(callerId, "voice-components");
1327
+ return this.requireVoiceHost(method).components();
1328
+ case "voice-start":
1329
+ this.requireManageRemotePlugins(callerId, "voice-start");
1330
+ return this.requireVoiceHost(method).start(params);
1331
+ case "voice-stop":
1332
+ this.requireManageRemotePlugins(callerId, "voice-stop");
1333
+ return this.requireVoiceHost(method).stop(params);
1334
+ case "voice-interrupt":
1335
+ this.requireManageRemotePlugins(callerId, "voice-interrupt");
1336
+ return this.requireVoiceHost(method).interrupt(params);
1337
+ case "voice-inject-transcript":
1338
+ this.requireManageRemotePlugins(callerId, "voice-inject-transcript");
1339
+ return this.requireVoiceHost(method).injectTranscript(params);
1340
+ case "voice-speak":
1341
+ this.requireManageRemotePlugins(callerId, "voice-speak");
1342
+ return this.requireVoiceHost(method).speak(params);
1343
+ case "voice-transcribe-audio":
1344
+ this.requireManageRemotePlugins(callerId, "voice-transcribe-audio");
1345
+ return this.requireVoiceHost(method).transcribeAudio(params);
1346
+ case "voice-synthesize-speech":
1347
+ this.requireManageRemotePlugins(callerId, "voice-synthesize-speech");
1348
+ return this.requireVoiceHost(method).synthesizeSpeech(params);
1349
+ case "voice-latency":
1350
+ this.requireManageRemotePlugins(callerId, "voice-latency");
1351
+ return this.requireVoiceHost(method).latency();
1352
+ case "voice-recent-turns":
1353
+ this.requireManageRemotePlugins(callerId, "voice-recent-turns");
1354
+ return this.requireVoiceHost(method).recentTurns(params);
1355
+ case "set-auth-token": {
1356
+ const record = this.workers.get(callerId);
1357
+ if (!record?.context) {
1358
+ throw new Error(`Remote plugin has no runtime context.`);
1359
+ }
1360
+ if (!isRecord(params)) {
1361
+ throw new Error("set-auth-token: missing params object.");
1362
+ }
1363
+ const token = params.token;
1364
+ if (token !== null && typeof token !== "string") {
1365
+ throw new Error("set-auth-token: token must be a string or null.");
1366
+ }
1367
+ record.context.authToken = token;
1368
+ return { ok: true };
1369
+ }
1370
+ default:
1371
+ throw new Error(
1372
+ `Unsupported host request method: ${method} (caller=${callerId})`,
1373
+ );
1374
+ }
1375
+ }
1376
+
1377
+ private async readAgentManagerHealth(): Promise<JsonValue> {
1378
+ const status = getAgentManager().getStatus();
1379
+ if (status.port === null) {
1380
+ return {
1381
+ ok: false,
1382
+ apiBase: null,
1383
+ path: "/api/health",
1384
+ status: null,
1385
+ error: "AgentManager has no active API port.",
1386
+ agentStatus: status as unknown as JsonValue,
1387
+ };
1388
+ }
1389
+ const apiBase = `http://127.0.0.1:${status.port}`;
1390
+ try {
1391
+ const response = await fetch(`${apiBase}/api/health`, {
1392
+ signal: AbortSignal.timeout(1500),
1393
+ });
1394
+ return {
1395
+ ok: response.ok,
1396
+ apiBase,
1397
+ path: "/api/health",
1398
+ status: response.status,
1399
+ body: await response.text(),
1400
+ agentStatus: status as unknown as JsonValue,
1401
+ };
1402
+ } catch (error) {
1403
+ return {
1404
+ ok: false,
1405
+ apiBase,
1406
+ path: "/api/health",
1407
+ status: null,
1408
+ error: error instanceof Error ? error.message : String(error),
1409
+ agentStatus: status as unknown as JsonValue,
1410
+ };
1411
+ }
1412
+ }
1413
+
1414
+ private requireDynamicViewHost(method: string): DynamicViewHost {
1415
+ if (!this.dynamicViewHost) {
1416
+ throw new Error(`${method}: dynamic view host is not configured.`);
1417
+ }
1418
+ return this.dynamicViewHost;
1419
+ }
1420
+
1421
+ private requireTraceHost(method: string): TraceHost {
1422
+ if (!this.traceHost) {
1423
+ throw new Error(`${method}: trace host is not configured.`);
1424
+ }
1425
+ return this.traceHost;
1426
+ }
1427
+
1428
+ private requireVoiceHost(method: string): VoiceHost {
1429
+ if (!this.voiceHost) {
1430
+ throw new Error(`${method}: voice host is not configured.`);
1431
+ }
1432
+ return this.voiceHost;
1433
+ }
1434
+
1435
+ private readAgentManagerLogsTail(params: JsonValue | undefined): JsonValue {
1436
+ const maxBytes = this.readLogMaxBytes(params);
1437
+ const logPath = getDiagnosticLogPath();
1438
+ if (!fs.existsSync(logPath)) {
1439
+ return { path: logPath, text: "", truncated: false };
1440
+ }
1441
+ const stat = fs.statSync(logPath);
1442
+ const size = Math.max(0, stat.size);
1443
+ const start = Math.max(0, size - maxBytes);
1444
+ const length = size - start;
1445
+ const buffer = Buffer.alloc(length);
1446
+ const fd = fs.openSync(logPath, "r");
1447
+ try {
1448
+ fs.readSync(fd, buffer, 0, length, start);
1449
+ } finally {
1450
+ fs.closeSync(fd);
1451
+ }
1452
+ return {
1453
+ path: logPath,
1454
+ text: buffer.toString("utf8"),
1455
+ truncated: start > 0,
1456
+ };
1457
+ }
1458
+
1459
+ private readLogMaxBytes(params: JsonValue | undefined): number {
1460
+ if (params === undefined) return 64 * 1024;
1461
+ if (!isRecord(params)) {
1462
+ throw new Error("agent-manager-logs-tail: params must be an object.");
1463
+ }
1464
+ const value = params.maxBytes;
1465
+ if (value === undefined) return 64 * 1024;
1466
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 1) {
1467
+ throw new Error("agent-manager-logs-tail: maxBytes must be positive.");
1468
+ }
1469
+ return Math.floor(value);
1470
+ }
1471
+
1472
+ private markWorkerError(
1473
+ id: string,
1474
+ handle: RemotePluginWorkerHandle,
1475
+ error: Error,
1476
+ ): void {
1477
+ const record = this.workers.get(id);
1478
+ if (record?.handle !== handle) return;
1479
+ this.rejectPendingInvokesForWorker(id);
1480
+ record.status.state = "error";
1481
+ record.status.error = error.message;
1482
+ record.status.stoppedAt = this.now();
1483
+ // Don't leave an orphaned window for a dead worker — close it and
1484
+ // let the next start cycle reopen one cleanly.
1485
+ if (record.window) {
1486
+ try {
1487
+ record.window.close();
1488
+ } catch {
1489
+ // already destroyed
1490
+ }
1491
+ record.window = null;
1492
+ }
1493
+ this.emitWorkerChanged(record.status);
1494
+ }
1495
+
1496
+ private emitStoreChanged(): void {
1497
+ this.events.storeChanged?.(this.getStoreSnapshot());
1498
+ }
1499
+
1500
+ private emitWorkerChanged(status: RemotePluginWorkerStatus): void {
1501
+ this.events.workerChanged?.(status);
1502
+ }
1503
+ }
1504
+
1505
+ let activeRemotePluginHost: RemotePluginHost | null = null;
1506
+
1507
+ export function getRemotePluginHost(): RemotePluginHost {
1508
+ activeRemotePluginHost ??= new RemotePluginHost();
1509
+ return activeRemotePluginHost;
1510
+ }
1511
+
1512
+ export function configureRemotePluginHostEvents(
1513
+ sendToWebview: SendToWebview,
1514
+ ): void {
1515
+ getRemotePluginHost().setEvents({
1516
+ storeChanged: (snapshot) => {
1517
+ sendToWebview("remotePluginStoreChanged", { snapshot });
1518
+ },
1519
+ workerChanged: (status) => {
1520
+ sendToWebview("remotePluginWorkerChanged", { status });
1521
+ },
1522
+ });
1523
+ }
1524
+
1525
+ export function resetRemotePluginHostForTesting(
1526
+ manager: RemotePluginHost | null = null,
1527
+ ): void {
1528
+ activeRemotePluginHost = manager;
1529
+ }
1530
+
1531
+ export type { RemotePluginInstallRecord };