@elizaos/app-core 2.0.0-alpha.13 → 2.0.0-alpha.15

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 (125) hide show
  1. package/.turbo/turbo-build.log +0 -1
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +26 -12
  4. package/dist/api/client.d.ts +3 -3
  5. package/dist/api/client.d.ts.map +1 -1
  6. package/dist/api/client.js +24 -13
  7. package/dist/bridge/plugin-bridge.d.ts.map +1 -1
  8. package/dist/components/AvatarLoader.d.ts +3 -1
  9. package/dist/components/AvatarLoader.d.ts.map +1 -1
  10. package/dist/components/AvatarLoader.js +4 -1
  11. package/dist/components/BscTradePanel.d.ts +1 -1
  12. package/dist/components/BscTradePanel.d.ts.map +1 -1
  13. package/dist/components/CharacterView.d.ts.map +1 -1
  14. package/dist/components/CharacterView.js +50 -15
  15. package/dist/components/ChatView.js +1 -1
  16. package/dist/components/ConfigPageView.d.ts.map +1 -1
  17. package/dist/components/ConfigPageView.js +9 -8
  18. package/dist/components/ConversationsSidebar.js +1 -1
  19. package/dist/components/CustomActionEditor.js +1 -1
  20. package/dist/components/FineTuningView.d.ts.map +1 -1
  21. package/dist/components/FineTuningView.js +2 -2
  22. package/dist/components/GlobalEmoteOverlay.d.ts.map +1 -1
  23. package/dist/components/GlobalEmoteOverlay.js +1 -1
  24. package/dist/components/HeartbeatsView.js +1 -1
  25. package/dist/components/LoadingScreen.d.ts.map +1 -1
  26. package/dist/components/LoadingScreen.js +38 -7
  27. package/dist/components/OnboardingWizard.js +1 -1
  28. package/dist/components/PluginsView.d.ts.map +1 -1
  29. package/dist/components/PluginsView.js +4 -1
  30. package/dist/components/ShellOverlays.js +1 -1
  31. package/dist/components/VoiceConfigView.d.ts.map +1 -1
  32. package/dist/components/VoiceConfigView.js +4 -2
  33. package/dist/components/avatar/VrmEngine.d.ts +2 -0
  34. package/dist/components/avatar/VrmEngine.d.ts.map +1 -1
  35. package/dist/components/avatar/VrmEngine.js +14 -6
  36. package/dist/components/companion/CompanionSceneHost.d.ts +1 -1
  37. package/dist/components/companion/CompanionSceneHost.d.ts.map +1 -1
  38. package/dist/components/companion/CompanionSceneHost.js +1 -1
  39. package/dist/components/index.d.ts +10 -10
  40. package/dist/components/index.d.ts.map +1 -1
  41. package/dist/components/index.js +10 -10
  42. package/dist/components/inventory/TokensTable.js +2 -2
  43. package/dist/components/onboarding/IdentityStep.d.ts.map +1 -1
  44. package/dist/components/onboarding/IdentityStep.js +1 -1
  45. package/dist/components/shared/ShellHeaderControls.js +1 -1
  46. package/dist/config/config-field.d.ts.map +1 -1
  47. package/dist/config/config-field.js +7 -8
  48. package/dist/config/index.d.ts +1 -1
  49. package/dist/config/index.d.ts.map +1 -1
  50. package/dist/config/index.js +1 -1
  51. package/dist/hooks/useVoiceChat.d.ts.map +1 -1
  52. package/dist/hooks/useVoiceChat.js +3 -1
  53. package/dist/i18n/locales/en.json +1192 -1192
  54. package/dist/i18n/locales/es.json +1192 -1192
  55. package/dist/i18n/locales/ko.json +1192 -1192
  56. package/dist/i18n/locales/pt.json +1192 -1192
  57. package/dist/i18n/locales/zh-CN.json +1192 -1192
  58. package/dist/package.json +181 -0
  59. package/dist/platform/lifo.d.ts.map +1 -1
  60. package/dist/platform/lifo.js +4 -1
  61. package/dist/state/AppContext.d.ts.map +1 -1
  62. package/dist/state/AppContext.js +23 -6
  63. package/dist/state/internal.d.ts +1 -1
  64. package/dist/state/internal.d.ts.map +1 -1
  65. package/dist/state/internal.js +1 -1
  66. package/dist/state/parsers.d.ts.map +1 -1
  67. package/dist/state/parsers.js +3 -2
  68. package/dist/state/persistence.js +1 -1
  69. package/dist/styles/anime.css +6324 -0
  70. package/dist/styles/base.css +196 -0
  71. package/dist/styles/onboarding-game.css +738 -0
  72. package/dist/styles/styles.css +2087 -0
  73. package/dist/styles/xterm.css +241 -0
  74. package/package.json +4 -4
  75. package/src/App.tsx +35 -14
  76. package/src/ambient.d.ts +5 -5
  77. package/src/api/client.ts +36 -23
  78. package/src/bridge/plugin-bridge.ts +1 -1
  79. package/src/components/AvatarLoader.tsx +6 -0
  80. package/src/components/BscTradePanel.tsx +1 -1
  81. package/src/components/CharacterView.tsx +536 -367
  82. package/src/components/ChatView.tsx +3 -3
  83. package/src/components/ConfigPageView.tsx +9 -8
  84. package/src/components/ConversationsSidebar.tsx +1 -1
  85. package/src/components/CustomActionEditor.tsx +6 -6
  86. package/src/components/FineTuningView.tsx +6 -3
  87. package/src/components/GlobalEmoteOverlay.tsx +1 -4
  88. package/src/components/HeartbeatsView.tsx +1 -1
  89. package/src/components/InventoryView.tsx +2 -2
  90. package/src/components/LoadingScreen.tsx +39 -6
  91. package/src/components/OnboardingWizard.tsx +1 -1
  92. package/src/components/PluginsView.tsx +6 -0
  93. package/src/components/ShellOverlays.tsx +1 -1
  94. package/src/components/VoiceConfigView.tsx +4 -5
  95. package/src/components/avatar/VrmEngine.ts +25 -7
  96. package/src/components/companion/CompanionSceneHost.tsx +5 -1
  97. package/src/components/index.ts +10 -10
  98. package/src/components/inventory/TokensTable.tsx +2 -2
  99. package/src/components/onboarding/IdentityStep.tsx +9 -13
  100. package/src/components/shared/ShellHeaderControls.tsx +1 -1
  101. package/src/config/config-field.tsx +7 -8
  102. package/src/config/index.ts +3 -3
  103. package/src/hooks/useVoiceChat.ts +5 -3
  104. package/src/platform/lifo.ts +14 -4
  105. package/src/state/AppContext.tsx +24 -1
  106. package/src/state/internal.ts +6 -6
  107. package/src/state/parsers.ts +4 -3
  108. package/src/state/persistence.ts +1 -1
  109. package/test/app/MessageContent.test.tsx +42 -0
  110. package/test/app/bug-report-modal.test.tsx +3 -3
  111. package/test/app/chat-view.test.tsx +3 -3
  112. package/test/app/cloud-login-lock.test.ts +3 -2
  113. package/test/app/custom-actions-smoke.test.ts +3 -3
  114. package/test/app/onboarding-language.test.tsx +3 -3
  115. package/test/app/pages-navigation-smoke.e2e.test.ts +13 -8
  116. package/test/app/plugin-bridge.test.ts +1 -1
  117. package/test/app/provider-dropdown-default.test.tsx +2 -4
  118. package/test/app/restart-banner.test.tsx +3 -3
  119. package/test/app/shell-mode-switching.e2e.test.ts +6 -6
  120. package/test/app/shell-mode-tab-memory.test.tsx +1 -1
  121. package/test/app/startup-chat.e2e.test.ts +3 -3
  122. package/test/app/triggers-view.e2e.test.ts +3 -2
  123. package/test/app/wallet-api-save-lock.test.ts +2 -1
  124. package/test/utils/assistant-text.test.ts +64 -0
  125. package/test/utils/streaming-text.test.ts +89 -0
@@ -3,13 +3,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  * Character view — roster-first character selection with optional customization.
4
4
  */
5
5
  import { client, } from "@elizaos/app-core/api";
6
- import { AvatarSelector } from "./AvatarSelector";
7
6
  import { dispatchWindowEvent, VOICE_CONFIG_UPDATED_EVENT, } from "@elizaos/app-core/events";
8
7
  import { getVrmPreviewUrl, useApp } from "@elizaos/app-core/state";
9
8
  import { PREMADE_VOICES, sanitizeApiKey, } from "@elizaos/app-core/voice";
10
9
  import { Button, Input, Textarea, ThemedSelect } from "@elizaos/ui";
11
- import { BookOpen, FileText, Lock, LockOpen, Palette, Volume2, VolumeX } from "lucide-react";
10
+ import { BookOpen, FileText, Lock, LockOpen, Palette, Volume2, VolumeX, } from "lucide-react";
12
11
  import { useCallback, useEffect, useState } from "react";
12
+ import { AvatarSelector } from "./AvatarSelector";
13
13
  const DEFAULT_ELEVEN_FAST_MODEL = "eleven_flash_v2_5";
14
14
  const STYLE_SECTION_KEYS = ["all", "chat", "post"];
15
15
  const STYLE_SECTION_PLACEHOLDERS = {
@@ -596,7 +596,11 @@ export function CharacterView({ inModal, sceneOverlay = false, } = {}) {
596
596
  const scrollPaneCls = "min-h-0 overflow-y-auto pr-1 [scrollbar-gutter:stable] custom-scrollbar";
597
597
  const SIDEBAR_TABS = [
598
598
  { key: "aboutMe", icon: FileText, labelKey: "characterview.aboutMe" },
599
- { key: "directions", icon: BookOpen, labelKey: "characterview.directionsAndThing" },
599
+ {
600
+ key: "directions",
601
+ icon: BookOpen,
602
+ labelKey: "characterview.directionsAndThing",
603
+ },
600
604
  { key: "styleRules", icon: Palette, labelKey: "characterview.StyleRules" },
601
605
  ];
602
606
  const bookPageCls = sceneOverlay
@@ -663,25 +667,53 @@ export function CharacterView({ inModal, sceneOverlay = false, } = {}) {
663
667
  ? "border-[#c59b47] bg-[linear-gradient(180deg,#f4cf79_0%,#d69f45_100%)] text-[#2d2418] shadow-[0_10px_18px_rgba(137,97,36,0.22)]"
664
668
  : "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%)]"}`, onClick: () => setCustomizeStep("core"), children: t("characterview.core") }), activeSection !== "styleRules" && (_jsx("button", { type: "button", className: `relative h-9 rounded-b-md rounded-t-[1rem] border px-3.5 text-[10px] font-bold uppercase tracking-[0.18em] transition-all ${customizeStep === "examples"
665
669
  ? "border-[#c59b47] bg-[linear-gradient(180deg,#f4cf79_0%,#d69f45_100%)] text-[#2d2418] shadow-[0_10px_18px_rgba(137,97,36,0.22)]"
666
- : "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%)]"}`, onClick: () => setCustomizeStep("examples"), children: t("characterview.examples") })), _jsx("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%)]" })] }), _jsxs("div", { className: "relative z-10 flex flex-1 flex-col overflow-y-auto p-5 custom-scrollbar", role: "tabpanel", "aria-labelledby": `notebook-tab-${activeSection}`, children: [activeSection === "aboutMe" && customizeStep === "core" && (_jsxs("div", { className: "flex flex-1 flex-col gap-3", "data-testid": "character-core-editor", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: "Name" }), _jsx(Input, { type: "text", value: d.name ?? "", placeholder: "Agent name", onChange: (e) => handleFieldEdit("name", e.target.value), 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" })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: "Avatar" }), _jsx(AvatarSelector, { selected: selectedVrmIndex, onSelect: (index) => setState("selectedVrmIndex", index), onUpload: handleCustomVrmUpload, showUpload: true, fullWidth: true })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.aboutMe") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("bio"), disabled: generating === "bio", children: generating === "bio" ? "generating..." : "regenerate" })] }), _jsx(Textarea, { value: bioText, placeholder: t("characterview.describeWhoYourAg"), onChange: (e) => handleFieldEdit("bio", e.target.value), 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" })] })), activeSection === "directions" && customizeStep === "core" && (_jsxs("div", { className: "flex flex-1 flex-col gap-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.directionsAndThing") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("system"), disabled: generating === "system", children: generating === "system" ? "generating..." : "regenerate" })] }), _jsx(Textarea, { value: d.system ?? "", maxLength: 10000, placeholder: t("characterview.writeInFirstPerso"), onChange: (e) => handleFieldEdit("system", e.target.value), 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" })] })), activeSection === "styleRules" && customizeStep === "core" && (_jsxs("div", { className: "flex flex-col gap-3", "data-testid": "character-style-editor", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.StyleRules") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("style", "replace"), disabled: generating === "style", children: generating === "style" ? "generating..." : "regenerate" })] }), STYLE_SECTION_KEYS.map((key) => {
670
+ : "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%)]"}`, onClick: () => setCustomizeStep("examples"), children: t("characterview.examples") })), _jsx("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%)]" })] }), _jsxs("div", { className: "relative z-10 flex flex-1 flex-col overflow-y-auto p-5 custom-scrollbar", role: "tabpanel", "aria-labelledby": `notebook-tab-${activeSection}`, children: [activeSection === "aboutMe" && customizeStep === "core" && (_jsxs("div", { className: "flex flex-1 flex-col gap-3", "data-testid": "character-core-editor", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: "Name" }), _jsx(Input, { type: "text", value: d.name ?? "", placeholder: "Agent name", onChange: (e) => handleFieldEdit("name", e.target.value), 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" })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: "Avatar" }), _jsx(AvatarSelector, { selected: selectedVrmIndex, onSelect: (index) => setState("selectedVrmIndex", index), onUpload: handleCustomVrmUpload, showUpload: true, fullWidth: true })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.aboutMe") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("bio"), disabled: generating === "bio", children: generating === "bio"
671
+ ? "generating..."
672
+ : "regenerate" })] }), _jsx(Textarea, { value: bioText, placeholder: t("characterview.describeWhoYourAg"), onChange: (e) => handleFieldEdit("bio", e.target.value), 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" })] })), activeSection === "directions" &&
673
+ customizeStep === "core" && (_jsxs("div", { className: "flex flex-1 flex-col gap-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.directionsAndThing") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("system"), disabled: generating === "system", children: generating === "system"
674
+ ? "generating..."
675
+ : "regenerate" })] }), _jsx(Textarea, { value: d.system ?? "", maxLength: 10000, placeholder: t("characterview.writeInFirstPerso"), onChange: (e) => handleFieldEdit("system", e.target.value), 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" })] })), activeSection === "styleRules" &&
676
+ customizeStep === "core" && (_jsxs("div", { className: "flex flex-col gap-3", "data-testid": "character-style-editor", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.StyleRules") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("style", "replace"), disabled: generating === "style", children: generating === "style"
677
+ ? "generating..."
678
+ : "regenerate" })] }), STYLE_SECTION_KEYS.map((key) => {
667
679
  const items = d.style?.[key] ?? [];
668
- return (_jsxs("div", { className: "flex flex-col gap-1.5", "data-testid": `style-section-${key}`, children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-[#d6d3c6]/60 dark:border-border/30 pb-1", children: [_jsx("span", { className: "text-[10px] font-bold uppercase tracking-widest text-[#6d737a] dark:text-muted", children: key }), _jsxs("span", { className: "text-[9px] font-medium uppercase tracking-wider text-[#9ca3af] dark:text-muted/60", children: [items.length, " rule", items.length === 1 ? "" : "s"] })] }), _jsx("div", { className: `${scrollPaneCls} max-h-[12rem]`, children: _jsx("div", { className: "flex flex-col gap-1", children: items.length > 0 ? (items.map((item, index) => (_jsxs("div", { 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", "data-testid": `style-entry-${key}-${index}`, children: [_jsx("span", { className: "mt-0.5 shrink-0 text-[10px] font-bold text-accent", children: index + 1 }), _jsx(Textarea, { value: styleEntryDrafts[key]?.[index] ?? item, rows: 1, onChange: (e) => handleStyleEntryDraftChange(key, index, e.target.value), onBlur: () => handleCommitStyleEntry(key, index), 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", "data-testid": `style-entry-editor-${key}-${index}` }), _jsx("button", { type: "button", className: "mt-0.5 shrink-0 text-[#9ca3af] opacity-0 transition-opacity group-hover:opacity-100 hover:text-red-500", onClick: () => handleRemoveStyleEntry(key, index), title: t("characterview.remove"), children: _jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", children: _jsx("path", { d: "M2 2l6 6M8 2l-6 6" }) }) })] }, getStyleEntryRenderKey(key, items, item, index))))) : (_jsx("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", children: STYLE_SECTION_EMPTY_STATES[key] })) }) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { type: "text", value: pendingStyleEntries[key], placeholder: STYLE_SECTION_PLACEHOLDERS[key], onChange: (e) => handlePendingStyleEntryChange(key, e.target.value), onKeyDown: (e) => {
680
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", "data-testid": `style-section-${key}`, children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-[#d6d3c6]/60 dark:border-border/30 pb-1", children: [_jsx("span", { className: "text-[10px] font-bold uppercase tracking-widest text-[#6d737a] dark:text-muted", children: key }), _jsxs("span", { className: "text-[9px] font-medium uppercase tracking-wider text-[#9ca3af] dark:text-muted/60", children: [items.length, " rule", items.length === 1 ? "" : "s"] })] }), _jsx("div", { className: `${scrollPaneCls} max-h-[12rem]`, children: _jsx("div", { className: "flex flex-col gap-1", children: items.length > 0 ? (items.map((item, index) => (_jsxs("div", { 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", "data-testid": `style-entry-${key}-${index}`, children: [_jsx("span", { className: "mt-0.5 shrink-0 text-[10px] font-bold text-accent", children: index + 1 }), _jsx(Textarea, { value: styleEntryDrafts[key]?.[index] ??
681
+ item, rows: 1, onChange: (e) => handleStyleEntryDraftChange(key, index, e.target.value), onBlur: () => handleCommitStyleEntry(key, index), 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", "data-testid": `style-entry-editor-${key}-${index}` }), _jsx("button", { type: "button", className: "mt-0.5 shrink-0 text-[#9ca3af] opacity-0 transition-opacity group-hover:opacity-100 hover:text-red-500", onClick: () => handleRemoveStyleEntry(key, index), title: t("characterview.remove"), children: _jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", "aria-label": t("characterview.remove"), children: _jsx("path", { d: "M2 2l6 6M8 2l-6 6" }) }) })] }, getStyleEntryRenderKey(key, items, item, index))))) : (_jsx("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", children: STYLE_SECTION_EMPTY_STATES[key] })) }) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { type: "text", value: pendingStyleEntries[key], placeholder: STYLE_SECTION_PLACEHOLDERS[key], onChange: (e) => handlePendingStyleEntryChange(key, e.target.value), onKeyDown: (e) => {
669
682
  if (e.key === "Enter") {
670
683
  e.preventDefault();
671
684
  handleAddStyleEntry(key);
672
685
  }
673
686
  }, 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", "data-testid": `style-entry-input-${key}` }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-7 shrink-0 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => handleAddStyleEntry(key), disabled: !pendingStyleEntries[key].trim(), children: "+ add" })] })] }, key));
674
- })] })), activeSection === "aboutMe" && customizeStep === "examples" && (_jsxs("div", { className: "flex flex-col gap-2", "data-testid": "character-chat-examples-card", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.chatExamples") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("chatExamples", "replace"), disabled: generating === "chatExamples", children: generating === "chatExamples" ? "generating..." : "generate" })] }), _jsxs("div", { className: `${scrollPaneCls} flex flex-col gap-2`, children: [(d.messageExamples ?? []).map((convo, ci) => (_jsxs("div", { className: "rounded-lg border border-[#d6d3c6]/40 dark:border-border/30 p-2.5", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsxs("span", { className: "text-[9px] font-bold uppercase tracking-widest text-[#9ca3af] dark:text-muted/60", children: [t("characterview.conversation"), " ", ci + 1] }), _jsx("button", { type: "button", className: "text-[#9ca3af] hover:text-red-500 transition-colors", onClick: () => {
675
- const updated = [...(d.messageExamples ?? [])];
687
+ })] })), activeSection === "aboutMe" &&
688
+ customizeStep === "examples" && (_jsxs("div", { className: "flex flex-col gap-2", "data-testid": "character-chat-examples-card", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.chatExamples") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("chatExamples", "replace"), disabled: generating === "chatExamples", children: generating === "chatExamples"
689
+ ? "generating..."
690
+ : "generate" })] }), _jsxs("div", { className: `${scrollPaneCls} flex flex-col gap-2`, children: [(d.messageExamples ?? []).map((convo, ci) => (_jsxs("div", { className: "rounded-lg border border-[#d6d3c6]/40 dark:border-border/30 p-2.5", children: [_jsxs("div", { className: "mb-2 flex items-center justify-between", children: [_jsxs("span", { className: "text-[9px] font-bold uppercase tracking-widest text-[#9ca3af] dark:text-muted/60", children: [t("characterview.conversation"), " ", ci + 1] }), _jsx("button", { type: "button", className: "text-[#9ca3af] hover:text-red-500 transition-colors", onClick: () => {
691
+ const updated = [
692
+ ...(d.messageExamples ?? []),
693
+ ];
676
694
  updated.splice(ci, 1);
677
695
  handleFieldEdit("messageExamples", updated);
678
- }, children: _jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", children: _jsx("path", { d: "M2 2l6 6M8 2l-6 6" }) }) })] }), _jsx("div", { className: "flex flex-col gap-1.5", children: convo.examples.map((msg, mi) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: `w-10 shrink-0 text-right text-[9px] font-bold uppercase tracking-wider ${msg.name === "{{user1}}" ? "text-[#9ca3af] dark:text-muted" : "text-accent"}`, children: msg.name === "{{user1}}" ? "user" : "agent" }), _jsx("input", { type: "text", value: msg.content?.text ?? "", onChange: (e) => {
679
- const updated = [...(d.messageExamples ?? [])];
680
- const convoClone = { examples: [...updated[ci].examples] };
681
- convoClone.examples[mi] = { ...convoClone.examples[mi], content: { text: e.target.value } };
696
+ }, children: _jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", "aria-label": t("characterview.remove"), children: _jsx("path", { d: "M2 2l6 6M8 2l-6 6" }) }) })] }), _jsx("div", { className: "flex flex-col gap-1.5", children: convo.examples.map((msg, mi) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: `w-10 shrink-0 text-right text-[9px] font-bold uppercase tracking-wider ${msg.name === "{{user1}}" ? "text-[#9ca3af] dark:text-muted" : "text-accent"}`, children: msg.name === "{{user1}}"
697
+ ? "user"
698
+ : "agent" }), _jsx("input", { type: "text", value: msg.content?.text ?? "", onChange: (e) => {
699
+ const updated = [
700
+ ...(d.messageExamples ?? []),
701
+ ];
702
+ const convoClone = {
703
+ examples: [...updated[ci].examples],
704
+ };
705
+ convoClone.examples[mi] = {
706
+ ...convoClone.examples[mi],
707
+ content: { text: e.target.value },
708
+ };
682
709
  updated[ci] = convoClone;
683
710
  handleFieldEdit("messageExamples", updated);
684
- }, 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" })] }, `${msg.name}:${msg.content?.text ?? ""}`))) })] }, convo.examples.map((msg) => `${msg.name}:${msg.content?.text ?? ""}`).join("|")))), (d.messageExamples ?? []).length === 0 && (_jsx("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", children: t("characterview.noChatExamplesYet") }))] })] })), activeSection === "directions" && customizeStep === "examples" && (_jsxs("div", { className: "flex flex-col gap-2", "data-testid": "character-post-examples-card", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.postExamples") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("postExamples", "replace"), disabled: generating === "postExamples", children: generating === "postExamples" ? "generating..." : "generate" })] }), _jsxs("div", { className: `${scrollPaneCls} flex flex-col gap-1.5`, children: [(d.postExamples ?? []).map((post, pi) => (_jsxs("div", { className: "group flex items-center gap-1.5", children: [_jsx("input", { type: "text", value: post, onChange: (e) => {
711
+ }, 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" })] }, `${msg.name}:${msg.content?.text ?? ""}`))) })] }, convo.examples
712
+ .map((msg) => `${msg.name}:${msg.content?.text ?? ""}`)
713
+ .join("|")))), (d.messageExamples ?? []).length === 0 && (_jsx("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", children: t("characterview.noChatExamplesYet") }))] })] })), activeSection === "directions" &&
714
+ customizeStep === "examples" && (_jsxs("div", { className: "flex flex-col gap-2", "data-testid": "character-post-examples-card", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs font-medium text-[#6d737a] dark:text-muted", children: t("characterview.postExamples") }), _jsx(Button, { variant: "ghost", size: "sm", className: "h-6 rounded-md px-2 text-[10px] font-bold text-accent", onClick: () => void handleGenerate("postExamples", "replace"), disabled: generating === "postExamples", children: generating === "postExamples"
715
+ ? "generating..."
716
+ : "generate" })] }), _jsxs("div", { className: `${scrollPaneCls} flex flex-col gap-1.5`, children: [(d.postExamples ?? []).map((post, pi) => (_jsxs("div", { className: "group flex items-center gap-1.5", children: [_jsx("input", { type: "text", value: post, onChange: (e) => {
685
717
  const updated = [...(d.postExamples ?? [])];
686
718
  updated[pi] = e.target.value;
687
719
  handleFieldEdit("postExamples", updated);
@@ -689,14 +721,17 @@ export function CharacterView({ inModal, sceneOverlay = false, } = {}) {
689
721
  const updated = [...(d.postExamples ?? [])];
690
722
  updated.splice(pi, 1);
691
723
  handleFieldEdit("postExamples", updated);
692
- }, children: _jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", children: _jsx("path", { d: "M2 2l6 6M8 2l-6 6" }) }) })] }, post || `post-${pi}`))), (d.postExamples ?? []).length === 0 && (_jsx("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", children: t("characterview.noPostExamplesYet") }))] }), _jsx("div", { className: "border-t border-[#d6d3c6]/40 dark:border-border/30 pt-2", children: _jsx("button", { type: "button", className: "text-[10px] font-bold text-accent hover:underline", onClick: () => {
724
+ }, children: _jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", "aria-label": t("characterview.remove"), children: _jsx("path", { d: "M2 2l6 6M8 2l-6 6" }) }) })] }, post || `post-${pi}`))), (d.postExamples ?? []).length === 0 && (_jsx("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", children: t("characterview.noPostExamplesYet") }))] }), _jsx("div", { className: "border-t border-[#d6d3c6]/40 dark:border-border/30 pt-2", children: _jsx("button", { type: "button", className: "text-[10px] font-bold text-accent hover:underline", onClick: () => {
693
725
  const updated = [...(d.postExamples ?? []), ""];
694
726
  handleFieldEdit("postExamples", updated);
695
727
  }, children: t("characterview.AddPost") }) })] }))] })] }), _jsxs("div", { className: `${bookSidebarCls} flex w-20 flex-col items-center rounded-r-[1.75rem] border-l border-white/[0.08] py-3`, role: "tablist", "aria-orientation": "vertical", children: [_jsx("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" }), _jsx("div", { className: "pointer-events-none absolute inset-y-0 left-0 w-px bg-white/[0.08]" }), _jsx("div", { className: "pointer-events-none absolute inset-y-0 right-0 w-px bg-black/35" }), SIDEBAR_TABS.map(({ key, icon: Icon, labelKey }) => {
696
728
  const isActive = activeSection === key;
697
- return (_jsxs("button", { type: "button", role: "tab", "aria-selected": isActive, className: `relative flex w-full items-center justify-center px-2 py-3.5 transition-colors border-b border-white/[0.06] last:border-b-0 ${isActive ? "text-[#f7e7bf]" : "text-[#999da7] hover:text-white/80"}`, onClick: () => {
729
+ return (_jsxs("button", { type: "button", role: "tab", "aria-selected": isActive, className: `relative flex w-full items-center justify-center px-2 py-3.5 transition-colors border-b border-white/[0.06] last:border-b-0 ${isActive
730
+ ? "text-[#f7e7bf]"
731
+ : "text-[#999da7] hover:text-white/80"}`, onClick: () => {
698
732
  setActiveSection(key);
699
- if (key === "styleRules" && customizeStep === "examples") {
733
+ if (key === "styleRules" &&
734
+ customizeStep === "examples") {
700
735
  setCustomizeStep("core");
701
736
  }
702
737
  }, onKeyDown: (e) => {
@@ -481,7 +481,7 @@ export function ChatView({ variant = "default" }) {
481
481
  const prev = i > 0 ? visibleMsgs[i - 1] : null;
482
482
  const isGrouped = prev?.role === msg.role;
483
483
  return (_jsx(ChatMessage, { message: msg, isGrouped: isGrouped, agentName: agentName, agentAvatarSrc: agentAvatarSrc, onSpeak: handleSpeakMessage, onEdit: handleEditMessage }, msg.id));
484
- }), chatSending && !chatFirstTokenReceived && (_jsx(TypingIndicator, { agentName: agentName, agentAvatarSrc: agentAvatarSrc }))] })) }), _jsx(AgentActivityBox, { sessions: ptySessions }), shareIngestNotice && (_jsx("div", { className: "text-xs text-ok py-1 relative", style: { zIndex: 1 }, children: shareIngestNotice })), droppedFiles.length > 0 && (_jsx("div", { className: "text-xs text-muted py-0.5 flex gap-2 relative", style: { zIndex: 1 }, children: droppedFiles.map((f) => (_jsx("span", { children: f }, f))) })), chatPendingImages.length > 0 && (_jsx("div", { className: "flex gap-2 flex-wrap py-1 relative", "data-no-camera-drag": isGameModal || undefined, style: { zIndex: 1 }, children: chatPendingImages.map((img, i) => (_jsxs("div", { className: "relative group w-16 h-16 shrink-0", children: [_jsx("img", { src: `data:${img.mimeType};base64,${img.data}`, alt: img.name, className: "w-16 h-16 object-cover border border-border rounded" }), _jsx("button", { type: "button", title: t("chatview.RemoveImage"), "aria-label": `Remove image ${img.name}`, onClick: () => removeImage(i), className: "absolute -top-1.5 -right-1.5 w-4 h-4 rounded-full bg-danger text-white text-[10px] flex items-center justify-center opacity-100 sm:opacity-0 sm:group-hover:opacity-100 focus-visible:opacity-100 transition-opacity cursor-pointer", children: "\u00D7" })] }, `${img.name}-${i}`))) })), voiceLatency && (_jsxs("div", { className: "pb-1 text-[10px] text-muted relative", style: { zIndex: 1 }, children: [t("chatview.SilenceEndFirstTo"), " ", voiceLatency.speechEndToFirstTokenMs ?? "—", t("chatview.msEndVoiceStart"), " ", voiceLatency.speechEndToVoiceStartMs ?? "—", t("chatview.msFirst"), " ", voiceLatency.firstSegmentCached == null
484
+ }), chatSending && !chatFirstTokenReceived && (_jsx(TypingIndicator, { agentName: agentName, agentAvatarSrc: agentAvatarSrc }))] })) }), _jsx(AgentActivityBox, { sessions: ptySessions }), shareIngestNotice && (_jsx("div", { className: "text-xs text-ok py-1 relative", style: { zIndex: 1 }, children: shareIngestNotice })), droppedFiles.length > 0 && (_jsx("div", { className: "text-xs text-muted py-0.5 flex gap-2 relative", style: { zIndex: 1 }, children: droppedFiles.map((f) => (_jsx("span", { children: f }, f))) })), chatPendingImages.length > 0 && (_jsx("div", { className: "flex gap-2 flex-wrap py-1 relative", "data-no-camera-drag": isGameModal || undefined, style: { zIndex: 1 }, children: chatPendingImages.map((img, imgIdx) => (_jsxs("div", { className: "relative group w-16 h-16 shrink-0", children: [_jsx("img", { src: `data:${img.mimeType};base64,${img.data}`, alt: img.name, className: "w-16 h-16 object-cover border border-border rounded" }), _jsx("button", { type: "button", title: t("chatview.RemoveImage"), "aria-label": `Remove image ${img.name}`, onClick: () => removeImage(imgIdx), className: "absolute -top-1.5 -right-1.5 w-4 h-4 rounded-full bg-danger text-white text-[10px] flex items-center justify-center opacity-100 sm:opacity-0 sm:group-hover:opacity-100 focus-visible:opacity-100 transition-opacity cursor-pointer", children: "\u00D7" })] }, `${img.name}-${img.data}`))) })), voiceLatency && (_jsxs("div", { className: "pb-1 text-[10px] text-muted relative", style: { zIndex: 1 }, children: [t("chatview.SilenceEndFirstTo"), " ", voiceLatency.speechEndToFirstTokenMs ?? "—", t("chatview.msEndVoiceStart"), " ", voiceLatency.speechEndToVoiceStartMs ?? "—", t("chatview.msFirst"), " ", voiceLatency.firstSegmentCached == null
485
485
  ? "—"
486
486
  : voiceLatency.firstSegmentCached
487
487
  ? "cached"
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigPageView.d.ts","sourceRoot":"","sources":["../../src/components/ConfigPageView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqbH,wBAAgB,cAAc,CAAC,EAAE,QAAgB,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,2CA0T1E"}
1
+ {"version":3,"file":"ConfigPageView.d.ts","sourceRoot":"","sources":["../../src/components/ConfigPageView.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqbH,wBAAgB,cAAc,CAAC,EAAE,QAAgB,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,2CA2T1E"}
@@ -6,8 +6,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
6
6
  * 1. Wallet & RPC providers
7
7
  * 2. Secrets (modal)
8
8
  */
9
- import { useCallback, useEffect, useState } from "react";
10
9
  import { WALLET_RPC_PROVIDER_OPTIONS, } from "@elizaos/autonomous/contracts/wallet";
10
+ import { useCallback, useEffect, useState } from "react";
11
11
  import { client } from "../api";
12
12
  import { ConfigRenderer, defaultRegistry, } from "../config";
13
13
  import { useApp } from "../state";
@@ -180,14 +180,15 @@ export function ConfigPageView({ embedded = false }) {
180
180
  setRpcFieldValues((prev) => ({ ...prev, [key]: String(value ?? "") }));
181
181
  }, []);
182
182
  /* ── RPC provider selection state ──────────────────────────────────── */
183
- const [selectedEvmRpc, setSelectedEvmRpc] = useState("eliza-cloud");
184
- const [selectedBscRpc, setSelectedBscRpc] = useState("eliza-cloud");
185
- const [selectedSolanaRpc, setSelectedSolanaRpc] = useState("eliza-cloud");
183
+ const initialRpc = resolveInitialWalletRpcSelections(walletConfig);
184
+ const [selectedEvmRpc, setSelectedEvmRpc] = useState(initialRpc.evm);
185
+ const [selectedBscRpc, setSelectedBscRpc] = useState(initialRpc.bsc);
186
+ const [selectedSolanaRpc, setSelectedSolanaRpc] = useState(initialRpc.solana);
186
187
  useEffect(() => {
187
- const initialSelections = resolveInitialWalletRpcSelections(walletConfig);
188
- setSelectedEvmRpc(initialSelections.evm);
189
- setSelectedBscRpc(initialSelections.bsc);
190
- setSelectedSolanaRpc(initialSelections.solana);
188
+ const selections = resolveInitialWalletRpcSelections(walletConfig);
189
+ setSelectedEvmRpc(selections.evm);
190
+ setSelectedBscRpc(selections.bsc);
191
+ setSelectedSolanaRpc(selections.solana);
191
192
  }, [walletConfig]);
192
193
  const handleWalletSaveAll = useCallback(() => {
193
194
  const config = buildWalletRpcUpdateRequest({
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useApp } from "../state";
3
2
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@elizaos/ui";
4
3
  import { useEffect, useRef, useState } from "react";
4
+ import { useApp } from "../state";
5
5
  import { ConversationListItem } from "./conversations/ConversationListItem";
6
6
  export function ConversationsSidebar({ mobile = false, onClose, variant = "default", }) {
7
7
  const { conversations, activeConversationId, unreadConversations, handleNewConversation, handleSelectConversation, handleDeleteConversation, handleRenameConversation, t, } = useApp();
@@ -569,7 +569,7 @@ export function CustomActionEditor({ open, action, onSave, onClose, }) {
569
569
  }, placeholder: t("customactioneditor.echoMessage"), rows: 4, className: "bg-surface border border-border px-2 py-1.5 text-sm text-txt placeholder:text-muted/50 outline-none focus:border-accent resize-none font-mono" }), _jsxs("span", { className: "text-xs text-muted/70", children: [t("streamsettings.Use"), " ", `{{paramName}}`, " ", t("customactioneditor.forParameterSubsti")] })] })), handlerType === "code" && (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-xs text-muted", children: t("customactioneditor.JavaScriptCode") }), _jsx("textarea", { value: code, onChange: (e) => {
570
570
  setCode(e.target.value);
571
571
  setFormError("");
572
- }, placeholder: t("customactioneditor.AvailableParams"), rows: 6, className: "bg-surface border border-border px-2 py-1.5 text-sm text-txt placeholder:text-muted/50 outline-none focus:border-accent resize-none font-mono" })] })), _jsxs("div", { className: "flex flex-col gap-2 border-t border-border pt-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs text-muted", children: t("customactioneditor.Parameters") }), _jsx("button", { type: "button", onClick: addParameter, className: "text-xs text-txt hover:opacity-80 cursor-pointer", children: t("customactioneditor.AddParameter") })] }), parameters.map((param, i) => (_jsxs("div", { className: "flex gap-2 items-start", children: [_jsx("input", { type: "text", value: param.name, onChange: (e) => updateParameter(i, "name", e.target.value), placeholder: t("customactioneditor.paramName"), className: "w-32 bg-surface border border-border px-2 py-1.5 text-sm text-txt placeholder:text-muted/50 outline-none focus:border-accent" }), _jsx("input", { type: "text", value: param.description, onChange: (e) => updateParameter(i, "description", e.target.value), placeholder: t("skillsview.Description"), className: "flex-1 bg-surface border border-border px-2 py-1.5 text-sm text-txt placeholder:text-muted/50 outline-none focus:border-accent" }), _jsxs("span", { className: "flex items-center gap-1 text-xs text-muted cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: param.required, onChange: (e) => updateParameter(i, "required", e.target.checked), className: "cursor-pointer" }), t("customactioneditor.Required")] }), _jsx("button", { type: "button", onClick: () => removeParameter(i), className: "px-2 text-muted hover:text-txt cursor-pointer", children: t("bugreportmodal.Times") })] }, `${param.name}-${i}`)))] }), _jsxs("div", { className: "flex flex-col gap-2 border-t border-border pt-3", children: [_jsxs("button", { type: "button", onClick: () => setTestExpanded((expanded) => !expanded), className: "flex items-center justify-between text-xs text-muted hover:text-txt cursor-pointer", children: [_jsx("span", { children: t("customactioneditor.TestAction") }), _jsx("span", { children: testExpanded ? (_jsx(ChevronDown, { className: "w-3 h-3" })) : (_jsx(ChevronRight, { className: "w-3 h-3" })) })] }), testExpanded && (_jsxs("div", { className: "flex flex-col gap-2 pl-2 border-l-2 border-border", children: [parameters
572
+ }, placeholder: t("customactioneditor.AvailableParams"), rows: 6, className: "bg-surface border border-border px-2 py-1.5 text-sm text-txt placeholder:text-muted/50 outline-none focus:border-accent resize-none font-mono" })] })), _jsxs("div", { className: "flex flex-col gap-2 border-t border-border pt-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-xs text-muted", children: t("customactioneditor.Parameters") }), _jsx("button", { type: "button", onClick: addParameter, className: "text-xs text-txt hover:opacity-80 cursor-pointer", children: t("customactioneditor.AddParameter") })] }), parameters.map((param, paramIdx) => (_jsxs("div", { className: "flex gap-2 items-start", children: [_jsx("input", { type: "text", value: param.name, onChange: (e) => updateParameter(paramIdx, "name", e.target.value), placeholder: t("customactioneditor.paramName"), className: "w-32 bg-surface border border-border px-2 py-1.5 text-sm text-txt placeholder:text-muted/50 outline-none focus:border-accent" }), _jsx("input", { type: "text", value: param.description, onChange: (e) => updateParameter(paramIdx, "description", e.target.value), placeholder: t("skillsview.Description"), className: "flex-1 bg-surface border border-border px-2 py-1.5 text-sm text-txt placeholder:text-muted/50 outline-none focus:border-accent" }), _jsxs("span", { className: "flex items-center gap-1 text-xs text-muted cursor-pointer", children: [_jsx("input", { type: "checkbox", checked: param.required, onChange: (e) => updateParameter(paramIdx, "required", e.target.checked), className: "cursor-pointer" }), t("customactioneditor.Required")] }), _jsx("button", { type: "button", onClick: () => removeParameter(paramIdx), className: "px-2 text-muted hover:text-txt cursor-pointer", children: t("bugreportmodal.Times") })] }, `${param.name}-${param.description ?? ""}`)))] }), _jsxs("div", { className: "flex flex-col gap-2 border-t border-border pt-3", children: [_jsxs("button", { type: "button", onClick: () => setTestExpanded((expanded) => !expanded), className: "flex items-center justify-between text-xs text-muted hover:text-txt cursor-pointer", children: [_jsx("span", { children: t("customactioneditor.TestAction") }), _jsx("span", { children: testExpanded ? (_jsx(ChevronDown, { className: "w-3 h-3" })) : (_jsx(ChevronRight, { className: "w-3 h-3" })) })] }), testExpanded && (_jsxs("div", { className: "flex flex-col gap-2 pl-2 border-l-2 border-border", children: [parameters
573
573
  .filter((p) => p.name.trim())
574
574
  .map((param) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-xs text-muted", children: param.name }), _jsx("input", { type: "text", value: testParams[param.name] || "", onChange: (e) => setTestParams({
575
575
  ...testParams,
@@ -1 +1 @@
1
- {"version":3,"file":"FineTuningView.d.ts","sourceRoot":"","sources":["../../src/components/FineTuningView.tsx"],"names":[],"mappings":"AA+EA,wBAAgB,cAAc,4CAq+B7B"}
1
+ {"version":3,"file":"FineTuningView.d.ts","sourceRoot":"","sources":["../../src/components/FineTuningView.tsx"],"names":[],"mappings":"AAkFA,wBAAgB,cAAc,4CAq+B7B"}
@@ -5,7 +5,7 @@ import { useApp } from "@elizaos/app-core/state";
5
5
  import { confirmDesktopAction } from "@elizaos/app-core/utils";
6
6
  import { Button, Input } from "@elizaos/ui";
7
7
  import { useCallback, useEffect, useState } from "react";
8
- import { parsePositiveFloat, parsePositiveInteger } from "../utils/number-parsing";
8
+ import { parsePositiveFloat, parsePositiveInteger, } from "../utils/number-parsing";
9
9
  const TRAINING_EVENT_KINDS = new Set([
10
10
  "job_started",
11
11
  "job_progress",
@@ -429,5 +429,5 @@ export function FineTuningView() {
429
429
  void handleSmokeTestSelectedModel();
430
430
  }, children: modelAction === `smoke:${selectedModel.id}`
431
431
  ? "Testing..."
432
- : "Run Smoke Prompt" })] }), smokeResult && (_jsx("textarea", { readOnly: true, value: smokeResult, className: "w-full min-h-24 px-2 py-1 border border-border bg-bg text-[11px] font-mono" }))] }))] })] })] }), _jsxs("section", { className: "border border-border bg-card p-4", children: [_jsx("h3", { className: "text-sm font-bold mb-3", children: t("finetuningview.LiveTrainingEvents") }), _jsx("div", { className: "max-h-56 overflow-auto border border-border", children: trainingEvents.length === 0 ? (_jsx("div", { className: "p-3 text-xs text-muted", children: t("finetuningview.NoLiveEventsYet") })) : (trainingEvents.map((event, index) => (_jsxs("div", { className: "px-2 py-1.5 border-b border-border text-xs", children: [_jsx("span", { className: "font-mono text-muted mr-2", children: formatTime(event.ts, { fallback: "—" }) }), _jsx("span", { className: "font-semibold", children: event.kind }), typeof event.progress === "number" && (_jsxs("span", { className: "text-muted", children: [" ", "\u00B7 ", formatProgress(event.progress)] })), event.phase && (_jsxs("span", { className: "text-muted", children: [" \u00B7 ", event.phase] })), _jsx("div", { className: "text-muted mt-0.5", children: event.message })] }, `${event.ts}-${event.kind}-${index}`)))) })] })] }));
432
+ : "Run Smoke Prompt" })] }), smokeResult && (_jsx("textarea", { readOnly: true, value: smokeResult, className: "w-full min-h-24 px-2 py-1 border border-border bg-bg text-[11px] font-mono" }))] }))] })] })] }), _jsxs("section", { className: "border border-border bg-card p-4", children: [_jsx("h3", { className: "text-sm font-bold mb-3", children: t("finetuningview.LiveTrainingEvents") }), _jsx("div", { className: "max-h-56 overflow-auto border border-border", children: trainingEvents.length === 0 ? (_jsx("div", { className: "p-3 text-xs text-muted", children: t("finetuningview.NoLiveEventsYet") })) : (trainingEvents.map((event) => (_jsxs("div", { className: "px-2 py-1.5 border-b border-border text-xs", children: [_jsx("span", { className: "font-mono text-muted mr-2", children: formatTime(event.ts, { fallback: "—" }) }), _jsx("span", { className: "font-semibold", children: event.kind }), typeof event.progress === "number" && (_jsxs("span", { className: "text-muted", children: [" ", "\u00B7 ", formatProgress(event.progress)] })), event.phase && (_jsxs("span", { className: "text-muted", children: [" \u00B7 ", event.phase] })), _jsx("div", { className: "text-muted mt-0.5", children: event.message })] }, `${event.ts}-${event.kind}-${String(event.message ?? "")}`)))) })] })] }));
433
433
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalEmoteOverlay.d.ts","sourceRoot":"","sources":["../../src/components/GlobalEmoteOverlay.tsx"],"names":[],"mappings":"AAyCA,wBAAgB,kBAAkB,4CAiHjC"}
1
+ {"version":3,"file":"GlobalEmoteOverlay.d.ts","sourceRoot":"","sources":["../../src/components/GlobalEmoteOverlay.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,kBAAkB,4CAiHjC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { APP_EMOTE_EVENT, } from "../events";
3
2
  import { useEffect, useRef, useState } from "react";
3
+ import { APP_EMOTE_EVENT } from "../events";
4
4
  const OVERLAY_LIFETIME_MS = 2400;
5
5
  const EMOTE_EMOJIS = {
6
6
  wave: "\u{1F44B}",
@@ -209,7 +209,7 @@ function runCountLabel(count, t) {
209
209
  : t("heartbeatsview.runCountPlural", { count });
210
210
  }
211
211
  export function HeartbeatsView() {
212
- const { triggers = [], triggersLoading = false, triggersSaving = false, triggerRunsById = {}, triggerHealth = null, triggerError = null, loadTriggers = async () => { }, createTrigger = async () => null, updateTrigger = async () => null, deleteTrigger = async () => true, runTriggerNow = async () => true, loadTriggerRuns = async () => { }, loadTriggerHealth = async () => { }, t, } = useApp();
212
+ const { triggers = [], triggersLoading = false, triggersSaving = false, triggerRunsById = {}, triggerHealth: _triggerHealth = null, triggerError = null, loadTriggers = async () => { }, createTrigger = async () => null, updateTrigger = async () => null, deleteTrigger = async () => true, runTriggerNow = async () => true, loadTriggerRuns = async () => { }, loadTriggerHealth = async () => { }, t, } = useApp();
213
213
  const [form, setForm] = useState(emptyForm);
214
214
  const [editingId, setEditingId] = useState(null);
215
215
  const [selectedTriggerId, setSelectedTriggerId] = useState(null);
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingScreen.d.ts","sourceRoot":"","sources":["../../src/components/LoadingScreen.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAQ7C,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAA0B,EAC1B,cAAc,EACd,MAAM,GACP,EAAE,kBAAkB,2CAoDpB"}
1
+ {"version":3,"file":"LoadingScreen.d.ts","sourceRoot":"","sources":["../../src/components/LoadingScreen.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAQ7C,UAAU,kBAAkB;IAC1B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAA0B,EAC1B,cAAc,EACd,MAAM,GACP,EAAE,kBAAkB,2CAqFpB"}
@@ -11,6 +11,7 @@ const PHASE_META = {
11
11
  };
12
12
  export function LoadingScreen({ phase = "starting-backend", elapsedSeconds, vrmUrl, }) {
13
13
  const [vrmCached, setVrmCached] = useState(false);
14
+ const [fetchProgress, setFetchProgress] = useState(0);
14
15
  const [, setRuntimeElapsedSeconds] = useState(0);
15
16
  useEffect(() => {
16
17
  if (typeof elapsedSeconds === "number")
@@ -25,15 +26,45 @@ export function LoadingScreen({ phase = "starting-backend", elapsedSeconds, vrmU
25
26
  if (!vrmUrl)
26
27
  return;
27
28
  const controller = new AbortController();
28
- fetch(vrmUrl, { signal: controller.signal })
29
- .then(() => setVrmCached(true))
30
- .catch(() => {
31
- // Non-blocking VRM will load normally later.
32
- });
29
+ (async () => {
30
+ try {
31
+ const response = await fetch(vrmUrl, { signal: controller.signal });
32
+ const contentLength = Number(response.headers.get("content-length") || 0);
33
+ if (!contentLength || !response.body) {
34
+ setVrmCached(true);
35
+ return;
36
+ }
37
+ const reader = response.body.getReader();
38
+ let received = 0;
39
+ for (;;) {
40
+ const { done, value } = await reader.read();
41
+ if (done)
42
+ break;
43
+ received += value.byteLength;
44
+ setFetchProgress(Math.min(received / contentLength, 1));
45
+ }
46
+ setVrmCached(true);
47
+ }
48
+ catch {
49
+ // Non-blocking — VRM will load normally later.
50
+ }
51
+ })();
33
52
  return () => controller.abort();
34
53
  }, [vrmUrl]);
35
54
  const meta = PHASE_META[phase];
36
- const progress = vrmCached ? Math.max(meta.progress, 80) : meta.progress;
55
+ let progress;
56
+ if (vrmCached) {
57
+ progress = Math.max(meta.progress, 80);
58
+ }
59
+ else if (fetchProgress > 0) {
60
+ progress = Math.max(meta.progress, Math.round(55 + fetchProgress * 25));
61
+ }
62
+ else {
63
+ progress = meta.progress;
64
+ }
37
65
  const label = vrmCached && phase !== "ready" ? "Loading avatar" : meta.label;
38
- return (_jsx("div", { className: "loading-screen", children: _jsxs("div", { className: "loading-screen__center", children: [_jsxs("div", { className: "loading-screen__title", children: ["LOADING", _jsx("span", { className: "loading-screen__dots" })] }), _jsxs("div", { className: "loading-screen__bar-row", children: [_jsx("div", { className: "loading-screen__progress-track", children: _jsx("div", { className: "loading-screen__progress-fill", style: { width: `${progress}%` } }) }), _jsxs("div", { className: "loading-screen__percent", children: [progress, " %"] })] }), _jsx("div", { className: "loading-screen__phase", children: label })] }) }));
66
+ return (_jsx("div", { className: "loading-screen", children: _jsxs("div", { className: "loading-screen__center", children: [_jsxs("div", { className: "loading-screen__title", children: ["LOADING", _jsx("span", { className: "loading-screen__dots" })] }), _jsxs("div", { className: "loading-screen__bar-row", children: [_jsx("div", { className: "loading-screen__progress-track", children: _jsx("div", { className: "loading-screen__progress-fill", style: {
67
+ width: `${progress}%`,
68
+ transition: "width 1.5s ease-out",
69
+ } }) }), _jsxs("div", { className: "loading-screen__percent", children: [progress, " %"] })] }), _jsx("div", { className: "loading-screen__phase", children: label })] }) }));
39
70
  }
@@ -7,11 +7,11 @@ import { useEffect } from "react";
7
7
  import { VrmStage } from "./companion/VrmStage";
8
8
  import { ActivateStep } from "./onboarding/ActivateStep";
9
9
  import { ConnectionStep } from "./onboarding/ConnectionStep";
10
+ import { IdentityStep } from "./onboarding/IdentityStep";
10
11
  import { OnboardingPanel } from "./onboarding/OnboardingPanel";
11
12
  import { OnboardingStepNav } from "./onboarding/OnboardingStepNav";
12
13
  import { PermissionsStep } from "./onboarding/PermissionsStep";
13
14
  import { RpcStep } from "./onboarding/RpcStep";
14
- import { IdentityStep } from "./onboarding/IdentityStep";
15
15
  import { WakeUpStep } from "./onboarding/WakeUpStep";
16
16
  export function OnboardingWizard() {
17
17
  const { onboardingStep, selectedVrmIndex, customVrmUrl, uiLanguage, uiTheme, setState, t, } = useApp();
@@ -1 +1 @@
1
- {"version":3,"file":"PluginsView.d.ts","sourceRoot":"","sources":["../../src/components/PluginsView.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAgFH,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAqE7C,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EAAE,EACxB,QAAQ,EAAE,MAAM,GACf;IACD,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACrC,CAuUA;AA4XD,KAAK,eAAe,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AAwtErE,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,EAC1B,IAAY,EACZ,OAAO,GACR,EAAE;IACD,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,2CAUA"}
1
+ {"version":3,"file":"PluginsView.d.ts","sourceRoot":"","sources":["../../src/components/PluginsView.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAgFH,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAqE7C,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EAAE,EACxB,QAAQ,EAAE,MAAM,GACf;IACD,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACrC,CAuUA;AA4XD,KAAK,eAAe,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AA8tErE,uDAAuD;AACvD,wBAAgB,WAAW,CAAC,EAC1B,IAAY,EACZ,OAAO,GACR,EAAE;IACD,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,2CAUA"}
@@ -1269,6 +1269,9 @@ function PluginListView({ label, mode = "all", inModal }) {
1269
1269
  setConnectorSelectedId(pluginId);
1270
1270
  setConnectorExpandedIds((prev) => {
1271
1271
  if (desktopConnectorLayout) {
1272
+ // Accordion: toggle off if already open, otherwise open this one only
1273
+ if (prev.has(pluginId))
1274
+ return new Set();
1272
1275
  return new Set([pluginId]);
1273
1276
  }
1274
1277
  const next = new Set(prev);
@@ -1432,7 +1435,7 @@ function PluginListView({ label, mode = "all", inModal }) {
1432
1435
  : "Save" })] })] })) : (_jsxs("div", { className: "plugins-game-detail-empty", children: [_jsx("span", { className: "plugins-game-detail-empty-icon", children: "\uD83E\uDDE9" }), _jsxs("span", { className: "plugins-game-detail-empty-text", children: [t("pluginsview.SelectA"), " ", isConnectorLikeMode ? "connector" : "plugin", " ", t("pluginsview.toC")] })] })) })] }));
1433
1436
  }
1434
1437
  // ── Main render ────────────────────────────────────────────────────
1435
- return (_jsxs("div", { "data-testid": mode === "social" ? "plugins-view-social" : undefined, className: `relative min-h-0 ${showDesktopSubgroupSidebar ? "md:pl-[18rem]" : ""}`, children: [showDesktopSubgroupSidebar && (_jsx("aside", { className: "hidden md:absolute md:left-0 md:top-0 md:block md:w-64", "data-testid": "plugins-subgroup-sidebar", children: _jsxs("div", { className: "sticky top-0 rounded-[28px] border border-border/50 bg-bg/35 p-5 backdrop-blur-xl shadow-sm", children: [_jsx("div", { className: "mb-4 text-[11px] font-semibold uppercase tracking-[0.18em] text-muted/80", children: "Plugin Types" }), _jsx("nav", { className: "flex flex-col gap-2", children: subgroupTags.map((tag) => renderSubgroupFilterButton(tag, { sidebar: true })) })] }) })), _jsxs("div", { className: "min-w-0", children: [showToolbar && (_jsxs("div", { className: "flex items-center gap-3 mb-4 flex-wrap", children: [_jsxs("div", { className: "relative flex-1 min-w-[220px]", children: [_jsx(Input, { type: "text", className: "w-full bg-card/60 backdrop-blur-md shadow-inner pr-8 h-9 rounded-xl focus-visible:ring-accent border-border/40", placeholder: searchPlaceholder, value: pluginSearch, onChange: (e) => setState("pluginSearch", e.target.value) }), pluginSearch && (_jsx(Button, { variant: "ghost", size: "icon", className: "absolute right-1 top-1/2 -translate-y-1/2 w-6 h-6 text-muted hover:text-txt rounded-full", onClick: () => setState("pluginSearch", ""), title: t("pluginsview.ClearSearch"), children: "\u2715" }))] }), _jsx("div", { className: "flex gap-1.5 shrink-0 bg-black/10 p-1 rounded-xl border border-white/5", children: ["all", "enabled"].map((s) => (_jsx(Button, { variant: pluginStatusFilter === s ? "default" : "ghost", size: "sm", className: `h-7 px-3 text-[11px] font-bold tracking-wide rounded-lg transition-all ${pluginStatusFilter === s
1438
+ return (_jsxs("div", { "data-testid": mode === "social" ? "plugins-view-social" : undefined, className: `relative min-h-0 ${showDesktopSubgroupSidebar ? "md:pl-[18rem]" : ""}`, children: [showDesktopSubgroupSidebar && (_jsx("aside", { className: "hidden md:absolute md:left-0 md:top-0 md:block md:w-64", "data-testid": "plugins-subgroup-sidebar", children: _jsxs("div", { className: "sticky top-0 rounded-[28px] border border-border/50 bg-bg/35 p-5 backdrop-blur-xl shadow-sm", children: [_jsx("div", { className: "mb-4 text-[11px] font-semibold uppercase tracking-[0.18em] text-muted/80", children: "Plugin Types" }), _jsx("nav", { className: "flex flex-col gap-2", children: subgroupTags.map((tag) => renderSubgroupFilterButton(tag, { sidebar: true })) })] }) })), _jsxs("div", { className: "min-w-0", children: [showToolbar && (_jsxs("div", { className: "flex items-center gap-3 mb-4 flex-wrap", children: [_jsxs("div", { className: "relative flex-1 min-w-[220px]", children: [_jsx(Input, { type: "text", name: "plugin-search", autoComplete: "off", "data-1p-ignore": true, "data-lpignore": "true", className: "w-full bg-card/60 backdrop-blur-md shadow-inner pr-8 h-9 rounded-xl focus-visible:ring-accent border-border/40", placeholder: searchPlaceholder, value: pluginSearch, onChange: (e) => setState("pluginSearch", e.target.value) }), pluginSearch && (_jsx(Button, { variant: "ghost", size: "icon", className: "absolute right-1 top-1/2 -translate-y-1/2 w-6 h-6 text-muted hover:text-txt rounded-full", onClick: () => setState("pluginSearch", ""), title: t("pluginsview.ClearSearch"), children: "\u2715" }))] }), _jsx("div", { className: "flex gap-1.5 shrink-0 bg-black/10 p-1 rounded-xl border border-white/5", children: ["all", "enabled"].map((s) => (_jsx(Button, { variant: pluginStatusFilter === s ? "default" : "ghost", size: "sm", className: `h-7 px-3 text-[11px] font-bold tracking-wide rounded-lg transition-all ${pluginStatusFilter === s
1436
1439
  ? "shadow-sm"
1437
1440
  : "text-muted hover:text-txt hover:bg-white/5"}`, onClick: () => setState("pluginStatusFilter", s), children: s === "all"
1438
1441
  ? `All (${categoryPlugins.length})`
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { BugReportModal, CommandPalette, RestartBanner, ShortcutsOverlay, } from "./index";
3
2
  import { GlobalEmoteOverlay } from "./GlobalEmoteOverlay";
3
+ import { BugReportModal, CommandPalette, RestartBanner, ShortcutsOverlay, } from "./index";
4
4
  export function ShellOverlays({ actionNotice, }) {
5
5
  return (_jsxs(_Fragment, { children: [_jsx(CommandPalette, {}), _jsx(RestartBanner, {}), _jsx(BugReportModal, {}), _jsx(ShortcutsOverlay, {}), _jsx(GlobalEmoteOverlay, {}), actionNotice && (_jsx("div", { className: `fixed bottom-6 left-1/2 -translate-x-1/2 px-5 py-2 rounded-lg text-[13px] font-medium z-[10000] text-white ${actionNotice.tone === "error"
6
6
  ? "bg-danger"
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceConfigView.d.ts","sourceRoot":"","sources":["../../src/components/VoiceConfigView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgTH,wBAAgB,eAAe,4CA0W9B"}
1
+ {"version":3,"file":"VoiceConfigView.d.ts","sourceRoot":"","sources":["../../src/components/VoiceConfigView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+SH,wBAAgB,eAAe,4CA0W9B"}
@@ -11,7 +11,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
11
  import { Button, Input } from "@elizaos/ui";
12
12
  import { useCallback, useEffect, useRef, useState } from "react";
13
13
  import { client, } from "../api";
14
- import { getSwabblePlugin, } from "../bridge/native-plugins";
14
+ import { getSwabblePlugin } from "../bridge/native-plugins";
15
15
  import { dispatchWindowEvent, VOICE_CONFIG_UPDATED_EVENT } from "../events";
16
16
  import { useTimeout } from "../hooks";
17
17
  import { useApp } from "../state";
@@ -130,7 +130,9 @@ function WakeWordSection({ serverConfig, }) {
130
130
  setEnabled(false);
131
131
  }
132
132
  else {
133
- const result = await getSwabblePlugin().start({ config: buildConfig() });
133
+ const result = await getSwabblePlugin().start({
134
+ config: buildConfig(),
135
+ });
134
136
  if (result.started)
135
137
  setEnabled(true);
136
138
  }
@@ -212,6 +212,8 @@ export declare class VrmEngine {
212
212
  setWorldUrl(url: string | null): Promise<void>;
213
213
  playEmote(path: string, duration: number, loop: boolean): Promise<void>;
214
214
  stopEmote(): void;
215
+ /** Play a one-shot wave greeting after the VRM becomes visible. */
216
+ playWaveGreeting(): void;
215
217
  loadVrmFromUrl(url: string, name?: string): Promise<void>;
216
218
  private playTeleportReveal;
217
219
  private applyTeleportFallbackDissolve;
@@ -1 +1 @@
1
- {"version":3,"file":"VrmEngine.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/VrmEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VrmEngine.d.ts","sourceRoot":"","sources":["../../../src/components/avatar/VrmEngine.ts"],"names":[],"mappings":"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"}
@@ -1386,6 +1386,10 @@ export class VrmEngine {
1386
1386
  }
1387
1387
  activeEmote?.fadeOut(fadeDuration);
1388
1388
  }
1389
+ /** Play a one-shot wave greeting after the VRM becomes visible. */
1390
+ playWaveGreeting() {
1391
+ this.playEmote("animations/emotes/waving-both-hands.glb.gz", 3, false);
1392
+ }
1389
1393
  async loadVrmFromUrl(url, name) {
1390
1394
  await this.whenReady();
1391
1395
  if (!this.scene)
@@ -1486,9 +1490,14 @@ export class VrmEngine {
1486
1490
  await this.loadAndPlayIdle(vrm);
1487
1491
  if (!this.loadingAborted && this.vrm === vrm) {
1488
1492
  this.vrmReady = true;
1493
+ // Let the idle animation settle into a natural pose before revealing
1494
+ await new Promise((resolve) => setTimeout(resolve, 300));
1495
+ if (this.loadingAborted || this.vrm !== vrm)
1496
+ return;
1489
1497
  await this.playTeleportReveal(vrm);
1490
1498
  vrm.scene.visible = true;
1491
1499
  this.startPendingWorldReveal(true);
1500
+ this.playWaveGreeting();
1492
1501
  }
1493
1502
  }
1494
1503
  catch {
@@ -1521,8 +1530,8 @@ export class VrmEngine {
1521
1530
  appliedNodeDissolve = true;
1522
1531
  mat.userData._dissolveApplied = true;
1523
1532
  mat.userData._origOpacityNode = mat.opacityNode ?? null;
1524
- // biome-ignore lint/suspicious/noExplicitAny: Three.js NodeMaterial emissiveNode is not in public types
1525
- mat.userData._origEmissiveNode = mat.emissiveNode ?? null;
1533
+ mat.userData._origEmissiveNode =
1534
+ mat.emissiveNode ?? null;
1526
1535
  mat.userData._origAlphaTest = mat.alphaTest;
1527
1536
  // World-space Y from TSL
1528
1537
  const worldY = tsl.positionWorld.y;
@@ -1570,10 +1579,9 @@ export class VrmEngine {
1570
1579
  mat.opacityNode = origOpacity
1571
1580
  ? origOpacity.mul(dissolveAlpha)
1572
1581
  : dissolveAlpha;
1573
- // biome-ignore lint/suspicious/noExplicitAny: Three.js NodeMaterial emissiveNode is not in public types
1574
- const origEmissive = mat.emissiveNode;
1575
- // biome-ignore lint/suspicious/noExplicitAny: Three.js NodeMaterial emissiveNode is not in public types
1576
- mat.emissiveNode = origEmissive
1582
+ const matWithEmissive = mat;
1583
+ const origEmissive = matWithEmissive.emissiveNode;
1584
+ matWithEmissive.emissiveNode = origEmissive
1577
1585
  ? origEmissive.add(emissiveBoost)
1578
1586
  : emissiveBoost;
1579
1587
  mat.alphaTest = 0.01;
@@ -1,2 +1,2 @@
1
- export { CompanionSceneHost, SharedCompanionScene, useSharedCompanionScene } from "../CompanionSceneHost";
1
+ export { CompanionSceneHost, SharedCompanionScene, useSharedCompanionScene, } from "../CompanionSceneHost";
2
2
  //# sourceMappingURL=CompanionSceneHost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CompanionSceneHost.d.ts","sourceRoot":"","sources":["../../../src/components/companion/CompanionSceneHost.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"CompanionSceneHost.d.ts","sourceRoot":"","sources":["../../../src/components/companion/CompanionSceneHost.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- export { CompanionSceneHost, SharedCompanionScene, useSharedCompanionScene } from "../CompanionSceneHost";
1
+ export { CompanionSceneHost, SharedCompanionScene, useSharedCompanionScene, } from "../CompanionSceneHost";