@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.
- package/.turbo/turbo-build.log +0 -1
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +26 -12
- package/dist/api/client.d.ts +3 -3
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +24 -13
- package/dist/bridge/plugin-bridge.d.ts.map +1 -1
- package/dist/components/AvatarLoader.d.ts +3 -1
- package/dist/components/AvatarLoader.d.ts.map +1 -1
- package/dist/components/AvatarLoader.js +4 -1
- package/dist/components/BscTradePanel.d.ts +1 -1
- package/dist/components/BscTradePanel.d.ts.map +1 -1
- package/dist/components/CharacterView.d.ts.map +1 -1
- package/dist/components/CharacterView.js +50 -15
- package/dist/components/ChatView.js +1 -1
- package/dist/components/ConfigPageView.d.ts.map +1 -1
- package/dist/components/ConfigPageView.js +9 -8
- package/dist/components/ConversationsSidebar.js +1 -1
- package/dist/components/CustomActionEditor.js +1 -1
- package/dist/components/FineTuningView.d.ts.map +1 -1
- package/dist/components/FineTuningView.js +2 -2
- package/dist/components/GlobalEmoteOverlay.d.ts.map +1 -1
- package/dist/components/GlobalEmoteOverlay.js +1 -1
- package/dist/components/HeartbeatsView.js +1 -1
- package/dist/components/LoadingScreen.d.ts.map +1 -1
- package/dist/components/LoadingScreen.js +38 -7
- package/dist/components/OnboardingWizard.js +1 -1
- package/dist/components/PluginsView.d.ts.map +1 -1
- package/dist/components/PluginsView.js +4 -1
- package/dist/components/ShellOverlays.js +1 -1
- package/dist/components/VoiceConfigView.d.ts.map +1 -1
- package/dist/components/VoiceConfigView.js +4 -2
- package/dist/components/avatar/VrmEngine.d.ts +2 -0
- package/dist/components/avatar/VrmEngine.d.ts.map +1 -1
- package/dist/components/avatar/VrmEngine.js +14 -6
- package/dist/components/companion/CompanionSceneHost.d.ts +1 -1
- package/dist/components/companion/CompanionSceneHost.d.ts.map +1 -1
- package/dist/components/companion/CompanionSceneHost.js +1 -1
- package/dist/components/index.d.ts +10 -10
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +10 -10
- package/dist/components/inventory/TokensTable.js +2 -2
- package/dist/components/onboarding/IdentityStep.d.ts.map +1 -1
- package/dist/components/onboarding/IdentityStep.js +1 -1
- package/dist/components/shared/ShellHeaderControls.js +1 -1
- package/dist/config/config-field.d.ts.map +1 -1
- package/dist/config/config-field.js +7 -8
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/hooks/useVoiceChat.d.ts.map +1 -1
- package/dist/hooks/useVoiceChat.js +3 -1
- package/dist/i18n/locales/en.json +1192 -1192
- package/dist/i18n/locales/es.json +1192 -1192
- package/dist/i18n/locales/ko.json +1192 -1192
- package/dist/i18n/locales/pt.json +1192 -1192
- package/dist/i18n/locales/zh-CN.json +1192 -1192
- package/dist/package.json +181 -0
- package/dist/platform/lifo.d.ts.map +1 -1
- package/dist/platform/lifo.js +4 -1
- package/dist/state/AppContext.d.ts.map +1 -1
- package/dist/state/AppContext.js +23 -6
- package/dist/state/internal.d.ts +1 -1
- package/dist/state/internal.d.ts.map +1 -1
- package/dist/state/internal.js +1 -1
- package/dist/state/parsers.d.ts.map +1 -1
- package/dist/state/parsers.js +3 -2
- package/dist/state/persistence.js +1 -1
- package/dist/styles/anime.css +6324 -0
- package/dist/styles/base.css +196 -0
- package/dist/styles/onboarding-game.css +738 -0
- package/dist/styles/styles.css +2087 -0
- package/dist/styles/xterm.css +241 -0
- package/package.json +4 -4
- package/src/App.tsx +35 -14
- package/src/ambient.d.ts +5 -5
- package/src/api/client.ts +36 -23
- package/src/bridge/plugin-bridge.ts +1 -1
- package/src/components/AvatarLoader.tsx +6 -0
- package/src/components/BscTradePanel.tsx +1 -1
- package/src/components/CharacterView.tsx +536 -367
- package/src/components/ChatView.tsx +3 -3
- package/src/components/ConfigPageView.tsx +9 -8
- package/src/components/ConversationsSidebar.tsx +1 -1
- package/src/components/CustomActionEditor.tsx +6 -6
- package/src/components/FineTuningView.tsx +6 -3
- package/src/components/GlobalEmoteOverlay.tsx +1 -4
- package/src/components/HeartbeatsView.tsx +1 -1
- package/src/components/InventoryView.tsx +2 -2
- package/src/components/LoadingScreen.tsx +39 -6
- package/src/components/OnboardingWizard.tsx +1 -1
- package/src/components/PluginsView.tsx +6 -0
- package/src/components/ShellOverlays.tsx +1 -1
- package/src/components/VoiceConfigView.tsx +4 -5
- package/src/components/avatar/VrmEngine.ts +25 -7
- package/src/components/companion/CompanionSceneHost.tsx +5 -1
- package/src/components/index.ts +10 -10
- package/src/components/inventory/TokensTable.tsx +2 -2
- package/src/components/onboarding/IdentityStep.tsx +9 -13
- package/src/components/shared/ShellHeaderControls.tsx +1 -1
- package/src/config/config-field.tsx +7 -8
- package/src/config/index.ts +3 -3
- package/src/hooks/useVoiceChat.ts +5 -3
- package/src/platform/lifo.ts +14 -4
- package/src/state/AppContext.tsx +24 -1
- package/src/state/internal.ts +6 -6
- package/src/state/parsers.ts +4 -3
- package/src/state/persistence.ts +1 -1
- package/test/app/MessageContent.test.tsx +42 -0
- package/test/app/bug-report-modal.test.tsx +3 -3
- package/test/app/chat-view.test.tsx +3 -3
- package/test/app/cloud-login-lock.test.ts +3 -2
- package/test/app/custom-actions-smoke.test.ts +3 -3
- package/test/app/onboarding-language.test.tsx +3 -3
- package/test/app/pages-navigation-smoke.e2e.test.ts +13 -8
- package/test/app/plugin-bridge.test.ts +1 -1
- package/test/app/provider-dropdown-default.test.tsx +2 -4
- package/test/app/restart-banner.test.tsx +3 -3
- package/test/app/shell-mode-switching.e2e.test.ts +6 -6
- package/test/app/shell-mode-tab-memory.test.tsx +1 -1
- package/test/app/startup-chat.e2e.test.ts +3 -3
- package/test/app/triggers-view.e2e.test.ts +3 -2
- package/test/app/wallet-api-save-lock.test.ts +2 -1
- package/test/utils/assistant-text.test.ts +64 -0
- 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
|
-
{
|
|
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"
|
|
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] ??
|
|
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" &&
|
|
675
|
-
|
|
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}}"
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
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
|
|
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
|
|
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" &&
|
|
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,
|
|
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,
|
|
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
|
|
184
|
-
const [
|
|
185
|
-
const [
|
|
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
|
|
188
|
-
setSelectedEvmRpc(
|
|
189
|
-
setSelectedBscRpc(
|
|
190
|
-
setSelectedSolanaRpc(
|
|
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,
|
|
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":"
|
|
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
|
|
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":"
|
|
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,
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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: {
|
|
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;
|
|
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;
|
|
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
|
|
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({
|
|
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":"AAWA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
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
|
-
|
|
1525
|
-
|
|
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
|
-
|
|
1574
|
-
const origEmissive =
|
|
1575
|
-
|
|
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,
|
|
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";
|