openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
42 lines (41 loc) • 2.45 kB
JavaScript
import { c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js";
import { i as mergeDeliveryContext, n as deliveryContextFromSession, o as normalizeDeliveryContext } from "./delivery-context.shared-CpAdEETO.js";
import { t as getLoadedChannelPluginForRead } from "./registry-loaded-read-7phT5GIn.js";
import { r as isInternalMessageChannel } from "./message-channel-BiOeMu0l.js";
import { i as stripTargetTopicSuffix, n as stripTargetKindPrefix, r as stripTargetProviderPrefix } from "./channel-target-prefix-l64LTfQ6.js";
//#region src/agents/subagent-announce-origin.ts
/**
* Subagent announcement origin resolver.
*
* Merges requester and session delivery context while avoiding stale thread ids after retargeting.
*/
function normalizeAnnounceRouteTarget(context) {
const rawTo = normalizeOptionalString(context?.to);
if (!rawTo) return;
const channel = normalizeOptionalString(context?.channel);
const messaging = channel ? getLoadedChannelPluginForRead(channel)?.messaging : void 0;
const route = stripTargetTopicSuffix(stripTargetKindPrefix(stripTargetProviderPrefix(rawTo, channel ?? ""), ["group", "channel"]));
return (messaging?.normalizeTarget?.(route) ?? route) || void 0;
}
function shouldStripThreadFromAnnounceEntry(normalizedRequester, normalizedEntry) {
if (!normalizedRequester?.to || normalizedRequester.threadId != null || normalizedEntry?.threadId == null) return false;
const requesterTarget = normalizeAnnounceRouteTarget(normalizedRequester);
const entryTarget = normalizeAnnounceRouteTarget(normalizedEntry);
if (requesterTarget && entryTarget) return requesterTarget !== entryTarget;
return false;
}
/** Resolve the delivery origin for a subagent completion announcement. */
function resolveAnnounceOrigin(entry, requesterOrigin) {
const normalizedRequester = normalizeDeliveryContext(requesterOrigin);
const normalizedEntry = deliveryContextFromSession(entry);
if (normalizedRequester?.channel && isInternalMessageChannel(normalizedRequester.channel)) return mergeDeliveryContext({
accountId: normalizedRequester.accountId,
threadId: normalizedRequester.threadId
}, normalizedEntry);
return mergeDeliveryContext(normalizedRequester, normalizedEntry && shouldStripThreadFromAnnounceEntry(normalizedRequester, normalizedEntry) ? (() => {
const { threadId: _ignore, ...rest } = normalizedEntry;
return rest;
})() : normalizedEntry);
}
//#endregion
export { resolveAnnounceOrigin as t };