import type {
ChannelMessageActionName,
ChannelThreadingToolContext,
} from "../../channels/plugins/types.public.js" ;
import { normalizeOptionalString } from "../../shared/string-coerce.js" ;
import {
isDeliverableMessageChannel,
normalizeMessageChannel,
} from "../../utils/message-channel.js" ;
import { applyTargetToParams } from "./channel-target.js" ;
import { actionHasTarget, actionRequiresTarget } from "./message-action-spec.js" ;
export function normalizeMessageActionInput(params: {
action: ChannelMessageActionName;
args: Record<string, unknown>;
toolContext?: ChannelThreadingToolContext;
}): Record<string, unknown> {
const normalizedArgs = { ...params.args };
const { action, toolContext } = params;
const explicitChannel = normalizeOptionalString(normalizedArgs.channel) ?? "" ;
const inferredChannel =
explicitChannel || normalizeMessageChannel(toolContext?.currentChannelProvider) || "" ;
const explicitTarget = normalizeOptionalString(normalizedArgs.target) ?? "" ;
const hasLegacyTargetFields =
typeof normalizedArgs.to === "string" || typeof normalizedArgs.channelId === "string" ;
const hasLegacyTarget =
(normalizeOptionalString(normalizedArgs.to) ?? "" ).length > 0 ||
(normalizeOptionalString(normalizedArgs.channelId) ?? "" ).length > 0 ;
if (explicitTarget && hasLegacyTargetFields) {
delete normalizedArgs.to;
delete normalizedArgs.channelId;
}
if (
!explicitTarget &&
!hasLegacyTarget &&
actionRequiresTarget(action) &&
!actionHasTarget(action, normalizedArgs, { channel: inferredChannel })
) {
const inferredTarget = normalizeOptionalString(toolContext?.currentChannelId);
if (inferredTarget) {
normalizedArgs.target = inferredTarget;
}
}
if (!explicitTarget && actionRequiresTarget(action) && hasLegacyTarget) {
const legacyTo = normalizeOptionalString(normalizedArgs.to) ?? "" ;
const legacyChannelId = normalizeOptionalString(normalizedArgs.channelId) ?? "" ;
const legacyTarget = legacyTo || legacyChannelId;
if (legacyTarget) {
normalizedArgs.target = legacyTarget;
delete normalizedArgs.to;
delete normalizedArgs.channelId;
}
}
if (!explicitChannel) {
if (inferredChannel && isDeliverableMessageChannel(inferredChannel)) {
normalizedArgs.channel = inferredChannel;
}
}
applyTargetToParams({ action, args: normalizedArgs });
if (
actionRequiresTarget(action) &&
!actionHasTarget(action, normalizedArgs, { channel: inferredChannel })
) {
throw new Error(`Action ${action} requires a target.`);
}
return normalizedArgs;
}
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland