mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 06:51:23 +00:00
feat(ui): add Agents dashboard
This commit is contained in:
@@ -6,6 +6,7 @@ import { normalizeAgentId } from "../routing/session-key.js";
|
||||
|
||||
const MAX_ASSISTANT_NAME = 50;
|
||||
const MAX_ASSISTANT_AVATAR = 200;
|
||||
const MAX_ASSISTANT_EMOJI = 16;
|
||||
|
||||
export const DEFAULT_ASSISTANT_IDENTITY: AssistantIdentity = {
|
||||
agentId: "main",
|
||||
@@ -17,6 +18,7 @@ export type AssistantIdentity = {
|
||||
agentId: string;
|
||||
name: string;
|
||||
avatar: string;
|
||||
emoji?: string;
|
||||
};
|
||||
|
||||
function coerceIdentityValue(value: string | undefined, maxLength: number): string | undefined {
|
||||
@@ -64,6 +66,33 @@ function normalizeAvatarValue(value: string | undefined): string | undefined {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function normalizeEmojiValue(value: string | undefined): string | undefined {
|
||||
if (!value) {
|
||||
return undefined;
|
||||
}
|
||||
const trimmed = value.trim();
|
||||
if (!trimmed) {
|
||||
return undefined;
|
||||
}
|
||||
if (trimmed.length > MAX_ASSISTANT_EMOJI) {
|
||||
return undefined;
|
||||
}
|
||||
let hasNonAscii = false;
|
||||
for (let i = 0; i < trimmed.length; i += 1) {
|
||||
if (trimmed.charCodeAt(i) > 127) {
|
||||
hasNonAscii = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!hasNonAscii) {
|
||||
return undefined;
|
||||
}
|
||||
if (isAvatarUrl(trimmed) || looksLikeAvatarPath(trimmed)) {
|
||||
return undefined;
|
||||
}
|
||||
return trimmed;
|
||||
}
|
||||
|
||||
export function resolveAssistantIdentity(params: {
|
||||
cfg: OpenClawConfig;
|
||||
agentId?: string | null;
|
||||
@@ -92,5 +121,13 @@ export function resolveAssistantIdentity(params: {
|
||||
avatarCandidates.map((candidate) => normalizeAvatarValue(candidate)).find(Boolean) ??
|
||||
DEFAULT_ASSISTANT_IDENTITY.avatar;
|
||||
|
||||
return { agentId, name, avatar };
|
||||
const emojiCandidates = [
|
||||
coerceIdentityValue(agentIdentity?.emoji, MAX_ASSISTANT_EMOJI),
|
||||
coerceIdentityValue(fileIdentity?.emoji, MAX_ASSISTANT_EMOJI),
|
||||
coerceIdentityValue(agentIdentity?.avatar, MAX_ASSISTANT_EMOJI),
|
||||
coerceIdentityValue(fileIdentity?.avatar, MAX_ASSISTANT_EMOJI),
|
||||
];
|
||||
const emoji = emojiCandidates.map((candidate) => normalizeEmojiValue(candidate)).find(Boolean);
|
||||
|
||||
return { agentId, name, avatar, emoji };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user