@elizaos/app-core 2.0.0-alpha.37

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 (1082) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/LICENSE +21 -0
  3. package/dist/App.d.ts +5 -0
  4. package/dist/App.d.ts.map +1 -0
  5. package/dist/App.js +198 -0
  6. package/dist/actions/character.d.ts +27 -0
  7. package/dist/actions/character.d.ts.map +1 -0
  8. package/dist/actions/character.js +97 -0
  9. package/dist/actions/chat-helpers.d.ts +47 -0
  10. package/dist/actions/chat-helpers.d.ts.map +1 -0
  11. package/dist/actions/chat-helpers.js +79 -0
  12. package/dist/actions/cloud.d.ts +17 -0
  13. package/dist/actions/cloud.d.ts.map +1 -0
  14. package/dist/actions/cloud.js +43 -0
  15. package/dist/actions/index.d.ts +12 -0
  16. package/dist/actions/index.d.ts.map +1 -0
  17. package/dist/actions/index.js +11 -0
  18. package/dist/actions/lifecycle.d.ts +43 -0
  19. package/dist/actions/lifecycle.d.ts.map +1 -0
  20. package/dist/actions/lifecycle.js +118 -0
  21. package/dist/actions/onboarding.d.ts +12 -0
  22. package/dist/actions/onboarding.d.ts.map +1 -0
  23. package/dist/actions/onboarding.js +28 -0
  24. package/dist/actions/triggers.d.ts +23 -0
  25. package/dist/actions/triggers.d.ts.map +1 -0
  26. package/dist/actions/triggers.js +148 -0
  27. package/dist/api/client.d.ts +2823 -0
  28. package/dist/api/client.d.ts.map +1 -0
  29. package/dist/api/client.js +2392 -0
  30. package/dist/api/index.d.ts +2 -0
  31. package/dist/api/index.d.ts.map +1 -0
  32. package/dist/api/index.js +1 -0
  33. package/dist/autonomy/index.d.ts +48 -0
  34. package/dist/autonomy/index.d.ts.map +1 -0
  35. package/dist/autonomy/index.js +330 -0
  36. package/dist/bridge/capacitor-bridge.d.ts +153 -0
  37. package/dist/bridge/capacitor-bridge.d.ts.map +1 -0
  38. package/dist/bridge/capacitor-bridge.js +193 -0
  39. package/dist/bridge/electrobun-rpc.d.ts +19 -0
  40. package/dist/bridge/electrobun-rpc.d.ts.map +1 -0
  41. package/dist/bridge/electrobun-rpc.js +27 -0
  42. package/dist/bridge/electrobun-runtime.d.ts +3 -0
  43. package/dist/bridge/electrobun-runtime.d.ts.map +1 -0
  44. package/dist/bridge/electrobun-runtime.js +17 -0
  45. package/dist/bridge/index.d.ts +6 -0
  46. package/dist/bridge/index.d.ts.map +1 -0
  47. package/dist/bridge/index.js +5 -0
  48. package/dist/bridge/native-plugins.d.ts +82 -0
  49. package/dist/bridge/native-plugins.d.ts.map +1 -0
  50. package/dist/bridge/native-plugins.js +39 -0
  51. package/dist/bridge/plugin-bridge.d.ts +116 -0
  52. package/dist/bridge/plugin-bridge.d.ts.map +1 -0
  53. package/dist/bridge/plugin-bridge.js +203 -0
  54. package/dist/bridge/storage-bridge.d.ts +39 -0
  55. package/dist/bridge/storage-bridge.d.ts.map +1 -0
  56. package/dist/bridge/storage-bridge.js +135 -0
  57. package/dist/chat/index.d.ts +57 -0
  58. package/dist/chat/index.d.ts.map +1 -0
  59. package/dist/chat/index.js +161 -0
  60. package/dist/coding/index.d.ts +25 -0
  61. package/dist/coding/index.d.ts.map +1 -0
  62. package/dist/coding/index.js +25 -0
  63. package/dist/components/AdvancedPageView.d.ts +17 -0
  64. package/dist/components/AdvancedPageView.d.ts.map +1 -0
  65. package/dist/components/AdvancedPageView.js +137 -0
  66. package/dist/components/AgentActivityBox.d.ts +7 -0
  67. package/dist/components/AgentActivityBox.d.ts.map +1 -0
  68. package/dist/components/AgentActivityBox.js +25 -0
  69. package/dist/components/ApiKeyConfig.d.ts +26 -0
  70. package/dist/components/ApiKeyConfig.d.ts.map +1 -0
  71. package/dist/components/ApiKeyConfig.js +121 -0
  72. package/dist/components/AppsPageView.d.ts +7 -0
  73. package/dist/components/AppsPageView.d.ts.map +1 -0
  74. package/dist/components/AppsPageView.js +31 -0
  75. package/dist/components/AppsView.d.ts +8 -0
  76. package/dist/components/AppsView.d.ts.map +1 -0
  77. package/dist/components/AppsView.js +149 -0
  78. package/dist/components/AvatarLoader.d.ts +9 -0
  79. package/dist/components/AvatarLoader.d.ts.map +1 -0
  80. package/dist/components/AvatarLoader.js +45 -0
  81. package/dist/components/AvatarSelector.d.ts +23 -0
  82. package/dist/components/AvatarSelector.d.ts.map +1 -0
  83. package/dist/components/AvatarSelector.js +105 -0
  84. package/dist/components/BscTradePanel.d.ts +22 -0
  85. package/dist/components/BscTradePanel.d.ts.map +1 -0
  86. package/dist/components/BscTradePanel.js +221 -0
  87. package/dist/components/BugReportModal.d.ts +2 -0
  88. package/dist/components/BugReportModal.d.ts.map +1 -0
  89. package/dist/components/BugReportModal.js +218 -0
  90. package/dist/components/CharacterView.d.ts +8 -0
  91. package/dist/components/CharacterView.d.ts.map +1 -0
  92. package/dist/components/CharacterView.js +703 -0
  93. package/dist/components/ChatAvatar.d.ts +8 -0
  94. package/dist/components/ChatAvatar.d.ts.map +1 -0
  95. package/dist/components/ChatAvatar.js +89 -0
  96. package/dist/components/ChatComposer.d.ts +37 -0
  97. package/dist/components/ChatComposer.d.ts.map +1 -0
  98. package/dist/components/ChatComposer.js +136 -0
  99. package/dist/components/ChatMessage.d.ts +24 -0
  100. package/dist/components/ChatMessage.d.ts.map +1 -0
  101. package/dist/components/ChatMessage.js +167 -0
  102. package/dist/components/ChatModalView.d.ts +10 -0
  103. package/dist/components/ChatModalView.d.ts.map +1 -0
  104. package/dist/components/ChatModalView.js +57 -0
  105. package/dist/components/ChatView.d.ts +14 -0
  106. package/dist/components/ChatView.d.ts.map +1 -0
  107. package/dist/components/ChatView.js +511 -0
  108. package/dist/components/CloudSourceControls.d.ts +13 -0
  109. package/dist/components/CloudSourceControls.d.ts.map +1 -0
  110. package/dist/components/CloudSourceControls.js +14 -0
  111. package/dist/components/CodingAgentSettingsSection.d.ts +2 -0
  112. package/dist/components/CodingAgentSettingsSection.d.ts.map +1 -0
  113. package/dist/components/CodingAgentSettingsSection.js +268 -0
  114. package/dist/components/CommandPalette.d.ts +2 -0
  115. package/dist/components/CommandPalette.d.ts.map +1 -0
  116. package/dist/components/CommandPalette.js +181 -0
  117. package/dist/components/CompanionSceneHost.d.ts +15 -0
  118. package/dist/components/CompanionSceneHost.d.ts.map +1 -0
  119. package/dist/components/CompanionSceneHost.js +343 -0
  120. package/dist/components/CompanionShell.d.ts +17 -0
  121. package/dist/components/CompanionShell.d.ts.map +1 -0
  122. package/dist/components/CompanionShell.js +15 -0
  123. package/dist/components/CompanionView.d.ts +2 -0
  124. package/dist/components/CompanionView.d.ts.map +1 -0
  125. package/dist/components/CompanionView.js +22 -0
  126. package/dist/components/ConfigPageView.d.ts +11 -0
  127. package/dist/components/ConfigPageView.d.ts.map +1 -0
  128. package/dist/components/ConfigPageView.js +275 -0
  129. package/dist/components/ConfigSaveFooter.d.ts +8 -0
  130. package/dist/components/ConfigSaveFooter.d.ts.map +1 -0
  131. package/dist/components/ConfigSaveFooter.js +10 -0
  132. package/dist/components/ConfirmModal.d.ts +61 -0
  133. package/dist/components/ConfirmModal.d.ts.map +1 -0
  134. package/dist/components/ConfirmModal.js +164 -0
  135. package/dist/components/ConnectionFailedBanner.d.ts +6 -0
  136. package/dist/components/ConnectionFailedBanner.d.ts.map +1 -0
  137. package/dist/components/ConnectionFailedBanner.js +22 -0
  138. package/dist/components/ConnectorsPageView.d.ts +7 -0
  139. package/dist/components/ConnectorsPageView.d.ts.map +1 -0
  140. package/dist/components/ConnectorsPageView.js +8 -0
  141. package/dist/components/ConversationsSidebar.d.ts +9 -0
  142. package/dist/components/ConversationsSidebar.d.ts.map +1 -0
  143. package/dist/components/ConversationsSidebar.js +116 -0
  144. package/dist/components/CustomActionEditor.d.ts +10 -0
  145. package/dist/components/CustomActionEditor.d.ts.map +1 -0
  146. package/dist/components/CustomActionEditor.js +578 -0
  147. package/dist/components/CustomActionsPanel.d.ts +9 -0
  148. package/dist/components/CustomActionsPanel.d.ts.map +1 -0
  149. package/dist/components/CustomActionsPanel.js +107 -0
  150. package/dist/components/CustomActionsView.d.ts +2 -0
  151. package/dist/components/CustomActionsView.d.ts.map +1 -0
  152. package/dist/components/CustomActionsView.js +134 -0
  153. package/dist/components/DatabasePageView.d.ts +5 -0
  154. package/dist/components/DatabasePageView.d.ts.map +1 -0
  155. package/dist/components/DatabasePageView.js +28 -0
  156. package/dist/components/DatabaseView.d.ts +9 -0
  157. package/dist/components/DatabaseView.d.ts.map +1 -0
  158. package/dist/components/DatabaseView.js +311 -0
  159. package/dist/components/ElizaCloudDashboard.d.ts +2 -0
  160. package/dist/components/ElizaCloudDashboard.d.ts.map +1 -0
  161. package/dist/components/ElizaCloudDashboard.js +657 -0
  162. package/dist/components/EmotePicker.d.ts +2 -0
  163. package/dist/components/EmotePicker.d.ts.map +1 -0
  164. package/dist/components/EmotePicker.js +343 -0
  165. package/dist/components/ErrorBoundary.d.ts +22 -0
  166. package/dist/components/ErrorBoundary.d.ts.map +1 -0
  167. package/dist/components/ErrorBoundary.js +31 -0
  168. package/dist/components/FineTuningView.d.ts +2 -0
  169. package/dist/components/FineTuningView.d.ts.map +1 -0
  170. package/dist/components/FineTuningView.js +433 -0
  171. package/dist/components/GameView.d.ts +11 -0
  172. package/dist/components/GameView.d.ts.map +1 -0
  173. package/dist/components/GameView.js +295 -0
  174. package/dist/components/GameViewOverlay.d.ts +8 -0
  175. package/dist/components/GameViewOverlay.d.ts.map +1 -0
  176. package/dist/components/GameViewOverlay.js +70 -0
  177. package/dist/components/GlobalEmoteOverlay.d.ts +2 -0
  178. package/dist/components/GlobalEmoteOverlay.d.ts.map +1 -0
  179. package/dist/components/GlobalEmoteOverlay.js +112 -0
  180. package/dist/components/Header.d.ts +8 -0
  181. package/dist/components/Header.d.ts.map +1 -0
  182. package/dist/components/Header.js +121 -0
  183. package/dist/components/HeartbeatsView.d.ts +2 -0
  184. package/dist/components/HeartbeatsView.d.ts.map +1 -0
  185. package/dist/components/HeartbeatsView.js +378 -0
  186. package/dist/components/InventoryView.d.ts +10 -0
  187. package/dist/components/InventoryView.d.ts.map +1 -0
  188. package/dist/components/InventoryView.js +162 -0
  189. package/dist/components/KnowledgeView.d.ts +20 -0
  190. package/dist/components/KnowledgeView.d.ts.map +1 -0
  191. package/dist/components/KnowledgeView.js +480 -0
  192. package/dist/components/LanguageDropdown.d.ts +30 -0
  193. package/dist/components/LanguageDropdown.d.ts.map +1 -0
  194. package/dist/components/LanguageDropdown.js +98 -0
  195. package/dist/components/LifoMonitorPanel.d.ts +21 -0
  196. package/dist/components/LifoMonitorPanel.d.ts.map +1 -0
  197. package/dist/components/LifoMonitorPanel.js +24 -0
  198. package/dist/components/LifoSandboxView.d.ts +5 -0
  199. package/dist/components/LifoSandboxView.d.ts.map +1 -0
  200. package/dist/components/LifoSandboxView.js +333 -0
  201. package/dist/components/LoadingScreen.d.ts +13 -0
  202. package/dist/components/LoadingScreen.d.ts.map +1 -0
  203. package/dist/components/LoadingScreen.js +39 -0
  204. package/dist/components/LogsPageView.d.ts +2 -0
  205. package/dist/components/LogsPageView.d.ts.map +1 -0
  206. package/dist/components/LogsPageView.js +7 -0
  207. package/dist/components/LogsView.d.ts +5 -0
  208. package/dist/components/LogsView.d.ts.map +1 -0
  209. package/dist/components/LogsView.js +71 -0
  210. package/dist/components/MediaGalleryView.d.ts +9 -0
  211. package/dist/components/MediaGalleryView.d.ts.map +1 -0
  212. package/dist/components/MediaGalleryView.js +236 -0
  213. package/dist/components/MediaSettingsSection.d.ts +11 -0
  214. package/dist/components/MediaSettingsSection.d.ts.map +1 -0
  215. package/dist/components/MediaSettingsSection.js +329 -0
  216. package/dist/components/MessageContent.d.ts +51 -0
  217. package/dist/components/MessageContent.d.ts.map +1 -0
  218. package/dist/components/MessageContent.js +553 -0
  219. package/dist/components/OnboardingWizard.d.ts +2 -0
  220. package/dist/components/OnboardingWizard.d.ts.map +1 -0
  221. package/dist/components/OnboardingWizard.js +59 -0
  222. package/dist/components/PairingView.d.ts +5 -0
  223. package/dist/components/PairingView.d.ts.map +1 -0
  224. package/dist/components/PairingView.js +28 -0
  225. package/dist/components/PermissionsSection.d.ts +20 -0
  226. package/dist/components/PermissionsSection.d.ts.map +1 -0
  227. package/dist/components/PermissionsSection.js +368 -0
  228. package/dist/components/PluginsPageView.d.ts +5 -0
  229. package/dist/components/PluginsPageView.d.ts.map +1 -0
  230. package/dist/components/PluginsPageView.js +8 -0
  231. package/dist/components/PluginsView.d.ts +21 -0
  232. package/dist/components/PluginsView.d.ts.map +1 -0
  233. package/dist/components/PluginsView.js +1531 -0
  234. package/dist/components/ProviderSwitcher.d.ts +42 -0
  235. package/dist/components/ProviderSwitcher.d.ts.map +1 -0
  236. package/dist/components/ProviderSwitcher.js +480 -0
  237. package/dist/components/RestartBanner.d.ts +2 -0
  238. package/dist/components/RestartBanner.d.ts.map +1 -0
  239. package/dist/components/RestartBanner.js +36 -0
  240. package/dist/components/RuntimeView.d.ts +10 -0
  241. package/dist/components/RuntimeView.d.ts.map +1 -0
  242. package/dist/components/RuntimeView.js +165 -0
  243. package/dist/components/SaveCommandModal.d.ts +12 -0
  244. package/dist/components/SaveCommandModal.d.ts.map +1 -0
  245. package/dist/components/SaveCommandModal.js +84 -0
  246. package/dist/components/SecretsView.d.ts +9 -0
  247. package/dist/components/SecretsView.d.ts.map +1 -0
  248. package/dist/components/SecretsView.js +249 -0
  249. package/dist/components/SettingsView.d.ts +9 -0
  250. package/dist/components/SettingsView.d.ts.map +1 -0
  251. package/dist/components/SettingsView.js +230 -0
  252. package/dist/components/ShellOverlays.d.ts +8 -0
  253. package/dist/components/ShellOverlays.d.ts.map +1 -0
  254. package/dist/components/ShellOverlays.js +10 -0
  255. package/dist/components/ShortcutsOverlay.d.ts +2 -0
  256. package/dist/components/ShortcutsOverlay.d.ts.map +1 -0
  257. package/dist/components/ShortcutsOverlay.js +79 -0
  258. package/dist/components/SkillsView.d.ts +11 -0
  259. package/dist/components/SkillsView.d.ts.map +1 -0
  260. package/dist/components/SkillsView.js +358 -0
  261. package/dist/components/StartupFailureView.d.ts +8 -0
  262. package/dist/components/StartupFailureView.d.ts.map +1 -0
  263. package/dist/components/StartupFailureView.js +15 -0
  264. package/dist/components/StreamView.d.ts +16 -0
  265. package/dist/components/StreamView.d.ts.map +1 -0
  266. package/dist/components/StreamView.js +300 -0
  267. package/dist/components/StripeEmbeddedCheckout.d.ts +24 -0
  268. package/dist/components/StripeEmbeddedCheckout.d.ts.map +1 -0
  269. package/dist/components/StripeEmbeddedCheckout.js +101 -0
  270. package/dist/components/SubscriptionStatus.d.ts +22 -0
  271. package/dist/components/SubscriptionStatus.d.ts.map +1 -0
  272. package/dist/components/SubscriptionStatus.js +301 -0
  273. package/dist/components/SystemWarningBanner.d.ts +6 -0
  274. package/dist/components/SystemWarningBanner.d.ts.map +1 -0
  275. package/dist/components/SystemWarningBanner.js +46 -0
  276. package/dist/components/ThemeToggle.d.ts +21 -0
  277. package/dist/components/ThemeToggle.d.ts.map +1 -0
  278. package/dist/components/ThemeToggle.js +24 -0
  279. package/dist/components/TrajectoriesView.d.ts +12 -0
  280. package/dist/components/TrajectoriesView.d.ts.map +1 -0
  281. package/dist/components/TrajectoriesView.js +183 -0
  282. package/dist/components/TrajectoryDetailView.d.ts +13 -0
  283. package/dist/components/TrajectoryDetailView.d.ts.map +1 -0
  284. package/dist/components/TrajectoryDetailView.js +112 -0
  285. package/dist/components/TriggersView.d.ts +2 -0
  286. package/dist/components/TriggersView.d.ts.map +1 -0
  287. package/dist/components/TriggersView.js +1 -0
  288. package/dist/components/VectorBrowserView.d.ts +10 -0
  289. package/dist/components/VectorBrowserView.d.ts.map +1 -0
  290. package/dist/components/VectorBrowserView.js +997 -0
  291. package/dist/components/VoiceConfigView.d.ts +11 -0
  292. package/dist/components/VoiceConfigView.d.ts.map +1 -0
  293. package/dist/components/VoiceConfigView.js +329 -0
  294. package/dist/components/VrmStage.d.ts +21 -0
  295. package/dist/components/VrmStage.d.ts.map +1 -0
  296. package/dist/components/VrmStage.js +252 -0
  297. package/dist/components/WhatsAppQrOverlay.d.ts +8 -0
  298. package/dist/components/WhatsAppQrOverlay.d.ts.map +1 -0
  299. package/dist/components/WhatsAppQrOverlay.js +63 -0
  300. package/dist/components/apps/AppDetailPane.d.ts +15 -0
  301. package/dist/components/apps/AppDetailPane.d.ts.map +1 -0
  302. package/dist/components/apps/AppDetailPane.js +13 -0
  303. package/dist/components/apps/AppsCatalogGrid.d.ts +20 -0
  304. package/dist/components/apps/AppsCatalogGrid.d.ts.map +1 -0
  305. package/dist/components/apps/AppsCatalogGrid.js +18 -0
  306. package/dist/components/apps/extensions/HyperscapeAppDetailPanel.d.ts +3 -0
  307. package/dist/components/apps/extensions/HyperscapeAppDetailPanel.d.ts.map +1 -0
  308. package/dist/components/apps/extensions/HyperscapeAppDetailPanel.js +253 -0
  309. package/dist/components/apps/extensions/registry.d.ts +4 -0
  310. package/dist/components/apps/extensions/registry.d.ts.map +1 -0
  311. package/dist/components/apps/extensions/registry.js +10 -0
  312. package/dist/components/apps/extensions/types.d.ts +7 -0
  313. package/dist/components/apps/extensions/types.d.ts.map +1 -0
  314. package/dist/components/apps/extensions/types.js +1 -0
  315. package/dist/components/apps/helpers.d.ts +7 -0
  316. package/dist/components/apps/helpers.d.ts.map +1 -0
  317. package/dist/components/apps/helpers.js +46 -0
  318. package/dist/components/avatar/VrmAnimationLoader.d.ts +30 -0
  319. package/dist/components/avatar/VrmAnimationLoader.d.ts.map +1 -0
  320. package/dist/components/avatar/VrmAnimationLoader.js +99 -0
  321. package/dist/components/avatar/VrmBlinkController.d.ts +37 -0
  322. package/dist/components/avatar/VrmBlinkController.d.ts.map +1 -0
  323. package/dist/components/avatar/VrmBlinkController.js +98 -0
  324. package/dist/components/avatar/VrmCameraManager.d.ts +57 -0
  325. package/dist/components/avatar/VrmCameraManager.d.ts.map +1 -0
  326. package/dist/components/avatar/VrmCameraManager.js +277 -0
  327. package/dist/components/avatar/VrmEngine.d.ts +229 -0
  328. package/dist/components/avatar/VrmEngine.d.ts.map +1 -0
  329. package/dist/components/avatar/VrmEngine.js +1950 -0
  330. package/dist/components/avatar/VrmFootShadow.d.ts +18 -0
  331. package/dist/components/avatar/VrmFootShadow.d.ts.map +1 -0
  332. package/dist/components/avatar/VrmFootShadow.js +83 -0
  333. package/dist/components/avatar/VrmViewer.d.ts +45 -0
  334. package/dist/components/avatar/VrmViewer.d.ts.map +1 -0
  335. package/dist/components/avatar/VrmViewer.js +341 -0
  336. package/dist/components/avatar/mixamoVRMRigMap.d.ts +3 -0
  337. package/dist/components/avatar/mixamoVRMRigMap.d.ts.map +1 -0
  338. package/dist/components/avatar/mixamoVRMRigMap.js +56 -0
  339. package/dist/components/avatar/retargetMixamoFbxToVrm.d.ts +9 -0
  340. package/dist/components/avatar/retargetMixamoFbxToVrm.d.ts.map +1 -0
  341. package/dist/components/avatar/retargetMixamoFbxToVrm.js +88 -0
  342. package/dist/components/avatar/retargetMixamoGltfToVrm.d.ts +11 -0
  343. package/dist/components/avatar/retargetMixamoGltfToVrm.d.ts.map +1 -0
  344. package/dist/components/avatar/retargetMixamoGltfToVrm.js +80 -0
  345. package/dist/components/chainConfig.d.ts +84 -0
  346. package/dist/components/chainConfig.d.ts.map +1 -0
  347. package/dist/components/chainConfig.js +268 -0
  348. package/dist/components/companion/CompanionHeader.d.ts +15 -0
  349. package/dist/components/companion/CompanionHeader.d.ts.map +1 -0
  350. package/dist/components/companion/CompanionHeader.js +7 -0
  351. package/dist/components/companion/CompanionSceneHost.d.ts +2 -0
  352. package/dist/components/companion/CompanionSceneHost.d.ts.map +1 -0
  353. package/dist/components/companion/CompanionSceneHost.js +1 -0
  354. package/dist/components/companion/VrmStage.d.ts +3 -0
  355. package/dist/components/companion/VrmStage.d.ts.map +1 -0
  356. package/dist/components/companion/VrmStage.js +1 -0
  357. package/dist/components/companion/walletUtils.d.ts +95 -0
  358. package/dist/components/companion/walletUtils.d.ts.map +1 -0
  359. package/dist/components/companion/walletUtils.js +167 -0
  360. package/dist/components/companion-shell-styles.d.ts +38 -0
  361. package/dist/components/companion-shell-styles.d.ts.map +1 -0
  362. package/dist/components/companion-shell-styles.js +248 -0
  363. package/dist/components/confirm-delete-control.d.ts +16 -0
  364. package/dist/components/confirm-delete-control.d.ts.map +1 -0
  365. package/dist/components/confirm-delete-control.js +12 -0
  366. package/dist/components/conversations/ConversationListItem.d.ts +31 -0
  367. package/dist/components/conversations/ConversationListItem.d.ts.map +1 -0
  368. package/dist/components/conversations/ConversationListItem.js +52 -0
  369. package/dist/components/conversations/conversation-utils.d.ts +9 -0
  370. package/dist/components/conversations/conversation-utils.d.ts.map +1 -0
  371. package/dist/components/conversations/conversation-utils.js +138 -0
  372. package/dist/components/format.d.ts +54 -0
  373. package/dist/components/format.d.ts.map +1 -0
  374. package/dist/components/format.js +82 -0
  375. package/dist/components/index.d.ts +93 -0
  376. package/dist/components/index.d.ts.map +1 -0
  377. package/dist/components/index.js +92 -0
  378. package/dist/components/inventory/CopyableAddress.d.ts +8 -0
  379. package/dist/components/inventory/CopyableAddress.d.ts.map +1 -0
  380. package/dist/components/inventory/CopyableAddress.js +18 -0
  381. package/dist/components/inventory/InventoryToolbar.d.ts +25 -0
  382. package/dist/components/inventory/InventoryToolbar.d.ts.map +1 -0
  383. package/dist/components/inventory/InventoryToolbar.js +28 -0
  384. package/dist/components/inventory/NftGrid.d.ts +13 -0
  385. package/dist/components/inventory/NftGrid.d.ts.map +1 -0
  386. package/dist/components/inventory/NftGrid.js +29 -0
  387. package/dist/components/inventory/TokenLogo.d.ts +12 -0
  388. package/dist/components/inventory/TokenLogo.d.ts.map +1 -0
  389. package/dist/components/inventory/TokenLogo.js +33 -0
  390. package/dist/components/inventory/TokensTable.d.ts +24 -0
  391. package/dist/components/inventory/TokensTable.d.ts.map +1 -0
  392. package/dist/components/inventory/TokensTable.js +26 -0
  393. package/dist/components/inventory/constants.d.ts +52 -0
  394. package/dist/components/inventory/constants.d.ts.map +1 -0
  395. package/dist/components/inventory/constants.js +121 -0
  396. package/dist/components/inventory/index.d.ts +9 -0
  397. package/dist/components/inventory/index.d.ts.map +1 -0
  398. package/dist/components/inventory/index.js +8 -0
  399. package/dist/components/inventory/media-url.d.ts +6 -0
  400. package/dist/components/inventory/media-url.d.ts.map +1 -0
  401. package/dist/components/inventory/media-url.js +28 -0
  402. package/dist/components/inventory/useInventoryData.d.ts +53 -0
  403. package/dist/components/inventory/useInventoryData.d.ts.map +1 -0
  404. package/dist/components/inventory/useInventoryData.js +332 -0
  405. package/dist/components/knowledge-upload-image.d.ts +27 -0
  406. package/dist/components/knowledge-upload-image.d.ts.map +1 -0
  407. package/dist/components/knowledge-upload-image.js +146 -0
  408. package/dist/components/labels.d.ts +6 -0
  409. package/dist/components/labels.d.ts.map +1 -0
  410. package/dist/components/labels.js +40 -0
  411. package/dist/components/onboarding/ActivateStep.d.ts +2 -0
  412. package/dist/components/onboarding/ActivateStep.d.ts.map +1 -0
  413. package/dist/components/onboarding/ActivateStep.js +6 -0
  414. package/dist/components/onboarding/ConnectionStep.d.ts +2 -0
  415. package/dist/components/onboarding/ConnectionStep.d.ts.map +1 -0
  416. package/dist/components/onboarding/ConnectionStep.js +552 -0
  417. package/dist/components/onboarding/OnboardingPanel.d.ts +9 -0
  418. package/dist/components/onboarding/OnboardingPanel.d.ts.map +1 -0
  419. package/dist/components/onboarding/OnboardingPanel.js +24 -0
  420. package/dist/components/onboarding/OnboardingStepNav.d.ts +2 -0
  421. package/dist/components/onboarding/OnboardingStepNav.d.ts.map +1 -0
  422. package/dist/components/onboarding/OnboardingStepNav.js +14 -0
  423. package/dist/components/onboarding/PermissionsStep.d.ts +2 -0
  424. package/dist/components/onboarding/PermissionsStep.d.ts.map +1 -0
  425. package/dist/components/onboarding/PermissionsStep.js +7 -0
  426. package/dist/components/onboarding/RpcStep.d.ts +2 -0
  427. package/dist/components/onboarding/RpcStep.d.ts.map +1 -0
  428. package/dist/components/onboarding/RpcStep.js +125 -0
  429. package/dist/components/onboarding/WakeUpStep.d.ts +2 -0
  430. package/dist/components/onboarding/WakeUpStep.d.ts.map +1 -0
  431. package/dist/components/onboarding/WakeUpStep.js +82 -0
  432. package/dist/components/permissions/PermissionIcon.d.ts +4 -0
  433. package/dist/components/permissions/PermissionIcon.d.ts.map +1 -0
  434. package/dist/components/permissions/PermissionIcon.js +12 -0
  435. package/dist/components/permissions/StreamingPermissions.d.ts +20 -0
  436. package/dist/components/permissions/StreamingPermissions.d.ts.map +1 -0
  437. package/dist/components/permissions/StreamingPermissions.js +173 -0
  438. package/dist/components/plugins/showcase-data.d.ts +7 -0
  439. package/dist/components/plugins/showcase-data.d.ts.map +1 -0
  440. package/dist/components/plugins/showcase-data.js +464 -0
  441. package/dist/components/shared/ShellHeaderControls.d.ts +27 -0
  442. package/dist/components/shared/ShellHeaderControls.d.ts.map +1 -0
  443. package/dist/components/shared/ShellHeaderControls.js +60 -0
  444. package/dist/components/skeletons.d.ts +17 -0
  445. package/dist/components/skeletons.d.ts.map +1 -0
  446. package/dist/components/skeletons.js +22 -0
  447. package/dist/components/stream/ActivityFeed.d.ts +5 -0
  448. package/dist/components/stream/ActivityFeed.d.ts.map +1 -0
  449. package/dist/components/stream/ActivityFeed.js +57 -0
  450. package/dist/components/stream/AvatarPip.d.ts +5 -0
  451. package/dist/components/stream/AvatarPip.d.ts.map +1 -0
  452. package/dist/components/stream/AvatarPip.js +6 -0
  453. package/dist/components/stream/ChatContent.d.ts +6 -0
  454. package/dist/components/stream/ChatContent.d.ts.map +1 -0
  455. package/dist/components/stream/ChatContent.js +69 -0
  456. package/dist/components/stream/ChatTicker.d.ts +5 -0
  457. package/dist/components/stream/ChatTicker.d.ts.map +1 -0
  458. package/dist/components/stream/ChatTicker.js +34 -0
  459. package/dist/components/stream/IdleContent.d.ts +5 -0
  460. package/dist/components/stream/IdleContent.d.ts.map +1 -0
  461. package/dist/components/stream/IdleContent.js +17 -0
  462. package/dist/components/stream/StatusBar.d.ts +36 -0
  463. package/dist/components/stream/StatusBar.d.ts.map +1 -0
  464. package/dist/components/stream/StatusBar.js +140 -0
  465. package/dist/components/stream/StreamSettings.d.ts +33 -0
  466. package/dist/components/stream/StreamSettings.d.ts.map +1 -0
  467. package/dist/components/stream/StreamSettings.js +99 -0
  468. package/dist/components/stream/StreamTerminal.d.ts +2 -0
  469. package/dist/components/stream/StreamTerminal.d.ts.map +1 -0
  470. package/dist/components/stream/StreamTerminal.js +52 -0
  471. package/dist/components/stream/StreamVoiceConfig.d.ts +10 -0
  472. package/dist/components/stream/StreamVoiceConfig.d.ts.map +1 -0
  473. package/dist/components/stream/StreamVoiceConfig.js +88 -0
  474. package/dist/components/stream/helpers.d.ts +32 -0
  475. package/dist/components/stream/helpers.d.ts.map +1 -0
  476. package/dist/components/stream/helpers.js +110 -0
  477. package/dist/components/stream/overlays/OverlayLayer.d.ts +20 -0
  478. package/dist/components/stream/overlays/OverlayLayer.d.ts.map +1 -0
  479. package/dist/components/stream/overlays/OverlayLayer.js +24 -0
  480. package/dist/components/stream/overlays/built-in/ActionTickerWidget.d.ts +8 -0
  481. package/dist/components/stream/overlays/built-in/ActionTickerWidget.d.ts.map +1 -0
  482. package/dist/components/stream/overlays/built-in/ActionTickerWidget.js +44 -0
  483. package/dist/components/stream/overlays/built-in/AlertPopupWidget.d.ts +7 -0
  484. package/dist/components/stream/overlays/built-in/AlertPopupWidget.d.ts.map +1 -0
  485. package/dist/components/stream/overlays/built-in/AlertPopupWidget.js +62 -0
  486. package/dist/components/stream/overlays/built-in/BrandingWidget.d.ts +7 -0
  487. package/dist/components/stream/overlays/built-in/BrandingWidget.d.ts.map +1 -0
  488. package/dist/components/stream/overlays/built-in/BrandingWidget.js +36 -0
  489. package/dist/components/stream/overlays/built-in/CustomHtmlWidget.d.ts +26 -0
  490. package/dist/components/stream/overlays/built-in/CustomHtmlWidget.d.ts.map +1 -0
  491. package/dist/components/stream/overlays/built-in/CustomHtmlWidget.js +78 -0
  492. package/dist/components/stream/overlays/built-in/PeonGlassWidget.d.ts +11 -0
  493. package/dist/components/stream/overlays/built-in/PeonGlassWidget.d.ts.map +1 -0
  494. package/dist/components/stream/overlays/built-in/PeonGlassWidget.js +188 -0
  495. package/dist/components/stream/overlays/built-in/PeonHudWidget.d.ts +10 -0
  496. package/dist/components/stream/overlays/built-in/PeonHudWidget.d.ts.map +1 -0
  497. package/dist/components/stream/overlays/built-in/PeonHudWidget.js +168 -0
  498. package/dist/components/stream/overlays/built-in/PeonSakuraWidget.d.ts +11 -0
  499. package/dist/components/stream/overlays/built-in/PeonSakuraWidget.d.ts.map +1 -0
  500. package/dist/components/stream/overlays/built-in/PeonSakuraWidget.js +213 -0
  501. package/dist/components/stream/overlays/built-in/ThoughtBubbleWidget.d.ts +8 -0
  502. package/dist/components/stream/overlays/built-in/ThoughtBubbleWidget.d.ts.map +1 -0
  503. package/dist/components/stream/overlays/built-in/ThoughtBubbleWidget.js +59 -0
  504. package/dist/components/stream/overlays/built-in/ViewerCountWidget.d.ts +7 -0
  505. package/dist/components/stream/overlays/built-in/ViewerCountWidget.d.ts.map +1 -0
  506. package/dist/components/stream/overlays/built-in/ViewerCountWidget.js +34 -0
  507. package/dist/components/stream/overlays/built-in/index.d.ts +13 -0
  508. package/dist/components/stream/overlays/built-in/index.d.ts.map +1 -0
  509. package/dist/components/stream/overlays/built-in/index.js +12 -0
  510. package/dist/components/stream/overlays/registry.d.ts +11 -0
  511. package/dist/components/stream/overlays/registry.d.ts.map +1 -0
  512. package/dist/components/stream/overlays/registry.js +16 -0
  513. package/dist/components/stream/overlays/types.d.ts +67 -0
  514. package/dist/components/stream/overlays/types.d.ts.map +1 -0
  515. package/dist/components/stream/overlays/types.js +7 -0
  516. package/dist/components/stream/overlays/useOverlayLayout.d.ts +27 -0
  517. package/dist/components/stream/overlays/useOverlayLayout.d.ts.map +1 -0
  518. package/dist/components/stream/overlays/useOverlayLayout.js +162 -0
  519. package/dist/components/trajectory-format.d.ts +6 -0
  520. package/dist/components/trajectory-format.d.ts.map +1 -0
  521. package/dist/components/trajectory-format.js +43 -0
  522. package/dist/components/ui-badges.d.ts +23 -0
  523. package/dist/components/ui-badges.d.ts.map +1 -0
  524. package/dist/components/ui-badges.js +38 -0
  525. package/dist/components/ui-switch.d.ts +14 -0
  526. package/dist/components/ui-switch.d.ts.map +1 -0
  527. package/dist/components/ui-switch.js +15 -0
  528. package/dist/components/vector-browser-three.d.ts +4 -0
  529. package/dist/components/vector-browser-three.d.ts.map +1 -0
  530. package/dist/components/vector-browser-three.js +19 -0
  531. package/dist/config/config-catalog.d.ts +376 -0
  532. package/dist/config/config-catalog.d.ts.map +1 -0
  533. package/dist/config/config-catalog.js +724 -0
  534. package/dist/config/config-field.d.ts +68 -0
  535. package/dist/config/config-field.d.ts.map +1 -0
  536. package/dist/config/config-field.js +821 -0
  537. package/dist/config/config-renderer.d.ts +176 -0
  538. package/dist/config/config-renderer.d.ts.map +1 -0
  539. package/dist/config/config-renderer.js +403 -0
  540. package/dist/config/index.d.ts +5 -0
  541. package/dist/config/index.d.ts.map +1 -0
  542. package/dist/config/index.js +4 -0
  543. package/dist/config/ui-renderer.d.ts +26 -0
  544. package/dist/config/ui-renderer.d.ts.map +1 -0
  545. package/dist/config/ui-renderer.js +815 -0
  546. package/dist/config/ui-spec.d.ts +164 -0
  547. package/dist/config/ui-spec.d.ts.map +1 -0
  548. package/dist/config/ui-spec.js +13 -0
  549. package/dist/events/index.d.ts +42 -0
  550. package/dist/events/index.d.ts.map +1 -0
  551. package/dist/events/index.js +41 -0
  552. package/dist/hooks/index.d.ts +14 -0
  553. package/dist/hooks/index.d.ts.map +1 -0
  554. package/dist/hooks/index.js +13 -0
  555. package/dist/hooks/useBugReport.d.ts +14 -0
  556. package/dist/hooks/useBugReport.d.ts.map +1 -0
  557. package/dist/hooks/useBugReport.js +18 -0
  558. package/dist/hooks/useCanvasWindow.d.ts +38 -0
  559. package/dist/hooks/useCanvasWindow.d.ts.map +1 -0
  560. package/dist/hooks/useCanvasWindow.js +273 -0
  561. package/dist/hooks/useChatAvatarVoice.d.ts +10 -0
  562. package/dist/hooks/useChatAvatarVoice.d.ts.map +1 -0
  563. package/dist/hooks/useChatAvatarVoice.js +71 -0
  564. package/dist/hooks/useContextMenu.d.ts +17 -0
  565. package/dist/hooks/useContextMenu.d.ts.map +1 -0
  566. package/dist/hooks/useContextMenu.js +100 -0
  567. package/dist/hooks/useKeyboardShortcuts.d.ts +17 -0
  568. package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  569. package/dist/hooks/useKeyboardShortcuts.js +67 -0
  570. package/dist/hooks/useLifoSync.d.ts +18 -0
  571. package/dist/hooks/useLifoSync.d.ts.map +1 -0
  572. package/dist/hooks/useLifoSync.js +113 -0
  573. package/dist/hooks/useMemoryMonitor.d.ts +87 -0
  574. package/dist/hooks/useMemoryMonitor.d.ts.map +1 -0
  575. package/dist/hooks/useMemoryMonitor.js +210 -0
  576. package/dist/hooks/useRenderGuard.d.ts +17 -0
  577. package/dist/hooks/useRenderGuard.d.ts.map +1 -0
  578. package/dist/hooks/useRenderGuard.js +36 -0
  579. package/dist/hooks/useRetakeCapture.d.ts +12 -0
  580. package/dist/hooks/useRetakeCapture.d.ts.map +1 -0
  581. package/dist/hooks/useRetakeCapture.js +59 -0
  582. package/dist/hooks/useStreamPopoutNavigation.d.ts +3 -0
  583. package/dist/hooks/useStreamPopoutNavigation.d.ts.map +1 -0
  584. package/dist/hooks/useStreamPopoutNavigation.js +17 -0
  585. package/dist/hooks/useTimeout.d.ts +11 -0
  586. package/dist/hooks/useTimeout.d.ts.map +1 -0
  587. package/dist/hooks/useTimeout.js +32 -0
  588. package/dist/hooks/useVoiceChat.d.ts +129 -0
  589. package/dist/hooks/useVoiceChat.d.ts.map +1 -0
  590. package/dist/hooks/useVoiceChat.js +1071 -0
  591. package/dist/hooks/useWhatsAppPairing.d.ts +11 -0
  592. package/dist/hooks/useWhatsAppPairing.d.ts.map +1 -0
  593. package/dist/hooks/useWhatsAppPairing.js +95 -0
  594. package/dist/i18n/index.d.ts +7 -0
  595. package/dist/i18n/index.d.ts.map +1 -0
  596. package/dist/i18n/index.js +53 -0
  597. package/dist/i18n/locales/en.json +1196 -0
  598. package/dist/i18n/locales/es.json +1196 -0
  599. package/dist/i18n/locales/ko.json +1196 -0
  600. package/dist/i18n/locales/pt.json +1196 -0
  601. package/dist/i18n/locales/zh-CN.json +1196 -0
  602. package/dist/i18n/messages.d.ts +6 -0
  603. package/dist/i18n/messages.d.ts.map +1 -0
  604. package/dist/i18n/messages.js +14 -0
  605. package/dist/index.d.ts +5 -0
  606. package/dist/index.d.ts.map +1 -0
  607. package/dist/index.js +6 -0
  608. package/dist/navigation/index.d.ts +27 -0
  609. package/dist/navigation/index.d.ts.map +1 -0
  610. package/dist/navigation/index.js +230 -0
  611. package/dist/package.json +161 -0
  612. package/dist/platform/browser-launch.d.ts +2 -0
  613. package/dist/platform/browser-launch.d.ts.map +1 -0
  614. package/dist/platform/browser-launch.js +109 -0
  615. package/dist/platform/index.d.ts +64 -0
  616. package/dist/platform/index.d.ts.map +1 -0
  617. package/dist/platform/index.js +155 -0
  618. package/dist/platform/init.d.ts +40 -0
  619. package/dist/platform/init.d.ts.map +1 -0
  620. package/dist/platform/init.js +158 -0
  621. package/dist/providers/index.d.ts +13 -0
  622. package/dist/providers/index.d.ts.map +1 -0
  623. package/dist/providers/index.js +72 -0
  624. package/dist/state/AppContext.d.ts +11 -0
  625. package/dist/state/AppContext.d.ts.map +1 -0
  626. package/dist/state/AppContext.js +4496 -0
  627. package/dist/state/index.d.ts +7 -0
  628. package/dist/state/index.d.ts.map +1 -0
  629. package/dist/state/index.js +6 -0
  630. package/dist/state/internal.d.ts +6 -0
  631. package/dist/state/internal.d.ts.map +1 -0
  632. package/dist/state/internal.js +5 -0
  633. package/dist/state/parsers.d.ts +26 -0
  634. package/dist/state/parsers.d.ts.map +1 -0
  635. package/dist/state/parsers.js +255 -0
  636. package/dist/state/persistence.d.ts +36 -0
  637. package/dist/state/persistence.d.ts.map +1 -0
  638. package/dist/state/persistence.js +254 -0
  639. package/dist/state/types.d.ts +402 -0
  640. package/dist/state/types.d.ts.map +1 -0
  641. package/dist/state/types.js +70 -0
  642. package/dist/state/ui-preferences.d.ts +3 -0
  643. package/dist/state/ui-preferences.d.ts.map +1 -0
  644. package/dist/state/ui-preferences.js +1 -0
  645. package/dist/state/useApp.d.ts +4 -0
  646. package/dist/state/useApp.d.ts.map +1 -0
  647. package/dist/state/useApp.js +22 -0
  648. package/dist/state/vrm.d.ts +19 -0
  649. package/dist/state/vrm.d.ts.map +1 -0
  650. package/dist/state/vrm.js +65 -0
  651. package/dist/stories/AppMockProvider.d.ts +15 -0
  652. package/dist/stories/AppMockProvider.d.ts.map +1 -0
  653. package/dist/stories/AppMockProvider.js +14 -0
  654. package/dist/styles/anime.css +6324 -0
  655. package/dist/styles/base.css +196 -0
  656. package/dist/styles/onboarding-game.css +716 -0
  657. package/dist/styles/styles.css +2085 -0
  658. package/dist/styles/xterm.css +241 -0
  659. package/dist/types/index.d.ts +657 -0
  660. package/dist/types/index.d.ts.map +1 -0
  661. package/dist/types/index.js +1 -0
  662. package/dist/utils/asset-url.d.ts +26 -0
  663. package/dist/utils/asset-url.d.ts.map +1 -0
  664. package/dist/utils/asset-url.js +99 -0
  665. package/dist/utils/assistant-text.d.ts +2 -0
  666. package/dist/utils/assistant-text.d.ts.map +1 -0
  667. package/dist/utils/assistant-text.js +161 -0
  668. package/dist/utils/clipboard.d.ts +2 -0
  669. package/dist/utils/clipboard.d.ts.map +1 -0
  670. package/dist/utils/clipboard.js +38 -0
  671. package/dist/utils/desktop-dialogs.d.ts +19 -0
  672. package/dist/utils/desktop-dialogs.d.ts.map +1 -0
  673. package/dist/utils/desktop-dialogs.js +50 -0
  674. package/dist/utils/index.d.ts +7 -0
  675. package/dist/utils/index.d.ts.map +1 -0
  676. package/dist/utils/index.js +6 -0
  677. package/dist/utils/number-parsing.d.ts +44 -0
  678. package/dist/utils/number-parsing.d.ts.map +1 -0
  679. package/dist/utils/number-parsing.js +56 -0
  680. package/dist/utils/openExternalUrl.d.ts +2 -0
  681. package/dist/utils/openExternalUrl.d.ts.map +1 -0
  682. package/dist/utils/openExternalUrl.js +17 -0
  683. package/dist/utils/spoken-text.d.ts +2 -0
  684. package/dist/utils/spoken-text.d.ts.map +1 -0
  685. package/dist/utils/spoken-text.js +56 -0
  686. package/dist/utils/streaming-text.d.ts +3 -0
  687. package/dist/utils/streaming-text.d.ts.map +1 -0
  688. package/dist/utils/streaming-text.js +87 -0
  689. package/dist/voice/index.d.ts +2 -0
  690. package/dist/voice/index.d.ts.map +1 -0
  691. package/dist/voice/index.js +1 -0
  692. package/dist/voice/types.d.ts +25 -0
  693. package/dist/voice/types.d.ts.map +1 -0
  694. package/dist/voice/types.js +166 -0
  695. package/package.json +86 -0
  696. package/src/App.tsx +469 -0
  697. package/src/actions/character.ts +113 -0
  698. package/src/actions/chat-helpers.ts +100 -0
  699. package/src/actions/cloud.ts +59 -0
  700. package/src/actions/index.ts +12 -0
  701. package/src/actions/lifecycle.ts +175 -0
  702. package/src/actions/onboarding.ts +46 -0
  703. package/src/actions/triggers.ts +190 -0
  704. package/src/ambient.d.ts +16 -0
  705. package/src/api/client.ts +5616 -0
  706. package/src/api/index.ts +1 -0
  707. package/src/autonomy/index.ts +477 -0
  708. package/src/bridge/capacitor-bridge.ts +295 -0
  709. package/src/bridge/electrobun-rpc.ts +58 -0
  710. package/src/bridge/electrobun-runtime.ts +28 -0
  711. package/src/bridge/index.ts +5 -0
  712. package/src/bridge/native-plugins.ts +134 -0
  713. package/src/bridge/plugin-bridge.ts +352 -0
  714. package/src/bridge/storage-bridge.ts +162 -0
  715. package/src/chat/index.ts +251 -0
  716. package/src/coding/index.ts +43 -0
  717. package/src/components/AdvancedPageView.tsx +362 -0
  718. package/src/components/AgentActivityBox.tsx +49 -0
  719. package/src/components/ApiKeyConfig.tsx +224 -0
  720. package/src/components/AppsPageView.tsx +52 -0
  721. package/src/components/AppsView.tsx +293 -0
  722. package/src/components/AvatarLoader.tsx +86 -0
  723. package/src/components/AvatarSelector.tsx +223 -0
  724. package/src/components/BscTradePanel.tsx +549 -0
  725. package/src/components/BugReportModal.tsx +499 -0
  726. package/src/components/CharacterView.tsx +1623 -0
  727. package/src/components/ChatAvatar.test.ts +96 -0
  728. package/src/components/ChatAvatar.tsx +147 -0
  729. package/src/components/ChatComposer.tsx +330 -0
  730. package/src/components/ChatMessage.tsx +448 -0
  731. package/src/components/ChatModalView.test.tsx +118 -0
  732. package/src/components/ChatModalView.tsx +125 -0
  733. package/src/components/ChatView.tsx +999 -0
  734. package/src/components/CloudSourceControls.tsx +80 -0
  735. package/src/components/CodingAgentSettingsSection.tsx +536 -0
  736. package/src/components/CommandPalette.tsx +284 -0
  737. package/src/components/CompanionSceneHost.tsx +498 -0
  738. package/src/components/CompanionShell.tsx +31 -0
  739. package/src/components/CompanionView.tsx +109 -0
  740. package/src/components/ConfigPageView.tsx +722 -0
  741. package/src/components/ConfigSaveFooter.tsx +41 -0
  742. package/src/components/ConfirmModal.tsx +379 -0
  743. package/src/components/ConnectionFailedBanner.tsx +91 -0
  744. package/src/components/ConnectorsPageView.tsx +13 -0
  745. package/src/components/ConversationsSidebar.tsx +279 -0
  746. package/src/components/CustomActionEditor.tsx +1125 -0
  747. package/src/components/CustomActionsPanel.tsx +288 -0
  748. package/src/components/CustomActionsView.tsx +322 -0
  749. package/src/components/DatabasePageView.tsx +55 -0
  750. package/src/components/DatabaseView.tsx +814 -0
  751. package/src/components/ElizaCloudDashboard.tsx +1696 -0
  752. package/src/components/EmotePicker.tsx +529 -0
  753. package/src/components/ErrorBoundary.tsx +76 -0
  754. package/src/components/FineTuningView.tsx +1080 -0
  755. package/src/components/GameView.tsx +551 -0
  756. package/src/components/GameViewOverlay.tsx +133 -0
  757. package/src/components/GlobalEmoteOverlay.tsx +152 -0
  758. package/src/components/Header.test.tsx +413 -0
  759. package/src/components/Header.tsx +400 -0
  760. package/src/components/HeartbeatsView.tsx +1002 -0
  761. package/src/components/InventoryView.tsx +372 -0
  762. package/src/components/KnowledgeView.tsx +1128 -0
  763. package/src/components/LanguageDropdown.tsx +187 -0
  764. package/src/components/LifoMonitorPanel.tsx +196 -0
  765. package/src/components/LifoSandboxView.tsx +499 -0
  766. package/src/components/LoadingScreen.tsx +77 -0
  767. package/src/components/LogsPageView.tsx +17 -0
  768. package/src/components/LogsView.tsx +239 -0
  769. package/src/components/MediaGalleryView.tsx +432 -0
  770. package/src/components/MediaSettingsSection.tsx +893 -0
  771. package/src/components/MessageContent.tsx +815 -0
  772. package/src/components/OnboardingWizard.test.tsx +107 -0
  773. package/src/components/OnboardingWizard.tsx +186 -0
  774. package/src/components/PairingView.tsx +110 -0
  775. package/src/components/PermissionsSection.tsx +818 -0
  776. package/src/components/PluginsPageView.tsx +9 -0
  777. package/src/components/PluginsView.tsx +3152 -0
  778. package/src/components/ProviderSwitcher.tsx +874 -0
  779. package/src/components/RestartBanner.tsx +76 -0
  780. package/src/components/RuntimeView.tsx +460 -0
  781. package/src/components/SaveCommandModal.tsx +211 -0
  782. package/src/components/SecretsView.tsx +569 -0
  783. package/src/components/SettingsView.tsx +825 -0
  784. package/src/components/ShellOverlays.tsx +41 -0
  785. package/src/components/ShortcutsOverlay.tsx +155 -0
  786. package/src/components/SkillsView.tsx +1435 -0
  787. package/src/components/StartupFailureView.tsx +63 -0
  788. package/src/components/StreamView.tsx +483 -0
  789. package/src/components/StripeEmbeddedCheckout.tsx +155 -0
  790. package/src/components/SubscriptionStatus.tsx +634 -0
  791. package/src/components/SystemWarningBanner.tsx +71 -0
  792. package/src/components/ThemeToggle.tsx +100 -0
  793. package/src/components/TrajectoriesView.tsx +526 -0
  794. package/src/components/TrajectoryDetailView.tsx +426 -0
  795. package/src/components/TriggersView.tsx +1 -0
  796. package/src/components/VectorBrowserView.tsx +1633 -0
  797. package/src/components/VoiceConfigView.tsx +674 -0
  798. package/src/components/VrmStage.test.ts +219 -0
  799. package/src/components/VrmStage.tsx +432 -0
  800. package/src/components/WhatsAppQrOverlay.tsx +230 -0
  801. package/src/components/__tests__/chainConfig.test.ts +220 -0
  802. package/src/components/apps/AppDetailPane.tsx +242 -0
  803. package/src/components/apps/AppsCatalogGrid.tsx +137 -0
  804. package/src/components/apps/extensions/HyperscapeAppDetailPanel.tsx +577 -0
  805. package/src/components/apps/extensions/registry.ts +16 -0
  806. package/src/components/apps/extensions/types.ts +9 -0
  807. package/src/components/apps/helpers.ts +44 -0
  808. package/src/components/avatar/VrmAnimationLoader.test.ts +164 -0
  809. package/src/components/avatar/VrmAnimationLoader.ts +151 -0
  810. package/src/components/avatar/VrmBlinkController.ts +118 -0
  811. package/src/components/avatar/VrmCameraManager.ts +407 -0
  812. package/src/components/avatar/VrmEngine.ts +2678 -0
  813. package/src/components/avatar/VrmFootShadow.ts +96 -0
  814. package/src/components/avatar/VrmViewer.tsx +421 -0
  815. package/src/components/avatar/__tests__/VrmCameraManager.test.ts +168 -0
  816. package/src/components/avatar/__tests__/VrmEngine.test.ts +1574 -0
  817. package/src/components/avatar/mixamoVRMRigMap.ts +62 -0
  818. package/src/components/avatar/retargetMixamoFbxToVrm.ts +144 -0
  819. package/src/components/avatar/retargetMixamoGltfToVrm.ts +119 -0
  820. package/src/components/chainConfig.ts +380 -0
  821. package/src/components/companion/CompanionHeader.tsx +47 -0
  822. package/src/components/companion/CompanionSceneHost.tsx +5 -0
  823. package/src/components/companion/VrmStage.tsx +2 -0
  824. package/src/components/companion/__tests__/walletUtils.test.ts +742 -0
  825. package/src/components/companion/walletUtils.ts +290 -0
  826. package/src/components/companion-shell-styles.test.ts +146 -0
  827. package/src/components/companion-shell-styles.ts +270 -0
  828. package/src/components/confirm-delete-control.tsx +69 -0
  829. package/src/components/conversations/ConversationListItem.tsx +185 -0
  830. package/src/components/conversations/conversation-utils.ts +151 -0
  831. package/src/components/format.ts +131 -0
  832. package/src/components/index.ts +92 -0
  833. package/src/components/inventory/CopyableAddress.tsx +41 -0
  834. package/src/components/inventory/InventoryToolbar.tsx +142 -0
  835. package/src/components/inventory/NftGrid.tsx +99 -0
  836. package/src/components/inventory/TokenLogo.tsx +71 -0
  837. package/src/components/inventory/TokensTable.tsx +216 -0
  838. package/src/components/inventory/constants.ts +170 -0
  839. package/src/components/inventory/index.ts +29 -0
  840. package/src/components/inventory/media-url.test.ts +38 -0
  841. package/src/components/inventory/media-url.ts +36 -0
  842. package/src/components/inventory/useInventoryData.ts +460 -0
  843. package/src/components/knowledge-upload-image.ts +215 -0
  844. package/src/components/labels.ts +46 -0
  845. package/src/components/onboarding/ActivateStep.tsx +30 -0
  846. package/src/components/onboarding/ConnectionStep.tsx +1530 -0
  847. package/src/components/onboarding/OnboardingPanel.tsx +39 -0
  848. package/src/components/onboarding/OnboardingStepNav.tsx +31 -0
  849. package/src/components/onboarding/PermissionsStep.tsx +20 -0
  850. package/src/components/onboarding/RpcStep.tsx +402 -0
  851. package/src/components/onboarding/WakeUpStep.tsx +184 -0
  852. package/src/components/permissions/PermissionIcon.tsx +25 -0
  853. package/src/components/permissions/StreamingPermissions.tsx +376 -0
  854. package/src/components/plugins/showcase-data.ts +481 -0
  855. package/src/components/shared/ShellHeaderControls.tsx +193 -0
  856. package/src/components/skeletons.tsx +88 -0
  857. package/src/components/stream/ActivityFeed.tsx +113 -0
  858. package/src/components/stream/AvatarPip.tsx +10 -0
  859. package/src/components/stream/ChatContent.tsx +126 -0
  860. package/src/components/stream/ChatTicker.tsx +55 -0
  861. package/src/components/stream/IdleContent.tsx +73 -0
  862. package/src/components/stream/StatusBar.tsx +469 -0
  863. package/src/components/stream/StreamSettings.tsx +506 -0
  864. package/src/components/stream/StreamTerminal.tsx +94 -0
  865. package/src/components/stream/StreamVoiceConfig.tsx +160 -0
  866. package/src/components/stream/helpers.ts +134 -0
  867. package/src/components/stream/overlays/OverlayLayer.tsx +75 -0
  868. package/src/components/stream/overlays/built-in/ActionTickerWidget.tsx +64 -0
  869. package/src/components/stream/overlays/built-in/AlertPopupWidget.tsx +87 -0
  870. package/src/components/stream/overlays/built-in/BrandingWidget.tsx +51 -0
  871. package/src/components/stream/overlays/built-in/CustomHtmlWidget.tsx +105 -0
  872. package/src/components/stream/overlays/built-in/PeonGlassWidget.tsx +265 -0
  873. package/src/components/stream/overlays/built-in/PeonHudWidget.tsx +247 -0
  874. package/src/components/stream/overlays/built-in/PeonSakuraWidget.tsx +278 -0
  875. package/src/components/stream/overlays/built-in/ThoughtBubbleWidget.tsx +77 -0
  876. package/src/components/stream/overlays/built-in/ViewerCountWidget.tsx +46 -0
  877. package/src/components/stream/overlays/built-in/index.ts +13 -0
  878. package/src/components/stream/overlays/registry.ts +22 -0
  879. package/src/components/stream/overlays/types.ts +90 -0
  880. package/src/components/stream/overlays/useOverlayLayout.ts +218 -0
  881. package/src/components/trajectory-format.ts +50 -0
  882. package/src/components/ui-badges.tsx +109 -0
  883. package/src/components/ui-switch.tsx +57 -0
  884. package/src/components/vector-browser-three.ts +27 -0
  885. package/src/config/config-catalog.ts +1092 -0
  886. package/src/config/config-field.tsx +1900 -0
  887. package/src/config/config-renderer.tsx +730 -0
  888. package/src/config/index.ts +11 -0
  889. package/src/config/ui-renderer.tsx +1751 -0
  890. package/src/config/ui-spec.ts +256 -0
  891. package/src/events/index.ts +89 -0
  892. package/src/hooks/index.ts +13 -0
  893. package/src/hooks/useBugReport.tsx +43 -0
  894. package/src/hooks/useCanvasWindow.ts +372 -0
  895. package/src/hooks/useChatAvatarVoice.ts +111 -0
  896. package/src/hooks/useContextMenu.ts +127 -0
  897. package/src/hooks/useKeyboardShortcuts.ts +86 -0
  898. package/src/hooks/useLifoSync.ts +143 -0
  899. package/src/hooks/useMemoryMonitor.ts +335 -0
  900. package/src/hooks/useRenderGuard.ts +43 -0
  901. package/src/hooks/useRetakeCapture.ts +67 -0
  902. package/src/hooks/useStreamPopoutNavigation.ts +27 -0
  903. package/src/hooks/useTimeout.ts +37 -0
  904. package/src/hooks/useVoiceChat.ts +1443 -0
  905. package/src/hooks/useWhatsAppPairing.ts +123 -0
  906. package/src/i18n/index.ts +76 -0
  907. package/src/i18n/locales/en.json +1196 -0
  908. package/src/i18n/locales/es.json +1196 -0
  909. package/src/i18n/locales/ko.json +1196 -0
  910. package/src/i18n/locales/pt.json +1196 -0
  911. package/src/i18n/locales/zh-CN.json +1196 -0
  912. package/src/i18n/messages.ts +21 -0
  913. package/src/index.ts +6 -0
  914. package/src/navigation/index.ts +282 -0
  915. package/src/navigation.test.ts +189 -0
  916. package/src/platform/browser-launch.test.ts +94 -0
  917. package/src/platform/browser-launch.ts +149 -0
  918. package/src/platform/index.ts +261 -0
  919. package/src/platform/init.ts +236 -0
  920. package/src/providers/index.ts +82 -0
  921. package/src/state/AppContext.tsx +5737 -0
  922. package/src/state/index.ts +6 -0
  923. package/src/state/internal.ts +77 -0
  924. package/src/state/parsers.test.ts +124 -0
  925. package/src/state/parsers.ts +309 -0
  926. package/src/state/persistence.ts +278 -0
  927. package/src/state/types.ts +694 -0
  928. package/src/state/ui-preferences.ts +3 -0
  929. package/src/state/useApp.ts +23 -0
  930. package/src/state/vrm.ts +76 -0
  931. package/src/stories/AppMockProvider.tsx +32 -0
  932. package/src/stories/ChatEmptyState.stories.tsx +27 -0
  933. package/src/stories/ChatMessage.stories.tsx +115 -0
  934. package/src/stories/CompanionHeader.stories.tsx +74 -0
  935. package/src/stories/CompanionView.stories.tsx +33 -0
  936. package/src/stories/ConversationListItem.stories.tsx +102 -0
  937. package/src/stories/TypingIndicator.stories.tsx +28 -0
  938. package/src/styles/anime.css +6324 -0
  939. package/src/styles/base.css +196 -0
  940. package/src/styles/onboarding-game.css +716 -0
  941. package/src/styles/styles.css +2085 -0
  942. package/src/styles/xterm.css +241 -0
  943. package/src/types/index.ts +715 -0
  944. package/src/types/react-test-renderer.d.ts +45 -0
  945. package/src/utils/asset-url.ts +110 -0
  946. package/src/utils/assistant-text.ts +172 -0
  947. package/src/utils/clipboard.ts +41 -0
  948. package/src/utils/desktop-dialogs.ts +80 -0
  949. package/src/utils/index.ts +6 -0
  950. package/src/utils/number-parsing.ts +125 -0
  951. package/src/utils/openExternalUrl.ts +20 -0
  952. package/src/utils/spoken-text.ts +65 -0
  953. package/src/utils/streaming-text.ts +120 -0
  954. package/src/voice/index.ts +1 -0
  955. package/src/voice/types.ts +197 -0
  956. package/test/app/AppContext.pty-sessions.test.tsx +143 -0
  957. package/test/app/MessageContent.test.tsx +326 -0
  958. package/test/app/PermissionsOnboarding.test.tsx +216 -0
  959. package/test/app/PermissionsSection.test.tsx +186 -0
  960. package/test/app/advanced-trajectory-fine-tuning.e2e.test.ts +397 -0
  961. package/test/app/agent-activity-box.test.tsx +132 -0
  962. package/test/app/agent-transfer-lock.test.ts +274 -0
  963. package/test/app/api-client-electron-fallback.test.ts +139 -0
  964. package/test/app/api-client-timeout.test.ts +75 -0
  965. package/test/app/api-client-ws.test.ts +98 -0
  966. package/test/app/api-client.ws-max-reconnect.test.ts +139 -0
  967. package/test/app/api-client.ws-reconnect.test.ts +157 -0
  968. package/test/app/app-context-autonomy-events.test.ts +478 -0
  969. package/test/app/apps-page-view.test.ts +114 -0
  970. package/test/app/apps-view.test.ts +769 -0
  971. package/test/app/autonomous-workflows.e2e.test.ts +765 -0
  972. package/test/app/autonomy-events.test.ts +150 -0
  973. package/test/app/avatar-selector.test.tsx +52 -0
  974. package/test/app/bsc-trade-panel.test.tsx +134 -0
  975. package/test/app/bug-report-modal.test.tsx +353 -0
  976. package/test/app/character-customization.e2e.test.ts +1168 -0
  977. package/test/app/chat-advanced-features.e2e.test.ts +706 -0
  978. package/test/app/chat-composer.test.tsx +181 -0
  979. package/test/app/chat-language-header.test.ts +64 -0
  980. package/test/app/chat-message.test.tsx +222 -0
  981. package/test/app/chat-modal-view.test.tsx +191 -0
  982. package/test/app/chat-routine-filter.test.ts +96 -0
  983. package/test/app/chat-send-lock.test.ts +1302 -0
  984. package/test/app/chat-stream-api-client.test.tsx +390 -0
  985. package/test/app/chat-view-game-modal.test.tsx +661 -0
  986. package/test/app/chat-view.test.tsx +877 -0
  987. package/test/app/cloud-api.e2e.test.ts +258 -0
  988. package/test/app/cloud-login-flow.e2e.test.ts +494 -0
  989. package/test/app/cloud-login-lock.test.ts +411 -0
  990. package/test/app/command-palette.test.tsx +184 -0
  991. package/test/app/command-registry.test.ts +75 -0
  992. package/test/app/companion-greeting-wave.test.tsx +443 -0
  993. package/test/app/companion-stale-conversation.test.tsx +424 -0
  994. package/test/app/companion-view.test.tsx +686 -0
  995. package/test/app/confirm-delete-control.test.ts +79 -0
  996. package/test/app/confirm-modal.test.tsx +219 -0
  997. package/test/app/connectors-ui.e2e.test.ts +508 -0
  998. package/test/app/conversations-sidebar-game-modal.test.tsx +260 -0
  999. package/test/app/conversations-sidebar.test.tsx +160 -0
  1000. package/test/app/custom-actions-smoke.test.ts +387 -0
  1001. package/test/app/custom-avatar-api-client.test.ts +207 -0
  1002. package/test/app/desktop-utils.test.ts +145 -0
  1003. package/test/app/electrobun-rpc-bridge.test.ts +83 -0
  1004. package/test/app/events.test.ts +88 -0
  1005. package/test/app/export-import-flows.e2e.test.ts +700 -0
  1006. package/test/app/fine-tuning-view.test.ts +471 -0
  1007. package/test/app/game-view-auth-session.test.tsx +186 -0
  1008. package/test/app/game-view.test.ts +444 -0
  1009. package/test/app/global-emote-overlay.test.tsx +106 -0
  1010. package/test/app/header-status.test.tsx +149 -0
  1011. package/test/app/i18n.test.ts +152 -0
  1012. package/test/app/inventory-bsc-view.test.ts +908 -0
  1013. package/test/app/knowledge-ui.e2e.test.ts +762 -0
  1014. package/test/app/knowledge-upload-helpers.test.ts +124 -0
  1015. package/test/app/lifecycle-lock.test.ts +267 -0
  1016. package/test/app/lifo-popout-utils.test.ts +208 -0
  1017. package/test/app/lifo-safe-endpoint.test.ts +34 -0
  1018. package/test/app/loading-screen.test.tsx +45 -0
  1019. package/test/app/memory-monitor.test.ts +332 -0
  1020. package/test/app/navigation.test.tsx +29 -0
  1021. package/test/app/onboarding-finish-lock.test.ts +500 -0
  1022. package/test/app/onboarding-language.test.tsx +161 -0
  1023. package/test/app/onboarding-steps.test.tsx +371 -0
  1024. package/test/app/open-external-url.test.ts +65 -0
  1025. package/test/app/pages-navigation-smoke.e2e.test.ts +633 -0
  1026. package/test/app/pairing-lock.test.ts +260 -0
  1027. package/test/app/pairing-view.test.tsx +74 -0
  1028. package/test/app/permissions-section.test.ts +432 -0
  1029. package/test/app/plugin-bridge.test.ts +109 -0
  1030. package/test/app/plugins-ui.e2e.test.ts +605 -0
  1031. package/test/app/plugins-view-game-modal.test.tsx +650 -0
  1032. package/test/app/plugins-view-toggle-restart.test.ts +129 -0
  1033. package/test/app/provider-dropdown-default.test.tsx +164 -0
  1034. package/test/app/restart-banner.test.tsx +197 -0
  1035. package/test/app/retake-capture.test.ts +84 -0
  1036. package/test/app/sandbox-api-client.test.ts +108 -0
  1037. package/test/app/save-command-modal.test.tsx +109 -0
  1038. package/test/app/secrets-view.test.tsx +92 -0
  1039. package/test/app/settings-control-styles.test.tsx +142 -0
  1040. package/test/app/settings-reset.e2e.test.ts +728 -0
  1041. package/test/app/settings-sections.e2e.test.ts +614 -0
  1042. package/test/app/shared-format.test.ts +44 -0
  1043. package/test/app/shared-switch.test.ts +69 -0
  1044. package/test/app/shell-mode-switching.e2e.test.ts +829 -0
  1045. package/test/app/shell-mode-tab-memory.test.tsx +283 -0
  1046. package/test/app/shell-overlays.test.tsx +50 -0
  1047. package/test/app/shortcuts-overlay.test.tsx +111 -0
  1048. package/test/app/sse-interruption.test.ts +122 -0
  1049. package/test/app/startup-asset-missing.e2e.test.ts +126 -0
  1050. package/test/app/startup-backend-missing.e2e.test.ts +118 -0
  1051. package/test/app/startup-chat.e2e.test.ts +305 -0
  1052. package/test/app/startup-conversation-restore.test.tsx +344 -0
  1053. package/test/app/startup-failure-view.test.tsx +103 -0
  1054. package/test/app/startup-onboarding.e2e.test.ts +612 -0
  1055. package/test/app/startup-timeout.test.tsx +80 -0
  1056. package/test/app/startup-token-401.e2e.test.ts +103 -0
  1057. package/test/app/stream-helpers.test.ts +46 -0
  1058. package/test/app/stream-popout-navigation.test.tsx +41 -0
  1059. package/test/app/stream-status-bar.test.tsx +89 -0
  1060. package/test/app/theme-toggle.test.tsx +33 -0
  1061. package/test/app/training-api-client.test.ts +128 -0
  1062. package/test/app/trajectories-view.test.tsx +220 -0
  1063. package/test/app/triggers-api-client.test.ts +77 -0
  1064. package/test/app/triggers-navigation.test.ts +118 -0
  1065. package/test/app/triggers-view.e2e.test.ts +674 -0
  1066. package/test/app/update-channel-lock.test.ts +259 -0
  1067. package/test/app/vector-browser.async-cleanup.test.tsx +367 -0
  1068. package/test/app/vector-browser.e2e.test.ts +653 -0
  1069. package/test/app/vrm-stage.test.tsx +351 -0
  1070. package/test/app/vrm-viewer.test.tsx +298 -0
  1071. package/test/app/wallet-api-save-lock.test.ts +277 -0
  1072. package/test/app/wallet-hooks.test.ts +405 -0
  1073. package/test/app/wallet-ui-flows.e2e.test.ts +556 -0
  1074. package/test/avatar/asset-url.test.ts +90 -0
  1075. package/test/avatar/avatar-selector.test.ts +173 -0
  1076. package/test/avatar/mixamo-vrm-rig-map.test.ts +111 -0
  1077. package/test/avatar/voice-chat-streaming-text.test.ts +96 -0
  1078. package/test/avatar/voice-chat.test.ts +391 -0
  1079. package/test/ui/command-palette-commands.test.ts +57 -0
  1080. package/test/ui/ui-renderer.test.ts +39 -0
  1081. package/tsconfig.build.json +19 -0
  1082. package/tsconfig.json +21 -0
@@ -0,0 +1,1633 @@
1
+ /**
2
+ * Vector Browser — explore agent memories and embeddings.
3
+ *
4
+ * Reads from the memories table (or similar vector-storage tables) using
5
+ * the generic database APIs. Shows paginated memory records with content,
6
+ * metadata, and embedding previews. Click any card to see full details.
7
+ * Toggle to a 2D scatter-plot graph view of embeddings.
8
+ */
9
+
10
+ import { Button, Input } from "@elizaos/ui";
11
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
12
+ import { client, type QueryResult, type TableInfo } from "../api";
13
+ import { useApp } from "../state";
14
+ import { createVectorBrowserRenderer, THREE } from "./vector-browser-three";
15
+
16
+ const PAGE_SIZE = 25;
17
+ const MAX_THREE_PIXEL_RATIO = 2;
18
+
19
+ type ViewMode = "list" | "graph" | "3d";
20
+
21
+ /** The dimension columns in the elizaOS `embeddings` table. */
22
+ const DIM_COLUMNS = [
23
+ "dim_384",
24
+ "dim_512",
25
+ "dim_768",
26
+ "dim_1024",
27
+ "dim_1536",
28
+ "dim_3072",
29
+ ] as const;
30
+
31
+ interface MemoryRecord {
32
+ id: string;
33
+ content: string;
34
+ roomId: string;
35
+ entityId: string;
36
+ type: string;
37
+ createdAt: string;
38
+ unique: boolean;
39
+ embedding: number[] | null;
40
+ raw: Record<string, unknown>;
41
+ }
42
+
43
+ function hasEmbedding(
44
+ memory: MemoryRecord,
45
+ ): memory is MemoryRecord & { embedding: number[] } {
46
+ return memory.embedding !== null;
47
+ }
48
+
49
+ interface VectorGraph2DBounds {
50
+ minX: number;
51
+ minY: number;
52
+ rangeX: number;
53
+ rangeY: number;
54
+ }
55
+
56
+ interface VectorGraph2DLayout {
57
+ bounds: VectorGraph2DBounds;
58
+ points: [number, number][];
59
+ typeColors: Record<string, string>;
60
+ withEmbeddings: Array<MemoryRecord & { embedding: number[] }>;
61
+ }
62
+
63
+ const VECTOR_GRAPH_2D_PALETTE = [
64
+ "#6cf",
65
+ "#f59e0b",
66
+ "#10b981",
67
+ "#ef4444",
68
+ "#8b5cf6",
69
+ "#ec4899",
70
+ "#06b6d4",
71
+ "#84cc16",
72
+ ];
73
+
74
+ /** Try to parse a JSON content field, returning the text content or the raw string. */
75
+ function parseContent(val: unknown): string {
76
+ if (typeof val !== "string") return String(val ?? "");
77
+ if (val.startsWith("{")) {
78
+ try {
79
+ const parsed = JSON.parse(val);
80
+ if (parsed.text) return String(parsed.text);
81
+ return val;
82
+ } catch {
83
+ return val;
84
+ }
85
+ }
86
+ return val;
87
+ }
88
+
89
+ /** Parse an embedding from various storage formats (pgvector text, JSON, typed arrays). */
90
+ function parseEmbedding(val: unknown): number[] | null {
91
+ if (!val) return null;
92
+ if (Array.isArray(val)) return val as number[];
93
+ // Handle typed arrays (Float32Array, Float64Array, Uint8Array etc.)
94
+ if (ArrayBuffer.isView(val)) {
95
+ return Array.from(val as Float64Array);
96
+ }
97
+ if (typeof val === "string" && val.length > 2) {
98
+ const trimmed = val.trim();
99
+ // pgvector text format: [0.1,0.2,0.3] — also valid JSON
100
+ // Also handle without brackets: 0.1,0.2,0.3
101
+ const inner =
102
+ trimmed.startsWith("[") && trimmed.endsWith("]")
103
+ ? trimmed.slice(1, -1)
104
+ : trimmed;
105
+ if (!inner) return null;
106
+ // Fast path: split by comma and parse floats
107
+ const parts = inner.split(",");
108
+ if (parts.length < 2) return null;
109
+ const nums: number[] = [];
110
+ for (const p of parts) {
111
+ const n = Number.parseFloat(p);
112
+ if (Number.isNaN(n)) return null;
113
+ nums.push(n);
114
+ }
115
+ return nums;
116
+ }
117
+ return null;
118
+ }
119
+
120
+ function rowToMemory(row: Record<string, unknown>): MemoryRecord {
121
+ // Try explicit embedding/vector column first, then check elizaOS dim_* columns
122
+ let embeddingVal = row.embedding ?? row.vector ?? row.embeddings;
123
+ if (!embeddingVal) {
124
+ for (const dim of DIM_COLUMNS) {
125
+ if (row[dim]) {
126
+ embeddingVal = row[dim];
127
+ break;
128
+ }
129
+ }
130
+ }
131
+
132
+ return {
133
+ id: String(row.id ?? row.ID ?? row.memory_id ?? ""),
134
+ content: parseContent(row.content ?? row.body ?? row.text ?? ""),
135
+ roomId: String(row.roomId ?? row.room_id ?? row.roomID ?? ""),
136
+ entityId: String(
137
+ row.entityId ??
138
+ row.entity_id ??
139
+ row.entityID ??
140
+ row.userId ??
141
+ row.user_id ??
142
+ "",
143
+ ),
144
+ type: String(row.type ?? row.memoryType ?? row.memory_type ?? ""),
145
+ createdAt: String(row.createdAt ?? row.created_at ?? row.timestamp ?? ""),
146
+ unique: row.unique === true || row.unique === 1 || row.isUnique === true,
147
+ embedding: parseEmbedding(embeddingVal),
148
+ raw: row,
149
+ };
150
+ }
151
+
152
+ function buildVectorGraph2DLayout(
153
+ memories: MemoryRecord[],
154
+ ): VectorGraph2DLayout | null {
155
+ const withEmbeddings = memories.filter(hasEmbedding);
156
+ if (withEmbeddings.length < 2) {
157
+ return null;
158
+ }
159
+
160
+ const points = projectTo2D(withEmbeddings.map((memory) => memory.embedding));
161
+ let minX = Infinity;
162
+ let maxX = -Infinity;
163
+ let minY = Infinity;
164
+ let maxY = -Infinity;
165
+ for (const [x, y] of points) {
166
+ if (x < minX) minX = x;
167
+ if (x > maxX) maxX = x;
168
+ if (y < minY) minY = y;
169
+ if (y > maxY) maxY = y;
170
+ }
171
+
172
+ const typeColors: Record<string, string> = {};
173
+ const types = [...new Set(withEmbeddings.map((memory) => memory.type))];
174
+ for (let index = 0; index < types.length; index += 1) {
175
+ typeColors[types[index]] =
176
+ VECTOR_GRAPH_2D_PALETTE[index % VECTOR_GRAPH_2D_PALETTE.length];
177
+ }
178
+
179
+ return {
180
+ bounds: {
181
+ minX,
182
+ minY,
183
+ rangeX: maxX - minX || 1,
184
+ rangeY: maxY - minY || 1,
185
+ },
186
+ points,
187
+ typeColors,
188
+ withEmbeddings,
189
+ };
190
+ }
191
+
192
+ function toVectorGraph2DScreenX(
193
+ x: number,
194
+ width: number,
195
+ padding: number,
196
+ bounds: VectorGraph2DBounds,
197
+ ): number {
198
+ return padding + ((x - bounds.minX) / bounds.rangeX) * (width - 2 * padding);
199
+ }
200
+
201
+ function toVectorGraph2DScreenY(
202
+ y: number,
203
+ height: number,
204
+ padding: number,
205
+ bounds: VectorGraph2DBounds,
206
+ ): number {
207
+ return padding + ((y - bounds.minY) / bounds.rangeY) * (height - 2 * padding);
208
+ }
209
+
210
+ // ── PCA projection utilities ───────────────────────────────────────────
211
+
212
+ function dot(a: number[], b: Float64Array | number[]): number {
213
+ let s = 0;
214
+ for (let i = 0; i < a.length; i++) s += a[i] * (b[i] ?? 0);
215
+ return s;
216
+ }
217
+
218
+ function powerIteration(
219
+ data: number[][],
220
+ dims: number,
221
+ iters = 30,
222
+ ): Float64Array {
223
+ const v = new Float64Array(dims);
224
+ // Random init
225
+ for (let d = 0; d < dims; d++) v[d] = Math.random() - 0.5;
226
+ normalize(v);
227
+
228
+ for (let iter = 0; iter < iters; iter++) {
229
+ const w = new Float64Array(dims);
230
+ for (const row of data) {
231
+ const d = dot(row, v);
232
+ for (let j = 0; j < dims; j++) w[j] += d * row[j];
233
+ }
234
+ normalize(w);
235
+ for (let d = 0; d < dims; d++) v[d] = w[d];
236
+ }
237
+ return v;
238
+ }
239
+
240
+ function normalize(v: Float64Array) {
241
+ let len = 0;
242
+ for (let i = 0; i < v.length; i++) len += v[i] * v[i];
243
+ len = Math.sqrt(len) || 1;
244
+ for (let i = 0; i < v.length; i++) v[i] /= len;
245
+ }
246
+
247
+ /** Compute mean and center data for PCA. */
248
+ function centerData(vectors: number[][]): {
249
+ centered: number[][];
250
+ mean: Float64Array;
251
+ } {
252
+ const dims = vectors[0].length;
253
+ const n = vectors.length;
254
+ const mean = new Float64Array(dims);
255
+ for (const v of vectors) {
256
+ for (let d = 0; d < dims; d++) mean[d] += v[d];
257
+ }
258
+ for (let d = 0; d < dims; d++) mean[d] /= n;
259
+ const centered = vectors.map((v) => v.map((x, d) => x - mean[d]));
260
+ return { centered, mean };
261
+ }
262
+
263
+ /** Deflate data by removing projection onto a principal component. */
264
+ function deflate(data: number[][], pc: Float64Array): number[][] {
265
+ const proj = data.map((v) => dot(v, pc));
266
+ return data.map((v, i) => v.map((x, d) => x - proj[i] * pc[d]));
267
+ }
268
+
269
+ /** Project high-dimensional vectors to 2D using the first two principal axes. */
270
+ function projectTo2D(vectors: number[][]): [number, number][] {
271
+ if (vectors.length === 0) return [];
272
+ const dims = vectors[0].length;
273
+ const { centered } = centerData(vectors);
274
+
275
+ const pc1 = powerIteration(centered, dims);
276
+ const deflated1 = deflate(centered, pc1);
277
+ const pc2 = powerIteration(deflated1, dims);
278
+
279
+ return centered.map((v) => [dot(v, pc1), dot(v, pc2)] as [number, number]);
280
+ }
281
+
282
+ /** Project high-dimensional vectors to 3D using the first three principal axes. */
283
+ function projectTo3D(vectors: number[][]): [number, number, number][] {
284
+ if (vectors.length === 0) return [];
285
+ const dims = vectors[0].length;
286
+ const { centered } = centerData(vectors);
287
+
288
+ const pc1 = powerIteration(centered, dims);
289
+ const deflated1 = deflate(centered, pc1);
290
+ const pc2 = powerIteration(deflated1, dims);
291
+ const deflated2 = deflate(deflated1, pc2);
292
+ const pc3 = powerIteration(deflated2, dims);
293
+
294
+ return centered.map(
295
+ (v) => [dot(v, pc1), dot(v, pc2), dot(v, pc3)] as [number, number, number],
296
+ );
297
+ }
298
+
299
+ // ── Graph sub-component ────────────────────────────────────────────────
300
+
301
+ function VectorGraph({
302
+ memories,
303
+ onSelect,
304
+ }: {
305
+ memories: MemoryRecord[];
306
+ onSelect: (mem: MemoryRecord) => void;
307
+ }) {
308
+ const { t } = useApp();
309
+ const canvasRef = useRef<HTMLCanvasElement>(null);
310
+ const containerRef = useRef<HTMLDivElement>(null);
311
+ const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);
312
+ const graph = useMemo(() => buildVectorGraph2DLayout(memories), [memories]);
313
+
314
+ useEffect(() => {
315
+ const canvas = canvasRef.current;
316
+ const container = containerRef.current;
317
+ if (!canvas || !container || !graph) return;
318
+
319
+ const rect = container.getBoundingClientRect();
320
+ const W = rect.width;
321
+ const H = 500;
322
+ const dpr = window.devicePixelRatio || 1;
323
+ canvas.width = W * dpr;
324
+ canvas.height = H * dpr;
325
+ canvas.style.width = `${W}px`;
326
+ canvas.style.height = `${H}px`;
327
+
328
+ const ctx = canvas.getContext("2d");
329
+ if (!ctx) return;
330
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
331
+
332
+ const pad = 40;
333
+
334
+ // Background
335
+ const style = getComputedStyle(document.documentElement);
336
+ const bgColor = style.getPropertyValue("--bg").trim() || "#111";
337
+ const borderColor = style.getPropertyValue("--border").trim() || "#333";
338
+ const accentColor = style.getPropertyValue("--accent").trim() || "#6cf";
339
+ const mutedColor = style.getPropertyValue("--muted").trim() || "#888";
340
+
341
+ ctx.fillStyle = bgColor;
342
+ ctx.fillRect(0, 0, W, H);
343
+
344
+ // Grid lines
345
+ ctx.strokeStyle = borderColor;
346
+ ctx.lineWidth = 0.5;
347
+ for (let i = 0; i <= 4; i++) {
348
+ const x = pad + (i / 4) * (W - 2 * pad);
349
+ const y = pad + (i / 4) * (H - 2 * pad);
350
+ ctx.beginPath();
351
+ ctx.moveTo(x, pad);
352
+ ctx.lineTo(x, H - pad);
353
+ ctx.stroke();
354
+ ctx.beginPath();
355
+ ctx.moveTo(pad, y);
356
+ ctx.lineTo(W - pad, y);
357
+ ctx.stroke();
358
+ }
359
+
360
+ // Axis labels
361
+ ctx.fillStyle = mutedColor;
362
+ ctx.font = "10px monospace";
363
+ ctx.textAlign = "center";
364
+ ctx.fillText("PC1", W / 2, H - 8);
365
+ ctx.save();
366
+ ctx.translate(12, H / 2);
367
+ ctx.rotate(-Math.PI / 2);
368
+ ctx.fillText("PC2", 0, 0);
369
+ ctx.restore();
370
+
371
+ // Draw points
372
+ for (let i = 0; i < graph.points.length; i++) {
373
+ const sx = toVectorGraph2DScreenX(
374
+ graph.points[i][0],
375
+ W,
376
+ pad,
377
+ graph.bounds,
378
+ );
379
+ const sy = toVectorGraph2DScreenY(
380
+ graph.points[i][1],
381
+ H,
382
+ pad,
383
+ graph.bounds,
384
+ );
385
+ const memory = graph.withEmbeddings[i];
386
+ const color = graph.typeColors[memory.type] || accentColor;
387
+ const isHovered = hoveredIdx === i;
388
+
389
+ ctx.beginPath();
390
+ ctx.arc(sx, sy, isHovered ? 6 : 4, 0, Math.PI * 2);
391
+ ctx.fillStyle = color;
392
+ ctx.globalAlpha = isHovered ? 1 : 0.7;
393
+ ctx.fill();
394
+ ctx.globalAlpha = 1;
395
+
396
+ if (isHovered) {
397
+ ctx.strokeStyle = "#fff";
398
+ ctx.lineWidth = 1.5;
399
+ ctx.stroke();
400
+ }
401
+ }
402
+
403
+ // Tooltip for hovered point
404
+ if (hoveredIdx !== null && hoveredIdx < graph.points.length) {
405
+ const sx = toVectorGraph2DScreenX(
406
+ graph.points[hoveredIdx][0],
407
+ W,
408
+ pad,
409
+ graph.bounds,
410
+ );
411
+ const sy = toVectorGraph2DScreenY(
412
+ graph.points[hoveredIdx][1],
413
+ H,
414
+ pad,
415
+ graph.bounds,
416
+ );
417
+ const memory = graph.withEmbeddings[hoveredIdx];
418
+ const label =
419
+ memory.content.slice(0, 60) + (memory.content.length > 60 ? "..." : "");
420
+
421
+ ctx.font = "11px sans-serif";
422
+ const metrics = ctx.measureText(label);
423
+ const tw = metrics.width + 12;
424
+ const th = 22;
425
+ let tx = sx + 10;
426
+ let ty = sy - 10 - th;
427
+ if (tx + tw > W) tx = sx - tw - 10;
428
+ if (ty < 0) ty = sy + 10;
429
+
430
+ ctx.fillStyle = "rgba(0,0,0,0.85)";
431
+ ctx.fillRect(tx, ty, tw, th);
432
+ ctx.fillStyle = "#fff";
433
+ ctx.textAlign = "left";
434
+ ctx.fillText(label, tx + 6, ty + 15);
435
+ }
436
+
437
+ // Legend
438
+ const types = Object.keys(graph.typeColors);
439
+ if (types.length > 1) {
440
+ let lx = pad;
441
+ const ly = H - 4;
442
+ ctx.font = "10px sans-serif";
443
+ ctx.textAlign = "left";
444
+ for (const type of types) {
445
+ if (!type || type === "undefined") continue;
446
+ ctx.fillStyle = graph.typeColors[type];
447
+ ctx.fillRect(lx, ly - 8, 8, 8);
448
+ ctx.fillStyle = mutedColor;
449
+ ctx.fillText(type, lx + 11, ly);
450
+ lx += ctx.measureText(type).width + 24;
451
+ }
452
+ }
453
+ }, [graph, hoveredIdx]);
454
+
455
+ // Mouse interaction
456
+ const handleMouseMove = useCallback(
457
+ (e: React.MouseEvent<HTMLCanvasElement>) => {
458
+ const canvas = canvasRef.current;
459
+ if (!canvas || !graph) return;
460
+ const rect = canvas.getBoundingClientRect();
461
+ const mx = e.clientX - rect.left;
462
+ const my = e.clientY - rect.top;
463
+
464
+ const W = rect.width;
465
+ const H = rect.height;
466
+ const pad = 40;
467
+
468
+ let closest = -1;
469
+ let closestDist = 15; // max pixel distance
470
+ for (let i = 0; i < graph.points.length; i++) {
471
+ const sx = toVectorGraph2DScreenX(
472
+ graph.points[i][0],
473
+ W,
474
+ pad,
475
+ graph.bounds,
476
+ );
477
+ const sy = toVectorGraph2DScreenY(
478
+ graph.points[i][1],
479
+ H,
480
+ pad,
481
+ graph.bounds,
482
+ );
483
+ const dist = Math.sqrt((mx - sx) ** 2 + (my - sy) ** 2);
484
+ if (dist < closestDist) {
485
+ closestDist = dist;
486
+ closest = i;
487
+ }
488
+ }
489
+ setHoveredIdx(closest >= 0 ? closest : null);
490
+ },
491
+ [graph],
492
+ );
493
+
494
+ const handleClick = useCallback(() => {
495
+ if (
496
+ graph &&
497
+ hoveredIdx !== null &&
498
+ hoveredIdx < graph.withEmbeddings.length
499
+ ) {
500
+ onSelect(graph.withEmbeddings[hoveredIdx]);
501
+ }
502
+ }, [graph, hoveredIdx, onSelect]);
503
+
504
+ if (!graph) {
505
+ const withEmbeddings = memories.filter(hasEmbedding);
506
+ return (
507
+ <div className="text-center py-16">
508
+ <div className="text-[var(--muted)] text-sm mb-2">
509
+ {t("vectorbrowserview.NotEnoughEmbedding")}
510
+ </div>
511
+ <div className="text-[var(--muted)] text-xs">
512
+ {t("vectorbrowserview.NeedAtLeast2Memo")} {withEmbeddings.length}.
513
+ </div>
514
+ </div>
515
+ );
516
+ }
517
+
518
+ return (
519
+ <div ref={containerRef} className="w-full">
520
+ <div className="text-[11px] text-[var(--muted)] mb-2">
521
+ {graph.withEmbeddings.length}{" "}
522
+ {t("vectorbrowserview.vectorsProjectedTo")}
523
+ </div>
524
+ <canvas
525
+ ref={canvasRef}
526
+ className="w-full border border-[var(--border)] cursor-crosshair"
527
+ style={{ height: 500 }}
528
+ onMouseMove={handleMouseMove}
529
+ onMouseLeave={() => setHoveredIdx(null)}
530
+ onClick={handleClick}
531
+ />
532
+ </div>
533
+ );
534
+ }
535
+
536
+ // ── 3D Graph sub-component (Three.js) ──────────────────────────────────
537
+
538
+ function VectorGraph3D({
539
+ memories,
540
+ onSelect,
541
+ }: {
542
+ memories: MemoryRecord[];
543
+ onSelect: (mem: MemoryRecord) => void;
544
+ }) {
545
+ const { t } = useApp();
546
+ const containerRef = useRef<HTMLDivElement>(null);
547
+ const rendererRef = useRef<THREE.WebGLRenderer | null>(null);
548
+ const sceneRef = useRef<THREE.Scene | null>(null);
549
+ const cameraRef = useRef<THREE.PerspectiveCamera | null>(null);
550
+ const spheresRef = useRef<THREE.Mesh[]>([]);
551
+ const animationRef = useRef<number>(0);
552
+ const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);
553
+ const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(
554
+ null,
555
+ );
556
+ const [rendererUnavailable, setRendererUnavailable] = useState(false);
557
+ const isDraggingRef = useRef(false);
558
+ const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);
559
+ const cleanupRef = useRef<(() => void) | null>(null);
560
+
561
+ const withEmbeddings = useMemo(
562
+ () => memories.filter(hasEmbedding),
563
+ [memories],
564
+ );
565
+
566
+ const points3D = useMemo(() => {
567
+ if (withEmbeddings.length < 2) return [];
568
+ const vecs = withEmbeddings.map((m) => m.embedding);
569
+ return projectTo3D(vecs);
570
+ }, [withEmbeddings]);
571
+
572
+ // Color palette for types
573
+ const typeColors = useMemo(() => {
574
+ const types = [...new Set(withEmbeddings.map((m) => m.type))];
575
+ const palette = [
576
+ 0x6699ff, 0xf59e0b, 0x10b981, 0xef4444, 0x8b5cf6, 0xec4899, 0x06b6d4,
577
+ 0x84cc16,
578
+ ];
579
+ const map: Record<string, number> = {};
580
+ types.forEach((t, i) => {
581
+ map[t] = palette[i % palette.length];
582
+ });
583
+ return map;
584
+ }, [withEmbeddings]);
585
+
586
+ // Initialize Three.js scene
587
+ useEffect(() => {
588
+ const container = containerRef.current;
589
+ if (!container || points3D.length === 0) return;
590
+
591
+ let cancelled = false;
592
+ cleanupRef.current = null;
593
+ setRendererUnavailable(false);
594
+
595
+ // Async renderer creation — tries WebGPU, falls back to WebGL.
596
+ // All scene setup runs inside this async IIFE so the useEffect callback
597
+ // itself remains synchronous (required for React cleanup return).
598
+ void (async () => {
599
+ const W = container.clientWidth;
600
+ const H = 550;
601
+
602
+ // Scene
603
+ const scene = new THREE.Scene();
604
+ scene.background = new THREE.Color(0x111111);
605
+ sceneRef.current = scene;
606
+
607
+ // Camera
608
+ const camera = new THREE.PerspectiveCamera(60, W / H, 0.1, 1000);
609
+ camera.position.set(0, 0, 5);
610
+ cameraRef.current = camera;
611
+
612
+ let renderer: THREE.WebGLRenderer;
613
+ try {
614
+ renderer = await createVectorBrowserRenderer();
615
+ } catch {
616
+ if (!cancelled) {
617
+ setRendererUnavailable(true);
618
+ }
619
+ return;
620
+ }
621
+
622
+ // Guard: if the effect was cleaned up while awaiting WebGPU init, abort.
623
+ if (cancelled) {
624
+ renderer.dispose();
625
+ return;
626
+ }
627
+
628
+ const raycaster = new THREE.Raycaster();
629
+ const pointer = new THREE.Vector2();
630
+ const geometry = new THREE.SphereGeometry(0.06, 16, 16);
631
+ const spheres: THREE.Mesh[] = [];
632
+ let gridHelper: THREE.GridHelper | null = null;
633
+ let axisGeom: THREE.BufferGeometry | null = null;
634
+ let axisMat: THREE.LineBasicMaterial | null = null;
635
+ let onMouseDown: ((e: MouseEvent) => void) | null = null;
636
+ let onMouseUp: (() => void) | null = null;
637
+ let onMouseMove: ((e: MouseEvent) => void) | null = null;
638
+ let onClick: ((e: MouseEvent) => void) | null = null;
639
+ let onWheel: ((e: WheelEvent) => void) | null = null;
640
+ let onMouseLeave: (() => void) | null = null;
641
+ let handleResize: (() => void) | null = null;
642
+ let cleanedUp = false;
643
+
644
+ cleanupRef.current = () => {
645
+ if (cleanedUp) return;
646
+ cleanedUp = true;
647
+ cancelAnimationFrame(animationRef.current);
648
+ if (handleResize) {
649
+ window.removeEventListener("resize", handleResize);
650
+ }
651
+ if (onMouseDown) {
652
+ renderer.domElement.removeEventListener("mousedown", onMouseDown);
653
+ }
654
+ if (onMouseUp) {
655
+ renderer.domElement.removeEventListener("mouseup", onMouseUp);
656
+ }
657
+ if (onMouseMove) {
658
+ renderer.domElement.removeEventListener("mousemove", onMouseMove);
659
+ }
660
+ if (onClick) {
661
+ renderer.domElement.removeEventListener("click", onClick);
662
+ }
663
+ if (onWheel) {
664
+ renderer.domElement.removeEventListener("wheel", onWheel);
665
+ }
666
+ if (onMouseLeave) {
667
+ renderer.domElement.removeEventListener("mouseleave", onMouseLeave);
668
+ }
669
+ geometry.dispose();
670
+ axisGeom?.dispose();
671
+ axisMat?.dispose();
672
+ if (gridHelper) {
673
+ const gridMaterial = Array.isArray(gridHelper.material)
674
+ ? gridHelper.material
675
+ : [gridHelper.material];
676
+ for (const material of gridMaterial) {
677
+ material.dispose();
678
+ }
679
+ gridHelper.geometry.dispose();
680
+ }
681
+ for (const sphere of spheres) {
682
+ const material = sphere.material;
683
+ if (Array.isArray(material)) {
684
+ for (const entry of material) {
685
+ entry.dispose();
686
+ }
687
+ } else {
688
+ material.dispose();
689
+ }
690
+ }
691
+ renderer.dispose();
692
+ rendererRef.current = null;
693
+ sceneRef.current = null;
694
+ cameraRef.current = null;
695
+ spheresRef.current = [];
696
+ if (container.contains(renderer.domElement)) {
697
+ container.removeChild(renderer.domElement);
698
+ }
699
+ };
700
+
701
+ renderer.setSize(W, H);
702
+ renderer.setPixelRatio(
703
+ Math.min(window.devicePixelRatio || 1, MAX_THREE_PIXEL_RATIO),
704
+ );
705
+ container.appendChild(renderer.domElement);
706
+ rendererRef.current = renderer;
707
+ if (cancelled) {
708
+ cleanupRef.current?.();
709
+ cleanupRef.current = null;
710
+ return;
711
+ }
712
+
713
+ // Compute bounds for scaling
714
+ let minX = Infinity,
715
+ maxX = -Infinity;
716
+ let minY = Infinity,
717
+ maxY = -Infinity;
718
+ let minZ = Infinity,
719
+ maxZ = -Infinity;
720
+ for (const [x, y, z] of points3D) {
721
+ if (x < minX) minX = x;
722
+ if (x > maxX) maxX = x;
723
+ if (y < minY) minY = y;
724
+ if (y > maxY) maxY = y;
725
+ if (z < minZ) minZ = z;
726
+ if (z > maxZ) maxZ = z;
727
+ }
728
+ const rangeX = maxX - minX || 1;
729
+ const rangeY = maxY - minY || 1;
730
+ const rangeZ = maxZ - minZ || 1;
731
+ const maxRange = Math.max(rangeX, rangeY, rangeZ);
732
+ const scale = 3 / maxRange;
733
+ const centerX = (minX + maxX) / 2;
734
+ const centerY = (minY + maxY) / 2;
735
+ const centerZ = (minZ + maxZ) / 2;
736
+
737
+ for (let i = 0; i < points3D.length; i++) {
738
+ const [x, y, z] = points3D[i];
739
+ const mem = withEmbeddings[i];
740
+ const color = typeColors[mem.type] ?? 0x6699ff;
741
+ const material = new THREE.MeshBasicMaterial({
742
+ color,
743
+ transparent: true,
744
+ opacity: 0.85,
745
+ });
746
+ const sphere = new THREE.Mesh(geometry, material);
747
+ sphere.position.set(
748
+ (x - centerX) * scale,
749
+ (y - centerY) * scale,
750
+ (z - centerZ) * scale,
751
+ );
752
+ sphere.userData = { index: i };
753
+ scene.add(sphere);
754
+ spheres.push(sphere);
755
+ }
756
+ spheresRef.current = spheres;
757
+
758
+ // Add subtle grid helper
759
+ gridHelper = new THREE.GridHelper(6, 12, 0x333333, 0x222222);
760
+ gridHelper.position.y = -2;
761
+ scene.add(gridHelper);
762
+
763
+ // Add axis lines
764
+ const axisLength = 2.5;
765
+ axisGeom = new THREE.BufferGeometry();
766
+ const axisPositions = new Float32Array([
767
+ -axisLength,
768
+ 0,
769
+ 0,
770
+ axisLength,
771
+ 0,
772
+ 0, // X axis
773
+ 0,
774
+ -axisLength,
775
+ 0,
776
+ 0,
777
+ axisLength,
778
+ 0, // Y axis
779
+ 0,
780
+ 0,
781
+ -axisLength,
782
+ 0,
783
+ 0,
784
+ axisLength, // Z axis
785
+ ]);
786
+ axisGeom.setAttribute(
787
+ "position",
788
+ new THREE.BufferAttribute(axisPositions, 3),
789
+ );
790
+ axisMat = new THREE.LineBasicMaterial({ color: 0x444444 });
791
+ const axisLines = new THREE.LineSegments(axisGeom, axisMat);
792
+ scene.add(axisLines);
793
+
794
+ // Simple orbit controls (manual implementation)
795
+ let theta = 0;
796
+ let phi = Math.PI / 4;
797
+ let radius = 5;
798
+ let targetTheta = theta;
799
+ let targetPhi = phi;
800
+ let targetRadius = radius;
801
+ const updatePointerFromEvent = (e: MouseEvent) => {
802
+ const rect = renderer.domElement.getBoundingClientRect();
803
+ pointer.set(
804
+ ((e.clientX - rect.left) / rect.width) * 2 - 1,
805
+ -((e.clientY - rect.top) / rect.height) * 2 + 1,
806
+ );
807
+ return rect;
808
+ };
809
+
810
+ const updateCamera = () => {
811
+ theta += (targetTheta - theta) * 0.1;
812
+ phi += (targetPhi - phi) * 0.1;
813
+ radius += (targetRadius - radius) * 0.1;
814
+ phi = Math.max(0.1, Math.min(Math.PI - 0.1, phi));
815
+ camera.position.x = radius * Math.sin(phi) * Math.cos(theta);
816
+ camera.position.y = radius * Math.cos(phi);
817
+ camera.position.z = radius * Math.sin(phi) * Math.sin(theta);
818
+ camera.lookAt(0, 0, 0);
819
+ };
820
+
821
+ onMouseDown = (e: MouseEvent) => {
822
+ isDraggingRef.current = true;
823
+ mouseDownPosRef.current = { x: e.clientX, y: e.clientY };
824
+ };
825
+
826
+ onMouseUp = () => {
827
+ isDraggingRef.current = false;
828
+ mouseDownPosRef.current = null;
829
+ };
830
+
831
+ onMouseMove = (e: MouseEvent) => {
832
+ if (isDraggingRef.current) {
833
+ targetTheta -= e.movementX * 0.01;
834
+ targetPhi -= e.movementY * 0.01;
835
+ }
836
+
837
+ // Raycasting for hover
838
+ const rect = updatePointerFromEvent(e);
839
+ raycaster.setFromCamera(pointer, camera);
840
+ const intersects = raycaster.intersectObjects(spheres);
841
+
842
+ if (intersects.length > 0) {
843
+ const idx = intersects[0].object.userData.index;
844
+ setHoveredIdx(idx);
845
+ setTooltipPos({ x: e.clientX - rect.left, y: e.clientY - rect.top });
846
+ // Highlight hovered sphere
847
+ spheres.forEach((s, i) => {
848
+ const mat = s.material as THREE.MeshBasicMaterial;
849
+ mat.opacity = i === idx ? 1 : 0.5;
850
+ s.scale.setScalar(i === idx ? 1.5 : 1);
851
+ });
852
+ } else {
853
+ setHoveredIdx(null);
854
+ setTooltipPos(null);
855
+ spheres.forEach((s) => {
856
+ const mat = s.material as THREE.MeshBasicMaterial;
857
+ mat.opacity = 0.85;
858
+ s.scale.setScalar(1);
859
+ });
860
+ }
861
+ };
862
+
863
+ onClick = (e: MouseEvent) => {
864
+ // Only trigger click if we didn't drag much
865
+ if (mouseDownPosRef.current) {
866
+ const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);
867
+ const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);
868
+ if (dx > 5 || dy > 5) return; // Was a drag, not a click
869
+ }
870
+
871
+ updatePointerFromEvent(e);
872
+ raycaster.setFromCamera(pointer, camera);
873
+ const intersects = raycaster.intersectObjects(spheres);
874
+ if (intersects.length > 0) {
875
+ const idx = intersects[0].object.userData.index;
876
+ if (idx < withEmbeddings.length) {
877
+ onSelect(withEmbeddings[idx]);
878
+ }
879
+ }
880
+ };
881
+
882
+ onWheel = (e: WheelEvent) => {
883
+ e.preventDefault();
884
+ targetRadius += e.deltaY * 0.005;
885
+ targetRadius = Math.max(2, Math.min(15, targetRadius));
886
+ };
887
+
888
+ onMouseLeave = () => {
889
+ isDraggingRef.current = false;
890
+ setHoveredIdx(null);
891
+ setTooltipPos(null);
892
+ };
893
+
894
+ renderer.domElement.addEventListener("mousedown", onMouseDown);
895
+ renderer.domElement.addEventListener("mouseup", onMouseUp);
896
+ renderer.domElement.addEventListener("mousemove", onMouseMove);
897
+ renderer.domElement.addEventListener("click", onClick);
898
+ renderer.domElement.addEventListener("wheel", onWheel, {
899
+ passive: false,
900
+ });
901
+ renderer.domElement.addEventListener("mouseleave", onMouseLeave);
902
+ if (cancelled) {
903
+ cleanupRef.current?.();
904
+ cleanupRef.current = null;
905
+ return;
906
+ }
907
+
908
+ // Animation loop
909
+ const animate = () => {
910
+ updateCamera();
911
+ renderer.render(scene, camera);
912
+ animationRef.current = requestAnimationFrame(animate);
913
+ };
914
+ animate();
915
+
916
+ // Resize handler
917
+ handleResize = () => {
918
+ const newW = container.clientWidth;
919
+ camera.aspect = newW / H;
920
+ camera.updateProjectionMatrix();
921
+ renderer.setSize(newW, H);
922
+ };
923
+ window.addEventListener("resize", handleResize);
924
+ })(); // end async IIFE
925
+
926
+ return () => {
927
+ cancelled = true;
928
+ cleanupRef.current?.();
929
+ cleanupRef.current = null;
930
+ };
931
+ }, [points3D, withEmbeddings, typeColors, onSelect]);
932
+
933
+ if (withEmbeddings.length < 2) {
934
+ return (
935
+ <div className="text-center py-16">
936
+ <div className="text-[var(--muted)] text-sm mb-2">
937
+ {t("vectorbrowserview.NotEnoughEmbedding1")}
938
+ </div>
939
+ <div className="text-[var(--muted)] text-xs">
940
+ {t("vectorbrowserview.NeedAtLeast2Memo")} {withEmbeddings.length}.
941
+ </div>
942
+ </div>
943
+ );
944
+ }
945
+
946
+ if (rendererUnavailable) {
947
+ return (
948
+ <div className="border border-[var(--border)] bg-[var(--card)] px-4 py-10 text-center">
949
+ <div className="text-sm text-[var(--txt)]">
950
+ 3D view unavailable in this environment.
951
+ </div>
952
+ <div className="mt-2 text-xs text-[var(--muted)]">
953
+ The current runtime could not initialize a renderer.
954
+ </div>
955
+ </div>
956
+ );
957
+ }
958
+
959
+ const hoveredMem = hoveredIdx !== null ? withEmbeddings[hoveredIdx] : null;
960
+
961
+ return (
962
+ <div className="relative">
963
+ <div className="text-[11px] text-[var(--muted)] mb-2">
964
+ {withEmbeddings.length} {t("vectorbrowserview.vectorsProjectedTo1")}
965
+ </div>
966
+ <div
967
+ ref={containerRef}
968
+ className="w-full border border-[var(--border)] cursor-grab active:cursor-grabbing"
969
+ style={{ height: 550 }}
970
+ />
971
+ {/* Tooltip */}
972
+ {hoveredMem && tooltipPos && (
973
+ <div
974
+ className="absolute pointer-events-none bg-black/90 text-white text-[11px] px-3 py-2 max-w-[300px] z-10"
975
+ style={{
976
+ left: tooltipPos.x + 15,
977
+ top: tooltipPos.y + 15,
978
+ transform: tooltipPos.x > 400 ? "translateX(-100%)" : undefined,
979
+ }}
980
+ >
981
+ <div className="font-medium mb-1 truncate">
982
+ {hoveredMem.type && hoveredMem.type !== "undefined" && (
983
+ <span className="px-1.5 py-0.5 bg-[var(--accent)]/30 text-[var(--accent)] mr-2 text-[10px]">
984
+ {hoveredMem.type}
985
+ </span>
986
+ )}
987
+ {hoveredMem.id.slice(0, 12)}...
988
+ </div>
989
+ <div className="text-[var(--muted)] line-clamp-3">
990
+ {hoveredMem.content.slice(0, 150)}
991
+ {hoveredMem.content.length > 150 ? "..." : ""}
992
+ </div>
993
+ </div>
994
+ )}
995
+ {/* Legend */}
996
+ <div className="flex flex-wrap gap-3 mt-2 text-[10px]">
997
+ {Object.entries(typeColors).map(
998
+ ([type, color]) =>
999
+ type &&
1000
+ type !== "undefined" && (
1001
+ <div key={type} className="flex items-center gap-1.5">
1002
+ <div
1003
+ className="w-3 h-3 rounded-full"
1004
+ style={{
1005
+ backgroundColor: `#${color.toString(16).padStart(6, "0")}`,
1006
+ }}
1007
+ />
1008
+ <span className="text-[var(--muted)]">{type}</span>
1009
+ </div>
1010
+ ),
1011
+ )}
1012
+ </div>
1013
+ </div>
1014
+ );
1015
+ }
1016
+
1017
+ // ── Detail modal ───────────────────────────────────────────────────────
1018
+
1019
+ function MemoryDetailModal({
1020
+ memory,
1021
+ onClose,
1022
+ }: {
1023
+ memory: MemoryRecord;
1024
+ onClose: () => void;
1025
+ }) {
1026
+ const { t } = useApp();
1027
+ return (
1028
+ <div
1029
+ className="fixed inset-0 bg-black/80 z-50 flex items-center justify-center p-8"
1030
+ onClick={(e) => {
1031
+ if (e.target === e.currentTarget) onClose();
1032
+ }}
1033
+ onKeyDown={(e) => {
1034
+ if (e.key === "Escape" || e.key === "Enter" || e.key === " ") {
1035
+ e.preventDefault();
1036
+ onClose();
1037
+ }
1038
+ }}
1039
+ role="dialog"
1040
+ aria-modal="true"
1041
+ >
1042
+ <div className="bg-[var(--card)] border border-[var(--border)] max-w-[700px] w-full max-h-[90vh] overflow-auto">
1043
+ {/* Header */}
1044
+ <div className="flex items-center justify-between p-3 border-b border-[var(--border)]">
1045
+ <div className="text-xs font-medium text-[var(--txt)]">
1046
+ {t("vectorbrowserview.MemoryDetail")}
1047
+ </div>
1048
+ <Button
1049
+ variant="ghost"
1050
+ size="icon"
1051
+ className="text-[var(--muted)] hover:text-[var(--txt)] hover:bg-transparent h-6 w-6 text-lg"
1052
+ onClick={onClose}
1053
+ >
1054
+ ×
1055
+ </Button>
1056
+ </div>
1057
+
1058
+ {/* Content */}
1059
+ <div className="p-4">
1060
+ <div className="text-[11px] text-[var(--muted)] mb-1 uppercase font-bold">
1061
+ {t("vectorbrowserview.Content")}
1062
+ </div>
1063
+ <div className="text-xs text-[var(--txt)] whitespace-pre-wrap break-words mb-4 p-2 bg-[var(--bg)] border border-[var(--border)] max-h-[200px] overflow-auto">
1064
+ {memory.content || "(empty)"}
1065
+ </div>
1066
+
1067
+ {/* Metadata */}
1068
+ <div className="text-[11px] text-[var(--muted)] mb-1 uppercase font-bold">
1069
+ {t("vectorbrowserview.Metadata")}
1070
+ </div>
1071
+ <div className="grid grid-cols-2 gap-x-4 gap-y-1 text-xs mb-4">
1072
+ <span className="text-[var(--muted)]">ID</span>
1073
+ <span className="text-[var(--txt)] font-mono truncate">
1074
+ {memory.id || "—"}
1075
+ </span>
1076
+ <span className="text-[var(--muted)]">
1077
+ {t("vectorbrowserview.Type")}
1078
+ </span>
1079
+ <span className="text-[var(--txt)]">{memory.type || "—"}</span>
1080
+ <span className="text-[var(--muted)]">
1081
+ {t("vectorbrowserview.Room")}
1082
+ </span>
1083
+ <span className="text-[var(--txt)] font-mono truncate">
1084
+ {memory.roomId || "—"}
1085
+ </span>
1086
+ <span className="text-[var(--muted)]">
1087
+ {t("vectorbrowserview.Entity")}
1088
+ </span>
1089
+ <span className="text-[var(--txt)] font-mono truncate">
1090
+ {memory.entityId || "—"}
1091
+ </span>
1092
+ <span className="text-[var(--muted)]">
1093
+ {t("vectorbrowserview.Created")}
1094
+ </span>
1095
+ <span className="text-[var(--txt)]">{memory.createdAt || "—"}</span>
1096
+ <span className="text-[var(--muted)]">
1097
+ {t("vectorbrowserview.Unique")}
1098
+ </span>
1099
+ <span className="text-[var(--txt)]">
1100
+ {memory.unique ? "Yes" : "No"}
1101
+ </span>
1102
+ </div>
1103
+
1104
+ {/* Embedding */}
1105
+ {memory.embedding && (
1106
+ <>
1107
+ <div className="text-[11px] text-[var(--muted)] mb-1 uppercase font-bold">
1108
+ {t("vectorbrowserview.Embedding")}
1109
+ {memory.embedding.length} {t("vectorbrowserview.dimensions")}
1110
+ </div>
1111
+ <div className="p-2 bg-[var(--bg)] border border-[var(--border)] text-[10px] font-mono text-[var(--muted)] max-h-[150px] overflow-auto break-all mb-4">
1112
+ [{memory.embedding.map((v) => v.toFixed(6)).join(", ")}]
1113
+ </div>
1114
+ </>
1115
+ )}
1116
+
1117
+ {/* Raw data */}
1118
+ <details>
1119
+ <summary className="text-[11px] text-[var(--muted)] cursor-pointer hover:text-[var(--txt)] uppercase font-bold mb-1">
1120
+ {t("vectorbrowserview.RawRecord")}
1121
+ </summary>
1122
+ <div className="p-2 bg-[var(--bg)] border border-[var(--border)] text-[10px] font-mono text-[var(--muted)] max-h-[200px] overflow-auto break-all">
1123
+ {JSON.stringify(memory.raw, null, 2)}
1124
+ </div>
1125
+ </details>
1126
+ </div>
1127
+ </div>
1128
+ </div>
1129
+ );
1130
+ }
1131
+
1132
+ // ── Main component ─────────────────────────────────────────────────────
1133
+
1134
+ export function VectorBrowserView() {
1135
+ const { t } = useApp();
1136
+ const [tables, setTables] = useState<TableInfo[]>([]);
1137
+ const [selectedTable, setSelectedTable] = useState("");
1138
+ const [memories, setMemories] = useState<MemoryRecord[]>([]);
1139
+ const [totalCount, setTotalCount] = useState(0);
1140
+ const [page, setPage] = useState(0);
1141
+ const [loading, setLoading] = useState(true);
1142
+ const [error, setError] = useState("");
1143
+ const [search, setSearch] = useState("");
1144
+ const [searchInput, setSearchInput] = useState("");
1145
+ const [selectedMemory, setSelectedMemory] = useState<MemoryRecord | null>(
1146
+ null,
1147
+ );
1148
+ const [viewMode, setViewMode] = useState<ViewMode>("list");
1149
+ const [graphMemories, setGraphMemories] = useState<MemoryRecord[]>([]);
1150
+ const [graphLoading, setGraphLoading] = useState(false);
1151
+ const [stats, setStats] = useState<{
1152
+ total: number;
1153
+ dimensions: number;
1154
+ uniqueCount: number;
1155
+ } | null>(null);
1156
+
1157
+ // Track whether the `embeddings` table exists for JOIN queries
1158
+ const [hasEmbeddingsTable, setHasEmbeddingsTable] = useState(false);
1159
+
1160
+ // Discover vector/memory tables
1161
+ const loadTables = useCallback(async () => {
1162
+ try {
1163
+ const { tables: allTables } = await client.getDatabaseTables();
1164
+ const vectorTables = allTables.filter((t) => {
1165
+ const n = t.name.toLowerCase();
1166
+ return (
1167
+ n.includes("memor") ||
1168
+ n.includes("embed") ||
1169
+ n.includes("vector") ||
1170
+ n.includes("knowledge")
1171
+ );
1172
+ });
1173
+ const available = vectorTables.length > 0 ? vectorTables : allTables;
1174
+ setTables(available);
1175
+
1176
+ // Check for separate embeddings table (elizaOS stores vectors there)
1177
+ const embTbl = allTables.find((t) => t.name === "embeddings");
1178
+ setHasEmbeddingsTable(!!embTbl);
1179
+
1180
+ if (available.length > 0 && !selectedTable) {
1181
+ const preferred =
1182
+ available.find((t) => t.name.toLowerCase() === "memories") ??
1183
+ available.find((t) => t.name.toLowerCase().includes("memor"));
1184
+ setSelectedTable(preferred?.name ?? available[0].name);
1185
+ }
1186
+ } catch (err) {
1187
+ const msg = err instanceof Error ? err.message : "error";
1188
+ if (msg === "Failed to fetch" || msg.includes("fetch")) {
1189
+ setError("Cannot connect to database. Make sure the agent is running.");
1190
+ } else {
1191
+ setError(`Failed to load tables: ${msg}`);
1192
+ }
1193
+ }
1194
+ }, [selectedTable]);
1195
+
1196
+ // Build a SELECT that casts any vector/embedding column to text so the raw
1197
+ // driver returns a parseable string instead of a binary blob.
1198
+ const buildSelect = useCallback(async (table: string): Promise<string> => {
1199
+ try {
1200
+ const colResult: QueryResult = await client.executeDatabaseQuery(
1201
+ `SELECT column_name, data_type FROM information_schema.columns WHERE table_name = '${table.replace(/'/g, "''")}' AND table_schema NOT IN ('pg_catalog','information_schema') ORDER BY ordinal_position`,
1202
+ );
1203
+ const cols = colResult.rows.map((r) => {
1204
+ const name = String(r.column_name);
1205
+ const dtype = String(r.data_type).toLowerCase();
1206
+ // Cast USER-DEFINED types (pgvector) and bytea to text
1207
+ if (
1208
+ dtype === "user-defined" ||
1209
+ dtype === "bytea" ||
1210
+ dtype === "vector"
1211
+ ) {
1212
+ return `"${name}"::text AS "${name}"`;
1213
+ }
1214
+ return `"${name}"`;
1215
+ });
1216
+ if (cols.length > 0) return cols.join(", ");
1217
+ } catch {
1218
+ // fall through to SELECT *
1219
+ }
1220
+ return "*";
1221
+ }, []);
1222
+
1223
+ /**
1224
+ * Build a query that JOINs memories with the embeddings table when applicable.
1225
+ * The embeddings table stores vectors in dim_* columns (pgvector), which we
1226
+ * cast to ::text so the driver returns a parseable string.
1227
+ */
1228
+ const buildJoinQuery = useCallback(
1229
+ (opts: { where?: string; limit: number; offset?: number }): string => {
1230
+ const isMemories = selectedTable === "memories" && hasEmbeddingsTable;
1231
+ const { where, limit, offset } = opts;
1232
+
1233
+ if (isMemories) {
1234
+ // Build dim column selects with ::text cast
1235
+ const dimCols = DIM_COLUMNS.map((d) => `e."${d}"::text AS "${d}"`).join(
1236
+ ", ",
1237
+ );
1238
+ return [
1239
+ `SELECT m.*, ${dimCols}`,
1240
+ `FROM "memories" m`,
1241
+ `LEFT JOIN "embeddings" e ON e."memory_id" = m."id"`,
1242
+ where ? `WHERE ${where}` : "",
1243
+ `ORDER BY m."created_at" DESC`,
1244
+ `LIMIT ${limit}`,
1245
+ offset ? `OFFSET ${offset}` : "",
1246
+ ]
1247
+ .filter(Boolean)
1248
+ .join(" ");
1249
+ }
1250
+
1251
+ // For other tables, use buildSelect to cast any vector columns
1252
+ return ""; // signal to caller to use the old path
1253
+ },
1254
+ [selectedTable, hasEmbeddingsTable],
1255
+ );
1256
+
1257
+ // Load memory records for list view
1258
+ const loadMemories = useCallback(async () => {
1259
+ if (!selectedTable) return;
1260
+ setLoading(true);
1261
+ setError("");
1262
+ try {
1263
+ const offset = page * PAGE_SIZE;
1264
+ const searchEscaped = search.replace(/'/g, "''");
1265
+ const countWhere = search
1266
+ ? ` WHERE "content"::text LIKE '%${searchEscaped}%'`
1267
+ : "";
1268
+ const joinWhere = search
1269
+ ? `m."content"::text LIKE '%${searchEscaped}%'`
1270
+ : undefined;
1271
+
1272
+ const countResult: QueryResult = await client.executeDatabaseQuery(
1273
+ `SELECT COUNT(*) as cnt FROM "${selectedTable}"${countWhere}`,
1274
+ );
1275
+ const total = Number(countResult.rows[0]?.cnt ?? 0);
1276
+ setTotalCount(total);
1277
+
1278
+ // Try JOIN path for memories + embeddings
1279
+ const joinSql = buildJoinQuery({
1280
+ where: joinWhere,
1281
+ limit: PAGE_SIZE,
1282
+ offset,
1283
+ });
1284
+ let result: QueryResult;
1285
+
1286
+ if (joinSql) {
1287
+ result = await client.executeDatabaseQuery(joinSql);
1288
+ } else {
1289
+ const selectCols = await buildSelect(selectedTable);
1290
+ const plainWhere = search
1291
+ ? ` WHERE "content"::text LIKE '%${searchEscaped}%'`
1292
+ : "";
1293
+ result = await client.executeDatabaseQuery(
1294
+ `SELECT ${selectCols} FROM "${selectedTable}"${plainWhere} LIMIT ${PAGE_SIZE} OFFSET ${offset}`,
1295
+ );
1296
+ }
1297
+ setMemories(result.rows.map(rowToMemory));
1298
+
1299
+ // Stats on first load
1300
+ if (page === 0 && !search) {
1301
+ let dims = 0;
1302
+ let uniqueCount = 0;
1303
+
1304
+ if (result.rows.length > 0) {
1305
+ const sample = rowToMemory(result.rows[0]);
1306
+ if (sample.embedding) dims = sample.embedding.length;
1307
+ }
1308
+
1309
+ try {
1310
+ const uniqueResult: QueryResult = await client.executeDatabaseQuery(
1311
+ `SELECT COUNT(*) as cnt FROM "${selectedTable}" WHERE "unique" = true OR "unique" = 1`,
1312
+ );
1313
+ uniqueCount = Number(uniqueResult.rows[0]?.cnt ?? 0);
1314
+ } catch {
1315
+ // column might not exist
1316
+ }
1317
+
1318
+ setStats({ total, dimensions: dims, uniqueCount });
1319
+ }
1320
+ } catch (err) {
1321
+ setError(
1322
+ `Failed to load memories: ${err instanceof Error ? err.message : "error"}`,
1323
+ );
1324
+ }
1325
+ setLoading(false);
1326
+ }, [selectedTable, page, search, buildSelect, buildJoinQuery]);
1327
+
1328
+ // Load embeddings for graph view (fetch more rows to make graph useful)
1329
+ // Only include rows that actually have embeddings (INNER JOIN or filter).
1330
+ const loadGraphData = useCallback(async () => {
1331
+ if (!selectedTable) return;
1332
+ setGraphLoading(true);
1333
+ try {
1334
+ const isMemories = selectedTable === "memories" && hasEmbeddingsTable;
1335
+ let result: QueryResult;
1336
+
1337
+ if (isMemories) {
1338
+ // INNER JOIN ensures only rows with embeddings are returned
1339
+ const dimCols = DIM_COLUMNS.map((d) => `e."${d}"::text AS "${d}"`).join(
1340
+ ", ",
1341
+ );
1342
+ result = await client.executeDatabaseQuery(
1343
+ `SELECT m.*, ${dimCols} FROM "memories" m INNER JOIN "embeddings" e ON e."memory_id" = m."id" ORDER BY m."created_at" DESC LIMIT 500`,
1344
+ );
1345
+ } else {
1346
+ const selectCols = await buildSelect(selectedTable);
1347
+ result = await client.executeDatabaseQuery(
1348
+ `SELECT ${selectCols} FROM "${selectedTable}" LIMIT 500`,
1349
+ );
1350
+ }
1351
+ setGraphMemories(result.rows.map(rowToMemory));
1352
+ } catch (err) {
1353
+ setError(
1354
+ `Failed to load graph data: ${err instanceof Error ? err.message : "error"}`,
1355
+ );
1356
+ }
1357
+ setGraphLoading(false);
1358
+ }, [selectedTable, buildSelect, hasEmbeddingsTable]);
1359
+
1360
+ useEffect(() => {
1361
+ loadTables();
1362
+ }, [loadTables]);
1363
+
1364
+ useEffect(() => {
1365
+ if (viewMode === "list") loadMemories();
1366
+ }, [loadMemories, viewMode]);
1367
+
1368
+ useEffect(() => {
1369
+ if (viewMode === "graph" || viewMode === "3d") loadGraphData();
1370
+ }, [loadGraphData, viewMode]);
1371
+
1372
+ const handleSearch = () => {
1373
+ setSearch(searchInput);
1374
+ setPage(0);
1375
+ };
1376
+
1377
+ const totalPages = Math.ceil(totalCount / PAGE_SIZE);
1378
+
1379
+ // Show connection error state prominently
1380
+ const isConnectionError = error?.includes("agent is running");
1381
+
1382
+ return (
1383
+ <div>
1384
+ {/* Stats bar */}
1385
+ {stats && !isConnectionError && (
1386
+ <div className="flex gap-4 mb-4 text-[11px] text-[var(--muted)]">
1387
+ <span>
1388
+ {Number(stats.total).toLocaleString()}{" "}
1389
+ {t("vectorbrowserview.memories")}
1390
+ </span>
1391
+ {Number(stats.uniqueCount) > 0 && (
1392
+ <span>
1393
+ {Number(stats.uniqueCount).toLocaleString()}{" "}
1394
+ {t("vectorbrowserview.unique")}
1395
+ </span>
1396
+ )}
1397
+ {Number(stats.dimensions) > 0 && (
1398
+ <span>
1399
+ {stats.dimensions} {t("vectorbrowserview.dimensions1")}
1400
+ </span>
1401
+ )}
1402
+ </div>
1403
+ )}
1404
+
1405
+ {/* Toolbar - hide when not connected */}
1406
+ {!isConnectionError && (
1407
+ <div className="flex flex-wrap items-center gap-3 mb-4">
1408
+ {viewMode === "list" && (
1409
+ <div className="flex gap-1">
1410
+ <Input
1411
+ type="text"
1412
+ placeholder={t("vectorbrowserview.SearchContent")}
1413
+ value={searchInput}
1414
+ onChange={(e) => setSearchInput(e.target.value)}
1415
+ onKeyDown={(e) => e.key === "Enter" && handleSearch()}
1416
+ className="w-[220px] bg-card text-xs"
1417
+ />
1418
+ <Button variant="default" size="sm" onClick={handleSearch}>
1419
+ {t("vectorbrowserview.Search")}
1420
+ </Button>
1421
+ </div>
1422
+ )}
1423
+
1424
+ {tables.length > 1 && (
1425
+ <select
1426
+ value={selectedTable}
1427
+ onChange={(e) => {
1428
+ setSelectedTable(e.target.value);
1429
+ setPage(0);
1430
+ setSearch("");
1431
+ setSearchInput("");
1432
+ }}
1433
+ className="px-2 py-1.5 border border-[var(--border)] bg-[var(--card)] text-[var(--txt)] text-xs"
1434
+ >
1435
+ {tables.map((t) => (
1436
+ <option key={t.name} value={t.name}>
1437
+ {t.name} (
1438
+ {typeof t.rowCount === "object"
1439
+ ? JSON.stringify(t.rowCount)
1440
+ : t.rowCount}
1441
+ )
1442
+ </option>
1443
+ ))}
1444
+ </select>
1445
+ )}
1446
+
1447
+ {/* View mode toggle */}
1448
+ <div className="flex gap-1 ml-auto">
1449
+ <Button
1450
+ variant={viewMode === "list" ? "default" : "outline"}
1451
+ size="sm"
1452
+ onClick={() => setViewMode("list")}
1453
+ >
1454
+ {t("vectorbrowserview.List")}
1455
+ </Button>
1456
+ <Button
1457
+ variant={viewMode === "graph" ? "default" : "outline"}
1458
+ size="sm"
1459
+ onClick={() => setViewMode("graph")}
1460
+ >
1461
+ 2D
1462
+ </Button>
1463
+ <Button
1464
+ variant={viewMode === "3d" ? "default" : "outline"}
1465
+ size="sm"
1466
+ onClick={() => setViewMode("3d")}
1467
+ >
1468
+ 3D
1469
+ </Button>
1470
+ </div>
1471
+
1472
+ {viewMode === "list" && (
1473
+ <span className="text-[11px] text-[var(--muted)]">
1474
+ {Number(totalCount) > 0
1475
+ ? `${page * PAGE_SIZE + 1}-${Math.min((page + 1) * PAGE_SIZE, Number(totalCount))} of ${Number(totalCount).toLocaleString()}`
1476
+ : ""}
1477
+ </span>
1478
+ )}
1479
+ </div>
1480
+ )}
1481
+
1482
+ {error &&
1483
+ (error.includes("agent is running") ? (
1484
+ <div className="text-center py-16">
1485
+ <div className="text-[var(--muted)] text-sm mb-2">
1486
+ {t("vectorbrowserview.DatabaseNotAvailab")}
1487
+ </div>
1488
+ <div className="text-[var(--muted)] text-xs mb-4">
1489
+ {t("vectorbrowserview.StartTheAgentToB")}
1490
+ </div>
1491
+ <Button
1492
+ variant="default"
1493
+ size="sm"
1494
+ onClick={() => {
1495
+ setError("");
1496
+ loadTables();
1497
+ }}
1498
+ >
1499
+ {t("vectorbrowserview.RetryConnection")}
1500
+ </Button>
1501
+ </div>
1502
+ ) : (
1503
+ <div className="p-2.5 border border-[var(--danger)] text-[var(--danger)] text-xs mb-3">
1504
+ {error}
1505
+ </div>
1506
+ ))}
1507
+
1508
+ {/* 2D Graph view */}
1509
+ {viewMode === "graph" &&
1510
+ (graphLoading ? (
1511
+ <div className="text-center py-16 text-[var(--muted)] text-sm italic">
1512
+ {t("vectorbrowserview.LoadingEmbeddings")}
1513
+ </div>
1514
+ ) : (
1515
+ <VectorGraph memories={graphMemories} onSelect={setSelectedMemory} />
1516
+ ))}
1517
+
1518
+ {/* 3D Graph view */}
1519
+ {viewMode === "3d" &&
1520
+ (graphLoading ? (
1521
+ <div className="text-center py-16 text-[var(--muted)] text-sm italic">
1522
+ {t("vectorbrowserview.LoadingEmbeddings")}
1523
+ </div>
1524
+ ) : (
1525
+ <VectorGraph3D
1526
+ memories={graphMemories}
1527
+ onSelect={setSelectedMemory}
1528
+ />
1529
+ ))}
1530
+
1531
+ {/* List view */}
1532
+ {viewMode === "list" &&
1533
+ (loading ? (
1534
+ <div className="text-center py-16 text-[var(--muted)] text-sm italic">
1535
+ {t("vectorbrowserview.LoadingMemories")}
1536
+ </div>
1537
+ ) : memories.length === 0 ? (
1538
+ <div className="text-center py-16">
1539
+ <div className="text-[var(--muted)] text-sm mb-2">
1540
+ {t("vectorbrowserview.NoMemoriesFound")}
1541
+ </div>
1542
+ <div className="text-[var(--muted)] text-xs">
1543
+ {search
1544
+ ? "No records match your search query."
1545
+ : "No memory records detected in the database."}
1546
+ </div>
1547
+ </div>
1548
+ ) : (
1549
+ <div className="flex flex-col gap-2">
1550
+ {memories.map((mem) => (
1551
+ <Button
1552
+ key={mem.id || `${mem.content.slice(0, 30)}-${mem.createdAt}`}
1553
+ variant="outline"
1554
+ className="justify-start items-start text-left h-auto p-3 hover:border-accent w-full flex flex-col"
1555
+ onClick={() => setSelectedMemory(mem)}
1556
+ >
1557
+ {/* Content preview */}
1558
+ <div className="text-xs text-[var(--txt)] mb-2 whitespace-pre-wrap break-words">
1559
+ {mem.content.length > 200
1560
+ ? `${mem.content.slice(0, 200)}...`
1561
+ : mem.content}
1562
+ </div>
1563
+
1564
+ {/* Metadata row */}
1565
+ <div className="flex flex-wrap items-center gap-3 text-[10px] text-[var(--muted)]">
1566
+ {mem.type && mem.type !== "undefined" && (
1567
+ <span className="px-1.5 py-0.5 bg-[var(--accent)]/10 text-[var(--accent)]">
1568
+ {mem.type}
1569
+ </span>
1570
+ )}
1571
+ {mem.roomId && mem.roomId !== "undefined" && (
1572
+ <span>
1573
+ {t("vectorbrowserview.Room1")} {mem.roomId.slice(0, 12)}
1574
+ </span>
1575
+ )}
1576
+ {mem.entityId && mem.entityId !== "undefined" && (
1577
+ <span>
1578
+ {t("vectorbrowserview.Entity1")}{" "}
1579
+ {mem.entityId.slice(0, 12)}
1580
+ </span>
1581
+ )}
1582
+ {mem.createdAt && mem.createdAt !== "undefined" && (
1583
+ <span>{mem.createdAt}</span>
1584
+ )}
1585
+ {mem.unique && (
1586
+ <span className="px-1.5 py-0.5 bg-green-500/20 text-green-400 font-bold">
1587
+ {t("vectorbrowserview.unique")}
1588
+ </span>
1589
+ )}
1590
+ {mem.embedding && (
1591
+ <span className="font-mono">[{mem.embedding.length}d]</span>
1592
+ )}
1593
+ </div>
1594
+ </Button>
1595
+ ))}
1596
+ </div>
1597
+ ))}
1598
+
1599
+ {/* Pagination (list view only) */}
1600
+ {viewMode === "list" && totalPages > 1 && (
1601
+ <div className="flex items-center justify-center gap-3 mt-4 pb-4">
1602
+ <Button
1603
+ variant="default"
1604
+ size="sm"
1605
+ disabled={page === 0}
1606
+ onClick={() => setPage((p) => p - 1)}
1607
+ >
1608
+ {t("vectorbrowserview.Prev")}
1609
+ </Button>
1610
+ <span className="text-[11px] text-[var(--muted)]">
1611
+ {t("vectorbrowserview.Page")} {page + 1} of {totalPages}
1612
+ </span>
1613
+ <Button
1614
+ variant="default"
1615
+ size="sm"
1616
+ disabled={page >= totalPages - 1}
1617
+ onClick={() => setPage((p) => p + 1)}
1618
+ >
1619
+ {t("vectorbrowserview.Next")}
1620
+ </Button>
1621
+ </div>
1622
+ )}
1623
+
1624
+ {/* Detail modal */}
1625
+ {selectedMemory && (
1626
+ <MemoryDetailModal
1627
+ memory={selectedMemory}
1628
+ onClose={() => setSelectedMemory(null)}
1629
+ />
1630
+ )}
1631
+ </div>
1632
+ );
1633
+ }