@elizaos/shared 2.0.0-alpha.538 → 2.0.0-beta.1

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 (563) hide show
  1. package/dist/api/chat-contracts.d.ts +2 -0
  2. package/dist/api/chat-contracts.d.ts.map +1 -0
  3. package/dist/api/chat-contracts.js +2 -0
  4. package/dist/api/chat-contracts.js.map +1 -0
  5. package/dist/api/http-helpers.d.ts +50 -0
  6. package/dist/api/http-helpers.d.ts.map +1 -0
  7. package/dist/api/http-helpers.js +168 -0
  8. package/dist/api/http-helpers.js.map +1 -0
  9. package/dist/api/route-helpers.d.ts +16 -0
  10. package/dist/api/route-helpers.d.ts.map +1 -0
  11. package/dist/api/route-helpers.js +2 -0
  12. package/dist/api/route-helpers.js.map +1 -0
  13. package/dist/cli/parse-duration.d.ts +5 -0
  14. package/dist/cli/parse-duration.d.ts.map +1 -0
  15. package/dist/cli/parse-duration.js +28 -0
  16. package/dist/cli/parse-duration.js.map +1 -0
  17. package/dist/config/allowed-hosts.d.ts +8 -0
  18. package/dist/config/allowed-hosts.d.ts.map +1 -0
  19. package/dist/config/allowed-hosts.js +44 -0
  20. package/dist/config/allowed-hosts.js.map +1 -0
  21. package/dist/config/api-key-prefix-hints.d.ts +25 -0
  22. package/dist/config/api-key-prefix-hints.d.ts.map +1 -0
  23. package/dist/config/api-key-prefix-hints.js +27 -0
  24. package/dist/config/api-key-prefix-hints.js.map +1 -0
  25. package/dist/config/app-config.d.ts +273 -0
  26. package/dist/config/app-config.d.ts.map +1 -0
  27. package/dist/config/app-config.js +32 -0
  28. package/dist/config/app-config.js.map +1 -0
  29. package/dist/config/app-manifest.d.ts +75 -0
  30. package/dist/config/app-manifest.d.ts.map +1 -0
  31. package/dist/config/app-manifest.js +109 -0
  32. package/dist/config/app-manifest.js.map +1 -0
  33. package/dist/config/boot-config-react.d.ts +5 -0
  34. package/dist/config/boot-config-react.d.ts.map +1 -0
  35. package/dist/config/boot-config-react.js +8 -0
  36. package/dist/config/boot-config-react.js.map +1 -0
  37. package/dist/config/boot-config-store.d.ts +74 -0
  38. package/dist/config/boot-config-store.d.ts.map +1 -0
  39. package/dist/config/boot-config-store.js +121 -0
  40. package/dist/config/boot-config-store.js.map +1 -0
  41. package/dist/config/boot-config.d.ts +6 -0
  42. package/dist/config/boot-config.d.ts.map +1 -0
  43. package/dist/config/boot-config.js +6 -0
  44. package/dist/config/boot-config.js.map +1 -0
  45. package/dist/config/branding-react.d.ts +4 -0
  46. package/dist/config/branding-react.d.ts.map +1 -0
  47. package/dist/config/branding-react.js +12 -0
  48. package/dist/config/branding-react.js.map +1 -0
  49. package/dist/config/branding.d.ts +53 -0
  50. package/dist/config/branding.d.ts.map +1 -0
  51. package/dist/config/branding.js +23 -0
  52. package/dist/config/branding.js.map +1 -0
  53. package/dist/config/cloud-only.d.ts +6 -0
  54. package/dist/config/cloud-only.d.ts.map +1 -0
  55. package/dist/config/cloud-only.js +16 -0
  56. package/dist/config/cloud-only.js.map +1 -0
  57. package/dist/config/config-catalog.d.ts +371 -0
  58. package/dist/config/config-catalog.d.ts.map +1 -0
  59. package/dist/config/config-catalog.js +710 -0
  60. package/dist/config/config-catalog.js.map +1 -0
  61. package/dist/config/config-paths.d.ts +11 -0
  62. package/dist/config/config-paths.d.ts.map +1 -0
  63. package/dist/config/config-paths.js +74 -0
  64. package/dist/config/config-paths.js.map +1 -0
  65. package/dist/config/config.d.ts +11 -0
  66. package/dist/config/config.d.ts.map +1 -0
  67. package/dist/config/config.js +23 -0
  68. package/dist/config/config.js.map +1 -0
  69. package/dist/config/distribution-profile.d.ts +16 -0
  70. package/dist/config/distribution-profile.d.ts.map +1 -0
  71. package/dist/config/distribution-profile.js +29 -0
  72. package/dist/config/distribution-profile.js.map +1 -0
  73. package/dist/config/env-vars.d.ts +2 -0
  74. package/dist/config/env-vars.d.ts.map +1 -0
  75. package/dist/config/env-vars.js +2 -0
  76. package/dist/config/env-vars.js.map +1 -0
  77. package/dist/config/index.d.ts +14 -0
  78. package/dist/config/index.d.ts.map +1 -0
  79. package/dist/config/index.js +17 -0
  80. package/dist/config/index.js.map +1 -0
  81. package/dist/config/plugin-auto-enable-engine.d.ts +4 -0
  82. package/dist/config/plugin-auto-enable-engine.d.ts.map +1 -0
  83. package/dist/config/plugin-auto-enable-engine.js +45 -0
  84. package/dist/config/plugin-auto-enable-engine.js.map +1 -0
  85. package/dist/config/plugin-auto-enable.d.ts +2 -0
  86. package/dist/config/plugin-auto-enable.d.ts.map +1 -0
  87. package/dist/config/plugin-auto-enable.js +8 -0
  88. package/dist/config/plugin-auto-enable.js.map +1 -0
  89. package/dist/config/plugin-manifest.d.ts +89 -0
  90. package/dist/config/plugin-manifest.d.ts.map +1 -0
  91. package/dist/config/plugin-manifest.js +272 -0
  92. package/dist/config/plugin-manifest.js.map +1 -0
  93. package/dist/config/plugin-ui-spec.d.ts +42 -0
  94. package/dist/config/plugin-ui-spec.d.ts.map +1 -0
  95. package/dist/config/plugin-ui-spec.js +257 -0
  96. package/dist/config/plugin-ui-spec.js.map +1 -0
  97. package/dist/config/runtime-mode.d.ts +54 -0
  98. package/dist/config/runtime-mode.d.ts.map +1 -0
  99. package/dist/config/runtime-mode.js +103 -0
  100. package/dist/config/runtime-mode.js.map +1 -0
  101. package/dist/config/runtime-overrides.d.ts +16 -0
  102. package/dist/config/runtime-overrides.d.ts.map +1 -0
  103. package/dist/config/runtime-overrides.js +49 -0
  104. package/dist/config/runtime-overrides.js.map +1 -0
  105. package/dist/config/schema.d.ts +7 -0
  106. package/dist/config/schema.d.ts.map +1 -0
  107. package/dist/config/schema.js +30 -0
  108. package/dist/config/schema.js.map +1 -0
  109. package/{config → dist/config}/types.eliza.d.ts +16 -38
  110. package/dist/config/types.eliza.d.ts.map +1 -0
  111. package/{config → dist/config}/types.messages.d.ts +1 -1
  112. package/{config → dist/config}/types.tools.d.ts +1 -1
  113. package/dist/config/ui-spec.d.ts +164 -0
  114. package/dist/config/ui-spec.d.ts.map +1 -0
  115. package/dist/config/ui-spec.js +14 -0
  116. package/dist/config/ui-spec.js.map +1 -0
  117. package/dist/config/wechat-config.d.ts +2 -0
  118. package/dist/config/wechat-config.d.ts.map +1 -0
  119. package/dist/config/wechat-config.js +2 -0
  120. package/dist/config/wechat-config.js.map +1 -0
  121. package/dist/config/zod-schema.agent-runtime.d.ts +1087 -0
  122. package/dist/config/zod-schema.agent-runtime.d.ts.map +1 -0
  123. package/dist/config/zod-schema.agent-runtime.js +764 -0
  124. package/dist/config/zod-schema.agent-runtime.js.map +1 -0
  125. package/dist/config/zod-schema.core.d.ts +1048 -0
  126. package/dist/config/zod-schema.core.d.ts.map +1 -0
  127. package/dist/config/zod-schema.core.js +707 -0
  128. package/dist/config/zod-schema.core.js.map +1 -0
  129. package/{connector-cred-types.d.ts → dist/connector-cred-types.d.ts} +3 -3
  130. package/{connector-cred-types.js → dist/connector-cred-types.js} +4 -4
  131. package/dist/connectors.d.ts +2 -0
  132. package/dist/connectors.d.ts.map +1 -0
  133. package/dist/connectors.js +2 -0
  134. package/dist/connectors.js.map +1 -0
  135. package/{contracts → dist/contracts}/apps.d.ts +8 -1
  136. package/dist/contracts/apps.d.ts.map +1 -0
  137. package/{contracts → dist/contracts}/apps.js +9 -10
  138. package/dist/contracts/apps.js.map +1 -0
  139. package/{contracts → dist/contracts}/awareness.d.ts +1 -1
  140. package/{contracts → dist/contracts}/config.d.ts +52 -4
  141. package/dist/contracts/config.d.ts.map +1 -0
  142. package/dist/contracts/feature-result.d.ts +24 -0
  143. package/dist/contracts/feature-result.d.ts.map +1 -0
  144. package/dist/contracts/feature-result.js +7 -0
  145. package/dist/contracts/feature-result.js.map +1 -0
  146. package/dist/contracts/health.d.ts +30 -0
  147. package/dist/contracts/health.d.ts.map +1 -0
  148. package/dist/contracts/health.js +29 -0
  149. package/dist/contracts/health.js.map +1 -0
  150. package/{contracts → dist/contracts}/index.d.ts +2 -1
  151. package/{contracts → dist/contracts}/index.d.ts.map +1 -1
  152. package/{contracts → dist/contracts}/index.js +2 -1
  153. package/dist/contracts/index.js.map +1 -0
  154. package/{contracts → dist/contracts}/lifeops.d.ts +410 -3
  155. package/dist/contracts/lifeops.d.ts.map +1 -0
  156. package/{contracts → dist/contracts}/lifeops.js +35 -5
  157. package/dist/contracts/lifeops.js.map +1 -0
  158. package/{contracts → dist/contracts}/onboarding.d.ts +85 -6
  159. package/dist/contracts/onboarding.d.ts.map +1 -0
  160. package/{contracts → dist/contracts}/onboarding.js +99 -13
  161. package/{contracts → dist/contracts}/onboarding.js.map +1 -1
  162. package/dist/contracts/permissions.d.ts +121 -0
  163. package/dist/contracts/permissions.d.ts.map +1 -0
  164. package/dist/contracts/permissions.js +31 -0
  165. package/dist/contracts/permissions.js.map +1 -0
  166. package/{contracts → dist/contracts}/service-routing.d.ts +3 -11
  167. package/dist/contracts/service-routing.d.ts.map +1 -0
  168. package/{contracts → dist/contracts}/service-routing.js +10 -11
  169. package/dist/contracts/service-routing.js.map +1 -0
  170. package/{contracts → dist/contracts}/wallet.d.ts +7 -0
  171. package/dist/contracts/wallet.d.ts.map +1 -0
  172. package/dist/contracts/wallet.js +194 -0
  173. package/dist/contracts/wallet.js.map +1 -0
  174. package/{env-utils.impl.d.ts → dist/env-utils.d.ts} +1 -1
  175. package/dist/env-utils.d.ts.map +1 -0
  176. package/{env-utils.impl.js → dist/env-utils.js} +4 -1
  177. package/dist/env-utils.js.map +1 -0
  178. package/dist/events/index.d.ts +62 -0
  179. package/dist/events/index.d.ts.map +1 -0
  180. package/dist/events/index.js +52 -0
  181. package/dist/events/index.js.map +1 -0
  182. package/dist/i18n/generated/validation-keyword-data.d.ts +3080 -0
  183. package/dist/i18n/generated/validation-keyword-data.d.ts.map +1 -0
  184. package/dist/i18n/generated/validation-keyword-data.js +3084 -0
  185. package/dist/i18n/generated/validation-keyword-data.js.map +1 -0
  186. package/dist/index.d.ts +93 -0
  187. package/dist/index.d.ts.map +1 -0
  188. package/dist/index.js +105 -0
  189. package/dist/index.js.map +1 -0
  190. package/dist/local-inference/index.d.ts +16 -0
  191. package/dist/local-inference/index.d.ts.map +1 -0
  192. package/dist/local-inference/index.js +16 -0
  193. package/dist/local-inference/index.js.map +1 -0
  194. package/dist/local-inference/paths.d.ts +24 -0
  195. package/dist/local-inference/paths.d.ts.map +1 -0
  196. package/dist/local-inference/paths.js +40 -0
  197. package/dist/local-inference/paths.js.map +1 -0
  198. package/dist/local-inference/routing-preferences.d.ts +31 -0
  199. package/dist/local-inference/routing-preferences.d.ts.map +1 -0
  200. package/dist/local-inference/routing-preferences.js +73 -0
  201. package/dist/local-inference/routing-preferences.js.map +1 -0
  202. package/dist/local-inference/types.d.ts +62 -0
  203. package/dist/local-inference/types.d.ts.map +1 -0
  204. package/dist/local-inference/types.js +25 -0
  205. package/dist/local-inference/types.js.map +1 -0
  206. package/dist/local-inference/verify.d.ts +39 -0
  207. package/dist/local-inference/verify.d.ts.map +1 -0
  208. package/dist/local-inference/verify.js +105 -0
  209. package/dist/local-inference/verify.js.map +1 -0
  210. package/dist/package.json +50 -0
  211. package/dist/platform/is-native-server.d.ts +9 -0
  212. package/dist/platform/is-native-server.d.ts.map +1 -0
  213. package/dist/platform/is-native-server.js +12 -0
  214. package/dist/platform/is-native-server.js.map +1 -0
  215. package/{runtime-env.js → dist/runtime-env.js} +2 -2
  216. package/{runtime-env.js.map → dist/runtime-env.js.map} +1 -1
  217. package/{self-edit.js → dist/self-edit.js} +1 -1
  218. package/{self-edit.js.map → dist/self-edit.js.map} +1 -1
  219. package/{settings-debug.d.ts.map → dist/settings-debug.d.ts.map} +1 -1
  220. package/{settings-debug.js → dist/settings-debug.js} +45 -38
  221. package/dist/settings-debug.js.map +1 -0
  222. package/{spoken-text.js → dist/spoken-text.js} +1 -1
  223. package/{spoken-text.js.map → dist/spoken-text.js.map} +1 -1
  224. package/dist/terminal/links.d.ts +9 -0
  225. package/dist/terminal/links.d.ts.map +1 -0
  226. package/dist/terminal/links.js +21 -0
  227. package/dist/terminal/links.js.map +1 -0
  228. package/dist/terminal/palette.d.ts +11 -0
  229. package/dist/terminal/palette.d.ts.map +1 -0
  230. package/dist/terminal/palette.js +13 -0
  231. package/dist/terminal/palette.js.map +1 -0
  232. package/dist/terminal/theme.d.ts +17 -0
  233. package/dist/terminal/theme.d.ts.map +1 -0
  234. package/dist/terminal/theme.js +25 -0
  235. package/dist/terminal/theme.js.map +1 -0
  236. package/dist/test-support/process-helpers.d.ts +13 -0
  237. package/dist/test-support/process-helpers.d.ts.map +1 -0
  238. package/dist/test-support/process-helpers.js +24 -0
  239. package/dist/test-support/process-helpers.js.map +1 -0
  240. package/dist/test-support/test-helpers.d.ts +112 -0
  241. package/dist/test-support/test-helpers.d.ts.map +1 -0
  242. package/dist/test-support/test-helpers.js +416 -0
  243. package/dist/test-support/test-helpers.js.map +1 -0
  244. package/{type-guards.d.ts → dist/type-guards.d.ts} +1 -0
  245. package/dist/type-guards.d.ts.map +1 -0
  246. package/{type-guards.js → dist/type-guards.js} +6 -0
  247. package/dist/type-guards.js.map +1 -0
  248. package/dist/types/index.d.ts +655 -0
  249. package/dist/types/index.d.ts.map +1 -0
  250. package/dist/types/index.js +5 -0
  251. package/dist/types/index.js.map +1 -0
  252. package/dist/utils/asset-url.d.ts +24 -0
  253. package/dist/utils/asset-url.d.ts.map +1 -0
  254. package/dist/utils/asset-url.js +151 -0
  255. package/dist/utils/asset-url.js.map +1 -0
  256. package/dist/utils/assistant-text.d.ts +2 -0
  257. package/dist/utils/assistant-text.d.ts.map +1 -0
  258. package/dist/utils/assistant-text.js +168 -0
  259. package/dist/utils/assistant-text.js.map +1 -0
  260. package/dist/utils/browser-tab-kit-types.d.ts +81 -0
  261. package/dist/utils/browser-tab-kit-types.d.ts.map +1 -0
  262. package/dist/utils/browser-tab-kit-types.js +23 -0
  263. package/dist/utils/browser-tab-kit-types.js.map +1 -0
  264. package/dist/utils/browser-tabs-renderer-registry.d.ts +56 -0
  265. package/dist/utils/browser-tabs-renderer-registry.d.ts.map +1 -0
  266. package/dist/utils/browser-tabs-renderer-registry.js +962 -0
  267. package/{i18n/generated/validation-keyword-data.d.ts.map → dist/utils/browser-tabs-renderer-registry.js.map} +1 -1
  268. package/dist/utils/character-message-examples.d.ts +7 -0
  269. package/dist/utils/character-message-examples.d.ts.map +1 -0
  270. package/dist/utils/character-message-examples.js +123 -0
  271. package/dist/utils/character-message-examples.js.map +1 -0
  272. package/dist/utils/cloud-status.d.ts +3 -0
  273. package/dist/utils/cloud-status.d.ts.map +1 -0
  274. package/dist/utils/cloud-status.js +11 -0
  275. package/dist/utils/cloud-status.js.map +1 -0
  276. package/dist/utils/documents-upload-image.d.ts +27 -0
  277. package/dist/utils/documents-upload-image.d.ts.map +1 -0
  278. package/dist/utils/documents-upload-image.js +147 -0
  279. package/dist/utils/documents-upload-image.js.map +1 -0
  280. package/dist/utils/eliza-cloud-model-route.d.ts +3 -0
  281. package/dist/utils/eliza-cloud-model-route.d.ts.map +1 -0
  282. package/dist/utils/eliza-cloud-model-route.js +10 -0
  283. package/dist/utils/eliza-cloud-model-route.js.map +1 -0
  284. package/dist/utils/eliza-globals.d.ts +13 -0
  285. package/dist/utils/eliza-globals.d.ts.map +1 -0
  286. package/dist/utils/eliza-globals.js +49 -0
  287. package/dist/utils/eliza-globals.js.map +1 -0
  288. package/dist/utils/eliza-root.d.ts +9 -0
  289. package/dist/utils/eliza-root.d.ts.map +1 -0
  290. package/dist/utils/eliza-root.js +102 -0
  291. package/dist/utils/eliza-root.js.map +1 -0
  292. package/dist/utils/env.d.ts +34 -0
  293. package/dist/utils/env.d.ts.map +1 -0
  294. package/dist/utils/env.js +131 -0
  295. package/dist/utils/env.js.map +1 -0
  296. package/dist/utils/errors.d.ts +13 -0
  297. package/dist/utils/errors.d.ts.map +1 -0
  298. package/dist/utils/errors.js +26 -0
  299. package/dist/utils/errors.js.map +1 -0
  300. package/dist/utils/exec-safety.d.ts +2 -0
  301. package/dist/utils/exec-safety.d.ts.map +1 -0
  302. package/dist/utils/exec-safety.js +22 -0
  303. package/dist/utils/exec-safety.js.map +1 -0
  304. package/dist/utils/format.d.ts +66 -0
  305. package/dist/utils/format.d.ts.map +1 -0
  306. package/dist/utils/format.js +122 -0
  307. package/dist/utils/format.js.map +1 -0
  308. package/dist/utils/index.d.ts +12 -0
  309. package/dist/utils/index.d.ts.map +1 -0
  310. package/dist/utils/index.js +12 -0
  311. package/dist/utils/index.js.map +1 -0
  312. package/dist/utils/labels.d.ts +6 -0
  313. package/dist/utils/labels.d.ts.map +1 -0
  314. package/dist/utils/labels.js +42 -0
  315. package/dist/utils/labels.js.map +1 -0
  316. package/dist/utils/log-prefix.d.ts +2 -0
  317. package/dist/utils/log-prefix.d.ts.map +1 -0
  318. package/dist/utils/log-prefix.js +54 -0
  319. package/dist/utils/log-prefix.js.map +1 -0
  320. package/dist/utils/name-tokens.d.ts +24 -0
  321. package/dist/utils/name-tokens.d.ts.map +1 -0
  322. package/dist/utils/name-tokens.js +37 -0
  323. package/dist/utils/name-tokens.js.map +1 -0
  324. package/dist/utils/namespace-defaults.d.ts +6 -0
  325. package/dist/utils/namespace-defaults.d.ts.map +1 -0
  326. package/dist/utils/namespace-defaults.js +16 -0
  327. package/dist/utils/namespace-defaults.js.map +1 -0
  328. package/dist/utils/number-parsing.d.ts +26 -0
  329. package/dist/utils/number-parsing.d.ts.map +1 -0
  330. package/dist/utils/number-parsing.js +52 -0
  331. package/dist/utils/number-parsing.js.map +1 -0
  332. package/dist/utils/owner-name.d.ts +3 -0
  333. package/dist/utils/owner-name.d.ts.map +1 -0
  334. package/dist/utils/owner-name.js +8 -0
  335. package/dist/utils/owner-name.js.map +1 -0
  336. package/dist/utils/permission-deep-links.d.ts +34 -0
  337. package/dist/utils/permission-deep-links.d.ts.map +1 -0
  338. package/dist/utils/permission-deep-links.js +84 -0
  339. package/dist/utils/permission-deep-links.js.map +1 -0
  340. package/dist/utils/rate-limiter.d.ts +32 -0
  341. package/dist/utils/rate-limiter.d.ts.map +1 -0
  342. package/dist/utils/rate-limiter.js +53 -0
  343. package/dist/utils/rate-limiter.js.map +1 -0
  344. package/dist/utils/serialise.d.ts +12 -0
  345. package/dist/utils/serialise.d.ts.map +1 -0
  346. package/dist/utils/serialise.js +22 -0
  347. package/dist/utils/serialise.js.map +1 -0
  348. package/dist/utils/sql-compat.d.ts +10 -0
  349. package/dist/utils/sql-compat.d.ts.map +1 -0
  350. package/dist/utils/sql-compat.js +112 -0
  351. package/dist/utils/sql-compat.js.map +1 -0
  352. package/dist/utils/streaming-text.d.ts +9 -0
  353. package/dist/utils/streaming-text.d.ts.map +1 -0
  354. package/dist/utils/streaming-text.js +113 -0
  355. package/dist/utils/streaming-text.js.map +1 -0
  356. package/dist/utils/subscription-auth.d.ts +9 -0
  357. package/dist/utils/subscription-auth.d.ts.map +1 -0
  358. package/dist/utils/subscription-auth.js +49 -0
  359. package/dist/utils/subscription-auth.js.map +1 -0
  360. package/dist/utils/trajectory-format.d.ts +6 -0
  361. package/dist/utils/trajectory-format.d.ts.map +1 -0
  362. package/dist/utils/trajectory-format.js +44 -0
  363. package/dist/utils/trajectory-format.js.map +1 -0
  364. package/dist/utils/tts-debug.d.ts +9 -0
  365. package/dist/utils/tts-debug.d.ts.map +1 -0
  366. package/dist/utils/tts-debug.js +70 -0
  367. package/dist/utils/tts-debug.js.map +1 -0
  368. package/dist/voice.d.ts +40 -0
  369. package/dist/voice.d.ts.map +1 -0
  370. package/dist/voice.js +296 -0
  371. package/dist/voice.js.map +1 -0
  372. package/package.json +33 -179
  373. package/config/types.eliza.d.ts.map +0 -1
  374. package/connectors.d.ts +0 -13
  375. package/connectors.d.ts.map +0 -1
  376. package/connectors.js +0 -97
  377. package/connectors.js.map +0 -1
  378. package/contracts/apps.d.ts.map +0 -1
  379. package/contracts/apps.js.map +0 -1
  380. package/contracts/config.d.ts.map +0 -1
  381. package/contracts/index.js.map +0 -1
  382. package/contracts/lifeops-extensions.d.ts +0 -340
  383. package/contracts/lifeops-extensions.d.ts.map +0 -1
  384. package/contracts/lifeops-extensions.js +0 -37
  385. package/contracts/lifeops-extensions.js.map +0 -1
  386. package/contracts/lifeops.d.ts.map +0 -1
  387. package/contracts/lifeops.js.map +0 -1
  388. package/contracts/onboarding.d.ts.map +0 -1
  389. package/contracts/permissions.d.ts +0 -39
  390. package/contracts/permissions.d.ts.map +0 -1
  391. package/contracts/permissions.js +0 -5
  392. package/contracts/permissions.js.map +0 -1
  393. package/contracts/scratchpad.d.ts +0 -136
  394. package/contracts/scratchpad.d.ts.map +0 -1
  395. package/contracts/scratchpad.js +0 -91
  396. package/contracts/scratchpad.js.map +0 -1
  397. package/contracts/service-routing.d.ts.map +0 -1
  398. package/contracts/service-routing.js.map +0 -1
  399. package/contracts/wallet.d.ts.map +0 -1
  400. package/contracts/wallet.js +0 -61
  401. package/contracts/wallet.js.map +0 -1
  402. package/eliza-core-roles.d.ts +0 -79
  403. package/eliza-core-roles.d.ts.map +0 -1
  404. package/eliza-core-roles.js +0 -600
  405. package/eliza-core-roles.js.map +0 -1
  406. package/env-utils.d.ts +0 -5
  407. package/env-utils.d.ts.map +0 -1
  408. package/env-utils.impl.d.ts.map +0 -1
  409. package/env-utils.impl.js.map +0 -1
  410. package/env-utils.js +0 -5
  411. package/env-utils.js.map +0 -1
  412. package/i18n/generated/validation-keyword-data.d.ts +0 -1091
  413. package/i18n/generated/validation-keyword-data.js +0 -1095
  414. package/i18n/generated/validation-keyword-data.js.map +0 -1
  415. package/index.d.ts +0 -28
  416. package/index.d.ts.map +0 -1
  417. package/index.js +0 -40
  418. package/index.js.map +0 -1
  419. package/settings-debug.js.map +0 -1
  420. package/type-guards.d.ts.map +0 -1
  421. package/type-guards.js.map +0 -1
  422. package/types.d.ts +0 -27
  423. package/types.d.ts.map +0 -1
  424. package/types.js +0 -2
  425. package/types.js.map +0 -1
  426. /package/{app-hero-art.d.ts → dist/app-hero-art.d.ts} +0 -0
  427. /package/{app-hero-art.d.ts.map → dist/app-hero-art.d.ts.map} +0 -0
  428. /package/{app-hero-art.js → dist/app-hero-art.js} +0 -0
  429. /package/{app-hero-art.js.map → dist/app-hero-art.js.map} +0 -0
  430. /package/{awareness → dist/awareness}/index.d.ts +0 -0
  431. /package/{awareness → dist/awareness}/index.d.ts.map +0 -0
  432. /package/{awareness → dist/awareness}/index.js +0 -0
  433. /package/{awareness → dist/awareness}/index.js.map +0 -0
  434. /package/{awareness → dist/awareness}/registry.d.ts +0 -0
  435. /package/{awareness → dist/awareness}/registry.d.ts.map +0 -0
  436. /package/{awareness → dist/awareness}/registry.js +0 -0
  437. /package/{awareness → dist/awareness}/registry.js.map +0 -0
  438. /package/{config → dist/config}/types.agent-defaults.d.ts +0 -0
  439. /package/{config → dist/config}/types.agent-defaults.d.ts.map +0 -0
  440. /package/{config → dist/config}/types.agent-defaults.js +0 -0
  441. /package/{config → dist/config}/types.agent-defaults.js.map +0 -0
  442. /package/{config → dist/config}/types.agents.d.ts +0 -0
  443. /package/{config → dist/config}/types.agents.d.ts.map +0 -0
  444. /package/{config → dist/config}/types.agents.js +0 -0
  445. /package/{config → dist/config}/types.agents.js.map +0 -0
  446. /package/{config → dist/config}/types.d.ts +0 -0
  447. /package/{config → dist/config}/types.d.ts.map +0 -0
  448. /package/{config → dist/config}/types.eliza.js +0 -0
  449. /package/{config → dist/config}/types.eliza.js.map +0 -0
  450. /package/{config → dist/config}/types.gateway.d.ts +0 -0
  451. /package/{config → dist/config}/types.gateway.d.ts.map +0 -0
  452. /package/{config → dist/config}/types.gateway.js +0 -0
  453. /package/{config → dist/config}/types.gateway.js.map +0 -0
  454. /package/{config → dist/config}/types.hooks.d.ts +0 -0
  455. /package/{config → dist/config}/types.hooks.d.ts.map +0 -0
  456. /package/{config → dist/config}/types.hooks.js +0 -0
  457. /package/{config → dist/config}/types.hooks.js.map +0 -0
  458. /package/{config → dist/config}/types.js +0 -0
  459. /package/{config → dist/config}/types.js.map +0 -0
  460. /package/{config → dist/config}/types.messages.d.ts.map +0 -0
  461. /package/{config → dist/config}/types.messages.js +0 -0
  462. /package/{config → dist/config}/types.messages.js.map +0 -0
  463. /package/{config → dist/config}/types.tools.d.ts.map +0 -0
  464. /package/{config → dist/config}/types.tools.js +0 -0
  465. /package/{config → dist/config}/types.tools.js.map +0 -0
  466. /package/{connector-cred-types.d.ts.map → dist/connector-cred-types.d.ts.map} +0 -0
  467. /package/{connector-cred-types.js.map → dist/connector-cred-types.js.map} +0 -0
  468. /package/{contracts → dist/contracts}/awareness.d.ts.map +0 -0
  469. /package/{contracts → dist/contracts}/awareness.js +0 -0
  470. /package/{contracts → dist/contracts}/awareness.js.map +0 -0
  471. /package/{contracts → dist/contracts}/cloud-topology.d.ts +0 -0
  472. /package/{contracts → dist/contracts}/cloud-topology.d.ts.map +0 -0
  473. /package/{contracts → dist/contracts}/cloud-topology.js +0 -0
  474. /package/{contracts → dist/contracts}/cloud-topology.js.map +0 -0
  475. /package/{contracts → dist/contracts}/config.js +0 -0
  476. /package/{contracts → dist/contracts}/config.js.map +0 -0
  477. /package/{contracts → dist/contracts}/content-pack.d.ts +0 -0
  478. /package/{contracts → dist/contracts}/content-pack.d.ts.map +0 -0
  479. /package/{contracts → dist/contracts}/content-pack.js +0 -0
  480. /package/{contracts → dist/contracts}/content-pack.js.map +0 -0
  481. /package/{contracts → dist/contracts}/drop.d.ts +0 -0
  482. /package/{contracts → dist/contracts}/drop.d.ts.map +0 -0
  483. /package/{contracts → dist/contracts}/drop.js +0 -0
  484. /package/{contracts → dist/contracts}/drop.js.map +0 -0
  485. /package/{contracts → dist/contracts}/inbox.d.ts +0 -0
  486. /package/{contracts → dist/contracts}/inbox.d.ts.map +0 -0
  487. /package/{contracts → dist/contracts}/inbox.js +0 -0
  488. /package/{contracts → dist/contracts}/inbox.js.map +0 -0
  489. /package/{contracts → dist/contracts}/lifeops-connector-degradation.d.ts +0 -0
  490. /package/{contracts → dist/contracts}/lifeops-connector-degradation.d.ts.map +0 -0
  491. /package/{contracts → dist/contracts}/lifeops-connector-degradation.js +0 -0
  492. /package/{contracts → dist/contracts}/lifeops-connector-degradation.js.map +0 -0
  493. /package/{contracts → dist/contracts}/theme.d.ts +0 -0
  494. /package/{contracts → dist/contracts}/theme.d.ts.map +0 -0
  495. /package/{contracts → dist/contracts}/theme.js +0 -0
  496. /package/{contracts → dist/contracts}/theme.js.map +0 -0
  497. /package/{contracts → dist/contracts}/verification.d.ts +0 -0
  498. /package/{contracts → dist/contracts}/verification.d.ts.map +0 -0
  499. /package/{contracts → dist/contracts}/verification.js +0 -0
  500. /package/{contracts → dist/contracts}/verification.js.map +0 -0
  501. /package/{dev-settings-banner-style.d.ts → dist/dev-settings-banner-style.d.ts} +0 -0
  502. /package/{dev-settings-banner-style.d.ts.map → dist/dev-settings-banner-style.d.ts.map} +0 -0
  503. /package/{dev-settings-banner-style.js → dist/dev-settings-banner-style.js} +0 -0
  504. /package/{dev-settings-banner-style.js.map → dist/dev-settings-banner-style.js.map} +0 -0
  505. /package/{dev-settings-figlet-heading.d.ts → dist/dev-settings-figlet-heading.d.ts} +0 -0
  506. /package/{dev-settings-figlet-heading.d.ts.map → dist/dev-settings-figlet-heading.d.ts.map} +0 -0
  507. /package/{dev-settings-figlet-heading.js → dist/dev-settings-figlet-heading.js} +0 -0
  508. /package/{dev-settings-figlet-heading.js.map → dist/dev-settings-figlet-heading.js.map} +0 -0
  509. /package/{dev-settings-table.d.ts → dist/dev-settings-table.d.ts} +0 -0
  510. /package/{dev-settings-table.d.ts.map → dist/dev-settings-table.d.ts.map} +0 -0
  511. /package/{dev-settings-table.js → dist/dev-settings-table.js} +0 -0
  512. /package/{dev-settings-table.js.map → dist/dev-settings-table.js.map} +0 -0
  513. /package/{format-error.d.ts → dist/format-error.d.ts} +0 -0
  514. /package/{format-error.d.ts.map → dist/format-error.d.ts.map} +0 -0
  515. /package/{format-error.js → dist/format-error.js} +0 -0
  516. /package/{format-error.js.map → dist/format-error.js.map} +0 -0
  517. /package/{i18n → dist/i18n}/keyword-matching.d.ts +0 -0
  518. /package/{i18n → dist/i18n}/keyword-matching.d.ts.map +0 -0
  519. /package/{i18n → dist/i18n}/keyword-matching.js +0 -0
  520. /package/{i18n → dist/i18n}/keyword-matching.js.map +0 -0
  521. /package/{i18n → dist/i18n}/validation-keywords.d.ts +0 -0
  522. /package/{i18n → dist/i18n}/validation-keywords.d.ts.map +0 -0
  523. /package/{i18n → dist/i18n}/validation-keywords.js +0 -0
  524. /package/{i18n → dist/i18n}/validation-keywords.js.map +0 -0
  525. /package/{onboarding-presets.characters.d.ts → dist/onboarding-presets.characters.d.ts} +0 -0
  526. /package/{onboarding-presets.characters.d.ts.map → dist/onboarding-presets.characters.d.ts.map} +0 -0
  527. /package/{onboarding-presets.characters.js → dist/onboarding-presets.characters.js} +0 -0
  528. /package/{onboarding-presets.characters.js.map → dist/onboarding-presets.characters.js.map} +0 -0
  529. /package/{onboarding-presets.d.ts → dist/onboarding-presets.d.ts} +0 -0
  530. /package/{onboarding-presets.d.ts.map → dist/onboarding-presets.d.ts.map} +0 -0
  531. /package/{onboarding-presets.js → dist/onboarding-presets.js} +0 -0
  532. /package/{onboarding-presets.js.map → dist/onboarding-presets.js.map} +0 -0
  533. /package/{onboarding-presets.shared.d.ts → dist/onboarding-presets.shared.d.ts} +0 -0
  534. /package/{onboarding-presets.shared.d.ts.map → dist/onboarding-presets.shared.d.ts.map} +0 -0
  535. /package/{onboarding-presets.shared.js → dist/onboarding-presets.shared.js} +0 -0
  536. /package/{onboarding-presets.shared.js.map → dist/onboarding-presets.shared.js.map} +0 -0
  537. /package/{recent-messages-state.d.ts → dist/recent-messages-state.d.ts} +0 -0
  538. /package/{recent-messages-state.d.ts.map → dist/recent-messages-state.d.ts.map} +0 -0
  539. /package/{recent-messages-state.js → dist/recent-messages-state.js} +0 -0
  540. /package/{recent-messages-state.js.map → dist/recent-messages-state.js.map} +0 -0
  541. /package/{restart.d.ts → dist/restart.d.ts} +0 -0
  542. /package/{restart.d.ts.map → dist/restart.d.ts.map} +0 -0
  543. /package/{restart.js → dist/restart.js} +0 -0
  544. /package/{restart.js.map → dist/restart.js.map} +0 -0
  545. /package/{runtime-env.d.ts → dist/runtime-env.d.ts} +0 -0
  546. /package/{runtime-env.d.ts.map → dist/runtime-env.d.ts.map} +0 -0
  547. /package/{self-edit.d.ts → dist/self-edit.d.ts} +0 -0
  548. /package/{self-edit.d.ts.map → dist/self-edit.d.ts.map} +0 -0
  549. /package/{settings-debug.d.ts → dist/settings-debug.d.ts} +0 -0
  550. /package/{spoken-text.d.ts → dist/spoken-text.d.ts} +0 -0
  551. /package/{spoken-text.d.ts.map → dist/spoken-text.d.ts.map} +0 -0
  552. /package/{themes → dist/themes}/index.d.ts +0 -0
  553. /package/{themes → dist/themes}/index.d.ts.map +0 -0
  554. /package/{themes → dist/themes}/index.js +0 -0
  555. /package/{themes → dist/themes}/index.js.map +0 -0
  556. /package/{themes → dist/themes}/presets.d.ts +0 -0
  557. /package/{themes → dist/themes}/presets.d.ts.map +0 -0
  558. /package/{themes → dist/themes}/presets.js +0 -0
  559. /package/{themes → dist/themes}/presets.js.map +0 -0
  560. /package/{validation-keywords.d.ts → dist/validation-keywords.d.ts} +0 -0
  561. /package/{validation-keywords.d.ts.map → dist/validation-keywords.d.ts.map} +0 -0
  562. /package/{validation-keywords.js → dist/validation-keywords.js} +0 -0
  563. /package/{validation-keywords.js.map → dist/validation-keywords.js.map} +0 -0
@@ -0,0 +1,24 @@
1
+ type AssetUrlResolveOptions = {
2
+ currentUrl?: string;
3
+ baseUrl?: string;
4
+ };
5
+ /**
6
+ * Resolve an app public asset path into a URL safe across http(s), custom
7
+ * schemes, and packaged file:// runtimes.
8
+ */
9
+ export declare function resolveAppAssetUrl(assetPath: string, options?: AssetUrlResolveOptions): string;
10
+ /**
11
+ * Resolve an API path (e.g. "/api/avatar/vrm") to a full URL reachable from
12
+ * the renderer. In desktop shells the page origin is electrobun:// or
13
+ * file://, so bare /api/... paths resolve to the SPA instead of the backend.
14
+ *
15
+ * Resolution order: boot `apiBase` → shell-injected `__ELIZAOS_API_BASE__` →
16
+ * `sessionStorage` fallback. The boot config is the current client-owned
17
+ * source of truth because `client.setBaseUrl()` updates it whenever the user
18
+ * switches servers. Injection still beats stale session state from prior
19
+ * sessions, but it must not override the active runtime target once the client
20
+ * has changed it.
21
+ */
22
+ export declare function resolveApiUrl(apiPath: string): string;
23
+ export {};
24
+ //# sourceMappingURL=asset-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-url.d.ts","sourceRoot":"","sources":["../../src/utils/asset-url.ts"],"names":[],"mappings":"AAWA,KAAK,sBAAsB,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AA0EF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM,CAgCR;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYrD"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Resolve app-shipped public assets (e.g. vrms/, animations/) to runtime-safe URLs.
3
+ *
4
+ * In packaged desktop builds, the renderer can run on file:// and later navigate to
5
+ * absolute paths (e.g. /chat). Root-relative assets like /vrms/1.vrm then
6
+ * resolve to file:///vrms/1.vrm and fail. We lock the asset base URL once from
7
+ * initial startup and resolve assets against that stable base.
8
+ */
9
+ import { getBootConfig } from "../config/boot-config.js";
10
+ import { getElizaApiBase } from "./eliza-globals.js";
11
+ let cachedRuntimeBaseHref = null;
12
+ function stripLeadingPathMarkers(assetPath) {
13
+ return assetPath
14
+ .trim()
15
+ .replace(/^\.?\//, "")
16
+ .replace(/^\/+/, "");
17
+ }
18
+ function isAlreadyAbsolute(assetPath) {
19
+ if (assetPath.startsWith("//"))
20
+ return true;
21
+ return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(assetPath);
22
+ }
23
+ function normalizeBaseHref(baseHref) {
24
+ return baseHref.endsWith("/") ? baseHref : `${baseHref}/`;
25
+ }
26
+ function inferBaseForUrl(url) {
27
+ if (url.protocol !== "file:")
28
+ return "/";
29
+ const pathname = url.pathname || "/";
30
+ if (pathname.endsWith("/"))
31
+ return pathname;
32
+ const lastSlash = pathname.lastIndexOf("/");
33
+ if (lastSlash < 0)
34
+ return "/";
35
+ const tail = pathname.slice(lastSlash + 1);
36
+ // If the path ends in a file name, use that file's directory.
37
+ if (tail.includes("."))
38
+ return pathname.slice(0, lastSlash + 1) || "/";
39
+ return "/";
40
+ }
41
+ /**
42
+ * For http/https origins (web + Electrobun dev static server) the static asset
43
+ * root is always the origin root. We must NOT honor Vite's `base: "./"` here
44
+ * because relative resolution against the current SPA route URL produces
45
+ * `/apps/app-heroes/...` etc., which the SPA's catch-all returns HTML for —
46
+ * silently breaking <img> tags via decode errors.
47
+ */
48
+ function shouldIgnoreViteBase(url) {
49
+ return url.protocol === "http:" || url.protocol === "https:";
50
+ }
51
+ function computeBaseHref(currentUrl, baseUrl) {
52
+ const current = new URL(currentUrl);
53
+ const explicit = baseUrl?.trim();
54
+ const base = explicit && !shouldIgnoreViteBase(current)
55
+ ? explicit
56
+ : inferBaseForUrl(current);
57
+ return new URL(base, current).href;
58
+ }
59
+ function runtimeBaseHref() {
60
+ if (cachedRuntimeBaseHref)
61
+ return cachedRuntimeBaseHref;
62
+ if (typeof window === "undefined")
63
+ return null;
64
+ const href = window.location?.href;
65
+ if (typeof href !== "string" || !href)
66
+ return null;
67
+ try {
68
+ const viteBaseUrl = import.meta.env
69
+ ?.BASE_URL;
70
+ cachedRuntimeBaseHref = computeBaseHref(href, viteBaseUrl);
71
+ return cachedRuntimeBaseHref;
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ /**
78
+ * Resolve an app public asset path into a URL safe across http(s), custom
79
+ * schemes, and packaged file:// runtimes.
80
+ */
81
+ export function resolveAppAssetUrl(assetPath, options) {
82
+ if (!assetPath)
83
+ return assetPath;
84
+ if (isAlreadyAbsolute(assetPath))
85
+ return assetPath;
86
+ const normalized = stripLeadingPathMarkers(assetPath);
87
+ if (!normalized)
88
+ return normalized;
89
+ const configuredBaseUrl = getBootConfig().assetBaseUrl?.trim();
90
+ if (configuredBaseUrl) {
91
+ try {
92
+ return new URL(normalized, normalizeBaseHref(configuredBaseUrl)).toString();
93
+ }
94
+ catch {
95
+ // Fall through to local runtime resolution when the configured CDN base is invalid.
96
+ }
97
+ }
98
+ if (options?.currentUrl) {
99
+ try {
100
+ const baseHref = computeBaseHref(options.currentUrl, options.baseUrl);
101
+ return new URL(normalized, baseHref).toString();
102
+ }
103
+ catch {
104
+ return `/${normalized}`;
105
+ }
106
+ }
107
+ const baseHref = runtimeBaseHref();
108
+ if (!baseHref)
109
+ return `/${normalized}`;
110
+ return new URL(normalized, baseHref).toString();
111
+ }
112
+ /** Keep in sync with `ElizaClient` SESSION_STORAGE_API_BASE_KEY. */
113
+ const ELIZA_API_BASE_SESSION_KEY = "elizaos_api_base";
114
+ function readSessionStorageApiBase() {
115
+ try {
116
+ if (typeof window === "undefined")
117
+ return undefined;
118
+ const raw = window.sessionStorage.getItem(ELIZA_API_BASE_SESSION_KEY);
119
+ const trimmed = raw?.trim();
120
+ return trimmed && trimmed.length > 0 ? trimmed : undefined;
121
+ }
122
+ catch {
123
+ return undefined;
124
+ }
125
+ }
126
+ /**
127
+ * Resolve an API path (e.g. "/api/avatar/vrm") to a full URL reachable from
128
+ * the renderer. In desktop shells the page origin is electrobun:// or
129
+ * file://, so bare /api/... paths resolve to the SPA instead of the backend.
130
+ *
131
+ * Resolution order: boot `apiBase` → shell-injected `__ELIZAOS_API_BASE__` →
132
+ * `sessionStorage` fallback. The boot config is the current client-owned
133
+ * source of truth because `client.setBaseUrl()` updates it whenever the user
134
+ * switches servers. Injection still beats stale session state from prior
135
+ * sessions, but it must not override the active runtime target once the client
136
+ * has changed it.
137
+ */
138
+ export function resolveApiUrl(apiPath) {
139
+ const bootRaw = getBootConfig().apiBase?.trim();
140
+ const boot = bootRaw && bootRaw.length > 0 ? bootRaw : undefined;
141
+ const injectedRaw = getElizaApiBase()?.trim();
142
+ const injected = injectedRaw && injectedRaw.length > 0 ? injectedRaw : undefined;
143
+ const stored = readSessionStorageApiBase();
144
+ const base = boot ?? injected ?? stored;
145
+ if (!base)
146
+ return apiPath;
147
+ const normalized = base.replace(/\/+$/, "");
148
+ const suffix = apiPath.startsWith("/") ? apiPath : `/${apiPath}`;
149
+ return `${normalized}${suffix}`;
150
+ }
151
+ //# sourceMappingURL=asset-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-url.js","sourceRoot":"","sources":["../../src/utils/asset-url.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAOrD,IAAI,qBAAqB,GAAkB,IAAI,CAAC;AAEhD,SAAS,uBAAuB,CAAC,SAAiB;IAChD,OAAO,SAAS;SACb,IAAI,EAAE;SACN,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,GAAQ;IAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,GAAG,CAAC;IAEzC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;IACrC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE5C,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAE9B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC3C,8DAA8D;IAC9D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;IAEvE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,GAAQ;IACpC,OAAO,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAC/D,CAAC;AAED,SAAS,eAAe,CAAC,UAAkB,EAAE,OAAgB;IAC3D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IACjC,MAAM,IAAI,GACR,QAAQ,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;QACxC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,qBAAqB;QAAE,OAAO,qBAAqB,CAAC;IACxD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAE/C,MAAM,IAAI,GAAI,MAAM,CAAC,QAA2C,EAAE,IAAI,CAAC;IACvE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,WAAW,GAAI,MAAM,CAAC,IAAwC,CAAC,GAAG;YACtE,EAAE,QAAQ,CAAC;QACb,qBAAqB,GAAG,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC3D,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,OAAgC;IAEhC,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,iBAAiB,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnD,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU;QAAE,OAAO,UAAU,CAAC;IAEnC,MAAM,iBAAiB,GAAG,aAAa,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAC/D,IAAI,iBAAiB,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CACZ,UAAU,EACV,iBAAiB,CAAC,iBAAiB,CAAC,CACrC,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,oFAAoF;QACtF,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACtE,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,UAAU,EAAE,CAAC;IAEvC,OAAO,IAAI,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,oEAAoE;AACpE,MAAM,0BAA0B,GAAG,kBAAkB,CAAC;AAEtD,SAAS,yBAAyB;IAChC,IAAI,CAAC;QACH,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;QAC5B,OAAO,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IAChD,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,WAAW,GAAG,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GACZ,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,MAAM,GAAG,yBAAyB,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI,MAAM,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IACjE,OAAO,GAAG,UAAU,GAAG,MAAM,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function stripAssistantStageDirections(input: string): string;
2
+ //# sourceMappingURL=assistant-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-text.d.ts","sourceRoot":"","sources":["../../src/utils/assistant-text.ts"],"names":[],"mappings":"AA8KA,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnE"}
@@ -0,0 +1,168 @@
1
+ const STAGE_DIRECTION_FIRST_WORDS = new Set([
2
+ "beam",
3
+ "beams",
4
+ "beaming",
5
+ "blink",
6
+ "blinks",
7
+ "blinking",
8
+ "blush",
9
+ "blushes",
10
+ "blushing",
11
+ "bow",
12
+ "bows",
13
+ "bowing",
14
+ "breathe",
15
+ "breathes",
16
+ "breathing",
17
+ "cheer",
18
+ "cheers",
19
+ "cheering",
20
+ "chuckle",
21
+ "chuckles",
22
+ "chuckling",
23
+ "clap",
24
+ "claps",
25
+ "clapping",
26
+ "cry",
27
+ "cries",
28
+ "crying",
29
+ "curtsy",
30
+ "curtsies",
31
+ "curtsying",
32
+ "dance",
33
+ "dances",
34
+ "dancing",
35
+ "frown",
36
+ "frowns",
37
+ "frowning",
38
+ "gasp",
39
+ "gasps",
40
+ "gasping",
41
+ "gesture",
42
+ "gestures",
43
+ "gesturing",
44
+ "giggle",
45
+ "giggles",
46
+ "giggling",
47
+ "glance",
48
+ "glances",
49
+ "glancing",
50
+ "grin",
51
+ "grins",
52
+ "grinning",
53
+ "laugh",
54
+ "laughs",
55
+ "laughing",
56
+ "lean",
57
+ "leans",
58
+ "leaning",
59
+ "look",
60
+ "looks",
61
+ "looking",
62
+ "nod",
63
+ "nods",
64
+ "nodding",
65
+ "pause",
66
+ "pauses",
67
+ "pausing",
68
+ "point",
69
+ "points",
70
+ "pointing",
71
+ "pose",
72
+ "poses",
73
+ "posing",
74
+ "pout",
75
+ "pouts",
76
+ "pouting",
77
+ "raise",
78
+ "raises",
79
+ "raising",
80
+ "shrug",
81
+ "shrugs",
82
+ "shrugging",
83
+ "sigh",
84
+ "sighs",
85
+ "sighing",
86
+ "smile",
87
+ "smiles",
88
+ "smiling",
89
+ "smirk",
90
+ "smirks",
91
+ "smirking",
92
+ "spin",
93
+ "spins",
94
+ "spinning",
95
+ "stare",
96
+ "stares",
97
+ "staring",
98
+ "stretch",
99
+ "stretches",
100
+ "stretching",
101
+ "sway",
102
+ "sways",
103
+ "swaying",
104
+ "tilt",
105
+ "tilts",
106
+ "tilting",
107
+ "wave",
108
+ "waves",
109
+ "waving",
110
+ "whisper",
111
+ "whispers",
112
+ "whispering",
113
+ "wink",
114
+ "winks",
115
+ "winking",
116
+ "yawn",
117
+ "yawns",
118
+ "yawning",
119
+ ]);
120
+ function collapseInlineWhitespace(input) {
121
+ return input.replace(/[ \t]+/g, " ").trim();
122
+ }
123
+ function looksLikeStageDirection(input) {
124
+ const normalized = collapseInlineWhitespace(input).trim();
125
+ if (!normalized || normalized.length > 100)
126
+ return false;
127
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: intentional ASCII-range check to reject non-ASCII input
128
+ if (/[^\x00-\x7F]/.test(normalized)) {
129
+ return false;
130
+ }
131
+ const wordMatch = normalized.match(/^[^\w]*([A-Za-z]+)/);
132
+ if (!wordMatch)
133
+ return false;
134
+ const firstWord = wordMatch[1].toLowerCase();
135
+ return STAGE_DIRECTION_FIRST_WORDS.has(firstWord);
136
+ }
137
+ function stripWrappedStageDirections(input, pattern) {
138
+ return input.replace(pattern, (match, inner, offset, source) => {
139
+ const prev = source[offset - 1] ?? "";
140
+ const next = source[offset + match.length] ?? "";
141
+ const hasSafeLeftBoundary = offset === 0 || /[\s([{>"'“‘.!?,;:-]/.test(prev);
142
+ const hasSafeRightBoundary = offset + match.length >= source.length ||
143
+ /[\s)\]}<"'”’.!?,;:-]/.test(next);
144
+ if (!hasSafeLeftBoundary ||
145
+ !hasSafeRightBoundary ||
146
+ !looksLikeStageDirection(inner)) {
147
+ return match;
148
+ }
149
+ return " ";
150
+ });
151
+ }
152
+ function tidyAssistantTextSpacing(input) {
153
+ const safe = input.length > 200_000 ? input.slice(0, 200_000) : input;
154
+ return safe
155
+ .replace(/[ \t]+\n/g, "\n")
156
+ .replace(/\n[ \t]+/g, "\n")
157
+ .replace(/[ \t]{2,}/g, " ")
158
+ .replace(/ ?([,.;!?])/g, "$1")
159
+ .replace(/\(\s+/g, "(")
160
+ .replace(/\s+\)/g, ")");
161
+ }
162
+ export function stripAssistantStageDirections(input) {
163
+ let normalized = input;
164
+ normalized = stripWrappedStageDirections(normalized, /\*([^*\n]+)\*/g);
165
+ normalized = stripWrappedStageDirections(normalized, /_([^_\n]+)_/g);
166
+ return tidyAssistantTextSpacing(normalized);
167
+ }
168
+ //# sourceMappingURL=assistant-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant-text.js","sourceRoot":"","sources":["../../src/utils/assistant-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Typed contract for the in-tab kit installed by BROWSER_TAB_PRELOAD_SCRIPT.
3
+ *
4
+ * The kit lives at `window.__elizaTabKit` inside every <electrobun-webview>
5
+ * tab and provides:
6
+ * - a visual cursor overlay the user sees moving as the agent works,
7
+ * - faithful pointer-event sequences (vs the bare `element.click()` of the
8
+ * legacy command path),
9
+ * - keyboard-accurate typing that triggers React controlled-input change
10
+ * detection.
11
+ *
12
+ * The host (running in the main webview) calls these via short
13
+ * `tag.executeJavascript(...)` snippets that reference `window.__elizaTabKit.*`.
14
+ * The original `__elizaTabExec(requestId, script)` channel is unchanged — the
15
+ * kit is additive.
16
+ *
17
+ * Synthetic events have `isTrusted === false` (not forge-able from script).
18
+ * That's acceptable for React-driven sites and most Web3 UIs; sites that
19
+ * specifically gate on `isTrusted` (rare) cannot be driven this way and need
20
+ * the real CDP path (deferred future work).
21
+ */
22
+ export interface BrowserTabKitCursorPoint {
23
+ x: number;
24
+ y: number;
25
+ }
26
+ export interface BrowserTabKitMoveOptions {
27
+ /** Animation duration in ms; defaults to 220. */
28
+ durationMs?: number;
29
+ }
30
+ export interface BrowserTabKitDispatchOptions {
31
+ /** Center of the click in viewport CSS pixels. Defaults to element center. */
32
+ x?: number;
33
+ y?: number;
34
+ /** Mouse button: 0 = primary, 1 = middle, 2 = secondary. Default 0. */
35
+ button?: 0 | 1 | 2;
36
+ /** True for double-click semantics. */
37
+ doubleClick?: boolean;
38
+ }
39
+ export interface BrowserTabKitTypeOptions {
40
+ /** Per-character delay in ms (uniform). Defaults to 18. */
41
+ perCharDelayMs?: number;
42
+ /** True to clear the existing value first. */
43
+ replace?: boolean;
44
+ }
45
+ /**
46
+ * Fully-formed RPC surface attached to `window.__elizaTabKit` inside every
47
+ * agent-driven tab. Methods are async (returning Promise) when they involve
48
+ * animation or fetch; sync otherwise.
49
+ */
50
+ export interface BrowserTabKit {
51
+ cursor: {
52
+ moveTo: (target: BrowserTabKitCursorPoint, options?: BrowserTabKitMoveOptions) => Promise<void>;
53
+ click: (target: BrowserTabKitCursorPoint) => Promise<void>;
54
+ highlight: (element: Element, durationMs?: number) => void;
55
+ show: () => void;
56
+ hide: () => void;
57
+ };
58
+ dispatchPointerSequence: (target: Element, options?: BrowserTabKitDispatchOptions) => Promise<void>;
59
+ typeRealistic: (target: Element, text: string, options?: BrowserTabKitTypeOptions) => Promise<void>;
60
+ /**
61
+ * Populate an `<input type=file>` from a URL or data: URI by fetching the
62
+ * bytes, wrapping them in a File, and assigning via DataTransfer. Real
63
+ * browser file inputs cannot be set from script otherwise — security
64
+ * sandbox blocks direct .files assignment of arbitrary paths. DataTransfer
65
+ * is the standard workaround that fires the file's `change` event.
66
+ */
67
+ setFileInput: (target: HTMLInputElement, url: string, options?: {
68
+ fileName?: string;
69
+ mimeType?: string;
70
+ }) => Promise<{
71
+ name: string;
72
+ size: number;
73
+ type: string;
74
+ }>;
75
+ }
76
+ declare global {
77
+ interface Window {
78
+ __elizaTabKit?: BrowserTabKit;
79
+ }
80
+ }
81
+ //# sourceMappingURL=browser-tab-kit-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-tab-kit-types.d.ts","sourceRoot":"","sources":["../../src/utils/browser-tab-kit-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,wBAAwB;IACvC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,wBAAwB;IACvC,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,8EAA8E;IAC9E,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,uEAAuE;IACvE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,uCAAuC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE;QACN,MAAM,EAAE,CACN,MAAM,EAAE,wBAAwB,EAChC,OAAO,CAAC,EAAE,wBAAwB,KAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,KAAK,EAAE,CAAC,MAAM,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3D,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3D,IAAI,EAAE,MAAM,IAAI,CAAC;QACjB,IAAI,EAAE,MAAM,IAAI,CAAC;KAClB,CAAC;IACF,uBAAuB,EAAE,CACvB,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,4BAA4B,KACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,aAAa,EAAE,CACb,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,wBAAwB,KAC/B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;;;OAMG;IACH,YAAY,EAAE,CACZ,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KAC/C,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,aAAa,CAAC,EAAE,aAAa,CAAC;KAC/B;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Typed contract for the in-tab kit installed by BROWSER_TAB_PRELOAD_SCRIPT.
3
+ *
4
+ * The kit lives at `window.__elizaTabKit` inside every <electrobun-webview>
5
+ * tab and provides:
6
+ * - a visual cursor overlay the user sees moving as the agent works,
7
+ * - faithful pointer-event sequences (vs the bare `element.click()` of the
8
+ * legacy command path),
9
+ * - keyboard-accurate typing that triggers React controlled-input change
10
+ * detection.
11
+ *
12
+ * The host (running in the main webview) calls these via short
13
+ * `tag.executeJavascript(...)` snippets that reference `window.__elizaTabKit.*`.
14
+ * The original `__elizaTabExec(requestId, script)` channel is unchanged — the
15
+ * kit is additive.
16
+ *
17
+ * Synthetic events have `isTrusted === false` (not forge-able from script).
18
+ * That's acceptable for React-driven sites and most Web3 UIs; sites that
19
+ * specifically gate on `isTrusted` (rare) cannot be driven this way and need
20
+ * the real CDP path (deferred future work).
21
+ */
22
+ export {};
23
+ //# sourceMappingURL=browser-tab-kit-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-tab-kit-types.js","sourceRoot":"","sources":["../../src/utils/browser-tab-kit-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Window-global handshake between the BrowserWorkspaceView React component
3
+ * (which owns the live <electrobun-webview> tag refs) and the Electrobun
4
+ * preload bridge (which holds the Electroview RPC handlers that bun calls
5
+ * into for evaluate/snapshot on a tab).
6
+ *
7
+ * Mirror of the type declared in
8
+ * platforms/electrobun/src/bridge/browser-tabs-renderer-registry.ts — both
9
+ * read/write the same `window.__ELIZA_BROWSER_TABS_REGISTRY__` key.
10
+ */
11
+ export type BrowserTabsRendererImpl = {
12
+ evaluate: (id: string, script: string, timeoutMs: number) => Promise<{
13
+ ok: boolean;
14
+ result?: unknown;
15
+ error?: string;
16
+ }>;
17
+ getTabRect: (id: string) => Promise<{
18
+ x: number;
19
+ y: number;
20
+ width: number;
21
+ height: number;
22
+ } | null>;
23
+ };
24
+ declare const REGISTRY_KEY: "__ELIZA_BROWSER_TABS_REGISTRY__";
25
+ /**
26
+ * Preload script string injected into every <electrobun-webview> tab so the
27
+ * host page (running in the main webview) can request a script evaluation
28
+ * via tag.executeJavascript and receive the result back via the
29
+ * `host-message` event channel.
30
+ *
31
+ * Runs inside the OOPIF (the tab's content) before any page scripts. Two
32
+ * surfaces are installed:
33
+ *
34
+ * 1. `window.__elizaTabExec(requestId, script)` — the eval-bridge entry
35
+ * that the renderer uses for arbitrary script evaluation. Results
36
+ * return via `__electrobunSendToHost`. `__electrobunSendToHost`
37
+ * JSON-stringifies the payload, so we pre-clone via
38
+ * `JSON.parse(JSON.stringify(...))` to surface unserializable results
39
+ * as a structured `{ __unserializable, type, repr }` marker rather
40
+ * than letting the native send silently drop them or throw.
41
+ *
42
+ * 2. `window.__elizaTabKit` — see browser-tab-kit-types.ts. Visual cursor
43
+ * overlay + faithful pointer-event sequences + React-compatible
44
+ * typing. Used by the agent's realistic-* subactions so the user can
45
+ * watch the cursor move and so events fire correctly on controlled
46
+ * inputs.
47
+ */
48
+ export declare const BROWSER_TAB_PRELOAD_SCRIPT = "\n(() => {\n const send = (payload) => {\n try {\n if (typeof window.__electrobunSendToHost === \"function\") {\n window.__electrobunSendToHost(payload);\n }\n } catch (_err) {\n // No fallback \u2014 if the host bridge is missing, swallow.\n }\n };\n\n const describeValue = (value) => {\n if (value === null) return \"null\";\n const t = typeof value;\n if (t !== \"object\") return t;\n try {\n const ctor = value && value.constructor && value.constructor.name;\n return ctor || \"object\";\n } catch {\n return \"object\";\n }\n };\n\n const toCloneable = (value) => {\n if (value === undefined) return undefined;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch (_err) {\n let repr;\n try {\n repr = String(value);\n } catch {\n repr = \"[unprintable value]\";\n }\n return {\n __unserializable: true,\n type: describeValue(value),\n repr,\n };\n }\n };\n\n window.__elizaTabExec = (requestId, script) => {\n let value;\n try {\n // Indirect eval gives the script the global scope, matching the\n // behaviour of webview.executeJavascript on a top-level webview.\n value = (0, eval)(script);\n } catch (err) {\n send({\n type: \"__elizaTabExecResult\",\n requestId,\n ok: false,\n error: err && err.message ? String(err.message) : String(err),\n });\n return;\n }\n\n Promise.resolve(value)\n .then((resolved) => {\n send({\n type: \"__elizaTabExecResult\",\n requestId,\n ok: true,\n result: toCloneable(resolved),\n });\n })\n .catch((err) => {\n send({\n type: \"__elizaTabExecResult\",\n requestId,\n ok: false,\n error: err && err.message ? String(err.message) : String(err),\n });\n });\n };\n\n // \u2500\u2500 Visual cursor + realistic event kit \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Installed lazily to avoid touching the DOM before the page is ready.\n // Idempotent \u2014 re-running just returns the existing kit.\n let kit = null;\n const ensureKit = () => {\n if (kit) return kit;\n if (!document || !document.documentElement) return null;\n\n let cursorRoot = null;\n let cursorVisible = false;\n let cursorPos = { x: 0, y: 0 };\n let activeAnim = 0;\n\n const easeOut = (t) => {\n // Approximation of cubic-bezier(.22,.61,.36,1) \u2014 a brief ease-out.\n const c = 1 - t;\n return 1 - c * c * c;\n };\n\n const buildCursorRoot = () => {\n const root = document.createElement(\"div\");\n root.setAttribute(\"aria-hidden\", \"true\");\n root.setAttribute(\"data-eliza-cursor\", \"1\");\n root.style.cssText = [\n \"position:fixed\",\n \"left:0\",\n \"top:0\",\n \"width:0\",\n \"height:0\",\n \"pointer-events:none\",\n \"z-index:2147483647\",\n \"display:none\",\n \"transform:translate3d(0,0,0)\",\n \"will-change:transform\",\n ].join(\";\");\n // Inline SVG arrow + ripple ring. The arrow uses a soft drop-shadow\n // so it stays visible against any page background.\n root.innerHTML = [\n \"<svg width='28' height='28' viewBox='0 0 28 28' style='display:block;filter:drop-shadow(0 1px 2px rgba(0,0,0,0.45));'>\",\n \" <path d='M3 2 L3 22 L9 16 L13 25 L16 23 L12 14 L20 14 Z' fill='#ffffff' stroke='#111111' stroke-width='1' stroke-linejoin='round'/>\",\n \"</svg>\",\n \"<div data-eliza-cursor-ripple style='position:absolute;left:-12px;top:-12px;width:24px;height:24px;border-radius:50%;border:2px solid #38bdf8;opacity:0;transform:scale(0.4);transition:transform 220ms ease-out, opacity 220ms ease-out;pointer-events:none;'></div>\",\n ].join(\"\");\n return root;\n };\n\n const ensureCursorRoot = () => {\n if (cursorRoot && cursorRoot.isConnected) return cursorRoot;\n cursorRoot = buildCursorRoot();\n document.documentElement.appendChild(cursorRoot);\n return cursorRoot;\n };\n\n const showCursor = () => {\n cursorVisible = true;\n const root = ensureCursorRoot();\n root.style.display = \"block\";\n };\n const hideCursor = () => {\n cursorVisible = false;\n if (cursorRoot) cursorRoot.style.display = \"none\";\n };\n\n const placeCursor = (x, y) => {\n cursorPos = { x, y };\n const root = ensureCursorRoot();\n root.style.transform = \"translate3d(\" + x + \"px,\" + y + \"px,0)\";\n };\n\n const moveTo = (target, options) =>\n new Promise((resolve) => {\n const root = ensureCursorRoot();\n if (!cursorVisible) {\n showCursor();\n // Snap to current pos so the first move animates from where we are.\n placeCursor(cursorPos.x || target.x, cursorPos.y || target.y);\n }\n const startX = cursorPos.x;\n const startY = cursorPos.y;\n const endX = target.x;\n const endY = target.y;\n const dur = Math.max(40, Math.min(2000, (options && options.durationMs) || 220));\n const startedAt = performance.now();\n const animId = ++activeAnim;\n const step = (now) => {\n if (animId !== activeAnim) return; // Superseded by another move.\n const t = Math.min(1, (now - startedAt) / dur);\n const eased = easeOut(t);\n placeCursor(startX + (endX - startX) * eased, startY + (endY - startY) * eased);\n if (t < 1) {\n requestAnimationFrame(step);\n } else {\n resolve();\n }\n };\n requestAnimationFrame(step);\n });\n\n const playRipple = () => {\n const root = ensureCursorRoot();\n const ripple = root.querySelector(\"[data-eliza-cursor-ripple]\");\n if (!ripple) return;\n ripple.style.transition = \"none\";\n ripple.style.opacity = \"0.85\";\n ripple.style.transform = \"scale(0.4)\";\n // Force layout so the next frame animates.\n void ripple.offsetWidth;\n ripple.style.transition = \"transform 320ms ease-out, opacity 320ms ease-out\";\n ripple.style.opacity = \"0\";\n ripple.style.transform = \"scale(1.6)\";\n };\n\n const clickAt = (target) => moveTo(target).then(() => {\n playRipple();\n });\n\n const highlight = (element, durationMs) => {\n if (!element || !element.style) return;\n const prevOutline = element.style.outline;\n const prevOutlineOffset = element.style.outlineOffset;\n const prevTransition = element.style.transition;\n element.style.transition = \"outline-color 180ms ease-out\";\n element.style.outline = \"2px solid #38bdf8\";\n element.style.outlineOffset = \"2px\";\n const dur = Math.max(120, Math.min(2000, durationMs || 360));\n setTimeout(() => {\n element.style.outline = prevOutline;\n element.style.outlineOffset = prevOutlineOffset;\n element.style.transition = prevTransition;\n }, dur);\n };\n\n const elementCenter = (element) => {\n const rect = element.getBoundingClientRect();\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n };\n };\n\n const fireMouseEvent = (target, type, x, y, button, buttons) => {\n // view is intentionally omitted \u2014 JSDOM rejects window references at\n // construction time, real browsers fill view in during dispatch, and\n // React synthetic events don't depend on it.\n const event = new MouseEvent(type, {\n bubbles: true,\n cancelable: true,\n composed: true,\n button: button,\n buttons: buttons,\n clientX: x,\n clientY: y,\n screenX: x,\n screenY: y,\n });\n target.dispatchEvent(event);\n };\n\n const firePointerEvent = (target, type, x, y, button, buttons) => {\n let event;\n try {\n event = new PointerEvent(type, {\n bubbles: true,\n cancelable: true,\n composed: true,\n pointerId: 1,\n pointerType: \"mouse\",\n isPrimary: true,\n button: button,\n buttons: buttons,\n clientX: x,\n clientY: y,\n screenX: x,\n screenY: y,\n });\n } catch (_err) {\n // Older WebKit may not have PointerEvent; fall back to mouse only.\n return;\n }\n target.dispatchEvent(event);\n };\n\n const dispatchPointerSequence = (target, options) => {\n if (!target) return Promise.resolve();\n const opts = options || {};\n const center = elementCenter(target);\n const x = typeof opts.x === \"number\" ? opts.x : center.x;\n const y = typeof opts.y === \"number\" ? opts.y : center.y;\n const button = typeof opts.button === \"number\" ? opts.button : 0;\n\n return moveTo({ x: x, y: y }).then(() => {\n firePointerEvent(target, \"pointerover\", x, y, button, 0);\n fireMouseEvent(target, \"mouseover\", x, y, button, 0);\n firePointerEvent(target, \"pointermove\", x, y, button, 0);\n fireMouseEvent(target, \"mousemove\", x, y, button, 0);\n firePointerEvent(target, \"pointerdown\", x, y, button, 1);\n fireMouseEvent(target, \"mousedown\", x, y, button, 1);\n // Most form controls expect focus between mousedown and click.\n if (typeof target.focus === \"function\") {\n try { target.focus({ preventScroll: true }); } catch (_e) { try { target.focus(); } catch (_e2) {} }\n }\n firePointerEvent(target, \"pointerup\", x, y, button, 0);\n fireMouseEvent(target, \"mouseup\", x, y, button, 0);\n fireMouseEvent(target, \"click\", x, y, button, 0);\n if (opts.doubleClick) {\n fireMouseEvent(target, \"dblclick\", x, y, button, 0);\n }\n playRipple();\n });\n };\n\n // React's controlled inputs check the value setter against the\n // prototype's own descriptor to detect \"real\" user input. Mutating\n // .value directly bypasses that. This helper sets value via the\n // prototype descriptor so React/Preact/Solid all see the change.\n const setNativeValue = (element, value) => {\n const proto = Object.getPrototypeOf(element);\n const protoDesc = proto ? Object.getOwnPropertyDescriptor(proto, \"value\") : null;\n const ownDesc = Object.getOwnPropertyDescriptor(element, \"value\");\n if (protoDesc && protoDesc.set && (!ownDesc || ownDesc.set !== protoDesc.set)) {\n protoDesc.set.call(element, value);\n } else {\n element.value = value;\n }\n };\n\n const fireKey = (target, type, key) => {\n const isChar = key.length === 1;\n const code = isChar\n ? (/[a-z]/i.test(key) ? \"Key\" + key.toUpperCase() : (\"Digit\" + key))\n : key;\n const init = {\n key: key,\n code: code,\n bubbles: true,\n cancelable: true,\n composed: true,\n };\n try {\n target.dispatchEvent(new KeyboardEvent(type, init));\n } catch (_err) {\n // KeyboardEvent always exists in modern browsers; ignore.\n }\n };\n\n const typeRealistic = (target, text, options) => {\n if (!target) return Promise.resolve();\n const opts = options || {};\n const delay = Math.max(0, Math.min(200, typeof opts.perCharDelayMs === \"number\" ? opts.perCharDelayMs : 18));\n try { target.focus({ preventScroll: true }); } catch (_e) { try { target.focus(); } catch (_e2) {} }\n if (opts.replace) {\n try {\n if (typeof target.setSelectionRange === \"function\") {\n target.setSelectionRange(0, (target.value || \"\").length);\n }\n } catch (_e) {}\n setNativeValue(target, \"\");\n target.dispatchEvent(new Event(\"input\", { bubbles: true, composed: true }));\n }\n\n const chars = Array.from(text);\n let index = 0;\n const sleep = (ms) => new Promise((r) => setTimeout(r, ms));\n\n const stepOne = () => {\n if (index >= chars.length) return Promise.resolve();\n const ch = chars[index++];\n fireKey(target, \"keydown\", ch);\n try {\n target.dispatchEvent(new InputEvent(\"beforeinput\", { bubbles: true, cancelable: true, composed: true, data: ch, inputType: \"insertText\" }));\n } catch (_e) {}\n const next = (target.value || \"\") + ch;\n setNativeValue(target, next);\n try {\n target.dispatchEvent(new InputEvent(\"input\", { bubbles: true, composed: true, data: ch, inputType: \"insertText\" }));\n } catch (_e) {\n target.dispatchEvent(new Event(\"input\", { bubbles: true, composed: true }));\n }\n fireKey(target, \"keyup\", ch);\n if (delay > 0) return sleep(delay).then(stepOne);\n return Promise.resolve().then(stepOne);\n };\n\n return stepOne().then(() => {\n target.dispatchEvent(new Event(\"change\", { bubbles: true, composed: true }));\n });\n };\n\n const setFileInput = async (target, url, options) => {\n if (!target || target.tagName !== \"INPUT\" || target.type !== \"file\") {\n throw new Error(\"setFileInput requires an HTMLInputElement of type=file\");\n }\n const opts = options || {};\n const response = await fetch(url, { credentials: \"omit\" });\n if (!response.ok) {\n throw new Error(\"setFileInput fetch failed: HTTP \" + response.status);\n }\n const blob = await response.blob();\n const mimeType = opts.mimeType || blob.type || \"application/octet-stream\";\n const ext = (() => {\n if (/png/i.test(mimeType)) return \"png\";\n if (/jpe?g/i.test(mimeType)) return \"jpg\";\n if (/webp/i.test(mimeType)) return \"webp\";\n if (/gif/i.test(mimeType)) return \"gif\";\n return \"bin\";\n })();\n const fileName = opts.fileName || \"upload-\" + Date.now() + \".\" + ext;\n const file = new File([blob], fileName, { type: mimeType });\n // The DataTransfer constructor is supported in WebKit, Blink, and\n // Gecko; this is the standard \"set <input type=file> from script\"\n // workaround. Direct .files= assignment is sandbox-blocked.\n const dt = new DataTransfer();\n dt.items.add(file);\n target.files = dt.files;\n try { target.focus({ preventScroll: true }); } catch (_e) {}\n target.dispatchEvent(new Event(\"input\", { bubbles: true, composed: true }));\n target.dispatchEvent(new Event(\"change\", { bubbles: true, composed: true }));\n return { name: file.name, size: file.size, type: file.type };\n };\n\n kit = {\n cursor: {\n moveTo: moveTo,\n click: clickAt,\n highlight: highlight,\n show: showCursor,\n hide: hideCursor,\n },\n dispatchPointerSequence: dispatchPointerSequence,\n typeRealistic: typeRealistic,\n setFileInput: setFileInput,\n };\n window.__elizaTabKit = kit;\n return kit;\n };\n\n // Defer first-time installation until the document is parseable.\n if (document && document.documentElement) {\n ensureKit();\n } else if (typeof document !== \"undefined\") {\n document.addEventListener(\"DOMContentLoaded\", () => ensureKit(), { once: true });\n }\n // Also re-install after navigations within the same OOPIF (in case the\n // document was replaced and our cursor root went with it).\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"pageshow\", () => ensureKit());\n }\n\n // \u2500\u2500 Wallet provider shims \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Inject EIP-1193 (window.ethereum) and Phantom-shaped (window.solana,\n // window.phantom.solana) wallet adapters that route every call through\n // __electrobunSendToHost to the React host, which forwards to the\n // existing client.sendBrowserWalletTransaction /\n // client.sendBrowserSolanaTransaction / etc. The host calls back into\n // the tab via tag.executeJavascript(\"window.__elizaWalletReply(...)\")\n // to deliver responses.\n //\n // Without this, launchpad pages in our <electrobun-webview> tabs see no\n // wallet provider and refuse to connect.\n if (typeof window !== \"undefined\" && !window.__elizaWalletInstalled) {\n window.__elizaWalletInstalled = true;\n\n const walletPending = new Map();\n let nextWalletReq = 1;\n\n window.__elizaWalletReply = (requestId, payload) => {\n const entry = walletPending.get(requestId);\n if (!entry) return;\n walletPending.delete(requestId);\n if (payload && typeof payload === \"object\" && payload.error) {\n entry.reject(new Error(String(payload.error)));\n } else {\n entry.resolve(payload && typeof payload === \"object\" ? payload.result : payload);\n }\n };\n\n const callHost = (protocol, method, params) =>\n new Promise((resolve, reject) => {\n if (typeof window.__electrobunSendToHost !== \"function\") {\n reject(new Error(\"Wallet bridge unavailable: not running in an Eliza tab.\"));\n return;\n }\n const requestId = nextWalletReq++;\n walletPending.set(requestId, { resolve: resolve, reject: reject });\n // Include the page's origin/hostname so the host can show a\n // \"<domain> wants to ...\" consent dialog without an extra eval\n // round-trip.\n let originValue;\n let hostnameValue;\n try {\n originValue = location.origin;\n hostnameValue = location.hostname;\n } catch (_e) {\n originValue = \"\";\n hostnameValue = \"\";\n }\n window.__electrobunSendToHost({\n type: \"__elizaWalletRequest\",\n requestId: requestId,\n protocol: protocol,\n method: method,\n params: params,\n origin: originValue,\n hostname: hostnameValue,\n });\n });\n\n // \u2500\u2500 EIP-1193 \u2500\u2500\n const eventListeners = { accountsChanged: new Set(), chainChanged: new Set(), connect: new Set(), disconnect: new Set() };\n const ethereum = {\n isMetaMask: false,\n isEliza: true,\n _events: eventListeners,\n request: (args) => {\n if (!args || typeof args.method !== \"string\") {\n return Promise.reject(new Error(\"EIP-1193 request requires {method, params}\"));\n }\n return callHost(\"evm\", args.method, args.params);\n },\n enable: function () {\n return this.request({ method: \"eth_requestAccounts\" });\n },\n send: function (methodOrPayload, paramsOrCallback) {\n // Legacy send shapes \u2014 best-effort polyfill.\n if (typeof methodOrPayload === \"string\") {\n return this.request({ method: methodOrPayload, params: paramsOrCallback });\n }\n if (methodOrPayload && typeof methodOrPayload === \"object\") {\n return this.request({ method: methodOrPayload.method, params: methodOrPayload.params });\n }\n return Promise.reject(new Error(\"Unsupported send shape.\"));\n },\n sendAsync: function (payload, callback) {\n this.request({ method: payload.method, params: payload.params })\n .then((result) => callback(null, { jsonrpc: \"2.0\", id: payload.id, result: result }))\n .catch((err) => callback(err, null));\n },\n on: (event, listener) => {\n const set = eventListeners[event];\n if (set) set.add(listener);\n },\n removeListener: (event, listener) => {\n const set = eventListeners[event];\n if (set) set.delete(listener);\n },\n };\n\n window.__elizaWalletEmit = (event, payload) => {\n const set = eventListeners[event];\n if (!set) return;\n for (const listener of Array.from(set)) {\n try { listener(payload); } catch (_e) {}\n }\n };\n\n try {\n Object.defineProperty(window, \"ethereum\", {\n value: ethereum,\n writable: true,\n configurable: true,\n });\n } catch (_err) {\n // Some pages freeze window.ethereum after their wallet detected it;\n // fall back to direct assignment when defineProperty is blocked.\n try { window.ethereum = ethereum; } catch (_e) {}\n }\n\n // \u2500\u2500 Solana (Phantom-shaped) \u2500\u2500\n const solanaListeners = { connect: new Set(), disconnect: new Set(), accountChanged: new Set() };\n const makePublicKey = (base58) => {\n if (!base58) return null;\n const obj = {\n toBase58: () => base58,\n toString: () => base58,\n toBytes: () => {\n // Best-effort: many launchpads only need toBase58/toString. If\n // they do call toBytes the result will be wrong, but the lazy\n // approach avoids bundling a base58 decoder into every tab.\n // The host-side signing path receives base58 directly, so\n // round-trip transactions don't depend on this method.\n throw new Error(\"solana.publicKey.toBytes is not supported by the Eliza tab shim\");\n },\n equals: (other) => other && typeof other.toBase58 === \"function\" && other.toBase58() === base58,\n };\n return obj;\n };\n const solana = {\n isPhantom: true,\n isEliza: true,\n publicKey: null,\n isConnected: false,\n connect: async function (options) {\n const _options = options;\n const result = await callHost(\"solana\", \"connect\", null);\n if (result && typeof result.publicKey === \"string\") {\n this.publicKey = makePublicKey(result.publicKey);\n this.isConnected = true;\n for (const listener of Array.from(solanaListeners.connect)) {\n try { listener(this.publicKey); } catch (_e) {}\n }\n }\n return { publicKey: this.publicKey };\n },\n disconnect: async function () {\n this.publicKey = null;\n this.isConnected = false;\n for (const listener of Array.from(solanaListeners.disconnect)) {\n try { listener(); } catch (_e) {}\n }\n },\n signMessage: async function (message, _encoding) {\n const bytes = message instanceof Uint8Array ? message : new TextEncoder().encode(String(message));\n const messageBase64 = btoa(String.fromCharCode.apply(null, Array.from(bytes)));\n const result = await callHost(\"solana\", \"signMessage\", { messageBase64: messageBase64 });\n if (!result || typeof result.signatureBase64 !== \"string\") {\n throw new Error(\"Solana signMessage returned no signature.\");\n }\n const sig = atob(result.signatureBase64);\n const arr = new Uint8Array(sig.length);\n for (let i = 0; i < sig.length; i += 1) arr[i] = sig.charCodeAt(i);\n return { signature: arr, publicKey: this.publicKey };\n },\n signTransaction: async function (transaction) {\n const transactionBase64 = await serializeTransactionForHost(transaction);\n const result = await callHost(\"solana\", \"signTransaction\", { transactionBase64: transactionBase64 });\n if (!result || typeof result.signedTransactionBase64 !== \"string\") {\n throw new Error(\"Solana signTransaction returned no signed tx.\");\n }\n return deserializeTransactionFromHost(result.signedTransactionBase64, transaction);\n },\n signAndSendTransaction: async function (transaction) {\n const transactionBase64 = await serializeTransactionForHost(transaction);\n const result = await callHost(\"solana\", \"signAndSendTransaction\", { transactionBase64: transactionBase64 });\n if (!result || typeof result.signature !== \"string\") {\n throw new Error(\"Solana signAndSendTransaction returned no signature.\");\n }\n return { signature: result.signature };\n },\n signAllTransactions: async function (transactions) {\n const out = [];\n for (const tx of transactions) {\n out.push(await this.signTransaction(tx));\n }\n return out;\n },\n on: (event, listener) => {\n const set = solanaListeners[event];\n if (set) set.add(listener);\n },\n off: (event, listener) => {\n const set = solanaListeners[event];\n if (set) set.delete(listener);\n },\n removeListener: (event, listener) => {\n const set = solanaListeners[event];\n if (set) set.delete(listener);\n },\n };\n\n // Helper: serialize a Solana Transaction-like object to base64. We\n // accept a few common shapes \u2014 the launchpad usually hands us either\n // a VersionedTransaction (has .serialize()) or a legacy Transaction\n // (has .serialize({verifySignatures:false})).\n async function serializeTransactionForHost(transaction) {\n if (!transaction) throw new Error(\"signTransaction requires a transaction\");\n try {\n let bytes;\n if (typeof transaction.serialize === \"function\") {\n // Legacy Transaction.serialize() throws if signatures aren't\n // present yet; pass {verifySignatures:false}. VersionedTransaction\n // ignores the option so it's safe either way.\n bytes = transaction.serialize({ verifySignatures: false, requireAllSignatures: false });\n } else if (transaction instanceof Uint8Array) {\n bytes = transaction;\n } else {\n throw new Error(\"Unsupported transaction shape for Eliza wallet bridge\");\n }\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 1) binary += String.fromCharCode(bytes[i]);\n return btoa(binary);\n } catch (err) {\n throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n // Best-effort: hand the signed bytes back as the same shape the caller\n // gave us. Most callers immediately send the result to a Connection\n // which accepts a serialized buffer \u2014 passing a Uint8Array is safe.\n function deserializeTransactionFromHost(base64, _original) {\n const bin = atob(base64);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i += 1) bytes[i] = bin.charCodeAt(i);\n return bytes;\n }\n\n try {\n Object.defineProperty(window, \"solana\", {\n value: solana,\n writable: true,\n configurable: true,\n });\n } catch (_err) {\n try { window.solana = solana; } catch (_e) {}\n }\n try {\n const phantomNs = window.phantom || {};\n phantomNs.solana = solana;\n window.phantom = phantomNs;\n } catch (_err) {}\n\n // Announce the provider per EIP-6963 (https://eips.ethereum.org/EIPS/eip-6963).\n // Keys:\n // uuid \u2014 stable per-installation identifier; we use a fixed value\n // because dApps key wallet selection on it. Changing this would\n // make every dApp forget the user's previous choice.\n // rdns \u2014 reverse-DNS namespace for the wallet brand.\n // icon \u2014 data URI; the SVG below is a 24x24 monochrome \"M\" mark in\n // the brand purple (#6f5cff). Inline so we don't depend on\n // network availability for wallet-picker rendering.\n const ELIZA_WALLET_ICON =\n \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIj48cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSI2IiBmaWxsPSIjNmY1Y2ZmIi8+PHRleHQgeD0iNTAlIiB5PSI2OCUiIGZvbnQtZmFtaWx5PSItYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxzYW5zLXNlcmlmIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZmZmIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj5NPC90ZXh0Pjwvc3ZnPg==\";\n const announceEthereum = () => {\n try {\n const detail = Object.freeze({\n info: Object.freeze({\n name: \"Eliza\",\n uuid: \"ai.eliza.wallet:1\",\n icon: ELIZA_WALLET_ICON,\n rdns: \"ai.eliza.wallet\",\n }),\n provider: ethereum,\n });\n window.dispatchEvent(new CustomEvent(\"eip6963:announceProvider\", { detail: detail }));\n } catch (_err) {}\n };\n window.addEventListener(\"eip6963:requestProvider\", announceEthereum);\n setTimeout(announceEthereum, 0);\n }\n\n // \u2500\u2500 Vault autofill shim \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Detect login forms on each tab page, ask the host to look up saved\n // credentials for the current domain, and (with user consent) fill the\n // username/password inputs. Mirrors the wallet shim's request/reply\n // pattern: tab\u2192host via __electrobunSendToHost; host\u2192tab via\n // tag.executeJavascript(\"window.__elizaVaultReply(...)\").\n //\n // The host (BrowserWorkspaceView) is responsible for showing a consent\n // prompt before returning credentials. The tab never autofills without\n // a host response carrying explicit field values.\n if (typeof window !== \"undefined\" && !window.__elizaVaultInstalled) {\n window.__elizaVaultInstalled = true;\n\n const vaultPending = new Map();\n let nextVaultReq = 1;\n\n window.__elizaVaultReply = (requestId, payload) => {\n const entry = vaultPending.get(requestId);\n if (!entry) return;\n vaultPending.delete(requestId);\n try {\n if (payload && typeof payload === \"object\" && payload.error) {\n entry.reject(new Error(String(payload.error)));\n return;\n }\n entry.resolve(payload && typeof payload === \"object\" ? payload : null);\n } catch (_e) {\n // Listener errors must not bubble up into the tab page.\n }\n };\n\n function cssSelectorFor(el) {\n if (!el || el.nodeType !== 1) return null;\n if (el.id) {\n // Document.querySelector('#\u2026') only works when the id is a valid\n // selector token. For complex ids fall through to the structural\n // path so we never produce an unparsable selector.\n if (/^[A-Za-z][A-Za-z0-9_-]*$/.test(el.id)) {\n return \"#\" + el.id;\n }\n }\n const parts = [];\n let node = el;\n let depth = 0;\n while (node && node.nodeType === 1 && depth < 6) {\n let part = node.tagName.toLowerCase();\n const parent = node.parentElement;\n if (parent) {\n const sameTag = Array.from(parent.children).filter(\n (c) => c.tagName === node.tagName,\n );\n if (sameTag.length > 1) {\n const idx = sameTag.indexOf(node) + 1;\n part += \":nth-of-type(\" + idx + \")\";\n }\n }\n parts.unshift(part);\n if (parent === document.body || !parent) break;\n node = parent;\n depth += 1;\n }\n return parts.join(\" > \");\n }\n\n function findPrecedingTextInput(passwordInput) {\n // Walk previous form-field siblings/ancestors looking for a text\n // or email input that's likely the username.\n const root = passwordInput.form || document.body;\n const candidates = root.querySelectorAll(\n 'input[type=\"text\"], input[type=\"email\"], input:not([type])',\n );\n let lastBefore = null;\n for (const el of candidates) {\n if (\n el.compareDocumentPosition(passwordInput) &\n Node.DOCUMENT_POSITION_FOLLOWING\n ) {\n lastBefore = el;\n }\n }\n return lastBefore;\n }\n\n function setNativeInputValue(input, value) {\n // React (and other VDOM frameworks) overrides the value setter on\n // HTMLInputElement.prototype to track changes. Calling the prototype\n // setter directly bypasses that, then dispatching input + change\n // events re-notifies the framework so controlled inputs see the\n // update.\n const proto = Object.getPrototypeOf(input);\n const desc = Object.getOwnPropertyDescriptor(proto, \"value\");\n if (desc && typeof desc.set === \"function\") {\n desc.set.call(input, value);\n } else {\n input.value = value;\n }\n input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n\n function fillFields(fields) {\n if (!fields || typeof fields !== \"object\") return;\n for (const selector of Object.keys(fields)) {\n const value = fields[selector];\n if (typeof value !== \"string\" || value.length === 0) continue;\n let target = null;\n try {\n target = document.querySelector(selector);\n } catch (_e) {\n target = null;\n }\n if (!target) continue;\n setNativeInputValue(target, value);\n }\n }\n\n const callHost = (domain, url, fieldHints) =>\n new Promise((resolve, reject) => {\n if (typeof window.__electrobunSendToHost !== \"function\") {\n reject(\n new Error(\"Vault autofill bridge unavailable: not in an Eliza tab.\"),\n );\n return;\n }\n const requestId = nextVaultReq++;\n vaultPending.set(requestId, { resolve: resolve, reject: reject });\n window.__electrobunSendToHost({\n type: \"__elizaVaultAutofillRequest\",\n requestId: requestId,\n domain: domain,\n url: url,\n fieldHints: fieldHints,\n });\n });\n\n function scanLoginForms() {\n const passwords = document.querySelectorAll(\n 'input[type=\"password\"]:not([data-eliza-vault-scanned])',\n );\n for (const pw of passwords) {\n pw.setAttribute(\"data-eliza-vault-scanned\", \"1\");\n const form = pw.form;\n const userInput =\n (form &&\n form.querySelector(\n 'input[type=\"email\"], input[name*=\"user\" i], input[name*=\"email\" i], input[name*=\"login\" i]',\n )) ||\n findPrecedingTextInput(pw);\n const fieldHints = [];\n const pwSelector = cssSelectorFor(pw);\n if (userInput) {\n const userSelector = cssSelectorFor(userInput);\n if (userSelector) {\n fieldHints.push({ kind: \"username\", selector: userSelector });\n }\n }\n if (pwSelector) {\n fieldHints.push({ kind: \"password\", selector: pwSelector });\n }\n if (fieldHints.length === 0) continue;\n callHost(location.hostname, location.href, fieldHints)\n .then((payload) => {\n if (payload && payload.fields) fillFields(payload.fields);\n })\n .catch(() => {\n // User denied, no match, or bridge unavailable. Leave fields\n // alone so the user can type credentials manually.\n });\n }\n }\n\n let scanTimer = null;\n function ensureVaultScan() {\n if (scanTimer) clearTimeout(scanTimer);\n scanTimer = setTimeout(() => {\n scanTimer = null;\n scanLoginForms();\n }, 250);\n }\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"pageshow\", ensureVaultScan);\n }\n if (typeof MutationObserver === \"function\" && document.documentElement) {\n const obs = new MutationObserver(ensureVaultScan);\n obs.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n }\n if (document && document.readyState !== \"loading\") {\n ensureVaultScan();\n } else if (typeof document !== \"undefined\") {\n document.addEventListener(\"DOMContentLoaded\", () => ensureVaultScan(), {\n once: true,\n });\n }\n }\n})();\n";
49
+ declare global {
50
+ interface Window {
51
+ [REGISTRY_KEY]?: BrowserTabsRendererImpl;
52
+ }
53
+ }
54
+ export declare function setBrowserTabsRendererImpl(impl: BrowserTabsRendererImpl | null): void;
55
+ export {};
56
+ //# sourceMappingURL=browser-tabs-renderer-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-tabs-renderer-registry.d.ts","sourceRoot":"","sources":["../../src/utils/browser-tabs-renderer-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,CACR,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,KACd,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;QAClC,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI,CAAC,CAAC;CACX,CAAC;AAEF,QAAA,MAAM,YAAY,EAAG,iCAA0C,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,0BAA0B,40nCAo5BtC,CAAC;AAEF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,CAAC,YAAY,CAAC,CAAC,EAAE,uBAAuB,CAAC;KAC1C;CACF;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,uBAAuB,GAAG,IAAI,GACnC,IAAI,CAON"}