@elizaos/app-core 2.0.0-alpha.52 → 2.0.0-alpha.53

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