Skip to content

Commit 11bfcdb

Browse files
committed
fix(ui): preserve legacy assistant avatar override across agent-scoped storage (#90932)
1 parent a2dda68 commit 11bfcdb

2 files changed

Lines changed: 26 additions & 1 deletion

File tree

ui/src/ui/controllers/assistant-identity.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,25 @@ describe("setAssistantAvatarOverride", () => {
116116
expect(loadLocalAssistantIdentity("agent-1").avatar).toBeNull();
117117
});
118118

119+
it("falls back to the legacy flat key when no agent-scoped override exists", () => {
120+
const storage = createStorageMock();
121+
storage.setItem(
122+
"openclaw.control.assistant.v1",
123+
JSON.stringify({ avatar: "data:image/png;base64,bGVnYWN5" }),
124+
);
125+
vi.stubGlobal("localStorage", storage);
126+
127+
expect(loadLocalAssistantIdentity("agent-1").avatar).toBe("data:image/png;base64,bGVnYWN5");
128+
expect(loadLocalAssistantIdentity("agent-2").avatar).toBe("data:image/png;base64,bGVnYWN5");
129+
// Scoped key still takes precedence over the flat key.
130+
storage.setItem(
131+
"openclaw.control.assistant.v1:agent-1",
132+
JSON.stringify({ avatar: "data:image/png;base64,c2NvcGVk" }),
133+
);
134+
expect(loadLocalAssistantIdentity("agent-1").avatar).toBe("data:image/png;base64,c2NvcGVk");
135+
expect(loadLocalAssistantIdentity("agent-2").avatar).toBe("data:image/png;base64,bGVnYWN5");
136+
});
137+
119138
it("applies the agent-scoped local override when loading identity", async () => {
120139
const request = vi
121140
.fn()

ui/src/ui/storage.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,13 @@ function localAssistantIdentityKey(agentId?: string | null): string {
360360
export function loadLocalAssistantIdentity(agentId?: string | null): LocalAssistantIdentity {
361361
const storage = getSafeLocalStorage();
362362
try {
363-
const raw = storage?.getItem(localAssistantIdentityKey(agentId));
363+
let raw = storage?.getItem(localAssistantIdentityKey(agentId));
364+
// Preserve legacy flat assistant avatar overrides for users upgrading from
365+
// the unscoped key. When no agent-scoped value exists, fall back to the
366+
// flat key so the visible override is not silently lost after upgrade.
367+
if (!raw && agentId) {
368+
raw = storage?.getItem(localAssistantIdentityKey());
369+
}
364370
if (!raw) {
365371
return { avatar: null };
366372
}

0 commit comments

Comments
 (0)