@elizaos/app-core 2.0.0-alpha.22 → 2.0.0-alpha.24
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/dist/components/OnboardingWizard.js +4 -4
- package/dist/components/onboarding/IdentityStep.d.ts.map +1 -1
- package/dist/components/onboarding/IdentityStep.js +16 -95
- package/dist/package.json +4 -3
- package/package.json +4 -4
- package/src/components/OnboardingWizard.tsx +4 -4
- package/src/components/onboarding/IdentityStep.tsx +0 -8
- package/test/app/onboarding-language.test.tsx +4 -4
- package/test/app/onboarding-steps.test.tsx +32 -32
- package/test/app/startup-onboarding.e2e.test.ts +8 -8
- package/.turbo/turbo-lint$colon$check.log +0 -2
- package/.turbo/turbo-typecheck.log +0 -1
|
@@ -48,7 +48,7 @@ export function OnboardingWizard() {
|
|
|
48
48
|
return null;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
return (_jsxs("div", { className: "onboarding-screen", children: [_jsx("div", { className: "onboarding-bg" }), _jsx("div", { className: "onboarding-bg-overlay" }), _jsx(VrmStage, { vrmPath: vrmPath, worldUrl: worldUrl, fallbackPreviewUrl: fallbackPreview, cameraProfile: "companion_close", initialCompanionZoomNormalized: 1, t: t }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tr", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--bl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--br", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsx("div", { style: {
|
|
51
|
+
return (_jsxs("div", { className: "onboarding-screen", children: [_jsx("div", { className: "onboarding-bg" }), !isCharacterSelect && _jsx("div", { className: "onboarding-bg-overlay" }), _jsx(VrmStage, { vrmPath: vrmPath, worldUrl: worldUrl, fallbackPreviewUrl: fallbackPreview, cameraProfile: "companion_close", initialCompanionZoomNormalized: 1, t: t }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--tr", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--bl", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsxs("svg", { className: "onboarding-corner onboarding-corner--br", viewBox: "0 0 36 36", fill: "none", stroke: "rgba(240,185,11,0.18)", strokeWidth: "1", "aria-hidden": "true", children: [_jsx("path", { d: "M0 18 L0 0 L18 0" }), _jsx("circle", { cx: "0", cy: "0", r: "2", fill: "rgba(240,185,11,0.25)", stroke: "none" })] }), _jsx("div", { style: {
|
|
52
52
|
position: "absolute",
|
|
53
53
|
top: "1rem",
|
|
54
54
|
right: "1rem",
|
|
@@ -57,15 +57,15 @@ export function OnboardingWizard() {
|
|
|
57
57
|
gap: "0.5rem",
|
|
58
58
|
alignItems: "center",
|
|
59
59
|
}, children: _jsx(LanguageDropdown, { uiLanguage: uiLanguage, setUiLanguage: setUiLanguage, t: t, variant: "companion" }) }), isCharacterSelect ? (
|
|
60
|
-
/* ── Full-screen
|
|
60
|
+
/* ── Full-screen character select — anchored to bottom ── */
|
|
61
61
|
_jsx("div", { style: {
|
|
62
62
|
position: "absolute",
|
|
63
63
|
inset: 0,
|
|
64
64
|
zIndex: 40,
|
|
65
65
|
display: "flex",
|
|
66
|
-
alignItems: "
|
|
66
|
+
alignItems: "flex-end",
|
|
67
67
|
justifyContent: "center",
|
|
68
|
-
|
|
68
|
+
paddingBottom: "3rem",
|
|
69
69
|
}, children: _jsx(IdentityStep, {}) })) : (
|
|
70
70
|
/* ── Standard overlaid UI — step nav + content panel ── */
|
|
71
71
|
_jsxs("div", { className: "onboarding-ui-overlay", children: [_jsx(OnboardingStepNav, {}), _jsx(OnboardingPanel, { step: onboardingStep, children: renderStep() })] }))] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentityStep.d.ts","sourceRoot":"","sources":["../../../src/components/onboarding/IdentityStep.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IdentityStep.d.ts","sourceRoot":"","sources":["../../../src/components/onboarding/IdentityStep.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,YAAY,4CA6P3B"}
|
|
@@ -9,6 +9,7 @@ const IDENTITY_PRESETS = {
|
|
|
9
9
|
"lol k": { name: "Anzu", avatarIndex: 3 },
|
|
10
10
|
"hehe~": { name: "Aya", avatarIndex: 4 },
|
|
11
11
|
};
|
|
12
|
+
/** Identical clip-paths used by CharacterView roster cards. */
|
|
12
13
|
const SLANT_CLIP = "polygon(32px 0, 100% 0, calc(100% - 32px) 100%, 0 100%)";
|
|
13
14
|
const INSET_CLIP = "polygon(0px 0, 100% 0, calc(100% - 4px) 100%, -8px 100%)";
|
|
14
15
|
export function IdentityStep() {
|
|
@@ -80,20 +81,13 @@ export function IdentityStep() {
|
|
|
80
81
|
}, [onboardingStyle, styles, handleSelect]);
|
|
81
82
|
/* ── Import UI ──────────────────────────────────────────────────── */
|
|
82
83
|
if (showImport) {
|
|
83
|
-
return (_jsxs("div", {
|
|
84
|
-
display: "flex",
|
|
85
|
-
flexDirection: "column",
|
|
86
|
-
alignItems: "center",
|
|
87
|
-
gap: "12px",
|
|
88
|
-
maxWidth: "400px",
|
|
89
|
-
width: "100%",
|
|
90
|
-
}, children: [_jsx("div", { className: "onboarding-section-title", children: t("onboarding.importAgent") }), _jsx("div", { className: "onboarding-divider", children: _jsx("div", { className: "onboarding-divider-diamond" }) }), _jsx("p", { className: "onboarding-desc", style: { marginBottom: "4px" }, children: t("onboarding.importDesc") }), _jsx("input", { type: "file", accept: ".eliza-agent", onChange: (e) => {
|
|
84
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-3 w-full max-w-[400px]", children: [_jsx("div", { className: "onboarding-section-title", children: t("onboarding.importAgent") }), _jsx("div", { className: "onboarding-divider", children: _jsx("div", { className: "onboarding-divider-diamond" }) }), _jsx("p", { className: "onboarding-desc mb-1", children: t("onboarding.importDesc") }), _jsx("input", { type: "file", accept: ".eliza-agent", onChange: (e) => {
|
|
91
85
|
setImportFile(e.target.files?.[0] ?? null);
|
|
92
86
|
setImportError(null);
|
|
93
|
-
}, className: "onboarding-input
|
|
87
|
+
}, className: "onboarding-input text-[13px] text-left" }), _jsx("input", { type: "password", placeholder: t("onboarding.decryptionPasswordPlaceholder"), value: importPassword, onChange: (e) => {
|
|
94
88
|
setImportPassword(e.target.value);
|
|
95
89
|
setImportError(null);
|
|
96
|
-
}, className: "onboarding-input" }), importError && (_jsx("p", { className: "onboarding-desc
|
|
90
|
+
}, className: "onboarding-input" }), importError && (_jsx("p", { className: "onboarding-desc text-[var(--danger)] !mb-0", children: importError })), importSuccess && (_jsx("p", { className: "onboarding-desc text-[var(--ok)] !mb-0", children: importSuccess })), _jsxs("div", { className: "flex gap-3 mt-2", children: [_jsx("button", { className: "onboarding-back-link", onClick: () => {
|
|
97
91
|
setShowImport(false);
|
|
98
92
|
setImportError(null);
|
|
99
93
|
setImportSuccess(null);
|
|
@@ -101,93 +95,20 @@ export function IdentityStep() {
|
|
|
101
95
|
setImportPassword("");
|
|
102
96
|
}, type: "button", children: t("onboarding.cancel") }), _jsx("button", { className: "onboarding-confirm-btn", disabled: importBusy || !importFile, onClick: () => void handleImportAgent(), type: "button", children: importBusy ? t("onboarding.importing") : t("onboarding.restore") })] })] }));
|
|
103
97
|
}
|
|
104
|
-
/* ── Video-game style character roster
|
|
105
|
-
return (_jsxs("div", {
|
|
106
|
-
display: "flex",
|
|
107
|
-
flexDirection: "column",
|
|
108
|
-
alignItems: "center",
|
|
109
|
-
gap: "16px",
|
|
110
|
-
width: "100%",
|
|
111
|
-
maxWidth: "640px",
|
|
112
|
-
}, children: [_jsx("div", { className: "onboarding-section-title", children: "Choose Your Agent" }), _jsx("div", { className: "onboarding-divider", children: _jsx("div", { className: "onboarding-divider-diamond" }) }), _jsx("p", { className: "onboarding-desc", style: { marginBottom: "4px", textAlign: "center" }, children: "Pick a personality for your agent. You can customize everything later." }), _jsx("div", { style: {
|
|
113
|
-
display: "flex",
|
|
114
|
-
flexWrap: "wrap",
|
|
115
|
-
justifyContent: "center",
|
|
116
|
-
gap: "4px",
|
|
117
|
-
}, children: styles.slice(0, 4).map((preset) => {
|
|
98
|
+
/* ── Video-game style character roster (matches CharacterView exactly) ── */
|
|
99
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-4 w-full max-w-[640px]", children: [_jsx("div", { className: "flex flex-wrap items-start justify-center gap-y-1", "data-testid": "onboarding-character-roster", children: styles.slice(0, 4).length > 0 ? (styles.slice(0, 4).map((preset) => {
|
|
118
100
|
const meta = IDENTITY_PRESETS[preset.catchphrase];
|
|
119
101
|
const isSelected = selectedCatchphrase === preset.catchphrase;
|
|
120
102
|
const name = meta?.name ?? "Agent";
|
|
121
103
|
const avatarIdx = meta?.avatarIndex ?? 1;
|
|
122
|
-
return (_jsx("button", { type: "button",
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
padding: 0,
|
|
133
|
-
}, children: _jsx("div", { style: {
|
|
134
|
-
position: "relative",
|
|
135
|
-
height: "10rem",
|
|
136
|
-
width: "100%",
|
|
137
|
-
padding: "2px",
|
|
138
|
-
transition: "all 0.3s",
|
|
139
|
-
background: isSelected
|
|
140
|
-
? "rgb(250, 204, 21)"
|
|
141
|
-
: "rgba(255,255,255,0.1)",
|
|
142
|
-
boxShadow: isSelected
|
|
143
|
-
? "0 0 28px rgba(250,204,21,0.32)"
|
|
144
|
-
: "none",
|
|
145
|
-
clipPath: SLANT_CLIP,
|
|
146
|
-
}, children: _jsxs("div", { style: {
|
|
147
|
-
position: "relative",
|
|
148
|
-
height: "100%",
|
|
149
|
-
width: "100%",
|
|
150
|
-
overflow: "hidden",
|
|
151
|
-
clipPath: SLANT_CLIP,
|
|
152
|
-
}, children: [isSelected && (_jsx("div", { style: {
|
|
153
|
-
pointerEvents: "none",
|
|
154
|
-
position: "absolute",
|
|
155
|
-
inset: "-12px",
|
|
156
|
-
background: "rgba(253, 224, 71, 0.15)",
|
|
157
|
-
filter: "blur(16px)",
|
|
158
|
-
clipPath: SLANT_CLIP,
|
|
159
|
-
} })), _jsx("img", { src: getVrmPreviewUrl(avatarIdx), alt: name, draggable: false, style: {
|
|
160
|
-
height: "100%",
|
|
161
|
-
width: "100%",
|
|
162
|
-
objectFit: "cover",
|
|
163
|
-
transition: "transform 0.3s ease-out",
|
|
164
|
-
transform: isSelected ? "scale(1.04)" : "scale(1)",
|
|
165
|
-
} }), _jsx("div", { style: {
|
|
166
|
-
position: "absolute",
|
|
167
|
-
left: 0,
|
|
168
|
-
right: 0,
|
|
169
|
-
bottom: 0,
|
|
170
|
-
}, children: _jsx("div", { style: {
|
|
171
|
-
padding: "4px 8px",
|
|
172
|
-
fontSize: "14px",
|
|
173
|
-
fontWeight: 600,
|
|
174
|
-
color: "white",
|
|
175
|
-
transition: "all 0.3s",
|
|
176
|
-
background: isSelected
|
|
177
|
-
? "rgba(0,0,0,0.78)"
|
|
178
|
-
: "rgba(0,0,0,0.62)",
|
|
179
|
-
boxShadow: isSelected
|
|
180
|
-
? "inset 0 1px 0 rgba(255,255,255,0.08)"
|
|
181
|
-
: "none",
|
|
182
|
-
clipPath: INSET_CLIP,
|
|
183
|
-
}, children: name }) })] }) }) }, preset.catchphrase));
|
|
184
|
-
}) }), _jsx("button", { className: "onboarding-confirm-btn", onClick: () => handleOnboardingNext(), type: "button", style: { width: "100%", maxWidth: "320px", marginTop: "8px" }, children: "Continue" }), _jsx("button", { type: "button", onClick: () => setShowImport(true), style: {
|
|
185
|
-
background: "none",
|
|
186
|
-
border: "none",
|
|
187
|
-
color: "rgba(255,255,255,0.4)",
|
|
188
|
-
fontSize: "12px",
|
|
189
|
-
cursor: "pointer",
|
|
190
|
-
textDecoration: "underline",
|
|
191
|
-
padding: "4px 0",
|
|
192
|
-
}, children: t("onboarding.restoreFromBackup") })] }));
|
|
104
|
+
return (_jsx("button", { type: "button", className: `group relative -mx-3 min-w-0 w-[9.75rem] text-center transition-all duration-300 ease-out ${isSelected
|
|
105
|
+
? "z-100 scale-[1.00] opacity-100"
|
|
106
|
+
: "scale-[1.00] opacity-70 hover:scale-[1.00] hover:opacity-100"}`, onClick: () => handleSelect(preset.catchphrase), "data-testid": `onboarding-preset-${preset.catchphrase}`, children: _jsx("div", { className: `relative h-[10rem] w-full p-[2px] transition-all duration-300 ${isSelected
|
|
107
|
+
? "bg-yellow-400 shadow-[0_0_28px_rgba(250,204,21,0.32)]"
|
|
108
|
+
: "bg-white/10 hover:bg-white/35"}`, style: { clipPath: SLANT_CLIP }, children: _jsxs("div", { className: "relative h-full w-full overflow-hidden", style: { clipPath: SLANT_CLIP }, children: [isSelected && (_jsx("div", { className: "pointer-events-none absolute -inset-3 bg-yellow-300/15 blur-xl", style: { clipPath: SLANT_CLIP } })), _jsx("img", { src: getVrmPreviewUrl(avatarIdx), alt: name, draggable: false, className: `h-full w-full object-cover transition-transform duration-300 ease-out ${isSelected
|
|
109
|
+
? "scale-[1.04]"
|
|
110
|
+
: "scale-100 group-hover:scale-[1.02]"}` }), _jsx("div", { className: "absolute inset-x-0 bottom-0", children: _jsx("div", { className: `px-2 py-1 text-sm font-semibold text-white transition-all ${isSelected
|
|
111
|
+
? "bg-black/78 shadow-[inset_0_1px_0_rgba(255,255,255,0.08)]"
|
|
112
|
+
: "bg-black/62"}`, style: { clipPath: INSET_CLIP }, children: name }) })] }) }) }, preset.catchphrase));
|
|
113
|
+
})) : (_jsx("div", { className: "rounded-2xl border border-white/10 bg-black/10 p-4 text-sm text-white/50", children: "Loading character presets..." })) }), _jsx("button", { className: "onboarding-confirm-btn w-full max-w-[320px] mt-2", onClick: () => handleOnboardingNext(), type: "button", children: "Continue" }), _jsx("button", { type: "button", onClick: () => setShowImport(true), className: "bg-transparent border-none text-white/40 text-xs cursor-pointer underline py-1", children: t("onboarding.restoreFromBackup") })] }));
|
|
193
114
|
}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/app-core",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.24",
|
|
4
4
|
"description": "Shared application core for elizaOS shells and white-label apps.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -164,8 +164,8 @@
|
|
|
164
164
|
"@capacitor/haptics": "8.0.0",
|
|
165
165
|
"@capacitor/keyboard": "8.0.0",
|
|
166
166
|
"@capacitor/preferences": "^8.0.1",
|
|
167
|
-
"@elizaos/autonomous": "
|
|
168
|
-
"@elizaos/ui": "
|
|
167
|
+
"@elizaos/autonomous": "2.0.0-alpha.24",
|
|
168
|
+
"@elizaos/ui": "2.0.0-alpha.24",
|
|
169
169
|
"@lifo-sh/core": "0.4.4",
|
|
170
170
|
"@lifo-sh/ui": "0.4.2",
|
|
171
171
|
"@pixiv/three-vrm": "^3.4.5",
|
|
@@ -177,5 +177,6 @@
|
|
|
177
177
|
"publishConfig": {
|
|
178
178
|
"access": "public"
|
|
179
179
|
},
|
|
180
|
+
"gitHead": "cb192f7b21c441e9463d1af2f890c145814baad2",
|
|
180
181
|
"types": "./index.d.ts"
|
|
181
182
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/app-core",
|
|
3
|
-
"version": "2.0.0-alpha.
|
|
3
|
+
"version": "2.0.0-alpha.24",
|
|
4
4
|
"description": "Shared application core for elizaOS shells and white-label apps.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -67,8 +67,8 @@
|
|
|
67
67
|
"@capacitor/haptics": "8.0.0",
|
|
68
68
|
"@capacitor/keyboard": "8.0.0",
|
|
69
69
|
"@capacitor/preferences": "^8.0.1",
|
|
70
|
-
"@elizaos/autonomous": "2.0.0-alpha.
|
|
71
|
-
"@elizaos/ui": "2.0.0-alpha.
|
|
70
|
+
"@elizaos/autonomous": "2.0.0-alpha.24",
|
|
71
|
+
"@elizaos/ui": "2.0.0-alpha.24",
|
|
72
72
|
"@lifo-sh/core": "0.4.4",
|
|
73
73
|
"@lifo-sh/ui": "0.4.2",
|
|
74
74
|
"@pixiv/three-vrm": "^3.4.5",
|
|
@@ -88,5 +88,5 @@
|
|
|
88
88
|
"tailwindcss": "^4.1.18",
|
|
89
89
|
"typescript": "^5.9.3"
|
|
90
90
|
},
|
|
91
|
-
"gitHead": "
|
|
91
|
+
"gitHead": "a255b2b57ceb27809938aaabfffc5b3a9f269205"
|
|
92
92
|
}
|
|
@@ -75,7 +75,7 @@ export function OnboardingWizard() {
|
|
|
75
75
|
<div className="onboarding-screen">
|
|
76
76
|
{/* Full-screen VRM background — same as CompanionView */}
|
|
77
77
|
<div className="onboarding-bg" />
|
|
78
|
-
<div className="onboarding-bg-overlay" />
|
|
78
|
+
{!isCharacterSelect && <div className="onboarding-bg-overlay" />}
|
|
79
79
|
|
|
80
80
|
{/* VRM character — fills viewport, zoomed in like companion view */}
|
|
81
81
|
<VrmStage
|
|
@@ -178,16 +178,16 @@ export function OnboardingWizard() {
|
|
|
178
178
|
</div>
|
|
179
179
|
|
|
180
180
|
{isCharacterSelect ? (
|
|
181
|
-
/* ── Full-screen
|
|
181
|
+
/* ── Full-screen character select — anchored to bottom ── */
|
|
182
182
|
<div
|
|
183
183
|
style={{
|
|
184
184
|
position: "absolute",
|
|
185
185
|
inset: 0,
|
|
186
186
|
zIndex: 40,
|
|
187
187
|
display: "flex",
|
|
188
|
-
alignItems: "
|
|
188
|
+
alignItems: "flex-end",
|
|
189
189
|
justifyContent: "center",
|
|
190
|
-
|
|
190
|
+
paddingBottom: "3rem",
|
|
191
191
|
}}
|
|
192
192
|
>
|
|
193
193
|
<IdentityStep />
|
|
@@ -174,14 +174,6 @@ export function IdentityStep() {
|
|
|
174
174
|
/* ── Video-game style character roster (matches CharacterView exactly) ── */
|
|
175
175
|
return (
|
|
176
176
|
<div className="flex flex-col items-center gap-4 w-full max-w-[640px]">
|
|
177
|
-
<div className="onboarding-section-title">Choose Your Agent</div>
|
|
178
|
-
<div className="onboarding-divider">
|
|
179
|
-
<div className="onboarding-divider-diamond" />
|
|
180
|
-
</div>
|
|
181
|
-
<p className="onboarding-desc mb-1 text-center">
|
|
182
|
-
Pick a personality for your agent. You can customize everything later.
|
|
183
|
-
</p>
|
|
184
|
-
|
|
185
177
|
{/* ── Character roster grid — identical to CharacterView roster ── */}
|
|
186
178
|
<div
|
|
187
179
|
className="flex flex-wrap items-start justify-center gap-y-1"
|
|
@@ -54,7 +54,7 @@ function createOnboardingContext(
|
|
|
54
54
|
): Record<string, unknown> {
|
|
55
55
|
return {
|
|
56
56
|
t: (k: string) => k,
|
|
57
|
-
onboardingStep: "
|
|
57
|
+
onboardingStep: "identity",
|
|
58
58
|
selectedVrmIndex: 1,
|
|
59
59
|
customBackgroundUrl: "",
|
|
60
60
|
onboardingOptions: {
|
|
@@ -136,7 +136,7 @@ describe("Onboarding language mode", () => {
|
|
|
136
136
|
);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
expect(collectText(tree.root)).toContain("
|
|
139
|
+
expect(collectText(tree.root)).toContain("Continue");
|
|
140
140
|
});
|
|
141
141
|
|
|
142
142
|
it("shows chinese copy when uiLanguage is zh-CN", async () => {
|
|
@@ -154,7 +154,7 @@ describe("Onboarding language mode", () => {
|
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
const text = collectText(tree.root);
|
|
157
|
-
expect(text).toContain("
|
|
158
|
-
expect(text).toContain("onboarding.
|
|
157
|
+
expect(text).toContain("Continue");
|
|
158
|
+
expect(text).toContain("onboarding.restoreFromBackup");
|
|
159
159
|
});
|
|
160
160
|
});
|
|
@@ -16,6 +16,7 @@ const { mockUseApp, mockIsNativeFn } = vi.hoisted(() => ({
|
|
|
16
16
|
|
|
17
17
|
vi.mock("@elizaos/app-core/state", () => ({
|
|
18
18
|
useApp: () => mockUseApp(),
|
|
19
|
+
getVrmPreviewUrl: (index: number) => `/vrms/previews/milady-${index}.png`,
|
|
19
20
|
}));
|
|
20
21
|
|
|
21
22
|
vi.mock("@elizaos/app-core/api", () => ({
|
|
@@ -51,7 +52,7 @@ vi.mock("@elizaos/app-core/platform", () => ({
|
|
|
51
52
|
|
|
52
53
|
import { ActivateStep } from "../../src/components/onboarding/ActivateStep";
|
|
53
54
|
import { ConnectionStep } from "../../src/components/onboarding/ConnectionStep";
|
|
54
|
-
import {
|
|
55
|
+
import { IdentityStep } from "../../src/components/onboarding/IdentityStep";
|
|
55
56
|
|
|
56
57
|
// ── Helpers ───────────────────────────────────────────────────────────
|
|
57
58
|
|
|
@@ -123,49 +124,48 @@ function findButtons(
|
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
// ===================================================================
|
|
126
|
-
// WakeUpStep
|
|
127
|
+
// IdentityStep (character select — replaces old WakeUpStep)
|
|
127
128
|
// ===================================================================
|
|
128
129
|
|
|
129
|
-
describe("
|
|
130
|
+
describe("IdentityStep", () => {
|
|
130
131
|
beforeEach(() => mockUseApp.mockReset());
|
|
131
132
|
|
|
132
|
-
it("renders
|
|
133
|
-
mockUseApp.mockReturnValue(
|
|
133
|
+
it("renders character selection with Continue button", async () => {
|
|
134
|
+
mockUseApp.mockReturnValue(
|
|
135
|
+
baseContext({
|
|
136
|
+
onboardingStep: "identity",
|
|
137
|
+
onboardingOptions: {
|
|
138
|
+
...baseContext().onboardingOptions,
|
|
139
|
+
styles: [
|
|
140
|
+
{
|
|
141
|
+
catchphrase: "Noted.",
|
|
142
|
+
hint: "calm & collected",
|
|
143
|
+
bio: ["bio"],
|
|
144
|
+
system: "You are {{name}}",
|
|
145
|
+
style: { all: [], chat: [], post: [] },
|
|
146
|
+
adjectives: [],
|
|
147
|
+
postExamples: [],
|
|
148
|
+
messageExamples: [],
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
);
|
|
134
154
|
let tree: TestRenderer.ReactTestRenderer | undefined;
|
|
135
155
|
await act(async () => {
|
|
136
|
-
tree = TestRenderer.create(React.createElement(
|
|
156
|
+
tree = TestRenderer.create(React.createElement(IdentityStep));
|
|
137
157
|
});
|
|
138
158
|
|
|
139
159
|
const text = collectText(tree?.root as TestRenderer.ReactTestInstance);
|
|
140
|
-
expect(text).toContain("
|
|
141
|
-
expect(text).toContain("
|
|
142
|
-
expect(text).toContain("onboarding.createNewAgent");
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it("calls handleOnboardingNext when Activate is clicked", async () => {
|
|
146
|
-
const next = vi.fn(async () => {});
|
|
147
|
-
mockUseApp.mockReturnValue(baseContext({ handleOnboardingNext: next }));
|
|
148
|
-
let tree: TestRenderer.ReactTestRenderer | undefined;
|
|
149
|
-
await act(async () => {
|
|
150
|
-
tree = TestRenderer.create(React.createElement(WakeUpStep));
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
const buttons = findButtons(tree?.root as TestRenderer.ReactTestInstance);
|
|
154
|
-
const activateBtn = buttons.find(
|
|
155
|
-
(b) => collectText(b) === "onboarding.createNewAgent",
|
|
156
|
-
);
|
|
157
|
-
expect(activateBtn).toBeDefined();
|
|
158
|
-
await act(async () => {
|
|
159
|
-
activateBtn?.props.onClick();
|
|
160
|
-
});
|
|
161
|
-
expect(next).toHaveBeenCalled();
|
|
160
|
+
expect(text).toContain("Continue");
|
|
161
|
+
expect(text).toContain("Rin");
|
|
162
162
|
});
|
|
163
163
|
|
|
164
164
|
it("shows Restore from Backup option", async () => {
|
|
165
|
-
mockUseApp.mockReturnValue(baseContext());
|
|
165
|
+
mockUseApp.mockReturnValue(baseContext({ onboardingStep: "identity" }));
|
|
166
166
|
let tree: TestRenderer.ReactTestRenderer | undefined;
|
|
167
167
|
await act(async () => {
|
|
168
|
-
tree = TestRenderer.create(React.createElement(
|
|
168
|
+
tree = TestRenderer.create(React.createElement(IdentityStep));
|
|
169
169
|
});
|
|
170
170
|
|
|
171
171
|
const text = collectText(tree?.root as TestRenderer.ReactTestInstance);
|
|
@@ -173,10 +173,10 @@ describe("WakeUpStep", () => {
|
|
|
173
173
|
});
|
|
174
174
|
|
|
175
175
|
it("switches to import view when Restore from Backup is clicked", async () => {
|
|
176
|
-
mockUseApp.mockReturnValue(baseContext());
|
|
176
|
+
mockUseApp.mockReturnValue(baseContext({ onboardingStep: "identity" }));
|
|
177
177
|
let tree: TestRenderer.ReactTestRenderer | undefined;
|
|
178
178
|
await act(async () => {
|
|
179
|
-
tree = TestRenderer.create(React.createElement(
|
|
179
|
+
tree = TestRenderer.create(React.createElement(IdentityStep));
|
|
180
180
|
});
|
|
181
181
|
|
|
182
182
|
const buttons = findButtons(tree?.root as TestRenderer.ReactTestInstance);
|
|
@@ -3,7 +3,7 @@ import React from "react";
|
|
|
3
3
|
import TestRenderer, { act } from "react-test-renderer";
|
|
4
4
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
5
|
|
|
6
|
-
type OnboardingStep = "
|
|
6
|
+
type OnboardingStep = "identity" | "connection" | "rpc" | "senses" | "activate";
|
|
7
7
|
|
|
8
8
|
type AppHarnessState = {
|
|
9
9
|
onboardingLoading: boolean;
|
|
@@ -165,14 +165,14 @@ vi.mock("@elizaos/app-core/components", async () => {
|
|
|
165
165
|
LifoSandboxView: () => React.createElement("div", null, "LifoSandboxView"),
|
|
166
166
|
OnboardingWizard: () => {
|
|
167
167
|
const state = mockUseApp();
|
|
168
|
-
if (state.onboardingStep === "
|
|
168
|
+
if (state.onboardingStep === "identity") {
|
|
169
169
|
return React.createElement(
|
|
170
170
|
"button",
|
|
171
171
|
{
|
|
172
172
|
onClick: () => state.handleOnboardingNext(),
|
|
173
173
|
type: "button",
|
|
174
174
|
},
|
|
175
|
-
"onboarding.
|
|
175
|
+
"onboarding.chooseAgent",
|
|
176
176
|
);
|
|
177
177
|
}
|
|
178
178
|
if (state.onboardingStep === "connection") {
|
|
@@ -435,7 +435,7 @@ function createHarnessState(): AppHarnessState {
|
|
|
435
435
|
onboardingComplete: false,
|
|
436
436
|
tab: "chat",
|
|
437
437
|
actionNotice: null,
|
|
438
|
-
onboardingStep: "
|
|
438
|
+
onboardingStep: "identity",
|
|
439
439
|
onboardingOptions: onboardingOptions(),
|
|
440
440
|
onboardingName: "Milady",
|
|
441
441
|
onboardingStyle: "",
|
|
@@ -518,7 +518,7 @@ describe("app startup onboarding flow (e2e)", () => {
|
|
|
518
518
|
state = createHarnessState();
|
|
519
519
|
|
|
520
520
|
const STEP_ORDER: OnboardingStep[] = [
|
|
521
|
-
"
|
|
521
|
+
"identity",
|
|
522
522
|
"connection",
|
|
523
523
|
"rpc",
|
|
524
524
|
"senses",
|
|
@@ -592,8 +592,8 @@ describe("app startup onboarding flow (e2e)", () => {
|
|
|
592
592
|
|
|
593
593
|
if (state.onboardingStep === "senses") {
|
|
594
594
|
clickButton(renderedTree, "permissions-continue");
|
|
595
|
-
} else if (state.onboardingStep === "
|
|
596
|
-
clickButton(renderedTree, "onboarding.
|
|
595
|
+
} else if (state.onboardingStep === "identity") {
|
|
596
|
+
clickButton(renderedTree, "onboarding.chooseAgent");
|
|
597
597
|
} else if (state.onboardingStep === "connection") {
|
|
598
598
|
if (!state.onboardingRunMode) {
|
|
599
599
|
clickButton(renderedTree, "onboarding.hostingLocal");
|
|
@@ -612,7 +612,7 @@ describe("app startup onboarding flow (e2e)", () => {
|
|
|
612
612
|
|
|
613
613
|
const renderedText = textOf(renderedTree.root);
|
|
614
614
|
|
|
615
|
-
expect(renderedText).toContain("
|
|
615
|
+
expect(renderedText).toContain("CharacterView");
|
|
616
616
|
expect(renderedText).not.toContain("OnboardingWizard");
|
|
617
617
|
});
|
|
618
618
|
});
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
$ bunx @biomejs/biome check ./src/App.tsx ./src/actions ./src/api ./src/autonomy ./src/bridge ./src/chat ./src/coding ./src/components ./src/config ./src/events ./src/hooks ./src/i18n ./src/index.ts ./src/navigation ./src/platform ./src/providers ./src/state ./src/types ./src/utils ./src/voice ./src/ambient.d.ts
|
|
2
|
-
Checked 253 files in 344ms. No fixes applied.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
$ test -f ../ui/dist/index.d.ts || (cd ../ui && bun run build) && tsc --noEmit -p tsconfig.json
|