const CONTROL_UI_AVATAR_PREFIX = "/avatar"; export function normalizeControlUiBasePath(basePath?: string): string { if (!basePath) { return ""; } let normalized = basePath.trim(); if (!normalized) { return ""; } if (!normalized.startsWith("/")) { normalized = `/${normalized}`; } if (normalized === "/") { return ""; } if (normalized.endsWith("/")) { normalized = normalized.slice(0, -1); } return normalized; } export function buildControlUiAvatarUrl(basePath: string, agentId: string): string { return basePath ? `${basePath}${CONTROL_UI_AVATAR_PREFIX}/${agentId}` : `${CONTROL_UI_AVATAR_PREFIX}/${agentId}`; } function looksLikeLocalAvatarPath(value: string): boolean { if (/[\\/]/.test(value)) { return true; } return /\.(png|jpe?g|gif|webp|svg|ico)$/i.test(value); } export function resolveAssistantAvatarUrl(params: { avatar?: string | null; agentId?: string | null; basePath?: string; }): string | undefined { const avatar = params.avatar?.trim(); if (!avatar) { return undefined; } if (/^https?:\/\//i.test(avatar) || /^data:image\//i.test(avatar)) { return avatar; } const basePath = normalizeControlUiBasePath(params.basePath); const baseAvatarPrefix = basePath ? `${basePath}${CONTROL_UI_AVATAR_PREFIX}/` : `${CONTROL_UI_AVATAR_PREFIX}/`; if (basePath && avatar.startsWith(`${CONTROL_UI_AVATAR_PREFIX}/`)) { return `${basePath}${avatar}`; } if (avatar.startsWith(baseAvatarPrefix)) { return avatar; } if (!params.agentId) { return avatar; } if (looksLikeLocalAvatarPath(avatar)) { return buildControlUiAvatarUrl(basePath, params.agentId); } return avatar; } export { CONTROL_UI_AVATAR_PREFIX };