// Resolves queue settings from config, directives, and fallback policy. import { normalizeOptionalLowercaseString } from "@openclaw/normalization-core/string-coerce"; import type { InboundDebounceByProvider } from "../../../config/types.messages.js"; import { normalizePersistedQueueMode, normalizeQueueDropPolicy, normalizeQueueMode, } from "./normalize.js"; import { DEFAULT_QUEUE_CAP, DEFAULT_QUEUE_DEBOUNCE_MS, DEFAULT_QUEUE_DROP } from "./state.js"; import type { QueueSettings, ResolveQueueSettingsParams } from "./types.js"; /** Resolve per-channel debounce override from debounceMsByChannel map. */ function resolveChannelDebounce( byChannel: InboundDebounceByProvider | undefined, channelKey: string | undefined, ): number | undefined { if (!channelKey || !byChannel) { return undefined; } const value = byChannel[channelKey]; return typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : undefined; } export function resolveQueueSettingsCore(params: ResolveQueueSettingsParams): QueueSettings { const channelKey = normalizeOptionalLowercaseString(params.channel); const queueCfg = params.cfg.messages?.queue; const providerModeRaw = channelKey && queueCfg?.byChannel ? (queueCfg.byChannel as Record)[channelKey] : undefined; const resolvedMode = params.inlineMode ?? normalizePersistedQueueMode(params.sessionEntry?.queueMode) ?? normalizeQueueMode(providerModeRaw) ?? normalizeQueueMode(queueCfg?.mode) ?? "steer"; const debounceRaw = params.inlineOptions?.debounceMs ?? params.sessionEntry?.queueDebounceMs ?? resolveChannelDebounce(queueCfg?.debounceMsByChannel, channelKey) ?? params.pluginDebounceMs ?? DEFAULT_QUEUE_DEBOUNCE_MS; const capRaw = params.inlineOptions?.cap ?? params.sessionEntry?.queueCap ?? queueCfg?.cap ?? DEFAULT_QUEUE_CAP; const dropRaw = params.inlineOptions?.dropPolicy ?? params.sessionEntry?.queueDrop ?? normalizeQueueDropPolicy(queueCfg?.drop) ?? DEFAULT_QUEUE_DROP; return { mode: resolvedMode, debounceMs: typeof debounceRaw === "number" ? Math.max(0, debounceRaw) : undefined, cap: typeof capRaw === "number" ? Math.max(1, Math.floor(capRaw)) : undefined, dropPolicy: dropRaw, }; }