openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
85 lines (84 loc) • 3.99 kB
JavaScript
import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js";
import "./agent-scope-MrLta7Pq.js";
import { u as normalizeAgentId } from "./session-key-B_NoIfpX.js";
import { c as resolveDefaultAgentId, o as resolveAgentWorkspaceDir } from "./agent-scope-config-CgCYpZfK.js";
import { a as isAvatarImageDataUrl, i as isAvatarHttpUrl, u as looksLikeAvatarPath } from "./avatar-policy-CLA5a0j8.js";
import { n as resolveAgentIdentity } from "./identity-Qcvvo6SY.js";
import { i as loadAgentIdentity } from "./agents.config-DfQl3_hl.js";
//#region src/shared/assistant-identity-values.ts
/** Normalizes optional assistant identity fields and truncates them to the caller's limit. */
function coerceIdentityValue(value, maxLength) {
const trimmed = normalizeOptionalString(value);
if (!trimmed) return;
if (trimmed.length <= maxLength) return trimmed;
return trimmed.slice(0, maxLength);
}
//#endregion
//#region src/gateway/assistant-identity.ts
const MAX_ASSISTANT_NAME = 50;
const MAX_ASSISTANT_AVATAR = 2e6;
const MAX_ASSISTANT_EMOJI = 16;
const DEFAULT_ASSISTANT_IDENTITY = {
agentId: "main",
name: "Assistant",
avatar: "A"
};
function isAvatarUrl(value) {
return isAvatarHttpUrl(value) || isAvatarImageDataUrl(value);
}
function normalizeAvatarValue(value) {
if (!value) return;
const trimmed = value.trim();
if (!trimmed) return;
if (isAvatarUrl(trimmed)) return trimmed;
if (looksLikeAvatarPath(trimmed)) return trimmed;
if (!/\s/.test(trimmed) && trimmed.length <= 4) return trimmed;
}
function normalizeEmojiValue(value) {
if (!value) return;
const trimmed = value.trim();
if (!trimmed) return;
if (trimmed.length > MAX_ASSISTANT_EMOJI) return;
let hasNonAscii = false;
for (let i = 0; i < trimmed.length; i += 1) if (trimmed.charCodeAt(i) > 127) {
hasNonAscii = true;
break;
}
if (!hasNonAscii) return;
if (isAvatarUrl(trimmed) || looksLikeAvatarPath(trimmed)) return;
return trimmed;
}
/** Resolve the display name/avatar/emoji for an agent-facing assistant identity. */
function resolveAssistantIdentity(params) {
const defaultAgentId = normalizeAgentId(resolveDefaultAgentId(params.cfg));
const agentId = normalizeAgentId(params.agentId ?? defaultAgentId);
const isDefaultAgent = agentId === defaultAgentId;
const workspaceDir = params.workspaceDir ?? resolveAgentWorkspaceDir(params.cfg, agentId);
const configAssistant = params.cfg.ui?.assistant;
const agentIdentity = resolveAgentIdentity(params.cfg, agentId);
const fileIdentity = workspaceDir ? loadAgentIdentity(workspaceDir) : null;
const uiName = coerceIdentityValue(configAssistant?.name, MAX_ASSISTANT_NAME);
const agentName = coerceIdentityValue(agentIdentity?.name, MAX_ASSISTANT_NAME);
const fileName = coerceIdentityValue(fileIdentity?.name, MAX_ASSISTANT_NAME);
const name = (isDefaultAgent ? uiName ?? agentName ?? fileName : agentName ?? fileName ?? uiName) ?? DEFAULT_ASSISTANT_IDENTITY.name;
const uiAvatar = coerceIdentityValue(configAssistant?.avatar, MAX_ASSISTANT_AVATAR);
const agentAvatarCandidates = [
coerceIdentityValue(agentIdentity?.avatar, MAX_ASSISTANT_AVATAR),
coerceIdentityValue(agentIdentity?.emoji, MAX_ASSISTANT_AVATAR),
coerceIdentityValue(fileIdentity?.avatar, MAX_ASSISTANT_AVATAR),
coerceIdentityValue(fileIdentity?.emoji, MAX_ASSISTANT_AVATAR)
];
return {
agentId,
name,
avatar: (isDefaultAgent ? [uiAvatar, ...agentAvatarCandidates] : [...agentAvatarCandidates, uiAvatar]).map((candidate) => normalizeAvatarValue(candidate)).find(Boolean) ?? DEFAULT_ASSISTANT_IDENTITY.avatar,
emoji: [
coerceIdentityValue(agentIdentity?.emoji, MAX_ASSISTANT_EMOJI),
coerceIdentityValue(fileIdentity?.emoji, MAX_ASSISTANT_EMOJI),
coerceIdentityValue(agentIdentity?.avatar, MAX_ASSISTANT_EMOJI),
coerceIdentityValue(fileIdentity?.avatar, MAX_ASSISTANT_EMOJI)
].map((candidate) => normalizeEmojiValue(candidate)).find(Boolean)
};
}
//#endregion
export { resolveAssistantIdentity as n, DEFAULT_ASSISTANT_IDENTITY as t };