| 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 }; |
|
|