@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.
@@ -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 centered character select ── */
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: "center",
66
+ alignItems: "flex-end",
67
67
  justifyContent: "center",
68
- padding: "2rem",
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":"AAiBA,wBAAgB,YAAY,4CAkV3B"}
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", { style: {
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", style: { fontSize: "13px", textAlign: "left" } }), _jsx("input", { type: "password", placeholder: t("onboarding.decryptionPasswordPlaceholder"), value: importPassword, onChange: (e) => {
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", style: { color: "var(--danger)", marginBottom: 0 }, children: importError })), importSuccess && (_jsx("p", { className: "onboarding-desc", style: { color: "var(--ok)", marginBottom: 0 }, children: importSuccess })), _jsxs("div", { style: { display: "flex", gap: "12px", marginTop: "8px" }, children: [_jsx("button", { className: "onboarding-back-link", onClick: () => {
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", { style: {
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", onClick: () => handleSelect(preset.catchphrase), style: {
123
- position: "relative",
124
- width: "9.75rem",
125
- textAlign: "center",
126
- transition: "all 0.3s ease-out",
127
- transform: isSelected ? "scale(1)" : "scale(1)",
128
- opacity: isSelected ? 1 : 0.7,
129
- cursor: "pointer",
130
- background: "none",
131
- border: "none",
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.22",
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": "^2.0.0-alpha.22",
168
- "@elizaos/ui": "^2.0.0-alpha.22",
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.22",
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.22",
71
- "@elizaos/ui": "2.0.0-alpha.22",
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": "56caa0e2d9f193f75091154d639df4a48065d80f"
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 centered character select ── */
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: "center",
188
+ alignItems: "flex-end",
189
189
  justifyContent: "center",
190
- padding: "2rem",
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: "wakeUp",
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("onboarding.welcomeTitle");
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("onboarding.welcomeTitle");
158
- expect(text).toContain("onboarding.createNewAgent");
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 { WakeUpStep } from "../../src/components/onboarding/WakeUpStep";
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("WakeUpStep", () => {
130
+ describe("IdentityStep", () => {
130
131
  beforeEach(() => mockUseApp.mockReset());
131
132
 
132
- it("renders initialization screen with Activate button", async () => {
133
- mockUseApp.mockReturnValue(baseContext());
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(WakeUpStep));
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("onboarding.welcomeTitle");
141
- expect(text).toContain("onboarding.welcomeSubtitle");
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(WakeUpStep));
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(WakeUpStep));
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 = "wakeUp" | "connection" | "rpc" | "senses" | "activate";
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 === "wakeUp") {
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.createNewAgent",
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: "wakeUp",
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
- "wakeUp",
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 === "wakeUp") {
596
- clickButton(renderedTree, "onboarding.createNewAgent");
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("ChatView");
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