openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
91 lines (90 loc) • 3.9 kB
JavaScript
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js";
import { A as parseRawSessionConversationRef } from "./session-key-BnWWjqNc.js";
//#region src/plugins/hook-agent-context.ts
/** Builds plugin hook agent context snapshots from active session and model state. */
const TARGET_PREFIXES = /* @__PURE__ */ new Set([
"channel",
"chat",
"direct",
"dm",
"group",
"thread",
"user"
]);
function normalizeKey(value) {
return (value ?? "").trim().toLowerCase();
}
function stripConversationPrefix(value, ...providers) {
const text = normalizeOptionalString(value);
if (!text) return;
const separatorIndex = text.indexOf(":");
if (separatorIndex === -1) return text;
const prefix = normalizeKey(text.slice(0, separatorIndex));
const suffix = normalizeOptionalString(text.slice(separatorIndex + 1));
if (!suffix) return text;
if (TARGET_PREFIXES.has(prefix) || providers.some((provider) => prefix === normalizeKey(provider))) return suffix;
return text;
}
function resolveAgentHookChannel(params) {
const messageChannel = normalizeOptionalString(params.messageChannel);
const provider = normalizeOptionalString(params.messageProvider);
if (!messageChannel) return provider;
const separatorIndex = messageChannel.indexOf(":");
if (separatorIndex === -1) return messageChannel;
const prefix = normalizeOptionalString(messageChannel.slice(0, separatorIndex));
if (!prefix) return provider;
if (TARGET_PREFIXES.has(normalizeKey(prefix)) || normalizeKey(prefix) === normalizeKey(provider)) return provider;
return prefix;
}
/** Resolves the channel id exposed to plugin agent hooks. */
function resolveAgentHookChannelId(params) {
const provider = normalizeOptionalString(params.messageProvider);
const messageChannel = normalizeOptionalString(params.messageChannel);
const parsed = parseRawSessionConversationRef(params.sessionKey);
if (parsed?.rawId) return parsed.rawId;
const metadataChannel = stripConversationPrefix(params.currentChannelId ?? void 0, provider, messageChannel) ?? stripConversationPrefix(params.messageTo ?? void 0, provider, messageChannel);
if (metadataChannel && normalizeKey(metadataChannel) !== normalizeKey(provider)) return metadataChannel;
const strippedMessageChannel = stripConversationPrefix(params.messageChannel ?? void 0, provider, messageChannel);
if (strippedMessageChannel && normalizeKey(strippedMessageChannel) !== normalizeKey(provider)) return strippedMessageChannel;
return messageChannel ?? provider;
}
/** Builds channel/provider fields for plugin agent hook context. */
function buildAgentHookContextChannelFields(params) {
const channel = resolveAgentHookChannel(params);
const channelId = resolveAgentHookChannelId(params);
const accountId = normalizeOptionalString(params.agentAccountId);
return {
channel,
...accountId ? { accountId } : {},
messageProvider: normalizeOptionalString(params.messageProvider),
channelId,
chatId: channelId,
senderId: normalizeOptionalString(params.senderId)
};
}
function buildAgentHookContextIdentityFields(params) {
const trigger = normalizeOptionalString(params.trigger);
if (trigger && trigger !== "user") return {};
const senderId = normalizeOptionalString(params.senderId);
const chatId = normalizeOptionalString(params.chatId);
const sender = senderId ? {
...params.channelContext?.sender,
id: senderId
} : params.channelContext?.sender;
const chat = chatId ? {
...params.channelContext?.chat,
id: chatId
} : params.channelContext?.chat;
const channelContext = sender || chat || params.channelContext ? {
...params.channelContext,
...sender ? { sender } : {},
...chat ? { chat } : {}
} : void 0;
return {
...senderId ? { senderId } : {},
...chatId ? { chatId } : {},
...channelContext ? { channelContext } : {}
};
}
//#endregion
export { buildAgentHookContextIdentityFields as n, buildAgentHookContextChannelFields as t };