@elizaos/app-core 2.0.0-alpha.73 → 2.0.0-alpha.75

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 (1143) hide show
  1. package/App.d.ts +5 -0
  2. package/App.d.ts.map +1 -0
  3. package/App.js +220 -0
  4. package/actions/character.d.ts +39 -0
  5. package/actions/character.d.ts.map +1 -0
  6. package/actions/character.js +247 -0
  7. package/actions/chat-helpers.d.ts +47 -0
  8. package/actions/chat-helpers.d.ts.map +1 -0
  9. package/actions/chat-helpers.js +79 -0
  10. package/actions/cloud.d.ts +17 -0
  11. package/actions/cloud.d.ts.map +1 -0
  12. package/actions/cloud.js +43 -0
  13. package/actions/index.d.ts +12 -0
  14. package/actions/index.d.ts.map +1 -0
  15. package/actions/index.js +11 -0
  16. package/actions/lifecycle.d.ts +43 -0
  17. package/actions/lifecycle.d.ts.map +1 -0
  18. package/actions/lifecycle.js +118 -0
  19. package/actions/onboarding.d.ts +12 -0
  20. package/actions/onboarding.d.ts.map +1 -0
  21. package/actions/onboarding.js +26 -0
  22. package/actions/triggers.d.ts +23 -0
  23. package/actions/triggers.d.ts.map +1 -0
  24. package/actions/triggers.js +148 -0
  25. package/api/client.d.ts +2736 -0
  26. package/api/client.d.ts.map +1 -0
  27. package/api/client.js +2492 -0
  28. package/api/index.d.ts +2 -0
  29. package/api/index.d.ts.map +1 -0
  30. package/autonomy/index.d.ts +48 -0
  31. package/autonomy/index.d.ts.map +1 -0
  32. package/autonomy/index.js +330 -0
  33. package/bridge/capacitor-bridge.d.ts +153 -0
  34. package/bridge/capacitor-bridge.d.ts.map +1 -0
  35. package/bridge/capacitor-bridge.js +193 -0
  36. package/bridge/electrobun-rpc.d.ts +28 -0
  37. package/bridge/electrobun-rpc.d.ts.map +1 -0
  38. package/bridge/electrobun-rpc.js +35 -0
  39. package/bridge/electrobun-runtime.d.ts +3 -0
  40. package/bridge/electrobun-runtime.d.ts.map +1 -0
  41. package/bridge/electrobun-runtime.js +17 -0
  42. package/bridge/index.d.ts +6 -0
  43. package/bridge/index.d.ts.map +1 -0
  44. package/bridge/native-plugins.d.ts +82 -0
  45. package/bridge/native-plugins.d.ts.map +1 -0
  46. package/bridge/native-plugins.js +39 -0
  47. package/bridge/plugin-bridge.d.ts +116 -0
  48. package/bridge/plugin-bridge.d.ts.map +1 -0
  49. package/bridge/plugin-bridge.js +203 -0
  50. package/bridge/storage-bridge.d.ts +39 -0
  51. package/bridge/storage-bridge.d.ts.map +1 -0
  52. package/bridge/storage-bridge.js +135 -0
  53. package/chat/index.d.ts +57 -0
  54. package/chat/index.d.ts.map +1 -0
  55. package/chat/index.js +160 -0
  56. package/coding/index.d.ts +25 -0
  57. package/coding/index.d.ts.map +1 -0
  58. package/coding/index.js +25 -0
  59. package/components/AdvancedPageView.d.ts +17 -0
  60. package/components/AdvancedPageView.d.ts.map +1 -0
  61. package/components/AdvancedPageView.js +146 -0
  62. package/components/AgentActivityBox.d.ts +7 -0
  63. package/components/AgentActivityBox.d.ts.map +1 -0
  64. package/components/AgentActivityBox.js +25 -0
  65. package/components/ApiKeyConfig.d.ts +26 -0
  66. package/components/ApiKeyConfig.d.ts.map +1 -0
  67. package/components/ApiKeyConfig.js +119 -0
  68. package/components/AppsPageView.d.ts +7 -0
  69. package/components/AppsPageView.d.ts.map +1 -0
  70. package/components/AppsPageView.js +31 -0
  71. package/components/AppsView.d.ts +8 -0
  72. package/components/AppsView.d.ts.map +1 -0
  73. package/components/AppsView.js +149 -0
  74. package/components/AvatarLoader.d.ts +13 -0
  75. package/components/AvatarLoader.d.ts.map +1 -0
  76. package/components/AvatarLoader.js +53 -0
  77. package/components/AvatarSelector.d.ts +23 -0
  78. package/components/AvatarSelector.d.ts.map +1 -0
  79. package/components/AvatarSelector.js +105 -0
  80. package/components/BscTradePanel.d.ts +22 -0
  81. package/components/BscTradePanel.d.ts.map +1 -0
  82. package/components/BscTradePanel.js +221 -0
  83. package/components/BugReportModal.d.ts +2 -0
  84. package/components/BugReportModal.d.ts.map +1 -0
  85. package/components/BugReportModal.js +219 -0
  86. package/components/CharacterRoster.d.ts +31 -0
  87. package/components/CharacterRoster.d.ts.map +1 -0
  88. package/components/CharacterRoster.js +41 -0
  89. package/components/CharacterView.d.ts +8 -0
  90. package/components/CharacterView.d.ts.map +1 -0
  91. package/components/CharacterView.js +685 -0
  92. package/components/ChatAvatar.d.ts +8 -0
  93. package/components/ChatAvatar.d.ts.map +1 -0
  94. package/components/ChatAvatar.js +89 -0
  95. package/components/ChatComposer.d.ts +37 -0
  96. package/components/ChatComposer.d.ts.map +1 -0
  97. package/components/ChatComposer.js +136 -0
  98. package/components/ChatMessage.d.ts +24 -0
  99. package/components/ChatMessage.d.ts.map +1 -0
  100. package/components/ChatMessage.js +167 -0
  101. package/components/ChatModalView.d.ts +10 -0
  102. package/components/ChatModalView.d.ts.map +1 -0
  103. package/components/ChatModalView.js +57 -0
  104. package/components/ChatView.d.ts +14 -0
  105. package/components/ChatView.d.ts.map +1 -0
  106. package/components/ChatView.js +526 -0
  107. package/components/CloudOnboarding.d.ts +7 -0
  108. package/components/CloudOnboarding.d.ts.map +1 -0
  109. package/components/CloudOnboarding.js +22 -0
  110. package/components/CloudSourceControls.d.ts +13 -0
  111. package/components/CloudSourceControls.d.ts.map +1 -0
  112. package/components/CloudSourceControls.js +16 -0
  113. package/components/CodingAgentSettingsSection.d.ts +2 -0
  114. package/components/CodingAgentSettingsSection.d.ts.map +1 -0
  115. package/components/CodingAgentSettingsSection.js +270 -0
  116. package/components/CommandPalette.d.ts +2 -0
  117. package/components/CommandPalette.d.ts.map +1 -0
  118. package/components/CommandPalette.js +181 -0
  119. package/components/CompanionSceneHost.d.ts +14 -0
  120. package/components/CompanionSceneHost.d.ts.map +1 -0
  121. package/components/CompanionSceneHost.js +360 -0
  122. package/components/CompanionShell.d.ts +17 -0
  123. package/components/CompanionShell.d.ts.map +1 -0
  124. package/components/CompanionShell.js +15 -0
  125. package/components/CompanionView.d.ts +2 -0
  126. package/components/CompanionView.d.ts.map +1 -0
  127. package/components/CompanionView.js +22 -0
  128. package/components/ConfigPageView.d.ts +11 -0
  129. package/components/ConfigPageView.d.ts.map +1 -0
  130. package/components/ConfigPageView.js +303 -0
  131. package/components/ConfigSaveFooter.d.ts +8 -0
  132. package/components/ConfigSaveFooter.d.ts.map +1 -0
  133. package/components/ConfigSaveFooter.js +10 -0
  134. package/components/ConfirmModal.d.ts +61 -0
  135. package/components/ConfirmModal.d.ts.map +1 -0
  136. package/components/ConfirmModal.js +164 -0
  137. package/components/ConnectionFailedBanner.d.ts +6 -0
  138. package/components/ConnectionFailedBanner.d.ts.map +1 -0
  139. package/components/ConnectionFailedBanner.js +22 -0
  140. package/components/ConnectorsPageView.d.ts +7 -0
  141. package/components/ConnectorsPageView.d.ts.map +1 -0
  142. package/components/ConnectorsPageView.js +8 -0
  143. package/components/ConversationsSidebar.d.ts +9 -0
  144. package/components/ConversationsSidebar.d.ts.map +1 -0
  145. package/components/ConversationsSidebar.js +116 -0
  146. package/components/CustomActionEditor.d.ts +10 -0
  147. package/components/CustomActionEditor.d.ts.map +1 -0
  148. package/components/CustomActionEditor.js +578 -0
  149. package/components/CustomActionsPanel.d.ts +9 -0
  150. package/components/CustomActionsPanel.d.ts.map +1 -0
  151. package/components/CustomActionsPanel.js +107 -0
  152. package/components/CustomActionsView.d.ts +2 -0
  153. package/components/CustomActionsView.d.ts.map +1 -0
  154. package/components/CustomActionsView.js +134 -0
  155. package/components/DatabasePageView.d.ts +5 -0
  156. package/components/DatabasePageView.d.ts.map +1 -0
  157. package/components/DatabasePageView.js +28 -0
  158. package/components/DatabaseView.d.ts +9 -0
  159. package/components/DatabaseView.d.ts.map +1 -0
  160. package/components/DatabaseView.js +311 -0
  161. package/components/ElizaCloudDashboard.d.ts +2 -0
  162. package/components/ElizaCloudDashboard.d.ts.map +1 -0
  163. package/components/ElizaCloudDashboard.js +657 -0
  164. package/components/EmotePicker.d.ts +2 -0
  165. package/components/EmotePicker.d.ts.map +1 -0
  166. package/components/EmotePicker.js +343 -0
  167. package/components/ErrorBoundary.d.ts +22 -0
  168. package/components/ErrorBoundary.d.ts.map +1 -0
  169. package/components/ErrorBoundary.js +31 -0
  170. package/components/FineTuningView.d.ts +2 -0
  171. package/components/FineTuningView.d.ts.map +1 -0
  172. package/components/FineTuningView.js +433 -0
  173. package/components/FlaminaGuide.d.ts +10 -0
  174. package/components/FlaminaGuide.d.ts.map +1 -0
  175. package/components/FlaminaGuide.js +64 -0
  176. package/components/GameView.d.ts +11 -0
  177. package/components/GameView.d.ts.map +1 -0
  178. package/components/GameView.js +294 -0
  179. package/components/GameViewOverlay.d.ts +8 -0
  180. package/components/GameViewOverlay.d.ts.map +1 -0
  181. package/components/GameViewOverlay.js +70 -0
  182. package/components/GlobalEmoteOverlay.d.ts +2 -0
  183. package/components/GlobalEmoteOverlay.d.ts.map +1 -0
  184. package/components/GlobalEmoteOverlay.js +112 -0
  185. package/components/Header.d.ts +9 -0
  186. package/components/Header.d.ts.map +1 -0
  187. package/components/Header.js +123 -0
  188. package/components/HeartbeatsView.d.ts +2 -0
  189. package/components/HeartbeatsView.d.ts.map +1 -0
  190. package/components/HeartbeatsView.js +378 -0
  191. package/components/InventoryView.d.ts +10 -0
  192. package/components/InventoryView.d.ts.map +1 -0
  193. package/components/InventoryView.js +176 -0
  194. package/components/KnowledgeView.d.ts +20 -0
  195. package/components/KnowledgeView.d.ts.map +1 -0
  196. package/components/KnowledgeView.js +480 -0
  197. package/components/LanguageDropdown.d.ts +30 -0
  198. package/components/LanguageDropdown.d.ts.map +1 -0
  199. package/components/LanguageDropdown.js +99 -0
  200. package/components/LifoMonitorPanel.d.ts +21 -0
  201. package/components/LifoMonitorPanel.d.ts.map +1 -0
  202. package/components/LifoMonitorPanel.js +24 -0
  203. package/components/LifoSandboxView.d.ts +5 -0
  204. package/components/LifoSandboxView.d.ts.map +1 -0
  205. package/components/LifoSandboxView.js +333 -0
  206. package/components/LoadingScreen.d.ts +13 -0
  207. package/components/LoadingScreen.d.ts.map +1 -0
  208. package/components/LoadingScreen.js +70 -0
  209. package/components/LogsPageView.d.ts +2 -0
  210. package/components/LogsPageView.d.ts.map +1 -0
  211. package/components/LogsPageView.js +7 -0
  212. package/components/LogsView.d.ts +5 -0
  213. package/components/LogsView.d.ts.map +1 -0
  214. package/components/LogsView.js +71 -0
  215. package/components/MediaGalleryView.d.ts +9 -0
  216. package/components/MediaGalleryView.d.ts.map +1 -0
  217. package/components/MediaGalleryView.js +236 -0
  218. package/components/MediaSettingsSection.d.ts +11 -0
  219. package/components/MediaSettingsSection.d.ts.map +1 -0
  220. package/components/MediaSettingsSection.js +329 -0
  221. package/components/MessageContent.d.ts +51 -0
  222. package/components/MessageContent.d.ts.map +1 -0
  223. package/components/MessageContent.js +553 -0
  224. package/components/OnboardingWizard.d.ts +2 -0
  225. package/components/OnboardingWizard.d.ts.map +1 -0
  226. package/components/OnboardingWizard.js +96 -0
  227. package/components/PairingView.d.ts +5 -0
  228. package/components/PairingView.d.ts.map +1 -0
  229. package/components/PairingView.js +29 -0
  230. package/components/PermissionsSection.d.ts +20 -0
  231. package/components/PermissionsSection.d.ts.map +1 -0
  232. package/components/PermissionsSection.js +573 -0
  233. package/components/PluginsPageView.d.ts +5 -0
  234. package/components/PluginsPageView.d.ts.map +1 -0
  235. package/components/PluginsPageView.js +8 -0
  236. package/components/PluginsView.d.ts +21 -0
  237. package/components/PluginsView.d.ts.map +1 -0
  238. package/components/PluginsView.js +1534 -0
  239. package/components/ProviderSwitcher.d.ts +42 -0
  240. package/components/ProviderSwitcher.d.ts.map +1 -0
  241. package/components/ProviderSwitcher.js +493 -0
  242. package/components/RestartBanner.d.ts +2 -0
  243. package/components/RestartBanner.d.ts.map +1 -0
  244. package/components/RestartBanner.js +36 -0
  245. package/components/RuntimeView.d.ts +10 -0
  246. package/components/RuntimeView.d.ts.map +1 -0
  247. package/components/RuntimeView.js +165 -0
  248. package/components/SaveCommandModal.d.ts +12 -0
  249. package/components/SaveCommandModal.d.ts.map +1 -0
  250. package/components/SaveCommandModal.js +84 -0
  251. package/components/SecretsView.d.ts +9 -0
  252. package/components/SecretsView.d.ts.map +1 -0
  253. package/components/SecretsView.js +249 -0
  254. package/components/SettingsView.d.ts +9 -0
  255. package/components/SettingsView.d.ts.map +1 -0
  256. package/components/SettingsView.js +230 -0
  257. package/components/ShellOverlays.d.ts +8 -0
  258. package/components/ShellOverlays.d.ts.map +1 -0
  259. package/components/ShellOverlays.js +10 -0
  260. package/components/ShortcutsOverlay.d.ts +2 -0
  261. package/components/ShortcutsOverlay.d.ts.map +1 -0
  262. package/components/ShortcutsOverlay.js +79 -0
  263. package/components/SkillsView.d.ts +11 -0
  264. package/components/SkillsView.d.ts.map +1 -0
  265. package/components/SkillsView.js +358 -0
  266. package/components/StartupFailureView.d.ts +8 -0
  267. package/components/StartupFailureView.d.ts.map +1 -0
  268. package/components/StartupFailureView.js +16 -0
  269. package/components/StreamView.d.ts +16 -0
  270. package/components/StreamView.d.ts.map +1 -0
  271. package/components/StreamView.js +300 -0
  272. package/components/StripeEmbeddedCheckout.d.ts +24 -0
  273. package/components/StripeEmbeddedCheckout.d.ts.map +1 -0
  274. package/components/StripeEmbeddedCheckout.js +101 -0
  275. package/components/SubscriptionStatus.d.ts +23 -0
  276. package/components/SubscriptionStatus.d.ts.map +1 -0
  277. package/components/SubscriptionStatus.js +301 -0
  278. package/components/SystemWarningBanner.d.ts +6 -0
  279. package/components/SystemWarningBanner.d.ts.map +1 -0
  280. package/components/SystemWarningBanner.js +46 -0
  281. package/components/ThemeToggle.d.ts +21 -0
  282. package/components/ThemeToggle.d.ts.map +1 -0
  283. package/components/ThemeToggle.js +24 -0
  284. package/components/TrajectoriesView.d.ts +12 -0
  285. package/components/TrajectoriesView.d.ts.map +1 -0
  286. package/components/TrajectoriesView.js +183 -0
  287. package/components/TrajectoryDetailView.d.ts +13 -0
  288. package/components/TrajectoryDetailView.d.ts.map +1 -0
  289. package/components/TrajectoryDetailView.js +112 -0
  290. package/components/TriggersView.d.ts +2 -0
  291. package/components/TriggersView.d.ts.map +1 -0
  292. package/components/VectorBrowserView.d.ts +10 -0
  293. package/components/VectorBrowserView.d.ts.map +1 -0
  294. package/components/VectorBrowserView.js +997 -0
  295. package/components/VoiceConfigView.d.ts +11 -0
  296. package/components/VoiceConfigView.d.ts.map +1 -0
  297. package/components/VoiceConfigView.js +329 -0
  298. package/components/VrmStage.d.ts +28 -0
  299. package/components/VrmStage.d.ts.map +1 -0
  300. package/components/VrmStage.js +178 -0
  301. package/components/WhatsAppQrOverlay.d.ts +8 -0
  302. package/components/WhatsAppQrOverlay.d.ts.map +1 -0
  303. package/components/WhatsAppQrOverlay.js +63 -0
  304. package/components/apps/AppDetailPane.d.ts +15 -0
  305. package/components/apps/AppDetailPane.d.ts.map +1 -0
  306. package/components/apps/AppDetailPane.js +13 -0
  307. package/components/apps/AppsCatalogGrid.d.ts +20 -0
  308. package/components/apps/AppsCatalogGrid.d.ts.map +1 -0
  309. package/components/apps/AppsCatalogGrid.js +18 -0
  310. package/components/apps/extensions/registry.d.ts +4 -0
  311. package/components/apps/extensions/registry.d.ts.map +1 -0
  312. package/components/apps/extensions/registry.js +7 -0
  313. package/components/apps/extensions/types.d.ts +7 -0
  314. package/components/apps/extensions/types.d.ts.map +1 -0
  315. package/components/apps/extensions/types.js +1 -0
  316. package/components/apps/helpers.d.ts +7 -0
  317. package/components/apps/helpers.d.ts.map +1 -0
  318. package/components/apps/helpers.js +44 -0
  319. package/components/avatar/VrmAnimationLoader.d.ts +30 -0
  320. package/components/avatar/VrmAnimationLoader.d.ts.map +1 -0
  321. package/components/avatar/VrmAnimationLoader.js +99 -0
  322. package/components/avatar/VrmBlinkController.d.ts +37 -0
  323. package/components/avatar/VrmBlinkController.d.ts.map +1 -0
  324. package/components/avatar/VrmBlinkController.js +98 -0
  325. package/components/avatar/VrmCameraManager.d.ts +57 -0
  326. package/components/avatar/VrmCameraManager.d.ts.map +1 -0
  327. package/components/avatar/VrmCameraManager.js +277 -0
  328. package/components/avatar/VrmEngine.d.ts +246 -0
  329. package/components/avatar/VrmEngine.d.ts.map +1 -0
  330. package/components/avatar/VrmEngine.js +2076 -0
  331. package/components/avatar/VrmFootShadow.d.ts +18 -0
  332. package/components/avatar/VrmFootShadow.d.ts.map +1 -0
  333. package/components/avatar/VrmFootShadow.js +83 -0
  334. package/components/avatar/VrmViewer.d.ts +60 -0
  335. package/components/avatar/VrmViewer.d.ts.map +1 -0
  336. package/components/avatar/VrmViewer.js +396 -0
  337. package/components/avatar/mixamoVRMRigMap.d.ts +3 -0
  338. package/components/avatar/mixamoVRMRigMap.d.ts.map +1 -0
  339. package/components/avatar/mixamoVRMRigMap.js +56 -0
  340. package/components/avatar/retargetMixamoFbxToVrm.d.ts +9 -0
  341. package/components/avatar/retargetMixamoFbxToVrm.d.ts.map +1 -0
  342. package/components/avatar/retargetMixamoFbxToVrm.js +88 -0
  343. package/components/avatar/retargetMixamoGltfToVrm.d.ts +11 -0
  344. package/components/avatar/retargetMixamoGltfToVrm.d.ts.map +1 -0
  345. package/components/avatar/retargetMixamoGltfToVrm.js +80 -0
  346. package/components/chainConfig.d.ts +89 -0
  347. package/components/chainConfig.d.ts.map +1 -0
  348. package/components/chainConfig.js +287 -0
  349. package/components/companion/CompanionHeader.d.ts +15 -0
  350. package/components/companion/CompanionHeader.d.ts.map +1 -0
  351. package/components/companion/CompanionHeader.js +7 -0
  352. package/components/companion/CompanionSceneHost.d.ts +2 -0
  353. package/components/companion/CompanionSceneHost.d.ts.map +1 -0
  354. package/components/companion/CompanionSceneHost.js +1 -0
  355. package/components/companion/VrmStage.d.ts +3 -0
  356. package/components/companion/VrmStage.d.ts.map +1 -0
  357. package/components/companion/VrmStage.js +1 -0
  358. package/components/companion/index.d.ts +18 -0
  359. package/components/companion/index.d.ts.map +1 -0
  360. package/components/companion/index.js +17 -0
  361. package/components/companion/walletUtils.d.ts +95 -0
  362. package/components/companion/walletUtils.d.ts.map +1 -0
  363. package/components/companion/walletUtils.js +167 -0
  364. package/components/companion-shell-styles.d.ts +38 -0
  365. package/components/companion-shell-styles.d.ts.map +1 -0
  366. package/components/companion-shell-styles.js +248 -0
  367. package/components/confirm-delete-control.d.ts +16 -0
  368. package/components/confirm-delete-control.d.ts.map +1 -0
  369. package/components/confirm-delete-control.js +12 -0
  370. package/components/conversations/ConversationListItem.d.ts +31 -0
  371. package/components/conversations/ConversationListItem.d.ts.map +1 -0
  372. package/components/conversations/ConversationListItem.js +52 -0
  373. package/components/conversations/conversation-utils.d.ts +9 -0
  374. package/components/conversations/conversation-utils.d.ts.map +1 -0
  375. package/components/conversations/conversation-utils.js +138 -0
  376. package/components/format.d.ts +54 -0
  377. package/components/format.d.ts.map +1 -0
  378. package/components/format.js +82 -0
  379. package/components/index.d.ts +96 -0
  380. package/components/index.d.ts.map +1 -0
  381. package/components/index.js +95 -0
  382. package/components/inventory/CopyableAddress.d.ts +8 -0
  383. package/components/inventory/CopyableAddress.d.ts.map +1 -0
  384. package/components/inventory/CopyableAddress.js +18 -0
  385. package/components/inventory/InventoryToolbar.d.ts +25 -0
  386. package/components/inventory/InventoryToolbar.d.ts.map +1 -0
  387. package/components/inventory/InventoryToolbar.js +28 -0
  388. package/components/inventory/NftGrid.d.ts +13 -0
  389. package/components/inventory/NftGrid.d.ts.map +1 -0
  390. package/components/inventory/NftGrid.js +29 -0
  391. package/components/inventory/TokenLogo.d.ts +12 -0
  392. package/components/inventory/TokenLogo.d.ts.map +1 -0
  393. package/components/inventory/TokenLogo.js +33 -0
  394. package/components/inventory/TokensTable.d.ts +24 -0
  395. package/components/inventory/TokensTable.d.ts.map +1 -0
  396. package/components/inventory/TokensTable.js +26 -0
  397. package/components/inventory/constants.d.ts +52 -0
  398. package/components/inventory/constants.d.ts.map +1 -0
  399. package/components/inventory/constants.js +121 -0
  400. package/components/inventory/index.d.ts +9 -0
  401. package/components/inventory/index.d.ts.map +1 -0
  402. package/components/inventory/index.js +8 -0
  403. package/components/inventory/media-url.d.ts +6 -0
  404. package/components/inventory/media-url.d.ts.map +1 -0
  405. package/components/inventory/media-url.js +28 -0
  406. package/components/inventory/useInventoryData.d.ts +53 -0
  407. package/components/inventory/useInventoryData.d.ts.map +1 -0
  408. package/components/inventory/useInventoryData.js +332 -0
  409. package/components/knowledge-upload-image.d.ts +27 -0
  410. package/components/knowledge-upload-image.d.ts.map +1 -0
  411. package/components/knowledge-upload-image.js +146 -0
  412. package/components/labels.d.ts +6 -0
  413. package/components/labels.d.ts.map +1 -0
  414. package/components/labels.js +40 -0
  415. package/components/onboarding/ActivateStep.d.ts +2 -0
  416. package/components/onboarding/ActivateStep.d.ts.map +1 -0
  417. package/components/onboarding/ActivateStep.js +10 -0
  418. package/components/onboarding/ConnectionStep.d.ts +2 -0
  419. package/components/onboarding/ConnectionStep.d.ts.map +1 -0
  420. package/components/onboarding/ConnectionStep.js +609 -0
  421. package/components/onboarding/IdentityStep.d.ts +2 -0
  422. package/components/onboarding/IdentityStep.d.ts.map +1 -0
  423. package/components/onboarding/IdentityStep.js +102 -0
  424. package/components/onboarding/OnboardingPanel.d.ts +9 -0
  425. package/components/onboarding/OnboardingPanel.d.ts.map +1 -0
  426. package/components/onboarding/OnboardingPanel.js +24 -0
  427. package/components/onboarding/OnboardingStepNav.d.ts +2 -0
  428. package/components/onboarding/OnboardingStepNav.d.ts.map +1 -0
  429. package/components/onboarding/OnboardingStepNav.js +23 -0
  430. package/components/onboarding/PermissionsStep.d.ts +2 -0
  431. package/components/onboarding/PermissionsStep.d.ts.map +1 -0
  432. package/components/onboarding/PermissionsStep.js +7 -0
  433. package/components/onboarding/RpcStep.d.ts +2 -0
  434. package/components/onboarding/RpcStep.d.ts.map +1 -0
  435. package/components/onboarding/RpcStep.js +125 -0
  436. package/components/permissions/PermissionIcon.d.ts +4 -0
  437. package/components/permissions/PermissionIcon.d.ts.map +1 -0
  438. package/components/permissions/PermissionIcon.js +12 -0
  439. package/components/permissions/StreamingPermissions.d.ts +20 -0
  440. package/components/permissions/StreamingPermissions.d.ts.map +1 -0
  441. package/components/permissions/StreamingPermissions.js +177 -0
  442. package/components/plugins/showcase-data.d.ts +7 -0
  443. package/components/plugins/showcase-data.d.ts.map +1 -0
  444. package/components/plugins/showcase-data.js +464 -0
  445. package/components/shared/ShellHeaderControls.d.ts +27 -0
  446. package/components/shared/ShellHeaderControls.d.ts.map +1 -0
  447. package/components/shared/ShellHeaderControls.js +60 -0
  448. package/components/shared-companion-scene-context.d.ts +3 -0
  449. package/components/shared-companion-scene-context.d.ts.map +1 -0
  450. package/components/shared-companion-scene-context.js +13 -0
  451. package/components/skeletons.d.ts +17 -0
  452. package/components/skeletons.d.ts.map +1 -0
  453. package/components/skeletons.js +22 -0
  454. package/components/stream/ActivityFeed.d.ts +5 -0
  455. package/components/stream/ActivityFeed.d.ts.map +1 -0
  456. package/components/stream/ActivityFeed.js +57 -0
  457. package/components/stream/AvatarPip.d.ts +5 -0
  458. package/components/stream/AvatarPip.d.ts.map +1 -0
  459. package/components/stream/AvatarPip.js +6 -0
  460. package/components/stream/ChatContent.d.ts +6 -0
  461. package/components/stream/ChatContent.d.ts.map +1 -0
  462. package/components/stream/ChatContent.js +69 -0
  463. package/components/stream/ChatTicker.d.ts +5 -0
  464. package/components/stream/ChatTicker.d.ts.map +1 -0
  465. package/components/stream/ChatTicker.js +34 -0
  466. package/components/stream/IdleContent.d.ts +5 -0
  467. package/components/stream/IdleContent.d.ts.map +1 -0
  468. package/components/stream/IdleContent.js +17 -0
  469. package/components/stream/StatusBar.d.ts +36 -0
  470. package/components/stream/StatusBar.d.ts.map +1 -0
  471. package/components/stream/StatusBar.js +140 -0
  472. package/components/stream/StreamSettings.d.ts +33 -0
  473. package/components/stream/StreamSettings.d.ts.map +1 -0
  474. package/components/stream/StreamSettings.js +99 -0
  475. package/components/stream/StreamTerminal.d.ts +2 -0
  476. package/components/stream/StreamTerminal.d.ts.map +1 -0
  477. package/components/stream/StreamTerminal.js +52 -0
  478. package/components/stream/StreamVoiceConfig.d.ts +10 -0
  479. package/components/stream/StreamVoiceConfig.d.ts.map +1 -0
  480. package/components/stream/StreamVoiceConfig.js +88 -0
  481. package/components/stream/helpers.d.ts +32 -0
  482. package/components/stream/helpers.d.ts.map +1 -0
  483. package/components/stream/helpers.js +110 -0
  484. package/components/stream/overlays/OverlayLayer.d.ts +20 -0
  485. package/components/stream/overlays/OverlayLayer.d.ts.map +1 -0
  486. package/components/stream/overlays/OverlayLayer.js +24 -0
  487. package/components/stream/overlays/built-in/ActionTickerWidget.d.ts +8 -0
  488. package/components/stream/overlays/built-in/ActionTickerWidget.d.ts.map +1 -0
  489. package/components/stream/overlays/built-in/ActionTickerWidget.js +44 -0
  490. package/components/stream/overlays/built-in/AlertPopupWidget.d.ts +7 -0
  491. package/components/stream/overlays/built-in/AlertPopupWidget.d.ts.map +1 -0
  492. package/components/stream/overlays/built-in/AlertPopupWidget.js +62 -0
  493. package/components/stream/overlays/built-in/BrandingWidget.d.ts +7 -0
  494. package/components/stream/overlays/built-in/BrandingWidget.d.ts.map +1 -0
  495. package/components/stream/overlays/built-in/BrandingWidget.js +36 -0
  496. package/components/stream/overlays/built-in/CustomHtmlWidget.d.ts +26 -0
  497. package/components/stream/overlays/built-in/CustomHtmlWidget.d.ts.map +1 -0
  498. package/components/stream/overlays/built-in/CustomHtmlWidget.js +78 -0
  499. package/components/stream/overlays/built-in/PeonGlassWidget.d.ts +11 -0
  500. package/components/stream/overlays/built-in/PeonGlassWidget.d.ts.map +1 -0
  501. package/components/stream/overlays/built-in/PeonGlassWidget.js +188 -0
  502. package/components/stream/overlays/built-in/PeonHudWidget.d.ts +10 -0
  503. package/components/stream/overlays/built-in/PeonHudWidget.d.ts.map +1 -0
  504. package/components/stream/overlays/built-in/PeonHudWidget.js +168 -0
  505. package/components/stream/overlays/built-in/PeonSakuraWidget.d.ts +11 -0
  506. package/components/stream/overlays/built-in/PeonSakuraWidget.d.ts.map +1 -0
  507. package/components/stream/overlays/built-in/PeonSakuraWidget.js +213 -0
  508. package/components/stream/overlays/built-in/ThoughtBubbleWidget.d.ts +8 -0
  509. package/components/stream/overlays/built-in/ThoughtBubbleWidget.d.ts.map +1 -0
  510. package/components/stream/overlays/built-in/ThoughtBubbleWidget.js +59 -0
  511. package/components/stream/overlays/built-in/ViewerCountWidget.d.ts +7 -0
  512. package/components/stream/overlays/built-in/ViewerCountWidget.d.ts.map +1 -0
  513. package/components/stream/overlays/built-in/ViewerCountWidget.js +34 -0
  514. package/components/stream/overlays/built-in/index.d.ts +13 -0
  515. package/components/stream/overlays/built-in/index.d.ts.map +1 -0
  516. package/components/stream/overlays/built-in/index.js +12 -0
  517. package/components/stream/overlays/registry.d.ts +11 -0
  518. package/components/stream/overlays/registry.d.ts.map +1 -0
  519. package/components/stream/overlays/registry.js +16 -0
  520. package/components/stream/overlays/types.d.ts +67 -0
  521. package/components/stream/overlays/types.d.ts.map +1 -0
  522. package/components/stream/overlays/types.js +7 -0
  523. package/components/stream/overlays/useOverlayLayout.d.ts +27 -0
  524. package/components/stream/overlays/useOverlayLayout.d.ts.map +1 -0
  525. package/components/stream/overlays/useOverlayLayout.js +162 -0
  526. package/components/trajectory-format.d.ts +6 -0
  527. package/components/trajectory-format.d.ts.map +1 -0
  528. package/components/trajectory-format.js +43 -0
  529. package/components/ui-badges.d.ts +23 -0
  530. package/components/ui-badges.d.ts.map +1 -0
  531. package/components/ui-badges.js +38 -0
  532. package/components/ui-switch.d.ts +14 -0
  533. package/components/ui-switch.d.ts.map +1 -0
  534. package/components/ui-switch.js +15 -0
  535. package/components/vector-browser-three.d.ts +4 -0
  536. package/components/vector-browser-three.d.ts.map +1 -0
  537. package/components/vector-browser-three.js +21 -0
  538. package/config/branding.d.ts +49 -0
  539. package/config/branding.d.ts.map +1 -0
  540. package/config/branding.js +16 -0
  541. package/config/config-catalog.d.ts +376 -0
  542. package/config/config-catalog.d.ts.map +1 -0
  543. package/config/config-catalog.js +724 -0
  544. package/config/config-field.d.ts +68 -0
  545. package/config/config-field.d.ts.map +1 -0
  546. package/config/config-field.js +840 -0
  547. package/config/config-renderer.d.ts +176 -0
  548. package/config/config-renderer.d.ts.map +1 -0
  549. package/config/config-renderer.js +405 -0
  550. package/config/index.d.ts +6 -0
  551. package/config/index.d.ts.map +1 -0
  552. package/config/index.js +5 -0
  553. package/config/ui-renderer.d.ts +26 -0
  554. package/config/ui-renderer.d.ts.map +1 -0
  555. package/config/ui-renderer.js +815 -0
  556. package/config/ui-spec.d.ts +164 -0
  557. package/config/ui-spec.d.ts.map +1 -0
  558. package/config/ui-spec.js +13 -0
  559. package/events/index.d.ts +47 -0
  560. package/events/index.d.ts.map +1 -0
  561. package/events/index.js +43 -0
  562. package/hooks/index.d.ts +15 -0
  563. package/hooks/index.d.ts.map +1 -0
  564. package/hooks/useBugReport.d.ts +14 -0
  565. package/hooks/useBugReport.d.ts.map +1 -0
  566. package/hooks/useBugReport.js +18 -0
  567. package/hooks/useCanvasWindow.d.ts +38 -0
  568. package/hooks/useCanvasWindow.d.ts.map +1 -0
  569. package/hooks/useCanvasWindow.js +273 -0
  570. package/hooks/useChatAvatarVoice.d.ts +10 -0
  571. package/hooks/useChatAvatarVoice.d.ts.map +1 -0
  572. package/hooks/useChatAvatarVoice.js +71 -0
  573. package/hooks/useClickOutside.d.ts +6 -0
  574. package/hooks/useClickOutside.d.ts.map +1 -0
  575. package/hooks/useClickOutside.js +25 -0
  576. package/hooks/useContextMenu.d.ts +17 -0
  577. package/hooks/useContextMenu.d.ts.map +1 -0
  578. package/hooks/useContextMenu.js +100 -0
  579. package/hooks/useKeyboardShortcuts.d.ts +17 -0
  580. package/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  581. package/hooks/useKeyboardShortcuts.js +67 -0
  582. package/hooks/useLifoSync.d.ts +18 -0
  583. package/hooks/useLifoSync.d.ts.map +1 -0
  584. package/hooks/useLifoSync.js +113 -0
  585. package/hooks/useMemoryMonitor.d.ts +87 -0
  586. package/hooks/useMemoryMonitor.d.ts.map +1 -0
  587. package/hooks/useMemoryMonitor.js +209 -0
  588. package/hooks/useRenderGuard.d.ts +17 -0
  589. package/hooks/useRenderGuard.d.ts.map +1 -0
  590. package/hooks/useRenderGuard.js +36 -0
  591. package/hooks/useRetakeCapture.d.ts +12 -0
  592. package/hooks/useRetakeCapture.d.ts.map +1 -0
  593. package/hooks/useRetakeCapture.js +60 -0
  594. package/hooks/useStreamPopoutNavigation.d.ts +3 -0
  595. package/hooks/useStreamPopoutNavigation.d.ts.map +1 -0
  596. package/hooks/useStreamPopoutNavigation.js +17 -0
  597. package/hooks/useTimeout.d.ts +11 -0
  598. package/hooks/useTimeout.d.ts.map +1 -0
  599. package/hooks/useTimeout.js +32 -0
  600. package/hooks/useVoiceChat.d.ts +94 -0
  601. package/hooks/useVoiceChat.d.ts.map +1 -0
  602. package/hooks/useVoiceChat.js +1074 -0
  603. package/hooks/useWhatsAppPairing.d.ts +11 -0
  604. package/hooks/useWhatsAppPairing.d.ts.map +1 -0
  605. package/hooks/useWhatsAppPairing.js +95 -0
  606. package/i18n/index.d.ts +7 -0
  607. package/i18n/index.d.ts.map +1 -0
  608. package/i18n/index.js +53 -0
  609. package/i18n/locales/en.json +1239 -0
  610. package/i18n/locales/es.json +1236 -0
  611. package/i18n/locales/ko.json +1236 -0
  612. package/i18n/locales/pt.json +1236 -0
  613. package/i18n/locales/zh-CN.json +1236 -0
  614. package/i18n/messages.d.ts +6 -0
  615. package/i18n/messages.d.ts.map +1 -0
  616. package/i18n/messages.js +14 -0
  617. package/index.d.ts +5 -0
  618. package/index.d.ts.map +1 -0
  619. package/navigation/index.d.ts +27 -0
  620. package/navigation/index.d.ts.map +1 -0
  621. package/navigation/index.js +232 -0
  622. package/onboarding-config.d.ts +25 -0
  623. package/onboarding-config.d.ts.map +1 -0
  624. package/onboarding-config.js +76 -0
  625. package/package.json +143 -53
  626. package/platform/browser-launch.d.ts +2 -0
  627. package/platform/browser-launch.d.ts.map +1 -0
  628. package/platform/browser-launch.js +109 -0
  629. package/platform/index.d.ts +14 -0
  630. package/platform/index.d.ts.map +1 -0
  631. package/platform/index.js +24 -0
  632. package/platform/init.d.ts +40 -0
  633. package/platform/init.d.ts.map +1 -0
  634. package/platform/init.js +160 -0
  635. package/platform/lifo.d.ts +51 -0
  636. package/platform/lifo.d.ts.map +1 -0
  637. package/platform/lifo.js +138 -0
  638. package/providers/index.d.ts +19 -0
  639. package/providers/index.d.ts.map +1 -0
  640. package/providers/index.js +80 -0
  641. package/shell-params.d.ts +12 -0
  642. package/shell-params.d.ts.map +1 -0
  643. package/shell-params.js +19 -0
  644. package/state/AppContext.d.ts +12 -0
  645. package/state/AppContext.d.ts.map +1 -0
  646. package/state/AppContext.js +5060 -0
  647. package/state/index.d.ts +7 -0
  648. package/state/index.d.ts.map +1 -0
  649. package/state/internal.d.ts +7 -0
  650. package/state/internal.d.ts.map +1 -0
  651. package/state/internal.js +6 -0
  652. package/state/onboarding-resume.d.ts +11 -0
  653. package/state/onboarding-resume.d.ts.map +1 -0
  654. package/state/onboarding-resume.js +189 -0
  655. package/state/parsers.d.ts +26 -0
  656. package/state/parsers.d.ts.map +1 -0
  657. package/state/parsers.js +255 -0
  658. package/state/persistence.d.ts +59 -0
  659. package/state/persistence.d.ts.map +1 -0
  660. package/state/persistence.js +326 -0
  661. package/state/shell-routing.d.ts +12 -0
  662. package/state/shell-routing.d.ts.map +1 -0
  663. package/state/shell-routing.js +25 -0
  664. package/state/types.d.ts +421 -0
  665. package/state/types.d.ts.map +1 -0
  666. package/state/types.js +75 -0
  667. package/state/ui-preferences.d.ts +3 -0
  668. package/state/ui-preferences.d.ts.map +1 -0
  669. package/state/ui-preferences.js +1 -0
  670. package/state/useApp.d.ts +4 -0
  671. package/state/useApp.d.ts.map +1 -0
  672. package/state/useApp.js +22 -0
  673. package/state/vrm.d.ts +30 -0
  674. package/state/vrm.d.ts.map +1 -0
  675. package/state/vrm.js +82 -0
  676. package/styles/anime.css +6321 -0
  677. package/styles/onboarding-game.css +1092 -0
  678. package/types/index.d.ts +657 -0
  679. package/types/index.d.ts.map +1 -0
  680. package/types/index.js +1 -0
  681. package/utils/asset-url.d.ts +26 -0
  682. package/utils/asset-url.d.ts.map +1 -0
  683. package/utils/asset-url.js +99 -0
  684. package/utils/assistant-text.d.ts +2 -0
  685. package/utils/assistant-text.d.ts.map +1 -0
  686. package/utils/assistant-text.js +161 -0
  687. package/utils/clipboard.d.ts +2 -0
  688. package/utils/clipboard.d.ts.map +1 -0
  689. package/utils/clipboard.js +38 -0
  690. package/utils/desktop-dialogs.d.ts +19 -0
  691. package/utils/desktop-dialogs.d.ts.map +1 -0
  692. package/utils/desktop-dialogs.js +50 -0
  693. package/utils/eliza-globals.d.ts +11 -0
  694. package/utils/eliza-globals.d.ts.map +1 -0
  695. package/utils/eliza-globals.js +33 -0
  696. package/utils/index.d.ts +8 -0
  697. package/utils/index.d.ts.map +1 -0
  698. package/utils/number-parsing.d.ts +44 -0
  699. package/utils/number-parsing.d.ts.map +1 -0
  700. package/utils/number-parsing.js +56 -0
  701. package/utils/openExternalUrl.d.ts +2 -0
  702. package/utils/openExternalUrl.d.ts.map +1 -0
  703. package/utils/openExternalUrl.js +17 -0
  704. package/utils/spoken-text.d.ts +2 -0
  705. package/utils/spoken-text.d.ts.map +1 -0
  706. package/utils/spoken-text.js +56 -0
  707. package/utils/streaming-text.d.ts +3 -0
  708. package/utils/streaming-text.d.ts.map +1 -0
  709. package/utils/streaming-text.js +87 -0
  710. package/voice/index.d.ts +2 -0
  711. package/voice/index.d.ts.map +1 -0
  712. package/voice/types.d.ts +25 -0
  713. package/voice/types.d.ts.map +1 -0
  714. package/voice/types.js +166 -0
  715. package/wallet-rpc.d.ts +8 -0
  716. package/wallet-rpc.d.ts.map +1 -0
  717. package/wallet-rpc.js +131 -0
  718. package/.turbo/turbo-build.log +0 -5
  719. package/src/App.tsx +0 -504
  720. package/src/actions/character.test.ts +0 -139
  721. package/src/actions/character.ts +0 -334
  722. package/src/actions/chat-helpers.ts +0 -100
  723. package/src/actions/cloud.ts +0 -59
  724. package/src/actions/index.ts +0 -12
  725. package/src/actions/lifecycle.ts +0 -175
  726. package/src/actions/onboarding.ts +0 -38
  727. package/src/actions/triggers.ts +0 -190
  728. package/src/ambient.d.ts +0 -33
  729. package/src/api/client.ts +0 -5659
  730. package/src/autonomy/index.ts +0 -477
  731. package/src/bridge/capacitor-bridge.ts +0 -295
  732. package/src/bridge/electrobun-rpc.ts +0 -78
  733. package/src/bridge/electrobun-runtime.ts +0 -28
  734. package/src/bridge/native-plugins.ts +0 -138
  735. package/src/bridge/plugin-bridge.ts +0 -352
  736. package/src/bridge/storage-bridge.ts +0 -162
  737. package/src/chat/index.ts +0 -250
  738. package/src/coding/index.ts +0 -43
  739. package/src/components/AdvancedPageView.tsx +0 -382
  740. package/src/components/AgentActivityBox.tsx +0 -49
  741. package/src/components/ApiKeyConfig.tsx +0 -222
  742. package/src/components/AppsPageView.tsx +0 -52
  743. package/src/components/AppsView.tsx +0 -293
  744. package/src/components/AvatarLoader.tsx +0 -104
  745. package/src/components/AvatarSelector.tsx +0 -223
  746. package/src/components/BscTradePanel.tsx +0 -549
  747. package/src/components/BugReportModal.tsx +0 -499
  748. package/src/components/CharacterRoster.tsx +0 -143
  749. package/src/components/CharacterView.tsx +0 -1575
  750. package/src/components/ChatAvatar.test.ts +0 -97
  751. package/src/components/ChatAvatar.tsx +0 -147
  752. package/src/components/ChatComposer.tsx +0 -330
  753. package/src/components/ChatMessage.tsx +0 -448
  754. package/src/components/ChatModalView.test.tsx +0 -118
  755. package/src/components/ChatModalView.tsx +0 -125
  756. package/src/components/ChatView.tsx +0 -992
  757. package/src/components/CloudOnboarding.tsx +0 -81
  758. package/src/components/CloudSourceControls.tsx +0 -85
  759. package/src/components/CodingAgentSettingsSection.tsx +0 -537
  760. package/src/components/CommandPalette.tsx +0 -284
  761. package/src/components/CompanionSceneHost.tsx +0 -517
  762. package/src/components/CompanionShell.tsx +0 -31
  763. package/src/components/CompanionView.tsx +0 -110
  764. package/src/components/ConfigPageView.tsx +0 -763
  765. package/src/components/ConfigSaveFooter.tsx +0 -41
  766. package/src/components/ConfirmModal.tsx +0 -379
  767. package/src/components/ConnectionFailedBanner.tsx +0 -91
  768. package/src/components/ConnectorsPageView.tsx +0 -13
  769. package/src/components/ConversationsSidebar.tsx +0 -279
  770. package/src/components/CustomActionEditor.tsx +0 -1127
  771. package/src/components/CustomActionsPanel.tsx +0 -288
  772. package/src/components/CustomActionsView.tsx +0 -325
  773. package/src/components/DatabasePageView.tsx +0 -55
  774. package/src/components/DatabaseView.tsx +0 -814
  775. package/src/components/ElizaCloudDashboard.tsx +0 -1696
  776. package/src/components/EmotePicker.tsx +0 -529
  777. package/src/components/ErrorBoundary.tsx +0 -76
  778. package/src/components/FineTuningView.tsx +0 -1080
  779. package/src/components/FlaminaGuide.test.tsx +0 -61
  780. package/src/components/FlaminaGuide.tsx +0 -212
  781. package/src/components/GameView.tsx +0 -551
  782. package/src/components/GameViewOverlay.tsx +0 -133
  783. package/src/components/GlobalEmoteOverlay.tsx +0 -152
  784. package/src/components/Header.test.tsx +0 -413
  785. package/src/components/Header.tsx +0 -400
  786. package/src/components/HeartbeatsView.tsx +0 -1003
  787. package/src/components/InventoryView.tsx +0 -393
  788. package/src/components/KnowledgeView.tsx +0 -1128
  789. package/src/components/LanguageDropdown.tsx +0 -192
  790. package/src/components/LifoMonitorPanel.tsx +0 -196
  791. package/src/components/LifoSandboxView.tsx +0 -499
  792. package/src/components/LoadingScreen.tsx +0 -112
  793. package/src/components/LogsPageView.tsx +0 -17
  794. package/src/components/LogsView.tsx +0 -239
  795. package/src/components/MediaGalleryView.tsx +0 -431
  796. package/src/components/MediaSettingsSection.tsx +0 -893
  797. package/src/components/MessageContent.tsx +0 -815
  798. package/src/components/MiladyBar.tsx +0 -103
  799. package/src/components/MiladyBarSettings.tsx +0 -872
  800. package/src/components/OnboardingWizard.test.tsx +0 -104
  801. package/src/components/OnboardingWizard.tsx +0 -249
  802. package/src/components/PairingView.tsx +0 -109
  803. package/src/components/PermissionsSection.tsx +0 -1184
  804. package/src/components/PluginsPageView.tsx +0 -9
  805. package/src/components/PluginsView.tsx +0 -3129
  806. package/src/components/ProviderSwitcher.tsx +0 -903
  807. package/src/components/RestartBanner.tsx +0 -76
  808. package/src/components/RuntimeView.tsx +0 -460
  809. package/src/components/SaveCommandModal.tsx +0 -211
  810. package/src/components/SecretsView.tsx +0 -569
  811. package/src/components/SecurityPageView.tsx +0 -242
  812. package/src/components/SettingsView.tsx +0 -825
  813. package/src/components/ShellOverlays.tsx +0 -41
  814. package/src/components/ShortcutsOverlay.tsx +0 -155
  815. package/src/components/SkillsView.tsx +0 -1435
  816. package/src/components/StartupFailureView.tsx +0 -63
  817. package/src/components/StreamView.tsx +0 -481
  818. package/src/components/StripeEmbeddedCheckout.tsx +0 -155
  819. package/src/components/SubscriptionStatus.tsx +0 -640
  820. package/src/components/SystemWarningBanner.tsx +0 -71
  821. package/src/components/ThemeToggle.tsx +0 -103
  822. package/src/components/TrajectoriesView.tsx +0 -526
  823. package/src/components/TrajectoryDetailView.tsx +0 -426
  824. package/src/components/VectorBrowserView.tsx +0 -1633
  825. package/src/components/VoiceConfigView.tsx +0 -674
  826. package/src/components/VrmStage.test.ts +0 -176
  827. package/src/components/VrmStage.tsx +0 -309
  828. package/src/components/WhatsAppQrOverlay.tsx +0 -230
  829. package/src/components/__tests__/chainConfig.test.ts +0 -220
  830. package/src/components/apps/AppDetailPane.tsx +0 -242
  831. package/src/components/apps/AppsCatalogGrid.tsx +0 -137
  832. package/src/components/apps/extensions/registry.ts +0 -13
  833. package/src/components/apps/extensions/types.ts +0 -9
  834. package/src/components/apps/helpers.ts +0 -43
  835. package/src/components/avatar/VrmAnimationLoader.test.ts +0 -164
  836. package/src/components/avatar/VrmAnimationLoader.ts +0 -151
  837. package/src/components/avatar/VrmBlinkController.ts +0 -118
  838. package/src/components/avatar/VrmCameraManager.ts +0 -407
  839. package/src/components/avatar/VrmEngine.ts +0 -2767
  840. package/src/components/avatar/VrmFootShadow.ts +0 -96
  841. package/src/components/avatar/VrmViewer.tsx +0 -421
  842. package/src/components/avatar/__tests__/VrmCameraManager.test.ts +0 -168
  843. package/src/components/avatar/__tests__/VrmEngine.test.ts +0 -1574
  844. package/src/components/avatar/mixamoVRMRigMap.ts +0 -62
  845. package/src/components/avatar/retargetMixamoFbxToVrm.ts +0 -144
  846. package/src/components/avatar/retargetMixamoGltfToVrm.ts +0 -119
  847. package/src/components/chainConfig.ts +0 -400
  848. package/src/components/companion/CompanionHeader.tsx +0 -50
  849. package/src/components/companion/CompanionSceneHost.tsx +0 -5
  850. package/src/components/companion/VrmStage.tsx +0 -2
  851. package/src/components/companion/__tests__/walletUtils.test.ts +0 -742
  852. package/src/components/companion/index.ts +0 -18
  853. package/src/components/companion/walletUtils.ts +0 -290
  854. package/src/components/companion-shell-styles.test.ts +0 -142
  855. package/src/components/companion-shell-styles.ts +0 -270
  856. package/src/components/confirm-delete-control.tsx +0 -69
  857. package/src/components/conversations/ConversationListItem.tsx +0 -185
  858. package/src/components/conversations/conversation-utils.ts +0 -151
  859. package/src/components/format.ts +0 -131
  860. package/src/components/index.ts +0 -96
  861. package/src/components/inventory/CopyableAddress.tsx +0 -41
  862. package/src/components/inventory/InventoryToolbar.tsx +0 -142
  863. package/src/components/inventory/NftGrid.tsx +0 -99
  864. package/src/components/inventory/TokenLogo.tsx +0 -71
  865. package/src/components/inventory/TokensTable.tsx +0 -216
  866. package/src/components/inventory/constants.ts +0 -170
  867. package/src/components/inventory/index.ts +0 -29
  868. package/src/components/inventory/media-url.test.ts +0 -38
  869. package/src/components/inventory/media-url.ts +0 -36
  870. package/src/components/inventory/useInventoryData.ts +0 -460
  871. package/src/components/knowledge-upload-image.ts +0 -215
  872. package/src/components/labels.ts +0 -46
  873. package/src/components/milady-bar/CloudCreditsChip.tsx +0 -61
  874. package/src/components/milady-bar/ProviderDropdown.tsx +0 -166
  875. package/src/components/milady-bar/WalletSummary.tsx +0 -61
  876. package/src/components/milady-bar/index.ts +0 -3
  877. package/src/components/onboarding/ActivateStep.tsx +0 -34
  878. package/src/components/onboarding/ConnectionStep.tsx +0 -1591
  879. package/src/components/onboarding/IdentityStep.tsx +0 -251
  880. package/src/components/onboarding/OnboardingPanel.tsx +0 -39
  881. package/src/components/onboarding/OnboardingStepNav.tsx +0 -41
  882. package/src/components/onboarding/PermissionsStep.tsx +0 -20
  883. package/src/components/onboarding/RpcStep.tsx +0 -402
  884. package/src/components/permissions/PermissionIcon.tsx +0 -25
  885. package/src/components/permissions/StreamingPermissions.tsx +0 -413
  886. package/src/components/plugins/showcase-data.ts +0 -481
  887. package/src/components/shared/ShellHeaderControls.tsx +0 -198
  888. package/src/components/shared-companion-scene-context.ts +0 -15
  889. package/src/components/skeletons.tsx +0 -88
  890. package/src/components/stream/ActivityFeed.tsx +0 -113
  891. package/src/components/stream/AvatarPip.tsx +0 -10
  892. package/src/components/stream/ChatContent.tsx +0 -126
  893. package/src/components/stream/ChatTicker.tsx +0 -55
  894. package/src/components/stream/IdleContent.tsx +0 -73
  895. package/src/components/stream/StatusBar.tsx +0 -463
  896. package/src/components/stream/StreamSettings.tsx +0 -506
  897. package/src/components/stream/StreamTerminal.tsx +0 -94
  898. package/src/components/stream/StreamVoiceConfig.tsx +0 -160
  899. package/src/components/stream/helpers.ts +0 -134
  900. package/src/components/stream/overlays/OverlayLayer.tsx +0 -75
  901. package/src/components/stream/overlays/built-in/ActionTickerWidget.tsx +0 -64
  902. package/src/components/stream/overlays/built-in/AlertPopupWidget.tsx +0 -87
  903. package/src/components/stream/overlays/built-in/BrandingWidget.tsx +0 -51
  904. package/src/components/stream/overlays/built-in/CustomHtmlWidget.tsx +0 -105
  905. package/src/components/stream/overlays/built-in/PeonGlassWidget.tsx +0 -265
  906. package/src/components/stream/overlays/built-in/PeonHudWidget.tsx +0 -247
  907. package/src/components/stream/overlays/built-in/PeonSakuraWidget.tsx +0 -278
  908. package/src/components/stream/overlays/built-in/ThoughtBubbleWidget.tsx +0 -77
  909. package/src/components/stream/overlays/built-in/ViewerCountWidget.tsx +0 -46
  910. package/src/components/stream/overlays/built-in/index.ts +0 -13
  911. package/src/components/stream/overlays/registry.ts +0 -22
  912. package/src/components/stream/overlays/types.ts +0 -90
  913. package/src/components/stream/overlays/useOverlayLayout.ts +0 -218
  914. package/src/components/trajectory-format.ts +0 -50
  915. package/src/components/ui-badges.tsx +0 -109
  916. package/src/components/ui-switch.tsx +0 -57
  917. package/src/components/vector-browser-three.ts +0 -29
  918. package/src/config/branding.ts +0 -67
  919. package/src/config/config-catalog.ts +0 -1092
  920. package/src/config/config-field.tsx +0 -1924
  921. package/src/config/config-renderer.tsx +0 -734
  922. package/src/config/index.ts +0 -12
  923. package/src/config/ui-renderer.tsx +0 -1751
  924. package/src/config/ui-spec.ts +0 -256
  925. package/src/events/index.ts +0 -96
  926. package/src/hooks/useBugReport.tsx +0 -43
  927. package/src/hooks/useCanvasWindow.ts +0 -372
  928. package/src/hooks/useChatAvatarVoice.ts +0 -111
  929. package/src/hooks/useClickOutside.ts +0 -31
  930. package/src/hooks/useContextMenu.ts +0 -127
  931. package/src/hooks/useKeyboardShortcuts.ts +0 -86
  932. package/src/hooks/useLifoSync.ts +0 -143
  933. package/src/hooks/useMemoryMonitor.ts +0 -334
  934. package/src/hooks/useMiladyBar.ts +0 -594
  935. package/src/hooks/useRenderGuard.ts +0 -43
  936. package/src/hooks/useRetakeCapture.ts +0 -68
  937. package/src/hooks/useStreamPopoutNavigation.ts +0 -27
  938. package/src/hooks/useTimeout.ts +0 -37
  939. package/src/hooks/useVoiceChat.ts +0 -1442
  940. package/src/hooks/useWhatsAppPairing.ts +0 -123
  941. package/src/i18n/index.ts +0 -76
  942. package/src/i18n/locales/en.json +0 -1195
  943. package/src/i18n/locales/es.json +0 -1195
  944. package/src/i18n/locales/ko.json +0 -1195
  945. package/src/i18n/locales/pt.json +0 -1195
  946. package/src/i18n/locales/zh-CN.json +0 -1195
  947. package/src/i18n/messages.ts +0 -21
  948. package/src/navigation/index.ts +0 -286
  949. package/src/navigation.test.ts +0 -189
  950. package/src/onboarding-config.test.ts +0 -104
  951. package/src/onboarding-config.ts +0 -122
  952. package/src/platform/browser-launch.test.ts +0 -94
  953. package/src/platform/browser-launch.ts +0 -149
  954. package/src/platform/index.ts +0 -58
  955. package/src/platform/init.ts +0 -238
  956. package/src/platform/lifo.ts +0 -225
  957. package/src/providers/index.ts +0 -108
  958. package/src/shell-params.test.ts +0 -48
  959. package/src/shell-params.ts +0 -36
  960. package/src/state/AppContext.tsx +0 -6415
  961. package/src/state/internal.ts +0 -91
  962. package/src/state/onboarding-resume.test.ts +0 -135
  963. package/src/state/onboarding-resume.ts +0 -263
  964. package/src/state/parsers.test.ts +0 -124
  965. package/src/state/parsers.ts +0 -309
  966. package/src/state/persistence.ts +0 -379
  967. package/src/state/shell-routing.ts +0 -39
  968. package/src/state/types.ts +0 -724
  969. package/src/state/ui-preferences.ts +0 -3
  970. package/src/state/useApp.ts +0 -23
  971. package/src/state/vrm.ts +0 -108
  972. package/src/styles/anime.css +0 -6324
  973. package/src/styles/onboarding-game.css +0 -976
  974. package/src/types/index.ts +0 -715
  975. package/src/types/react-test-renderer.d.ts +0 -45
  976. package/src/utils/asset-url.ts +0 -110
  977. package/src/utils/assistant-text.ts +0 -172
  978. package/src/utils/clipboard.ts +0 -41
  979. package/src/utils/desktop-dialogs.ts +0 -80
  980. package/src/utils/eliza-globals.ts +0 -44
  981. package/src/utils/number-parsing.ts +0 -125
  982. package/src/utils/openExternalUrl.ts +0 -20
  983. package/src/utils/spoken-text.ts +0 -65
  984. package/src/utils/streaming-text.ts +0 -120
  985. package/src/voice/types.ts +0 -197
  986. package/src/wallet-rpc.ts +0 -176
  987. package/test/app/AppContext.pty-sessions.test.tsx +0 -143
  988. package/test/app/MessageContent.test.tsx +0 -366
  989. package/test/app/PermissionsOnboarding.test.tsx +0 -358
  990. package/test/app/PermissionsSection.test.tsx +0 -575
  991. package/test/app/advanced-trajectory-fine-tuning.e2e.test.ts +0 -396
  992. package/test/app/agent-activity-box.test.tsx +0 -132
  993. package/test/app/agent-transfer-lock.test.ts +0 -279
  994. package/test/app/api-client-electrobun-fallback.test.ts +0 -139
  995. package/test/app/api-client-electron-fallback.test.ts +0 -139
  996. package/test/app/api-client-timeout.test.ts +0 -75
  997. package/test/app/api-client-ws.test.ts +0 -98
  998. package/test/app/api-client.ws-max-reconnect.test.ts +0 -139
  999. package/test/app/api-client.ws-reconnect.test.ts +0 -157
  1000. package/test/app/app-context-autonomy-events.test.ts +0 -559
  1001. package/test/app/apps-page-view.test.ts +0 -114
  1002. package/test/app/apps-view.test.ts +0 -768
  1003. package/test/app/autonomous-workflows.e2e.test.ts +0 -765
  1004. package/test/app/autonomy-events.test.ts +0 -150
  1005. package/test/app/avatar-selector.test.tsx +0 -52
  1006. package/test/app/bsc-trade-panel.test.tsx +0 -134
  1007. package/test/app/bug-report-modal.test.tsx +0 -353
  1008. package/test/app/character-action-bar-visibility.test.ts +0 -70
  1009. package/test/app/character-customization.e2e.test.ts +0 -1384
  1010. package/test/app/character-save-journey.test.ts +0 -1245
  1011. package/test/app/chat-advanced-features.e2e.test.ts +0 -706
  1012. package/test/app/chat-composer.test.tsx +0 -181
  1013. package/test/app/chat-journey.test.ts +0 -1075
  1014. package/test/app/chat-language-header.test.ts +0 -64
  1015. package/test/app/chat-message.test.tsx +0 -222
  1016. package/test/app/chat-modal-view.test.tsx +0 -191
  1017. package/test/app/chat-routine-filter.test.ts +0 -96
  1018. package/test/app/chat-send-lock.test.ts +0 -1465
  1019. package/test/app/chat-stream-api-client.test.tsx +0 -390
  1020. package/test/app/chat-view-game-modal.test.tsx +0 -661
  1021. package/test/app/chat-view.test.tsx +0 -877
  1022. package/test/app/cloud-api.e2e.test.ts +0 -258
  1023. package/test/app/cloud-login-flow.e2e.test.ts +0 -494
  1024. package/test/app/cloud-login-lock.test.ts +0 -416
  1025. package/test/app/command-palette.test.tsx +0 -184
  1026. package/test/app/command-registry.test.ts +0 -75
  1027. package/test/app/companion-greeting-wave.test.tsx +0 -431
  1028. package/test/app/companion-scene-host.test.tsx +0 -85
  1029. package/test/app/companion-stale-conversation.test.tsx +0 -447
  1030. package/test/app/companion-view.test.tsx +0 -690
  1031. package/test/app/confirm-delete-control.test.ts +0 -79
  1032. package/test/app/confirm-modal.test.tsx +0 -219
  1033. package/test/app/connection-mode-persistence.test.ts +0 -411
  1034. package/test/app/connectors-ui.e2e.test.ts +0 -508
  1035. package/test/app/conversations-sidebar-game-modal.test.tsx +0 -265
  1036. package/test/app/conversations-sidebar.test.tsx +0 -185
  1037. package/test/app/custom-actions-smoke.test.ts +0 -387
  1038. package/test/app/custom-avatar-api-client.test.ts +0 -207
  1039. package/test/app/desktop-utils.test.ts +0 -145
  1040. package/test/app/electrobun-rpc-bridge.test.ts +0 -83
  1041. package/test/app/events.test.ts +0 -88
  1042. package/test/app/export-import-flows.e2e.test.ts +0 -700
  1043. package/test/app/fine-tuning-view.test.ts +0 -471
  1044. package/test/app/game-view-auth-session.test.tsx +0 -187
  1045. package/test/app/game-view.test.ts +0 -444
  1046. package/test/app/global-emote-overlay.test.tsx +0 -106
  1047. package/test/app/header-status.test.tsx +0 -149
  1048. package/test/app/i18n.test.ts +0 -152
  1049. package/test/app/inventory-bsc-view.test.ts +0 -940
  1050. package/test/app/knowledge-ui.e2e.test.ts +0 -762
  1051. package/test/app/knowledge-upload-helpers.test.ts +0 -124
  1052. package/test/app/lifecycle-lock.test.ts +0 -267
  1053. package/test/app/lifo-popout-utils.test.ts +0 -208
  1054. package/test/app/lifo-safe-endpoint.test.ts +0 -34
  1055. package/test/app/loading-screen.test.tsx +0 -45
  1056. package/test/app/memory-monitor.test.ts +0 -331
  1057. package/test/app/milady-bar-regression.test.tsx +0 -519
  1058. package/test/app/milady-bar-settings.test.tsx +0 -1056
  1059. package/test/app/milady-bar.test.tsx +0 -583
  1060. package/test/app/navigation.test.tsx +0 -22
  1061. package/test/app/onboarding-e2e-journey.test.ts +0 -1409
  1062. package/test/app/onboarding-finish-lock.test.ts +0 -676
  1063. package/test/app/onboarding-language.test.tsx +0 -160
  1064. package/test/app/onboarding-steps.test.tsx +0 -375
  1065. package/test/app/open-external-url.test.ts +0 -65
  1066. package/test/app/pages-navigation-smoke.e2e.test.ts +0 -646
  1067. package/test/app/pairing-lock.test.ts +0 -260
  1068. package/test/app/pairing-view.test.tsx +0 -74
  1069. package/test/app/permissions-section.test.ts +0 -432
  1070. package/test/app/plugin-bridge.test.ts +0 -109
  1071. package/test/app/plugins-ui.e2e.test.ts +0 -605
  1072. package/test/app/plugins-view-game-modal.test.tsx +0 -686
  1073. package/test/app/plugins-view-toggle-restart.test.ts +0 -129
  1074. package/test/app/provider-dropdown-default.test.tsx +0 -300
  1075. package/test/app/restart-banner.test.tsx +0 -205
  1076. package/test/app/retake-capture.test.ts +0 -84
  1077. package/test/app/sandbox-api-client.test.ts +0 -108
  1078. package/test/app/save-command-modal.test.tsx +0 -109
  1079. package/test/app/secrets-view.test.tsx +0 -92
  1080. package/test/app/settings-control-styles.test.tsx +0 -142
  1081. package/test/app/settings-reset.e2e.test.ts +0 -726
  1082. package/test/app/settings-sections.e2e.test.ts +0 -614
  1083. package/test/app/shared-format.test.ts +0 -44
  1084. package/test/app/shared-switch.test.ts +0 -69
  1085. package/test/app/shell-mode-switching.e2e.test.ts +0 -841
  1086. package/test/app/shell-mode-tab-memory.test.tsx +0 -58
  1087. package/test/app/shell-overlays.test.tsx +0 -50
  1088. package/test/app/shortcuts-overlay.test.tsx +0 -111
  1089. package/test/app/sse-interruption.test.ts +0 -122
  1090. package/test/app/startup-asset-missing.e2e.test.ts +0 -126
  1091. package/test/app/startup-backend-missing.e2e.test.ts +0 -126
  1092. package/test/app/startup-chat.e2e.test.ts +0 -323
  1093. package/test/app/startup-conversation-restore.test.tsx +0 -381
  1094. package/test/app/startup-failure-view.test.tsx +0 -103
  1095. package/test/app/startup-onboarding.e2e.test.ts +0 -712
  1096. package/test/app/startup-timeout.test.tsx +0 -80
  1097. package/test/app/startup-token-401.e2e.test.ts +0 -103
  1098. package/test/app/stream-helpers.test.ts +0 -46
  1099. package/test/app/stream-popout-navigation.test.tsx +0 -41
  1100. package/test/app/stream-status-bar.test.tsx +0 -89
  1101. package/test/app/theme-toggle.test.tsx +0 -40
  1102. package/test/app/training-api-client.test.ts +0 -128
  1103. package/test/app/trajectories-view.test.tsx +0 -220
  1104. package/test/app/triggers-api-client.test.ts +0 -77
  1105. package/test/app/triggers-navigation.test.ts +0 -113
  1106. package/test/app/triggers-view.e2e.test.ts +0 -675
  1107. package/test/app/update-channel-lock.test.ts +0 -259
  1108. package/test/app/vector-browser.async-cleanup.test.tsx +0 -367
  1109. package/test/app/vector-browser.e2e.test.ts +0 -653
  1110. package/test/app/vrm-stage.test.tsx +0 -351
  1111. package/test/app/vrm-viewer.test.tsx +0 -298
  1112. package/test/app/wallet-api-save-lock.test.ts +0 -299
  1113. package/test/app/wallet-hooks.test.ts +0 -405
  1114. package/test/app/wallet-ui-flows.e2e.test.ts +0 -556
  1115. package/test/avatar/asset-url.test.ts +0 -90
  1116. package/test/avatar/avatar-selector.test.ts +0 -173
  1117. package/test/avatar/mixamo-vrm-rig-map.test.ts +0 -111
  1118. package/test/avatar/voice-chat-streaming-text.test.ts +0 -96
  1119. package/test/avatar/voice-chat.test.ts +0 -391
  1120. package/test/browser-extension/README.md +0 -138
  1121. package/test/browser-extension/test-harness.ts +0 -499
  1122. package/test/capacitor-plugins.e2e.test.ts +0 -168
  1123. package/test/test-types.ts +0 -5
  1124. package/test/ui/command-palette-commands.test.ts +0 -57
  1125. package/test/ui/ui-renderer.test.ts +0 -39
  1126. package/test/utils/assistant-text.test.ts +0 -68
  1127. package/test/utils/eliza-globals.test.ts +0 -59
  1128. package/test/utils/package-exports.test.ts +0 -70
  1129. package/test/utils/streaming-text.test.ts +0 -89
  1130. package/tsconfig.build.json +0 -19
  1131. package/tsconfig.json +0 -20
  1132. package/tsconfig.typecheck.json +0 -12
  1133. /package/{src/api/index.ts → api/index.js} +0 -0
  1134. /package/{src/bridge/index.ts → bridge/index.js} +0 -0
  1135. /package/{src/components/TriggersView.tsx → components/TriggersView.js} +0 -0
  1136. /package/{src/hooks/index.ts → hooks/index.js} +0 -0
  1137. /package/{src/index.ts → index.js} +0 -0
  1138. /package/{src/state/index.ts → state/index.js} +0 -0
  1139. /package/{src/styles → styles}/base.css +0 -0
  1140. /package/{src/styles → styles}/styles.css +0 -0
  1141. /package/{src/styles → styles}/xterm.css +0 -0
  1142. /package/{src/utils/index.ts → utils/index.js} +0 -0
  1143. /package/{src/voice/index.ts → voice/index.js} +0 -0
@@ -1,1575 +0,0 @@
1
- /**
2
- * Character view — roster-first character selection with optional customization.
3
- */
4
-
5
- import {
6
- type CharacterData,
7
- client,
8
- type StylePreset,
9
- type VoiceConfig,
10
- } from "@elizaos/app-core/api";
11
- import { AvatarSelector } from "./AvatarSelector";
12
- import {
13
- dispatchWindowEvent,
14
- VOICE_CONFIG_UPDATED_EVENT,
15
- } from "@elizaos/app-core/events";
16
- import { COMPANION_ENABLED } from "@elizaos/app-core/navigation";
17
- import { normalizeGeneratedMessageExamples } from "../actions/character";
18
- import { useApp } from "@elizaos/app-core/state";
19
- import {
20
- CharacterRoster,
21
- type CharacterRosterEntry,
22
- resolveRosterEntries,
23
- } from "./CharacterRoster";
24
- import {
25
- PREMADE_VOICES,
26
- sanitizeApiKey,
27
- type VoicePreset,
28
- } from "@elizaos/app-core/voice";
29
- import { Button, Input, Textarea, ThemedSelect } from "@elizaos/ui";
30
- import { BookOpen, FileText, Lock, LockOpen, Palette, Volume2, VolumeX } from "lucide-react";
31
- import { useCallback, useEffect, useState } from "react";
32
-
33
- const DEFAULT_ELEVEN_FAST_MODEL = "eleven_flash_v2_5";
34
-
35
- type StyleSectionKey = "all" | "chat" | "post";
36
- type CustomizeStep = "core" | "examples";
37
- type ActiveSection = "aboutMe" | "directions" | "styleRules";
38
- const STYLE_SECTION_KEYS: StyleSectionKey[] = ["all", "chat", "post"];
39
- const STYLE_SECTION_PLACEHOLDERS: Record<StyleSectionKey, string> = {
40
- all: "Add shared rule",
41
- chat: "Add chat rule",
42
- post: "Add post rule",
43
- };
44
- const STYLE_SECTION_EMPTY_STATES: Record<StyleSectionKey, string> = {
45
- all: "No shared rules yet.",
46
- chat: "No chat rules yet.",
47
- post: "No post rules yet.",
48
- };
49
- const VOICE_SELECT_GROUPS = [
50
- {
51
- label: "Female",
52
- items: PREMADE_VOICES.filter((preset) => preset.gender === "female").map(
53
- (preset) => ({
54
- id: preset.id,
55
- text: preset.name,
56
- }),
57
- ),
58
- },
59
- {
60
- label: "Male",
61
- items: PREMADE_VOICES.filter((preset) => preset.gender === "male").map(
62
- (preset) => ({
63
- id: preset.id,
64
- text: preset.name,
65
- }),
66
- ),
67
- },
68
- {
69
- label: "Character",
70
- items: PREMADE_VOICES.filter((preset) => preset.gender === "character").map(
71
- (preset) => ({
72
- id: preset.id,
73
- text: preset.name,
74
- }),
75
- ),
76
- },
77
- ];
78
-
79
- function replaceCharacterToken(value: string, name: string) {
80
- return value.replaceAll("{{name}}", name).replaceAll("{{agentName}}", name);
81
- }
82
-
83
- function buildCharacterFromPreset(
84
- preset: StylePreset,
85
- name: string,
86
- ): CharacterData {
87
- return {
88
- name,
89
- username: name,
90
- bio: preset.bio.map((line) => replaceCharacterToken(line, name)),
91
- system: replaceCharacterToken(preset.system, name),
92
- adjectives: [...preset.adjectives],
93
- style: {
94
- all: [...preset.style.all],
95
- chat: [...preset.style.chat],
96
- post: [...preset.style.post],
97
- },
98
- messageExamples: preset.messageExamples.map((conversation) => ({
99
- examples: conversation.map((message) => ({
100
- name:
101
- message.user === "{{agentName}}"
102
- ? name
103
- : replaceCharacterToken(message.user, name),
104
- content: {
105
- text: replaceCharacterToken(message.content.text, name),
106
- },
107
- })),
108
- })),
109
- postExamples: preset.postExamples.map((example) =>
110
- replaceCharacterToken(example, name),
111
- ),
112
- };
113
- }
114
-
115
- function buildCharacterDraftFromPreset(
116
- entry: CharacterRosterEntry,
117
- ): CharacterData {
118
- const character = buildCharacterFromPreset(entry.preset, entry.name);
119
- return {
120
- name: character.name ?? "",
121
- username: character.username ?? "",
122
- bio: Array.isArray(character.bio)
123
- ? character.bio.join("\n")
124
- : (character.bio ?? ""),
125
- system: character.system ?? "",
126
- adjectives: character.adjectives ?? [],
127
- style: {
128
- all: character.style?.all ?? [],
129
- chat: character.style?.chat ?? [],
130
- post: character.style?.post ?? [],
131
- },
132
- messageExamples: character.messageExamples ?? [],
133
- postExamples: character.postExamples ?? [],
134
- };
135
- }
136
-
137
- function normalizeCharacterDraftForComparison(
138
- character: CharacterData | null | undefined,
139
- ) {
140
- return {
141
- name: (character?.name ?? "").trim(),
142
- username: (character?.username ?? "").trim(),
143
- bio:
144
- typeof character?.bio === "string"
145
- ? character.bio.trim()
146
- : Array.isArray(character?.bio)
147
- ? character.bio.join("\n").trim()
148
- : "",
149
- system: (character?.system ?? "").trim(),
150
- adjectives: [...(character?.adjectives ?? [])],
151
- style: {
152
- all: [...(character?.style?.all ?? [])],
153
- chat: [...(character?.style?.chat ?? [])],
154
- post: [...(character?.style?.post ?? [])],
155
- },
156
- messageExamples: (character?.messageExamples ?? []).map((conversation) => ({
157
- examples: (conversation.examples ?? []).map((message) => ({
158
- name: message.name,
159
- content: {
160
- text: message.content?.text ?? "",
161
- },
162
- })),
163
- })),
164
- postExamples: [...(character?.postExamples ?? [])],
165
- };
166
- }
167
-
168
- function characterDraftMatchesPreset(
169
- character: CharacterData | null | undefined,
170
- avatarIndex: number,
171
- entry: CharacterRosterEntry,
172
- ) {
173
- if (avatarIndex !== entry.avatarIndex) return false;
174
- const normalizedCurrent = normalizeCharacterDraftForComparison(character);
175
- const normalizedPreset = normalizeCharacterDraftForComparison(
176
- buildCharacterDraftFromPreset(entry),
177
- );
178
- return JSON.stringify(normalizedCurrent) === JSON.stringify(normalizedPreset);
179
- }
180
-
181
-
182
- function findMatchingRosterEntry(
183
- character: CharacterData | null,
184
- avatarIndex: number,
185
- roster: CharacterRosterEntry[],
186
- ) {
187
- if (!character) return null;
188
- const currentName =
189
- typeof character.name === "string" ? character.name.trim() : "";
190
- const exactNameMatch = roster.find((entry) => entry.name === currentName);
191
- if (exactNameMatch) return exactNameMatch.id;
192
-
193
- let bestMatch: { id: string; score: number } | null = null;
194
- for (const entry of roster) {
195
- let score = 0;
196
- if (entry.avatarIndex === avatarIndex) score += 3;
197
-
198
- const draftAdjectives = new Set(character.adjectives ?? []);
199
- for (const adjective of entry.preset.adjectives) {
200
- if (draftAdjectives.has(adjective)) score += 1;
201
- }
202
-
203
- if (
204
- typeof character.system === "string" &&
205
- character.system.includes(entry.preset.catchphrase)
206
- ) {
207
- score += 1;
208
- }
209
-
210
- if (!bestMatch || score > bestMatch.score) {
211
- bestMatch = { id: entry.id, score };
212
- }
213
- }
214
-
215
- return bestMatch && bestMatch.score >= 4 ? bestMatch.id : null;
216
- }
217
-
218
- function findExactRosterEntry(
219
- character: CharacterData | null,
220
- roster: CharacterRosterEntry[],
221
- ) {
222
- if (!character) return null;
223
- const currentName =
224
- typeof character.name === "string" ? character.name.trim() : "";
225
- return roster.find((entry) => entry.name === currentName) ?? null;
226
- }
227
-
228
- function hasCharacterContent(character: CharacterData | null | undefined) {
229
- return Boolean(character && Object.keys(character).length > 0);
230
- }
231
-
232
- function resolveActiveRosterEntry(
233
- character: CharacterData | null | undefined,
234
- avatarIndex: number,
235
- selectedCharacterId: string | null,
236
- roster: CharacterRosterEntry[],
237
- ) {
238
- if (selectedCharacterId) {
239
- const selectedEntry =
240
- roster.find((entry) => entry.id === selectedCharacterId) ?? null;
241
- if (selectedEntry) return selectedEntry;
242
- }
243
-
244
- const exactEntry = findExactRosterEntry(character ?? null, roster);
245
- if (exactEntry) return exactEntry;
246
-
247
- const matchedId = findMatchingRosterEntry(
248
- character ?? null,
249
- avatarIndex,
250
- roster,
251
- );
252
- if (!matchedId) return null;
253
- return roster.find((entry) => entry.id === matchedId) ?? null;
254
- }
255
-
256
- function getStyleEntryRenderKey(
257
- section: StyleSectionKey,
258
- items: string[],
259
- item: string,
260
- index: number,
261
- ) {
262
- let occurrence = 0;
263
- for (const current of items.slice(0, index + 1)) {
264
- if (current === item) occurrence += 1;
265
- }
266
- return `${section}:${item}:${occurrence}`;
267
- }
268
-
269
- /* ── CharacterView ──────────────────────────────────────────────────── */
270
-
271
- export function CharacterView({
272
- inModal,
273
- sceneOverlay = false,
274
- }: {
275
- inModal?: boolean;
276
- sceneOverlay?: boolean;
277
- } = {}) {
278
- const {
279
- tab,
280
- setTab,
281
- characterData,
282
- characterDraft,
283
- characterLoading,
284
- characterSaving,
285
- characterSaveSuccess,
286
- characterSaveError,
287
- handleCharacterFieldInput,
288
- handleCharacterArrayInput,
289
- handleCharacterStyleInput,
290
- handleSaveCharacter,
291
- loadCharacter,
292
- setState,
293
- onboardingOptions,
294
- selectedVrmIndex,
295
- t,
296
- // Registry / Drop
297
- registryStatus,
298
- registryLoading,
299
- registryRegistering,
300
- registryError,
301
- dropStatus,
302
- loadRegistryStatus,
303
- registerOnChain,
304
- syncRegistryProfile,
305
- loadDropStatus,
306
- walletConfig,
307
- } = useApp();
308
-
309
- useEffect(() => {
310
- void loadCharacter();
311
- void loadRegistryStatus();
312
- void loadDropStatus();
313
- }, [loadCharacter, loadRegistryStatus, loadDropStatus]);
314
-
315
- const handleFieldEdit = useCallback(
316
- <K extends keyof CharacterData>(field: K, value: CharacterData[K]) => {
317
- handleCharacterFieldInput(field, value);
318
- },
319
- [handleCharacterFieldInput],
320
- );
321
-
322
- const handleStyleEdit = useCallback(
323
- (key: "all" | "chat" | "post", value: string) => {
324
- handleCharacterStyleInput(key, value);
325
- },
326
- [handleCharacterStyleInput],
327
- );
328
-
329
- /* ── Character generation state ─────────────────────────────────── */
330
- const [generating, setGenerating] = useState<string | null>(null);
331
- const [pendingStyleEntries, setPendingStyleEntries] = useState<
332
- Record<StyleSectionKey, string>
333
- >({
334
- all: "",
335
- chat: "",
336
- post: "",
337
- });
338
- const [styleEntryDrafts, setStyleEntryDrafts] = useState<
339
- Record<StyleSectionKey, string[]>
340
- >({
341
- all: [],
342
- chat: [],
343
- post: [],
344
- });
345
- const [customizeStep, setCustomizeStep] = useState<CustomizeStep>("core");
346
- const [activeSection, setActiveSection] = useState<ActiveSection>("aboutMe");
347
- const [customOverridesEnabled, setCustomOverridesEnabled] = useState(false);
348
- const [selectedCharacterId, setSelectedCharacterId] = useState<string | null>(
349
- null,
350
- );
351
- const [rosterStyles, setRosterStyles] = useState<StylePreset[]>(
352
- onboardingOptions?.styles ?? [],
353
- );
354
-
355
- /* ── Voice config state ─────────────────────────────────────────── */
356
- const [voiceConfig, setVoiceConfig] = useState<VoiceConfig>({});
357
- const [voiceLoading, setVoiceLoading] = useState(false);
358
- const [voiceSaving, setVoiceSaving] = useState(false);
359
- const [voiceSaveError, setVoiceSaveError] = useState<string | null>(null);
360
- const [voiceTesting, setVoiceTesting] = useState(false);
361
- const [voiceTestAudio, setVoiceTestAudio] = useState<HTMLAudioElement | null>(
362
- null,
363
- );
364
- const [selectedVoicePresetId, setSelectedVoicePresetId] = useState<
365
- string | null
366
- >(null);
367
- const [voiceSelectionLocked, setVoiceSelectionLocked] = useState(false);
368
-
369
- useEffect(() => {
370
- if (onboardingOptions?.styles?.length) {
371
- setRosterStyles(onboardingOptions.styles);
372
- return;
373
- }
374
-
375
- let cancelled = false;
376
- void client
377
- .getOnboardingOptions()
378
- .then((options) => {
379
- if (!cancelled) {
380
- setRosterStyles(options.styles ?? []);
381
- }
382
- })
383
- .catch(() => {
384
- /* ignore */
385
- });
386
-
387
- return () => {
388
- cancelled = true;
389
- };
390
- }, [onboardingOptions?.styles]);
391
-
392
- const characterRoster = resolveRosterEntries(rosterStyles);
393
- const visibleCharacterRoster = characterRoster;
394
- const currentCharacter = hasCharacterContent(characterDraft)
395
- ? characterDraft
396
- : characterData;
397
- const activeRosterEntry = resolveActiveRosterEntry(
398
- currentCharacter,
399
- selectedVrmIndex,
400
- selectedCharacterId,
401
- characterRoster,
402
- );
403
- const detailedEditMode = tab === "character";
404
-
405
- /* Load voice config on mount */
406
- useEffect(() => {
407
- void (async () => {
408
- setVoiceLoading(true);
409
- try {
410
- const cfg = await client.getConfig();
411
- const messages = cfg.messages as
412
- | Record<string, Record<string, unknown>>
413
- | undefined;
414
- const tts = messages?.tts as VoiceConfig | undefined;
415
- if (tts) {
416
- setVoiceConfig(tts);
417
- if (tts.elevenlabs?.voiceId) {
418
- const preset = PREMADE_VOICES.find(
419
- (p) => p.voiceId === tts.elevenlabs?.voiceId,
420
- );
421
- setSelectedVoicePresetId(preset?.id ?? null);
422
- }
423
- }
424
- } catch {
425
- /* ignore */
426
- }
427
- setVoiceLoading(false);
428
- })();
429
- }, []);
430
-
431
- const handleSelectPreset = useCallback((preset: VoicePreset) => {
432
- setSelectedVoicePresetId(preset.id);
433
- setVoiceConfig((prev) => ({
434
- ...prev,
435
- elevenlabs: { ...(prev.elevenlabs ?? {}), voiceId: preset.voiceId },
436
- }));
437
- }, []);
438
-
439
- const applyVoicePresetForEntry = useCallback(
440
- (entry: CharacterRosterEntry) => {
441
- setVoiceSaveError(null);
442
- if (!entry.voicePresetId) return;
443
- const voicePreset = PREMADE_VOICES.find(
444
- (preset) => preset.id === entry.voicePresetId,
445
- );
446
- if (voicePreset) handleSelectPreset(voicePreset);
447
- },
448
- [handleSelectPreset],
449
- );
450
-
451
- const applyCharacterDefaults = useCallback(
452
- (entry: CharacterRosterEntry) => {
453
- const nextCharacter = buildCharacterDraftFromPreset(entry);
454
- handleFieldEdit("name", nextCharacter.name ?? "");
455
- handleFieldEdit("username", nextCharacter.username ?? "");
456
- handleFieldEdit("bio", nextCharacter.bio ?? "");
457
- handleFieldEdit("system", nextCharacter.system ?? "");
458
- handleFieldEdit("adjectives", nextCharacter.adjectives ?? []);
459
- handleFieldEdit(
460
- "style",
461
- nextCharacter.style ?? { all: [], chat: [], post: [] },
462
- );
463
- handleFieldEdit("messageExamples", nextCharacter.messageExamples ?? []);
464
- handleFieldEdit("postExamples", nextCharacter.postExamples ?? []);
465
- },
466
- [handleFieldEdit],
467
- );
468
-
469
- const commitCharacterSelection = useCallback(
470
- (entry: CharacterRosterEntry, applyDefaults: boolean) => {
471
- setSelectedCharacterId(entry.id);
472
- setState("selectedVrmIndex", entry.avatarIndex);
473
- if (!voiceSelectionLocked && selectedCharacterId !== entry.id) {
474
- applyVoicePresetForEntry(entry);
475
- }
476
- if (applyDefaults) {
477
- applyCharacterDefaults(entry);
478
- }
479
- },
480
- [
481
- applyCharacterDefaults,
482
- applyVoicePresetForEntry,
483
- selectedCharacterId,
484
- setState,
485
- voiceSelectionLocked,
486
- ],
487
- );
488
-
489
- const handleTestVoice = useCallback(
490
- (previewUrl: string) => {
491
- if (voiceTestAudio) {
492
- voiceTestAudio.pause();
493
- voiceTestAudio.currentTime = 0;
494
- }
495
- setVoiceTesting(true);
496
- const audio = new Audio(previewUrl);
497
- setVoiceTestAudio(audio);
498
- audio.onended = () => setVoiceTesting(false);
499
- audio.onerror = () => setVoiceTesting(false);
500
- audio.play().catch(() => setVoiceTesting(false));
501
- },
502
- [voiceTestAudio],
503
- );
504
-
505
- const handleStopTest = useCallback(() => {
506
- if (voiceTestAudio) {
507
- voiceTestAudio.pause();
508
- voiceTestAudio.currentTime = 0;
509
- }
510
- setVoiceTesting(false);
511
- }, [voiceTestAudio]);
512
-
513
- const persistVoiceConfig = useCallback(async () => {
514
- setVoiceSaveError(null);
515
- const normalizedElevenlabs = {
516
- ...voiceConfig.elevenlabs,
517
- modelId: voiceConfig.elevenlabs?.modelId ?? DEFAULT_ELEVEN_FAST_MODEL,
518
- };
519
- const sanitizedKey = sanitizeApiKey(normalizedElevenlabs?.apiKey);
520
- if (sanitizedKey) normalizedElevenlabs.apiKey = sanitizedKey;
521
- else delete normalizedElevenlabs.apiKey;
522
-
523
- const normalizedVoiceConfig: VoiceConfig = {
524
- ...voiceConfig,
525
- provider: voiceConfig.provider ?? "elevenlabs",
526
- elevenlabs: normalizedElevenlabs,
527
- };
528
-
529
- await client.updateConfig({
530
- messages: {
531
- tts: normalizedVoiceConfig,
532
- },
533
- });
534
- dispatchWindowEvent(VOICE_CONFIG_UPDATED_EVENT, normalizedVoiceConfig);
535
- }, [voiceConfig]);
536
-
537
- const d = characterDraft ?? ({} as Record<string, unknown>);
538
- const bioText =
539
- typeof d.bio === "string"
540
- ? d.bio
541
- : Array.isArray(d.bio)
542
- ? (d.bio as string[]).join("\n")
543
- : "";
544
-
545
- const getCharContext = useCallback(
546
- () => ({
547
- name: d.name ?? "",
548
- system: d.system ?? "",
549
- bio: bioText,
550
- style: d.style ?? { all: [], chat: [], post: [] },
551
- postExamples: d.postExamples ?? [],
552
- }),
553
- [d, bioText],
554
- );
555
-
556
- useEffect(() => {
557
- setStyleEntryDrafts({
558
- all: [...(d.style?.all ?? [])],
559
- chat: [...(d.style?.chat ?? [])],
560
- post: [...(d.style?.post ?? [])],
561
- });
562
- }, [d.style]);
563
-
564
- const handleGenerate = useCallback(
565
- async (field: string, mode: "append" | "replace" = "replace") => {
566
- setGenerating(field);
567
- try {
568
- const { generated } = await client.generateCharacterField(
569
- field,
570
- getCharContext(),
571
- mode,
572
- );
573
- if (field === "bio") {
574
- handleFieldEdit("bio", generated.trim());
575
- } else if (field === "system") {
576
- handleFieldEdit("system", generated.trim());
577
- } else if (field === "style") {
578
- try {
579
- const parsed = JSON.parse(generated);
580
- if (mode === "append") {
581
- handleStyleEdit(
582
- "all",
583
- [...(d.style?.all ?? []), ...(parsed.all ?? [])].join("\n"),
584
- );
585
- handleStyleEdit(
586
- "chat",
587
- [...(d.style?.chat ?? []), ...(parsed.chat ?? [])].join("\n"),
588
- );
589
- handleStyleEdit(
590
- "post",
591
- [...(d.style?.post ?? []), ...(parsed.post ?? [])].join("\n"),
592
- );
593
- } else {
594
- if (parsed.all) handleStyleEdit("all", parsed.all.join("\n"));
595
- if (parsed.chat) handleStyleEdit("chat", parsed.chat.join("\n"));
596
- if (parsed.post) handleStyleEdit("post", parsed.post.join("\n"));
597
- }
598
- } catch {
599
- /* raw text fallback */
600
- }
601
- } else if (field === "chatExamples") {
602
- const formatted = normalizeGeneratedMessageExamples(
603
- generated,
604
- d.name?.trim() || "Agent",
605
- );
606
- if (formatted.length > 0) {
607
- setState("characterSaveError", null);
608
- handleFieldEdit("messageExamples", formatted);
609
- } else {
610
- setState(
611
- "characterSaveError",
612
- "Generated chat examples could not be parsed. Try again.",
613
- );
614
- }
615
- } else if (field === "postExamples") {
616
- try {
617
- const parsed = JSON.parse(generated);
618
- if (Array.isArray(parsed)) {
619
- if (mode === "append") {
620
- handleCharacterArrayInput(
621
- "postExamples",
622
- [...(d.postExamples ?? []), ...parsed].join("\n"),
623
- );
624
- } else {
625
- handleCharacterArrayInput("postExamples", parsed.join("\n"));
626
- }
627
- }
628
- } catch {
629
- /* raw text fallback */
630
- }
631
- }
632
- } catch (err) {
633
- if (field === "chatExamples") {
634
- setState(
635
- "characterSaveError",
636
- err instanceof Error
637
- ? `Failed to generate chat examples: ${err.message}`
638
- : "Failed to generate chat examples.",
639
- );
640
- }
641
- }
642
- setGenerating(null);
643
- },
644
- [
645
- getCharContext,
646
- d,
647
- handleFieldEdit,
648
- handleStyleEdit,
649
- handleCharacterArrayInput,
650
- setState,
651
- ],
652
- );
653
-
654
- const handlePendingStyleEntryChange = useCallback(
655
- (key: StyleSectionKey, value: string) => {
656
- setPendingStyleEntries((prev) => ({ ...prev, [key]: value }));
657
- },
658
- [],
659
- );
660
-
661
- const handleAddStyleEntry = useCallback(
662
- (key: StyleSectionKey) => {
663
- const value = pendingStyleEntries[key].trim();
664
- if (!value) return;
665
-
666
- const nextItems = [...(d.style?.[key] ?? [])];
667
- if (!nextItems.includes(value)) {
668
- nextItems.push(value);
669
- handleStyleEdit(key, nextItems.join("\n"));
670
- }
671
-
672
- setPendingStyleEntries((prev) => ({ ...prev, [key]: "" }));
673
- },
674
- [d.style, handleStyleEdit, pendingStyleEntries],
675
- );
676
-
677
- const handleRemoveStyleEntry = useCallback(
678
- (key: StyleSectionKey, index: number) => {
679
- const nextItems = [...(d.style?.[key] ?? [])];
680
- nextItems.splice(index, 1);
681
- handleStyleEdit(key, nextItems.join("\n"));
682
- },
683
- [d.style, handleStyleEdit],
684
- );
685
-
686
- const handleStyleEntryDraftChange = useCallback(
687
- (key: StyleSectionKey, index: number, value: string) => {
688
- setStyleEntryDrafts((prev) => {
689
- const nextItems = [...(prev[key] ?? [])];
690
- nextItems[index] = value;
691
- return { ...prev, [key]: nextItems };
692
- });
693
- },
694
- [],
695
- );
696
-
697
- const handleCommitStyleEntry = useCallback(
698
- (key: StyleSectionKey, index: number) => {
699
- const nextValue = styleEntryDrafts[key]?.[index]?.trim() ?? "";
700
- const nextItems = [...(d.style?.[key] ?? [])];
701
-
702
- if (!nextValue) {
703
- nextItems.splice(index, 1);
704
- } else {
705
- nextItems[index] = nextValue;
706
- }
707
-
708
- handleStyleEdit(key, nextItems.join("\n"));
709
- },
710
- [d.style, handleStyleEdit, styleEntryDrafts],
711
- );
712
-
713
- const handleSelectCharacter = useCallback(
714
- (entry: CharacterRosterEntry) => {
715
- const shouldApplyDefaults =
716
- !customOverridesEnabled &&
717
- (!currentCharacter ||
718
- !activeRosterEntry ||
719
- characterDraftMatchesPreset(
720
- currentCharacter,
721
- selectedVrmIndex,
722
- activeRosterEntry,
723
- ));
724
- commitCharacterSelection(entry, shouldApplyDefaults);
725
- },
726
- [
727
- activeRosterEntry,
728
- commitCharacterSelection,
729
- currentCharacter,
730
- customOverridesEnabled,
731
- selectedVrmIndex,
732
- ],
733
- );
734
-
735
- const handleCustomOverridesChange = useCallback(
736
- (enabled: boolean) => {
737
- setTab(enabled ? "character" : "character-select");
738
- setCustomOverridesEnabled(enabled);
739
- setCustomizeStep("core");
740
- if (enabled) return;
741
-
742
- const activeEntry = resolveActiveRosterEntry(
743
- currentCharacter,
744
- selectedVrmIndex,
745
- selectedCharacterId,
746
- characterRoster,
747
- );
748
- if (activeEntry) {
749
- setSelectedCharacterId(activeEntry.id);
750
- }
751
- },
752
- [
753
- characterRoster,
754
- currentCharacter,
755
- selectedCharacterId,
756
- selectedVrmIndex,
757
- setTab,
758
- ],
759
- );
760
-
761
- useEffect(() => {
762
- setCustomOverridesEnabled(detailedEditMode);
763
- if (detailedEditMode) {
764
- setCustomizeStep("core");
765
- }
766
- }, [detailedEditMode]);
767
-
768
- useEffect(() => {
769
- if (
770
- characterLoading ||
771
- selectedCharacterId ||
772
- !characterRoster.length ||
773
- !currentCharacter
774
- ) {
775
- return;
776
- }
777
-
778
- const activeEntry =
779
- resolveActiveRosterEntry(
780
- currentCharacter,
781
- selectedVrmIndex,
782
- selectedCharacterId,
783
- characterRoster,
784
- ) ??
785
- characterRoster[0] ??
786
- null;
787
- if (!activeEntry) return;
788
- const matchesFactory = characterDraftMatchesPreset(
789
- currentCharacter,
790
- selectedVrmIndex,
791
- activeEntry,
792
- );
793
- setSelectedCharacterId(activeEntry.id);
794
- setCustomOverridesEnabled(detailedEditMode);
795
- if (matchesFactory) {
796
- commitCharacterSelection(activeEntry, true);
797
- }
798
- }, [
799
- characterLoading,
800
- characterRoster,
801
- commitCharacterSelection,
802
- currentCharacter,
803
- detailedEditMode,
804
- selectedCharacterId,
805
- selectedVrmIndex,
806
- ]);
807
-
808
- const handleSaveAll = useCallback(async () => {
809
- const trimmedName =
810
- typeof characterDraft?.name === "string" ? characterDraft.name.trim() : "";
811
- if (!trimmedName) {
812
- setVoiceSaveError(null);
813
- setState("characterSaveSuccess", null);
814
- setState("characterSaveError", "Character name is required before saving.");
815
- return;
816
- }
817
-
818
- setVoiceSaveError(null);
819
- try {
820
- await handleSaveCharacter();
821
- } catch {
822
- return;
823
- }
824
-
825
- setVoiceSaving(true);
826
- let voiceSaveFailed = false;
827
- try {
828
- await persistVoiceConfig();
829
- } catch (err) {
830
- voiceSaveFailed = true;
831
- setVoiceSaveError(
832
- err instanceof Error ? err.message : "Failed to save voice settings.",
833
- );
834
- } finally {
835
- setVoiceSaving(false);
836
- }
837
- if (!voiceSaveFailed) {
838
- setTab(COMPANION_ENABLED ? "companion" : "chat");
839
- }
840
- }, [
841
- characterDraft?.name,
842
- handleSaveCharacter,
843
- persistVoiceConfig,
844
- setState,
845
- setTab,
846
- ]);
847
-
848
- /* ── Helpers ────────────────────────────────────────────────────── */
849
- const cardCls = sceneOverlay
850
- ? "p-5 border border-white/10 bg-black/15 backdrop-blur-md rounded-2xl shadow-[0_18px_48px_rgba(0,0,0,0.28)]"
851
- : "p-5 border border-border/40 bg-card/40 backdrop-blur-xl rounded-2xl shadow-sm";
852
- const sectionCls =
853
- sceneOverlay && !inModal ? "relative z-10 mt-4 px-1" : `mt-4 ${cardCls}`;
854
- const scrollPaneCls =
855
- "min-h-0 overflow-y-auto pr-1 [scrollbar-gutter:stable] custom-scrollbar";
856
-
857
- const SIDEBAR_TABS: { key: ActiveSection; icon: typeof FileText; labelKey: string }[] = [
858
- { key: "aboutMe", icon: FileText, labelKey: "characterview.aboutMe" },
859
- { key: "directions", icon: BookOpen, labelKey: "characterview.directionsAndThing" },
860
- { key: "styleRules", icon: Palette, labelKey: "characterview.StyleRules" },
861
- ];
862
-
863
- const bookPageCls = sceneOverlay
864
- ? "relative overflow-hidden bg-[linear-gradient(180deg,rgba(255,251,242,0.98)_0%,rgba(243,233,214,0.96)_100%)] backdrop-blur-md dark:bg-[linear-gradient(180deg,rgba(46,43,38,0.98)_0%,rgba(31,28,25,0.96)_100%)]"
865
- : "relative overflow-hidden bg-[linear-gradient(180deg,#fffaf1_0%,#f4ead7_100%)] dark:bg-[linear-gradient(180deg,hsl(35,14%,18%)_0%,hsl(35,10%,13%)_100%)]";
866
- const bookSidebarCls =
867
- "relative overflow-hidden bg-[linear-gradient(180deg,#333842_0%,#23272f_42%,#191c22_100%)] dark:bg-[linear-gradient(180deg,hsl(220,14%,15%)_0%,hsl(220,16%,10%)_42%,hsl(220,20%,7%)_100%)]";
868
- const notebookShellCls =
869
- "relative isolate flex h-[34.75rem] w-full max-w-[29rem] overflow-visible";
870
- const notebookFrameCls = sceneOverlay
871
- ? "relative flex h-full w-full overflow-hidden rounded-[1.75rem] border border-[#2f261b]/20 bg-[#f8f0df]/70 dark:border-white/10 dark:bg-[#1c1c1e]/90 shadow-[0_24px_60px_rgba(0,0,0,0.34),inset_0_1px_0_rgba(255,255,255,0.5)]"
872
- : "relative flex h-full w-full overflow-hidden rounded-[1.75rem] border border-[#2f261b]/14 bg-[#f8f0df] dark:border-white/10 dark:bg-[#1c1c1e] shadow-[0_26px_60px_rgba(36,28,18,0.2),inset_0_1px_0_rgba(255,255,255,0.58)]";
873
-
874
- const handleCustomVrmUpload = useCallback(
875
- (file: File) => {
876
- const url = URL.createObjectURL(file);
877
- setState("customVrmUrl", url);
878
- setState("selectedVrmIndex", 0);
879
- },
880
- [setState],
881
- );
882
-
883
- if (characterLoading && !characterData) {
884
- return (
885
- <div className={sectionCls}>
886
- <div className="text-center py-6 text-[var(--muted)] text-[13px]">
887
- {t("characterview.loadingCharacterDa")}
888
- </div>
889
- </div>
890
- );
891
- }
892
-
893
- const hasWallet = Boolean(walletConfig?.evmAddress);
894
- const isRegistered = registryStatus?.registered === true;
895
- const dropLive =
896
- dropStatus?.dropEnabled &&
897
- dropStatus?.publicMintOpen &&
898
- !dropStatus?.mintedOut;
899
- const userMinted = dropStatus?.userHasMinted === true;
900
- const activeVoicePreset =
901
- PREMADE_VOICES.find((preset) => preset.id === selectedVoicePresetId) ??
902
- null;
903
- const voiceSelectValue = selectedVoicePresetId ?? null;
904
- const combinedSaveError = characterSaveError;
905
- const saveAdvisory =
906
- characterSaveSuccess && voiceSaveError
907
- ? `Character saved. Voice settings still need attention: ${voiceSaveError}`
908
- : null;
909
- const customizationActionLabel = customOverridesEnabled
910
- ? t("characterview.backToCharacterSelect")
911
- : t("characterview.customize");
912
- const rootCls =
913
- sceneOverlay && !inModal
914
- ? "relative z-10 flex min-h-full flex-col justify-end pb-4"
915
- : `${inModal || sceneOverlay ? "pb-8" : ""} ${sceneOverlay ? "relative z-10" : ""
916
- }`;
917
-
918
- return (
919
- <div className={rootCls}>
920
- {/* ═══ ON-CHAIN IDENTITY ═══ */}
921
- {hasWallet && (
922
- <div className={sectionCls}>
923
- {!isRegistered && !dropLive && (
924
- <div className="flex flex-col gap-3">
925
- <div className="text-[12px] text-[var(--muted)]">
926
- {t("characterview.RegisterYourAgent")}
927
- </div>
928
- <div className="flex items-center gap-2">
929
- <button
930
- type="button"
931
- className="btn text-xs py-[5px] px-4 !mt-0 cursor-pointer"
932
- disabled={registryRegistering || registryLoading}
933
- onClick={() => void registerOnChain()}
934
- >
935
- {registryRegistering ? "registering..." : "register now"}
936
- </button>
937
- {registryError && (
938
- <span className="text-xs text-[var(--danger,#e74c3c)]">
939
- {registryError}
940
- </span>
941
- )}
942
- </div>
943
- </div>
944
- )}
945
- </div>
946
- )}
947
-
948
- {isRegistered &&
949
- (() => {
950
- const currentName = characterDraft?.name || d.name || "";
951
- const onChainName = registryStatus.agentName || "";
952
- const nameOutOfSync =
953
- currentName && onChainName && currentName !== onChainName;
954
- return (
955
- <div className={sectionCls}>
956
- <div className="flex flex-col gap-2">
957
- <div className="flex items-center gap-2 text-[12px]">
958
- <span className="text-green-400 font-bold tracking-wide">
959
- {t("characterview.Registered")}
960
- </span>
961
- <span className="text-muted/50">|</span>
962
- <span className="text-muted font-medium">
963
- {t("characterview.Token")}
964
- {registryStatus.tokenId}
965
- </span>
966
- <span className="text-muted/50">|</span>
967
- <span className="text-txt font-semibold">{onChainName}</span>
968
- </div>
969
- {nameOutOfSync && (
970
- <div className="flex items-center gap-3 bg-amber-400/10 border border-amber-400/20 px-3 py-2 rounded-lg">
971
- <span className="text-[11px] text-amber-400/80 font-medium tracking-wide">
972
- {t("characterview.OnChainName")}{" "}
973
- <strong className="text-amber-400">{onChainName}</strong>{" "}
974
- {t("characterview.DiffersFrom")}{" "}
975
- <strong className="text-amber-400">{currentName}"</strong>
976
- </span>
977
- <Button
978
- variant="outline"
979
- size="sm"
980
- className="text-[10px] h-6 px-2.5 border-amber-400/50 text-amber-400 hover:bg-amber-400/20 transition-all font-bold"
981
- disabled={registryRegistering}
982
- onClick={() => void syncRegistryProfile()}
983
- >
984
- {registryRegistering ? "syncing..." : "sync to chain"}
985
- </Button>
986
- </div>
987
- )}
988
- {registryError && (
989
- <span className="text-xs text-[var(--danger,#e74c3c)]">
990
- {registryError}
991
- </span>
992
- )}
993
- <a
994
- href={`https://etherscan.io/token/${registryStatus.walletAddress}`}
995
- target="_blank"
996
- rel="noopener noreferrer"
997
- className="text-[11px] underline text-[var(--accent)]"
998
- >
999
- {t("characterview.viewOnEtherscan")}
1000
- </a>
1001
- </div>
1002
- </div>
1003
- );
1004
- })()}
1005
-
1006
- {hasWallet && userMinted && !isRegistered && (
1007
- <div className={sectionCls}>
1008
- <div className="text-[12px] text-[var(--ok,#16a34a)]">
1009
- {t("characterview.MintedFromCollecti")}
1010
- </div>
1011
- </div>
1012
- )}
1013
-
1014
- {!customOverridesEnabled ? (
1015
- <CharacterRoster
1016
- entries={visibleCharacterRoster}
1017
- selectedId={selectedCharacterId}
1018
- onSelect={handleSelectCharacter}
1019
- variant={sceneOverlay ? "onboarding" : "editor"}
1020
- testIdPrefix="character"
1021
- />
1022
- ) : null}
1023
-
1024
- {customOverridesEnabled && (
1025
- <div className="mt-3 flex justify-end">
1026
- {/* ── Book container ── */}
1027
- <div
1028
- className={notebookShellCls}
1029
- data-testid="character-notebook"
1030
- >
1031
- <div className="pointer-events-none absolute inset-x-5 bottom-[-1.2rem] top-6 rounded-[1.9rem] bg-[linear-gradient(180deg,rgba(35,27,18,0.12)_0%,rgba(16,12,9,0.32)_100%)] dark:bg-[linear-gradient(180deg,rgba(0,0,0,0.3)_0%,rgba(0,0,0,0.5)_100%)] blur-xl" />
1032
- <div className="pointer-events-none absolute inset-[0.35rem] translate-x-2 translate-y-2 rounded-[1.9rem] border border-[#d7c5a4]/50 bg-[linear-gradient(180deg,rgba(251,246,235,0.86)_0%,rgba(236,224,198,0.7)_100%)] dark:border-white/10 dark:bg-[linear-gradient(180deg,rgba(38,38,40,0.9)_0%,rgba(28,28,30,0.8)_100%)] shadow-[0_12px_26px_rgba(62,44,21,0.12)]" />
1033
- <div className="pointer-events-none absolute bottom-[-0.95rem] left-8 h-14 w-4 rounded-b-sm bg-[linear-gradient(180deg,#ddb45e_0%,#be8530_100%)] [clip-path:polygon(0_0,100%_0,100%_78%,50%_100%,0_78%)] shadow-[0_10px_20px_rgba(141,97,34,0.28)]" />
1034
- <div className={notebookFrameCls}>
1035
- <div className="pointer-events-none absolute left-4 top-4 h-2 w-2 rounded-full border border-[#d8c295]/70 bg-[#fff9eb]/85 shadow-[0_0_0_2px_rgba(150,116,61,0.08)] dark:border-white/20 dark:bg-white/10 dark:shadow-[0_0_0_2px_rgba(255,255,255,0.05)]" />
1036
- <div className="pointer-events-none absolute bottom-4 left-4 h-2 w-2 rounded-full border border-[#d8c295]/70 bg-[#fff9eb]/85 shadow-[0_0_0_2px_rgba(150,116,61,0.08)] dark:border-white/20 dark:bg-white/10 dark:shadow-[0_0_0_2px_rgba(255,255,255,0.05)]" />
1037
- <div className="pointer-events-none absolute right-4 top-4 h-2 w-2 rounded-full border border-white/10 bg-white/10 shadow-[0_0_0_2px_rgba(255,255,255,0.03)]" />
1038
- <div className="pointer-events-none absolute bottom-4 right-4 h-2 w-2 rounded-full border border-white/10 bg-white/10 shadow-[0_0_0_2px_rgba(255,255,255,0.03)]" />
1039
- <div className="pointer-events-none absolute inset-x-0 bottom-0 h-14 bg-[linear-gradient(180deg,rgba(0,0,0,0)_0%,rgba(104,77,39,0.07)_100%)] dark:bg-[linear-gradient(180deg,rgba(0,0,0,0)_0%,rgba(0,0,0,0.15)_100%)]" />
1040
- <div className="pointer-events-none absolute bottom-3 right-[4.95rem] top-3 w-[0.7rem] rounded-full bg-[linear-gradient(90deg,rgba(116,92,55,0.16)_0%,rgba(255,255,255,0.5)_45%,rgba(112,88,52,0.2)_100%)] shadow-[inset_0_0_7px_rgba(89,67,37,0.16),0_0_18px_rgba(255,246,220,0.16)] dark:bg-[linear-gradient(90deg,rgba(255,255,255,0.05)_0%,rgba(255,255,255,0.15)_45%,rgba(255,255,255,0.05)_100%)] dark:shadow-[inset_0_0_7px_rgba(0,0,0,0.3),0_0_18px_rgba(255,255,255,0.05)]" />
1041
- {/* ── Book page (left) ── */}
1042
- <div
1043
- className={`${bookPageCls} flex flex-1 flex-col rounded-l-[1.75rem] border-r border-[#cdbb98]/60 text-[#1e2329] dark:border-white/[0.08] dark:text-[hsl(40,10%,84%)]`}
1044
- >
1045
- <div className="pointer-events-none absolute inset-[0.7rem] rounded-[1.25rem] border border-[#efe3cc]/85 shadow-[inset_0_0_0_1px_rgba(207,184,141,0.24)] dark:border-white/5 dark:shadow-[inset_0_0_0_1px_rgba(255,255,255,0.03)]" />
1046
- <div className="pointer-events-none absolute inset-0 bg-[radial-gradient(circle_at_top_left,rgba(255,255,255,0.72)_0%,rgba(255,255,255,0)_36%),linear-gradient(180deg,rgba(255,255,255,0.14)_0%,rgba(255,255,255,0)_24%),repeating-linear-gradient(0deg,rgba(168,139,87,0.035)_0px,rgba(168,139,87,0.035)_1px,transparent_1px,transparent_11px)] opacity-85 dark:opacity-25" />
1047
- <div className="pointer-events-none absolute bottom-0 right-0 top-0 w-5 bg-[linear-gradient(90deg,rgba(123,98,61,0)_0%,rgba(123,98,61,0.08)_55%,rgba(255,255,255,0.14)_100%)] dark:bg-[linear-gradient(90deg,rgba(255,255,255,0)_0%,rgba(255,255,255,0.03)_60%,rgba(255,255,255,0.08)_100%)]" />
1048
- {/* Mode toggle: Core / Examples */}
1049
- <div className="relative z-10 flex items-end gap-2 bg-[linear-gradient(180deg,rgba(255,255,255,0.26)_0%,rgba(255,255,255,0)_100%)] px-5 pb-3 pt-4 dark:bg-[linear-gradient(180deg,rgba(255,255,255,0.06)_0%,rgba(255,255,255,0)_100%)]">
1050
- <button
1051
- type="button"
1052
- className={`relative h-9 rounded-b-md rounded-t-[1rem] border px-3.5 text-[10px] font-bold uppercase tracking-[0.18em] transition-all ${customizeStep === "core"
1053
- ? "border-[#c59b47] bg-[linear-gradient(180deg,#f4cf79_0%,#d69f45_100%)] text-[#2d2418] shadow-[0_10px_18px_rgba(137,97,36,0.22)]"
1054
- : "border-[#d4c6ad]/90 bg-[linear-gradient(180deg,rgba(255,252,245,0.96)_0%,rgba(243,235,222,0.82)_100%)] text-[#7b7365] shadow-[inset_0_1px_0_rgba(255,255,255,0.75)] hover:bg-[linear-gradient(180deg,rgba(255,255,255,0.98)_0%,rgba(248,240,226,0.9)_100%)] dark:border-white/10 dark:bg-[linear-gradient(180deg,rgba(255,255,255,0.1)_0%,rgba(255,255,255,0.04)_100%)] dark:text-muted dark:shadow-none dark:hover:bg-[linear-gradient(180deg,rgba(255,255,255,0.14)_0%,rgba(255,255,255,0.05)_100%)]"
1055
- }`}
1056
- onClick={() => setCustomizeStep("core")}
1057
- >
1058
- {t("characterview.core")}
1059
- </button>
1060
- {activeSection !== "styleRules" && (
1061
- <button
1062
- type="button"
1063
- className={`relative h-9 rounded-b-md rounded-t-[1rem] border px-3.5 text-[10px] font-bold uppercase tracking-[0.18em] transition-all ${customizeStep === "examples"
1064
- ? "border-[#c59b47] bg-[linear-gradient(180deg,#f4cf79_0%,#d69f45_100%)] text-[#2d2418] shadow-[0_10px_18px_rgba(137,97,36,0.22)]"
1065
- : "border-[#d4c6ad]/90 bg-[linear-gradient(180deg,rgba(255,252,245,0.96)_0%,rgba(243,235,222,0.82)_100%)] text-[#7b7365] shadow-[inset_0_1px_0_rgba(255,255,255,0.75)] hover:bg-[linear-gradient(180deg,rgba(255,255,255,0.98)_0%,rgba(248,240,226,0.9)_100%)] dark:border-white/10 dark:bg-[linear-gradient(180deg,rgba(255,255,255,0.1)_0%,rgba(255,255,255,0.04)_100%)] dark:text-muted dark:shadow-none dark:hover:bg-[linear-gradient(180deg,rgba(255,255,255,0.14)_0%,rgba(255,255,255,0.05)_100%)]"
1066
- }`}
1067
- onClick={() => setCustomizeStep("examples")}
1068
- >
1069
- {t("characterview.examples")}
1070
- </button>
1071
- )}
1072
- <div className="pointer-events-none absolute inset-x-4 bottom-0 h-px bg-[linear-gradient(90deg,rgba(209,193,165,0)_0%,rgba(209,193,165,0.92)_10%,rgba(209,193,165,0.92)_90%,rgba(209,193,165,0)_100%)] dark:bg-[linear-gradient(90deg,rgba(255,255,255,0)_0%,rgba(255,255,255,0.08)_10%,rgba(255,255,255,0.08)_90%,rgba(255,255,255,0)_100%)]" />
1073
- </div>
1074
-
1075
- {/* Content area */}
1076
- <div className="relative z-10 flex flex-1 flex-col overflow-y-auto p-5 custom-scrollbar" role="tabpanel" aria-labelledby={`notebook-tab-${activeSection}`}>
1077
- {/* ── About Me (Core) ── */}
1078
- {activeSection === "aboutMe" && customizeStep === "core" && (
1079
- <div className="flex flex-1 flex-col gap-3" data-testid="character-core-editor">
1080
- {/* Name */}
1081
- <div className="flex flex-col gap-1.5">
1082
- <span className="text-xs font-medium text-[#6d737a] dark:text-muted">Name</span>
1083
- <Input
1084
- type="text"
1085
- value={d.name ?? ""}
1086
- placeholder="Agent name"
1087
- onChange={(e) => handleFieldEdit("name", e.target.value)}
1088
- className="h-8 rounded-lg border-[#d6d3c6] dark:border-border/40 bg-white/60 dark:bg-white/5 text-sm text-[#1e2329] dark:text-[hsl(40,10%,84%)] focus-visible:border-accent focus-visible:ring-accent/50"
1089
- />
1090
- </div>
1091
-
1092
- {/* Avatar */}
1093
- <div className="flex flex-col gap-1.5">
1094
- <span className="text-xs font-medium text-[#6d737a] dark:text-muted">Avatar</span>
1095
- <AvatarSelector
1096
- selected={selectedVrmIndex}
1097
- onSelect={(index: number) => setState("selectedVrmIndex", index)}
1098
- onUpload={handleCustomVrmUpload}
1099
- showUpload={true}
1100
- fullWidth={true}
1101
- />
1102
- </div>
1103
-
1104
- <div className="flex items-center justify-between">
1105
- <span className="text-xs font-medium text-[#6d737a] dark:text-muted">{t("characterview.aboutMe")}</span>
1106
- <Button
1107
- variant="ghost"
1108
- size="sm"
1109
- className="h-6 rounded-md px-2 text-[10px] font-bold text-accent"
1110
- onClick={() => void handleGenerate("bio")}
1111
- disabled={generating === "bio"}
1112
- >
1113
- {generating === "bio" ? "generating..." : "regenerate"}
1114
- </Button>
1115
- </div>
1116
- <Textarea
1117
- value={bioText}
1118
- placeholder={t("characterview.describeWhoYourAg")}
1119
- onChange={(e) => handleFieldEdit("bio", e.target.value)}
1120
- className="flex-1 resize-none overflow-y-auto rounded-lg border-[#d6d3c6] dark:border-border/40 bg-white/60 dark:bg-white/5 p-3 font-mono text-xs leading-relaxed text-[#1e2329] dark:text-[hsl(40,10%,84%)] focus-visible:border-accent focus-visible:ring-accent/50"
1121
- />
1122
- </div>
1123
- )}
1124
-
1125
- {/* ── Directions (Core) ── */}
1126
- {activeSection === "directions" && customizeStep === "core" && (
1127
- <div className="flex flex-1 flex-col gap-3">
1128
- <div className="flex items-center justify-between">
1129
- <span className="text-xs font-medium text-[#6d737a] dark:text-muted">{t("characterview.directionsAndThing")}</span>
1130
- <Button
1131
- variant="ghost"
1132
- size="sm"
1133
- className="h-6 rounded-md px-2 text-[10px] font-bold text-accent"
1134
- onClick={() => void handleGenerate("system")}
1135
- disabled={generating === "system"}
1136
- >
1137
- {generating === "system" ? "generating..." : "regenerate"}
1138
- </Button>
1139
- </div>
1140
- <Textarea
1141
- value={d.system ?? ""}
1142
- maxLength={10000}
1143
- placeholder={t("characterview.writeInFirstPerso")}
1144
- onChange={(e) => handleFieldEdit("system", e.target.value)}
1145
- className="flex-1 resize-none overflow-y-auto rounded-lg border-[#d6d3c6] dark:border-border/40 bg-white/60 dark:bg-white/5 p-3 font-mono text-xs leading-relaxed text-[#1e2329] dark:text-[hsl(40,10%,84%)] focus-visible:border-accent focus-visible:ring-accent/50"
1146
- />
1147
- </div>
1148
- )}
1149
-
1150
- {/* ── Style Rules (Core) ── */}
1151
- {activeSection === "styleRules" && customizeStep === "core" && (
1152
- <div className="flex flex-col gap-3" data-testid="character-style-editor">
1153
- <div className="flex items-center justify-between">
1154
- <span className="text-xs font-medium text-[#6d737a] dark:text-muted">{t("characterview.StyleRules")}</span>
1155
- <Button
1156
- variant="ghost"
1157
- size="sm"
1158
- className="h-6 rounded-md px-2 text-[10px] font-bold text-accent"
1159
- onClick={() => void handleGenerate("style", "replace")}
1160
- disabled={generating === "style"}
1161
- >
1162
- {generating === "style" ? "generating..." : "regenerate"}
1163
- </Button>
1164
- </div>
1165
- {STYLE_SECTION_KEYS.map((key) => {
1166
- const items = d.style?.[key] ?? [];
1167
- return (
1168
- <div
1169
- key={key}
1170
- className="flex flex-col gap-1.5"
1171
- data-testid={`style-section-${key}`}
1172
- >
1173
- <div className="flex items-center gap-2 border-b border-[#d6d3c6]/60 dark:border-border/30 pb-1">
1174
- <span className="text-[10px] font-bold uppercase tracking-widest text-[#6d737a] dark:text-muted">{key}</span>
1175
- <span className="text-[9px] font-medium uppercase tracking-wider text-[#9ca3af] dark:text-muted/60">
1176
- {items.length} rule{items.length === 1 ? "" : "s"}
1177
- </span>
1178
- </div>
1179
- <div className={`${scrollPaneCls} max-h-[12rem]`}>
1180
- <div className="flex flex-col gap-1">
1181
- {items.length > 0 ? (
1182
- items.map((item, index) => (
1183
- <div
1184
- key={getStyleEntryRenderKey(key, items, item, index)}
1185
- className="group flex items-start gap-2 rounded-md border border-[#d6d3c6]/40 dark:border-border/20 bg-white/50 dark:bg-white/3 px-2.5 py-2"
1186
- data-testid={`style-entry-${key}-${index}`}
1187
- >
1188
- <span className="mt-0.5 shrink-0 text-[10px] font-bold text-accent">
1189
- {index + 1}
1190
- </span>
1191
- <Textarea
1192
- value={styleEntryDrafts[key]?.[index] ?? item}
1193
- rows={1}
1194
- onChange={(e) => handleStyleEntryDraftChange(key, index, e.target.value)}
1195
- onBlur={() => handleCommitStyleEntry(key, index)}
1196
- className="min-h-[2rem] min-w-0 flex-1 resize-none rounded border-0 bg-transparent p-0 font-mono text-xs leading-relaxed text-[#1e2329] dark:text-[hsl(40,10%,84%)] focus-visible:ring-0"
1197
- data-testid={`style-entry-editor-${key}-${index}`}
1198
- />
1199
- <button
1200
- type="button"
1201
- className="mt-0.5 shrink-0 text-[#9ca3af] opacity-0 transition-opacity group-hover:opacity-100 hover:text-red-500"
1202
- onClick={() => handleRemoveStyleEntry(key, index)}
1203
- title={t("characterview.remove")}
1204
- >
1205
- <svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"><path d="M2 2l6 6M8 2l-6 6" /></svg>
1206
- </button>
1207
- </div>
1208
- ))
1209
- ) : (
1210
- <div className="rounded-md border border-dashed border-[#d6d3c6]/60 dark:border-border/30 px-3 py-2 text-[11px] text-[#9ca3af] dark:text-muted">
1211
- {STYLE_SECTION_EMPTY_STATES[key]}
1212
- </div>
1213
- )}
1214
- </div>
1215
- </div>
1216
- <div className="flex items-center gap-2">
1217
- <Input
1218
- type="text"
1219
- value={pendingStyleEntries[key]}
1220
- placeholder={STYLE_SECTION_PLACEHOLDERS[key]}
1221
- onChange={(e) => handlePendingStyleEntryChange(key, e.target.value)}
1222
- onKeyDown={(e) => {
1223
- if (e.key === "Enter") {
1224
- e.preventDefault();
1225
- handleAddStyleEntry(key);
1226
- }
1227
- }}
1228
- className="h-7 min-w-0 flex-1 rounded-md border-[#d6d3c6]/60 dark:border-border/30 bg-white/50 dark:bg-white/5 text-xs text-[#1e2329] dark:text-[hsl(40,10%,84%)] focus-visible:border-accent focus-visible:ring-accent/50"
1229
- data-testid={`style-entry-input-${key}`}
1230
- />
1231
- <Button
1232
- variant="ghost"
1233
- size="sm"
1234
- className="h-7 shrink-0 rounded-md px-2 text-[10px] font-bold text-accent"
1235
- onClick={() => handleAddStyleEntry(key)}
1236
- disabled={!pendingStyleEntries[key].trim()}
1237
- >
1238
- + add
1239
- </Button>
1240
- </div>
1241
- </div>
1242
- );
1243
- })}
1244
- </div>
1245
- )}
1246
-
1247
- {/* ── Chat Examples (About Me + Examples mode) ── */}
1248
- {activeSection === "aboutMe" && customizeStep === "examples" && (
1249
- <div className="flex flex-col gap-2" data-testid="character-chat-examples-card">
1250
- <div className="flex items-center justify-between">
1251
- <span className="text-xs font-medium text-[#6d737a] dark:text-muted">{t("characterview.chatExamples")}</span>
1252
- <Button
1253
- variant="ghost"
1254
- size="sm"
1255
- className="h-6 rounded-md px-2 text-[10px] font-bold text-accent"
1256
- onClick={() => void handleGenerate("chatExamples", "replace")}
1257
- disabled={generating === "chatExamples"}
1258
- >
1259
- {generating === "chatExamples" ? "generating..." : "generate"}
1260
- </Button>
1261
- </div>
1262
- <div className={`${scrollPaneCls} flex flex-col gap-2`}>
1263
- {(d.messageExamples ?? []).map((convo, ci) => (
1264
- <div
1265
- key={convo.examples.map((msg) => `${msg.name}:${msg.content?.text ?? ""}`).join("|")}
1266
- className="rounded-lg border border-[#d6d3c6]/40 dark:border-border/30 p-2.5"
1267
- >
1268
- <div className="mb-2 flex items-center justify-between">
1269
- <span className="text-[9px] font-bold uppercase tracking-widest text-[#9ca3af] dark:text-muted/60">
1270
- {t("characterview.conversation")} {ci + 1}
1271
- </span>
1272
- <button
1273
- type="button"
1274
- className="text-[#9ca3af] hover:text-red-500 transition-colors"
1275
- onClick={() => {
1276
- const updated = [...(d.messageExamples ?? [])];
1277
- updated.splice(ci, 1);
1278
- handleFieldEdit("messageExamples", updated);
1279
- }}
1280
- >
1281
- <svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"><path d="M2 2l6 6M8 2l-6 6" /></svg>
1282
- </button>
1283
- </div>
1284
- <div className="flex flex-col gap-1.5">
1285
- {convo.examples.map((msg, mi) => (
1286
- <div key={`${msg.name}:${msg.content?.text ?? ""}`} className="flex items-center gap-2">
1287
- <span className={`w-10 shrink-0 text-right text-[9px] font-bold uppercase tracking-wider ${msg.name === "{{user1}}" ? "text-[#9ca3af] dark:text-muted" : "text-accent"}`}>
1288
- {msg.name === "{{user1}}" ? "user" : "agent"}
1289
- </span>
1290
- <input
1291
- type="text"
1292
- value={msg.content?.text ?? ""}
1293
- onChange={(e) => {
1294
- const updated = [...(d.messageExamples ?? [])];
1295
- const convoClone = { examples: [...updated[ci].examples] };
1296
- convoClone.examples[mi] = { ...convoClone.examples[mi], content: { text: e.target.value } };
1297
- updated[ci] = convoClone;
1298
- handleFieldEdit("messageExamples", updated);
1299
- }}
1300
- className="h-7 flex-1 rounded-md border border-[#d6d3c6]/40 dark:border-border/30 bg-white/60 dark:bg-white/5 px-2 font-mono text-[11px] text-[#1e2329] dark:text-[hsl(40,10%,84%)] outline-none focus:border-accent"
1301
- />
1302
- </div>
1303
- ))}
1304
- </div>
1305
- </div>
1306
- ))}
1307
- {(d.messageExamples ?? []).length === 0 && (
1308
- <div className="rounded-md border border-dashed border-[#d6d3c6]/60 dark:border-border/30 py-2 text-center text-[11px] text-[#9ca3af] dark:text-muted">
1309
- {t("characterview.noChatExamplesYet")}
1310
- </div>
1311
- )}
1312
- </div>
1313
- </div>
1314
- )}
1315
-
1316
- {/* ── Post Examples (Directions + Examples mode) ── */}
1317
- {activeSection === "directions" && customizeStep === "examples" && (
1318
- <div className="flex flex-col gap-2" data-testid="character-post-examples-card">
1319
- <div className="flex items-center justify-between">
1320
- <span className="text-xs font-medium text-[#6d737a] dark:text-muted">{t("characterview.postExamples")}</span>
1321
- <Button
1322
- variant="ghost"
1323
- size="sm"
1324
- className="h-6 rounded-md px-2 text-[10px] font-bold text-accent"
1325
- onClick={() => void handleGenerate("postExamples", "replace")}
1326
- disabled={generating === "postExamples"}
1327
- >
1328
- {generating === "postExamples" ? "generating..." : "generate"}
1329
- </Button>
1330
- </div>
1331
- <div className={`${scrollPaneCls} flex flex-col gap-1.5`}>
1332
- {(d.postExamples ?? []).map((post: string, pi: number) => (
1333
- <div key={post || `post-${pi}`} className="group flex items-center gap-1.5">
1334
- <input
1335
- type="text"
1336
- value={post}
1337
- onChange={(e) => {
1338
- const updated = [...(d.postExamples ?? [])];
1339
- updated[pi] = e.target.value;
1340
- handleFieldEdit("postExamples", updated);
1341
- }}
1342
- className="h-7 flex-1 rounded-md border border-[#d6d3c6]/40 dark:border-border/30 bg-white/60 dark:bg-white/5 px-2 font-mono text-[11px] text-[#1e2329] dark:text-[hsl(40,10%,84%)] outline-none focus:border-accent"
1343
- />
1344
- <button
1345
- type="button"
1346
- className="shrink-0 text-[#9ca3af] opacity-0 transition-opacity group-hover:opacity-100 hover:text-red-500"
1347
- onClick={() => {
1348
- const updated = [...(d.postExamples ?? [])];
1349
- updated.splice(pi, 1);
1350
- handleFieldEdit("postExamples", updated);
1351
- }}
1352
- >
1353
- <svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"><path d="M2 2l6 6M8 2l-6 6" /></svg>
1354
- </button>
1355
- </div>
1356
- ))}
1357
- {(d.postExamples ?? []).length === 0 && (
1358
- <div className="rounded-md border border-dashed border-[#d6d3c6]/60 dark:border-border/30 py-2 text-center text-[11px] text-[#9ca3af] dark:text-muted">
1359
- {t("characterview.noPostExamplesYet")}
1360
- </div>
1361
- )}
1362
- </div>
1363
- <div className="border-t border-[#d6d3c6]/40 dark:border-border/30 pt-2">
1364
- <button
1365
- type="button"
1366
- className="text-[10px] font-bold text-accent hover:underline"
1367
- onClick={() => {
1368
- const updated = [...(d.postExamples ?? []), ""];
1369
- handleFieldEdit("postExamples", updated);
1370
- }}
1371
- >
1372
- {t("characterview.AddPost")}
1373
- </button>
1374
- </div>
1375
- </div>
1376
- )}
1377
- </div>
1378
- </div>
1379
-
1380
- {/* ── Sidebar (right) ── */}
1381
- <div
1382
- className={`${bookSidebarCls} flex w-20 flex-col items-center rounded-r-[1.75rem] border-l border-white/[0.08] py-3`}
1383
- role="tablist"
1384
- aria-orientation="vertical"
1385
- >
1386
- <div className="pointer-events-none absolute inset-x-2 top-2 h-10 rounded-full bg-[linear-gradient(180deg,rgba(255,255,255,0.12)_0%,rgba(255,255,255,0)_100%)] blur-sm" />
1387
- <div className="pointer-events-none absolute inset-y-0 left-0 w-px bg-white/[0.08]" />
1388
- <div className="pointer-events-none absolute inset-y-0 right-0 w-px bg-black/35" />
1389
- {SIDEBAR_TABS.map(({ key, icon: Icon, labelKey }) => {
1390
- const isActive = activeSection === key;
1391
- return (
1392
- <button
1393
- key={key}
1394
- type="button"
1395
- role="tab"
1396
- aria-selected={isActive}
1397
- className={`relative flex w-full items-center justify-center px-2 py-3.5 transition-colors border-b border-white/[0.06] last:border-b-0 ${isActive ? "text-[#f7e7bf]" : "text-[#999da7] hover:text-white/80"
1398
- }`}
1399
- onClick={() => {
1400
- setActiveSection(key);
1401
- if (key === "styleRules" && customizeStep === "examples") {
1402
- setCustomizeStep("core");
1403
- }
1404
- }}
1405
- onKeyDown={(e) => {
1406
- const keys = SIDEBAR_TABS.map((tab) => tab.key);
1407
- const idx = keys.indexOf(key);
1408
- if (e.key === "ArrowDown") {
1409
- e.preventDefault();
1410
- const next = keys[(idx + 1) % keys.length];
1411
- setActiveSection(next);
1412
- } else if (e.key === "ArrowUp") {
1413
- e.preventDefault();
1414
- const prev = keys[(idx - 1 + keys.length) % keys.length];
1415
- setActiveSection(prev);
1416
- }
1417
- }}
1418
- id={`notebook-tab-${key}`}
1419
- data-testid={`notebook-tab-${key}`}
1420
- >
1421
- {isActive && (
1422
- <div className="absolute inset-y-2 left-0 w-[4px] rounded-r-full bg-[#d4a14c] shadow-[0_0_12px_rgba(212,161,76,0.45)]" />
1423
- )}
1424
- <div className="relative z-10 flex flex-col items-center gap-1.5">
1425
- <div
1426
- className={`flex h-10 w-10 items-center justify-center rounded-full border transition-all ${isActive
1427
- ? "border-[#f0ce85]/55 bg-[radial-gradient(circle_at_30%_30%,rgba(255,236,195,0.28)_0%,rgba(255,236,195,0.05)_42%,rgba(255,255,255,0)_100%)] shadow-[0_0_18px_rgba(220,176,90,0.22)]"
1428
- : "border-white/10 bg-white/[0.03]"
1429
- }`}
1430
- >
1431
- <Icon className="h-4.5 w-4.5" />
1432
- </div>
1433
- <span className="max-w-[4.1rem] text-center text-[8px] font-semibold uppercase tracking-[0.16em] leading-[1.22]">
1434
- {t(labelKey)}
1435
- </span>
1436
- </div>
1437
- </button>
1438
- );
1439
- })}
1440
- </div>
1441
- </div>
1442
- </div>
1443
- </div>
1444
- )}
1445
-
1446
- <div className={`${sectionCls} relative z-10 ${sceneOverlay ? "character-action-bar" : ""}`}>
1447
- {(characterSaveSuccess || combinedSaveError || saveAdvisory) && (
1448
- <div className="mb-3 flex flex-wrap items-center justify-center gap-2">
1449
- {characterSaveSuccess && (
1450
- <span className="rounded-lg border border-green-400/20 bg-green-400/10 px-3 py-1.5 text-xs font-bold text-green-400">
1451
- {characterSaveSuccess}
1452
- </span>
1453
- )}
1454
- {saveAdvisory && (
1455
- <span className="rounded-lg border border-amber-400/20 bg-amber-400/10 px-3 py-1.5 text-xs font-medium text-amber-300">
1456
- {saveAdvisory}
1457
- </span>
1458
- )}
1459
- {combinedSaveError && (
1460
- <span className="rounded-lg border border-danger/20 bg-danger/10 px-3 py-1.5 text-xs font-medium text-danger">
1461
- {combinedSaveError}
1462
- </span>
1463
- )}
1464
- </div>
1465
- )}
1466
-
1467
- <div className="flex min-h-10 flex-row items-center justify-between gap-2">
1468
- <div className="flex items-center justify-start">
1469
- <div
1470
- className="flex min-w-0 items-center gap-2"
1471
- data-testid="character-voice-picker"
1472
- >
1473
- <Button
1474
- type="button"
1475
- variant={voiceSelectionLocked ? "default" : "outline"}
1476
- size="icon"
1477
- className="h-8 w-8 rounded-full border-border/50 bg-bg/65 p-0 shadow-inner backdrop-blur-sm"
1478
- onClick={() => setVoiceSelectionLocked((value) => !value)}
1479
- aria-label={
1480
- voiceSelectionLocked
1481
- ? "Unlock voice selection"
1482
- : "Lock voice selection"
1483
- }
1484
- title={
1485
- voiceSelectionLocked
1486
- ? "Voice stays pinned when switching characters"
1487
- : "Lock current voice"
1488
- }
1489
- >
1490
- {voiceSelectionLocked ? (
1491
- <Lock className="h-3.5 w-3.5" />
1492
- ) : (
1493
- <LockOpen className="h-3.5 w-3.5" />
1494
- )}
1495
- </Button>
1496
- <ThemedSelect
1497
- value={voiceSelectValue}
1498
- groups={VOICE_SELECT_GROUPS}
1499
- onChange={(id) => {
1500
- const preset = PREMADE_VOICES.find(
1501
- (voicePreset) => voicePreset.id === id,
1502
- );
1503
- if (preset) handleSelectPreset(preset);
1504
- }}
1505
- placeholder={t("characterview.selectAVoice")}
1506
- menuPlacement="top"
1507
- className="min-w-0 w-[7rem] sm:w-[11rem]"
1508
- triggerClassName="h-8 rounded-full border-border/50 bg-bg/65 px-4 py-0 text-[11px] shadow-inner backdrop-blur-sm"
1509
- menuClassName="border-border/60 bg-bg/92 shadow-2xl backdrop-blur-md"
1510
- />
1511
- <Button
1512
- type="button"
1513
- variant={voiceTesting ? "destructive" : "outline"}
1514
- size="icon"
1515
- className="h-8 w-8 rounded-full border-border/50 bg-bg/65 p-0 shadow-inner backdrop-blur-sm"
1516
- onClick={() =>
1517
- voiceTesting
1518
- ? handleStopTest()
1519
- : activeVoicePreset
1520
- ? handleTestVoice(activeVoicePreset.previewUrl)
1521
- : undefined
1522
- }
1523
- aria-label={voiceTesting ? "Stop voice preview" : "Preview voice"}
1524
- title={voiceTesting ? "Stop voice preview" : "Preview voice"}
1525
- disabled={!activeVoicePreset || voiceLoading}
1526
- >
1527
- {voiceTesting ? (
1528
- <VolumeX className="h-3.5 w-3.5" />
1529
- ) : (
1530
- <Volume2 className="h-3.5 w-3.5" />
1531
- )}
1532
- </Button>
1533
- </div>
1534
- </div>
1535
-
1536
- <div className="flex items-center">
1537
- <Button
1538
- size="lg"
1539
- className="ce-save-btn"
1540
- disabled={characterSaving || voiceSaving}
1541
- onClick={() => void handleSaveAll()}
1542
- >
1543
- {characterSaving || voiceSaving ? (
1544
- "saving..."
1545
- ) : (
1546
- <>
1547
- <span className="hidden sm:inline">Save Character</span>
1548
- <span className="sm:hidden">Save</span>
1549
- </>
1550
- )}
1551
- </Button>
1552
- </div>
1553
-
1554
- <div className="flex items-center justify-end">
1555
- <Button
1556
- type="button"
1557
- variant={customOverridesEnabled ? "outline" : "default"}
1558
- size="sm"
1559
- className={`ce-customize-btn ${customOverridesEnabled
1560
- ? "border-border/40 bg-bg/40 text-txt"
1561
- : ""
1562
- }`}
1563
- onClick={() =>
1564
- handleCustomOverridesChange(!customOverridesEnabled)
1565
- }
1566
- data-testid="character-customize-toggle"
1567
- >
1568
- {customizationActionLabel}
1569
- </Button>
1570
- </div>
1571
- </div>
1572
- </div>
1573
- </div>
1574
- );
1575
- }