UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

423 lines (422 loc) • 25.1 kB
import { l as normalizeOptionalString } from "./string-coerce-6kR-86XC.mjs"; import { n as formatInlineCodeSpan } from "./markdown-code-Buzx6wvi.mjs"; import { o as classifyOAuthRefreshFailure } from "./oauth-refresh-failure-Go2BQdE9.mjs"; import { i as isSilentReplyPayloadText, t as HEARTBEAT_TOKEN } from "./tokens-BTKQYTUd.mjs"; import { o as hasReplyPayloadContent } from "./payload-B9AxxNvV.mjs"; import { T as setReplyPayloadMetadata, a as copyReplyPayloadMetadata, l as hasReplyPayloadSpeechContent, s as getReplyPayloadMetadata, x as markReplyPayloadForSourceSuppressionDelivery } from "./reply-payload-DBtQZ6PK.mjs"; import { m as isTimeoutErrorMessage } from "./message-patterns-QVXLboHm.mjs"; import { c as trimTextPreservingCode } from "./text-projection-CNGD_ARQ.mjs"; import { t as parseReplyDirectives } from "./reply-directives-Dy5vZKi1.mjs"; import "./classify-Ds2nZqCN.mjs"; import { h as formatUserFacingAssistantErrorText, m as formatAssistantErrorText } from "./embedded-agent-helpers-DKuJhdd0.mjs"; import { r as normalizeTextForComparison } from "./messaging-dedupe-BmhhMVBf.mjs"; import { t as buildProviderLoginRecovery } from "./provider-login-recovery-D-4z1cq8.mjs"; import { o as resolveToolDisplay } from "./tool-display-DLY_VyQb.mjs"; import { n as formatToolAggregateParts } from "./tool-meta-C8eh5Nql.mjs"; import { r as isExecLikeToolName } from "./tool-error-summary-BGZoXZWD.mjs"; import { i as createHeartbeatToolResponsePayload } from "./heartbeat-tool-response-C2nXg1C8.mjs"; import { _ as hasVisibleCommittedMessagingToolDeliveryEvidence, f as hasCompletedMessagingToolDeliveryEvidence, y as resolveExplicitFinalSourceReplyDeliveryEvidence } from "./delivery-evidence-CxxgEIuM.mjs"; import { a as extractAssistantThinking, m as sanitizeAssistantVisibleStreamText, o as extractAssistantVisibleText } from "./embedded-agent-utils-CtIx7yzd.mjs"; import { t as resolveRawAssistantAnswerText } from "./assistant-answer-text-DEHRpf0n.mjs"; //#region src/agents/embedded-agent-runner/run/source-reply-payloads.ts /** Builds transcript mirrors and completion evidence for message-tool source replies. */ function buildSourceReplyPayloadState(params) { const sourceReplyPayloads = params.payloads ?? []; const replyItems = sourceReplyPayloads.flatMap((payload, index) => { const text = normalizeOptionalString(payload.text) ?? ""; const media = (payload.mediaUrls?.length ? payload.mediaUrls : payload.mediaUrl ? [payload.mediaUrl] : []).filter((value) => value.trim().length > 0); if (!text && media.length === 0 && !payload.presentation && !payload.interactive && !payload.channelData) return []; return [{ text, ...payload.mediaUrl ? { mediaUrl: payload.mediaUrl } : {}, ...media.length ? { media } : {}, ...payload.audioAsVoice ? { audioAsVoice: true } : {}, ...payload.attachments?.length ? { attachments: payload.attachments } : {}, ...payload.trustedLocalMedia !== void 0 ? { trustedLocalMedia: payload.trustedLocalMedia } : {}, ...payload.presentation ? { presentation: payload.presentation } : {}, ...payload.interactive ? { interactive: payload.interactive } : {}, ...payload.channelData ? { channelData: payload.channelData } : {}, sourceReplyMirror: { idempotencyKey: payload.idempotencyKey ?? (params.runId ? `${params.runId}:internal-source-reply:${index}` : void 0), ...payload.transcriptOwner ? { transcriptOwner: true } : {} } }]; }); const hasSourceReplyPayload = replyItems.length > 0; const deliveredSourceReplyViaMessageTool = params.sourceReplyDeliveryMode === "message_tool_only" && params.didDeliverSourceReplyViaMessageTool === true; return { replyItems, hasSourceReplyPayload, deliveredSourceReplyViaMessageTool, completedSourceReplyViaMessageTool: resolveExplicitFinalSourceReplyDeliveryEvidence({ messagingToolSentTargets: params.sentTargets, messagingToolSourceReplyPayloads: sourceReplyPayloads }) ?? (hasSourceReplyPayload || deliveredSourceReplyViaMessageTool) }; } //#endregion //#region src/agents/embedded-agent-runner/run/tool-error-warning.ts function formatWarningToolLabel(toolName, metas, markdown) { const { label } = resolveToolDisplay({ name: toolName }); const { detail } = formatToolAggregateParts(toolName, metas, { markdown }); return detail ? `${label}: ${detail}` : label; } /** Always warn when a tool failure would otherwise leave the user with no reply. */ function buildFailureWarning(params) { if (params.hasUserFacingReply) return; const includeDetails = params.verboseLevel === "full"; const failureVerb = params.lastToolError.executionStarted === false ? "blocked" : "failed"; const terminalDiagnostic = params.lastToolError.terminalDiagnostic; if (terminalDiagnostic?.kind === "timeout") { const toolLabel = resolveToolDisplay({ name: params.lastToolError.toolName }).label; const count = terminalDiagnostic.partialResults; const partialSuffix = count ? `; ${count} partial ${count === 1 ? "result is" : "results are"} available` : ""; const errorSuffix = includeDetails && params.lastToolError.error ? `: ${params.lastToolError.error}` : "."; return `⚠️ ${toolLabel} timed out after ${terminalDiagnostic.timeoutMs / 1e3}s${partialSuffix}${errorSuffix}`; } if (terminalDiagnostic?.kind === "process") return `⚠️ ${formatWarningToolLabel("process", includeDetails ? [terminalDiagnostic.sessionId] : void 0, params.useMarkdown)} failed (${terminalDiagnostic.reason.kind === "exit" ? `exit ${terminalDiagnostic.reason.exitCode}` : terminalDiagnostic.reason.kind === "signal" ? `signal ${terminalDiagnostic.reason.signal}` : terminalDiagnostic.reason.timeoutKind === "no-output-timeout" ? "timed out waiting for output" : "timed out"})${includeDetails && params.lastToolError.error ? `: ${params.lastToolError.error}` : ""}.`; const errorSuffix = (includeDetails || params.lastToolError.errorCode === "approval_timeout") && params.lastToolError.error ? `: ${params.lastToolError.error}` : ""; if (isExecLikeToolName(params.lastToolError.toolName)) { const toolLabel = resolveToolDisplay({ name: params.lastToolError.toolName }).label; const subject = includeDetails ? formatExecLikeFailureSubject(params.lastToolError.meta, params.useMarkdown) : ""; const conciseExitSuffix = includeDetails ? "" : formatConciseExecExitSuffix(params.lastToolError.error); return `⚠️ ${toolLabel} ${failureVerb}${subject ? `: ${subject}` : ""}${conciseExitSuffix}${errorSuffix}`; } return `⚠️ ${formatWarningToolLabel(params.lastToolError.toolName, includeDetails && params.lastToolError.meta ? [params.lastToolError.meta] : void 0, params.useMarkdown)} ${failureVerb}${errorSuffix}`; } function formatExecLikeFailureSubject(meta, markdown) { const normalized = normalizeOptionalString(meta); if (!normalized) return ""; const { flags, body } = splitExecLikeFailureMeta(normalized); if (!body) return flags.join(" · "); const { text, suffix } = splitDisplayContextSuffix(body); const command = extractLiteralExecCommand(text) ?? text; const subject = `${markdown ? formatInlineCodeSpan(command) : command}${suffix}`; return flags.length > 0 ? `${flags.join(" · ")} · ${subject}` : subject; } function splitExecLikeFailureMeta(meta) { const flags = []; const bodyParts = []; for (const part of meta.split(" · ").map((candidate) => candidate.trim()).filter(Boolean)) { if (part === "elevated" || part === "pty") { flags.push(part); continue; } bodyParts.push(part); } return { flags, body: bodyParts.join(" · ") }; } const SEMANTIC_RUN_SUMMARIES = /* @__PURE__ */ new Set([ "tests", "build", "lint", "script", "command" ]); const LITERAL_RUN_SUMMARY_PREFIXES = /* @__PURE__ */ new Set([ "python", "python3", "ruby", "php", "git", "npm", "pnpm", "yarn", "bun", "openclaw", "make", "cargo", "go", "docker", "npx", "uv", "poetry", "pytest", "vitest", "jest", "deno" ]); function extractLiteralExecCommand(body) { const rawCommand = extractRawExecCommand(body); if (rawCommand) return rawCommand; const nodeScript = body.match(/^run node script (.+)$/u); if (nodeScript?.[1]) return `node ${nodeScript[1]}`; const runSubject = body.match(/^run (.+)$/u)?.[1]; if (runSubject && isKnownLiteralRunSummary(runSubject)) return runSubject; } function extractRawExecCommand(body) { const codeSpan = extractTrailingMarkdownCodeSpan(body); if (!codeSpan) return; const context = extractRawExecContext(codeSpan.prefix, codeSpan.value); const command = context.trailing.reduce((value, suffix) => `${value} ${suffix}`, codeSpan.value); return context.leading.length > 0 ? `${context.leading.join(" · ")} · ${command}` : command; } function extractTrailingMarkdownCodeSpan(body) { const trimmed = body.trimEnd(); if (!trimmed.endsWith("`")) return; let delimiterLength = 0; for (let index = trimmed.length - 1; index >= 0 && trimmed[index] === "`"; index -= 1) delimiterLength += 1; const delimiter = "`".repeat(delimiterLength); const valueEnd = trimmed.length - delimiterLength; let searchIndex = 0; while (searchIndex < valueEnd) { const openIndex = trimmed.indexOf(delimiter, searchIndex); if (openIndex < 0 || openIndex >= valueEnd) return; const prefixMatch = trimmed.slice(0, openIndex).match(/^(?:(.*)(?:,\s*| · ))?$/u); if (prefixMatch) return { prefix: prefixMatch[1], value: unwrapMarkdownInlineCodePadding(trimmed.slice(openIndex + delimiterLength, valueEnd)) }; searchIndex = openIndex + delimiterLength; } } function unwrapMarkdownInlineCodePadding(value) { if (value.length < 2 || !value.startsWith(" ") || !value.endsWith(" ")) return value; const unwrapped = value.slice(1, -1); return /\S/u.test(unwrapped) ? unwrapped : value; } function extractRawExecContext(prefix, inlineCode) { const value = prefix ?? ""; return { leading: [...value.matchAll(/(?:^|,\s*| · )(node:\s*[^,·]+)(?=,\s*| · |$)/gu)].map((match) => match[1]?.trim()).filter((part) => Boolean(part)), trailing: [...value.matchAll(/(\((?:agent|repo|sandbox|workspace)\)|\(in [^)\r\n]+\))(?=\s*(?:,\s*| · |$))/gu)].filter((match) => shouldKeepRawExecTrailingContext(value, match, inlineCode)).map((match) => match[1]?.trim()).filter((part) => Boolean(part)) }; } function shouldKeepRawExecTrailingContext(prefix, match, inlineCode) { const suffix = match[1]?.trim(); if (!suffix || inlineCode.includes(suffix)) return false; const segment = prefix.slice(0, match.index ?? 0).trimEnd().split(/,\s*| · /u).at(-1)?.trim(); return (segment ? extractLiteralExecCommand(segment) : void 0) === inlineCode || segment === inlineCode || /^\((?:agent|repo|workspace)\)$/u.test(suffix) || isPathLikeCwdSuffix(suffix); } function isPathLikeCwdSuffix(suffix) { const cwd = suffix.match(/^\(in ([^)\r\n]+)\)$/u)?.[1]?.trim(); return Boolean(cwd && (/^(?:\/|~|\.{1,2}(?:\/|$)|[A-Za-z]:[\\/]|\\\\)/u.test(cwd) || cwd.includes("/"))); } function isKnownLiteralRunSummary(subject) { if (SEMANTIC_RUN_SUMMARIES.has(subject) || subject.includes("→") || subject.includes("->") || /^(?:node|python3?|ruby|php) inline script(?: \(heredoc\))?$/u.test(subject)) return false; const match = subject.match(/^(\S+)\s+(.+)$/u); const command = match?.[1]; const remainder = match?.[2]; if (!command || !remainder || remainder === "command") return false; return LITERAL_RUN_SUMMARY_PREFIXES.has(command); } function splitDisplayContextSuffix(value) { const match = /^(.*?)( \((?:agent|repo|workspace|sandbox)\))$/u.exec(value); if (!match) return { text: value, suffix: "" }; return { text: match[1] ?? value, suffix: match[2] ?? "" }; } function formatConciseExecExitSuffix(error) { const code = normalizeOptionalString(error)?.match(/\b(?:command\s+)?(?:failed\s+with\s+exit\s+code|exited\s+with\s+code|exit(?:ed)?\s+code|exit\s+status)\s+(-?\d+)\b/iu)?.[1]; return code ? ` (exit ${code})` : ""; } //#endregion //#region src/agents/embedded-agent-runner/run/payloads.ts /** * Converts a completed embedded attempt into reply payloads for channels. This * is the boundary that suppresses duplicate source replies, filters raw API * errors, preserves directive metadata, and decides when tool failures must be * surfaced to the user. */ function buildEmbeddedRunPayloads(params) { const heartbeatTerminalToolFailure = params.isHeartbeatTrigger === true && params.lastToolError && params.lastToolError.mutatingAction === true ? { toolName: params.lastToolError.toolName } : void 0; if (params.heartbeatToolResponse && !heartbeatTerminalToolFailure) return [createHeartbeatToolResponsePayload(params.heartbeatToolResponse)]; const { replyItems, hasSourceReplyPayload, deliveredSourceReplyViaMessageTool, completedSourceReplyViaMessageTool } = buildSourceReplyPayloadState({ payloads: params.messagingToolSourceReplyPayloads, sentTargets: params.messagingToolSentTargets, sourceReplyDeliveryMode: params.sourceReplyDeliveryMode, didDeliverSourceReplyViaMessageTool: params.didDeliverSourceReplyViaMessageTool, runId: params.runId }); if (params.heartbeatToolResponse) { const heartbeatPayload = createHeartbeatToolResponsePayload(params.heartbeatToolResponse); replyItems.push({ text: heartbeatPayload.text ?? "", ...heartbeatPayload.channelData ? { channelData: heartbeatPayload.channelData } : {} }); } const useMarkdown = params.toolResultFormat === "markdown"; const suppressAssistantArtifacts = params.heartbeatToolResponse !== void 0 || params.didSendDeterministicApprovalPrompt === true || params.sourceReplyDeliveryMode === "message_tool_only" && hasSourceReplyPayload || deliveredSourceReplyViaMessageTool; const suppressFailureArtifacts = params.didSendDeterministicApprovalPrompt === true || params.sourceReplyDeliveryMode === "message_tool_only" && completedSourceReplyViaMessageTool; let hasUserFacingReply = completedSourceReplyViaMessageTool || params.heartbeatToolResponse?.notify === true; let hasIntentionalSilentFinal = false; const appendSegmentAnswer = ({ assistantTexts, lastAssistant, currentAssistant, assistantMessageIndex }) => { hasIntentionalSilentFinal = false; const nonEmptyAssistantTexts = assistantTexts.map((text) => sanitizeAssistantVisibleStreamText(text)).filter((text) => text.trim().length > 0); const assistantForPayload = currentAssistant ?? (nonEmptyAssistantTexts.length === 1 ? void 0 : lastAssistant); const storedDelivery = assistantForPayload?.openclawDelivery; const lastAssistantStopReason = assistantForPayload?.stopReason; const lastAssistantErrored = lastAssistantStopReason === "error"; const lastAssistantAborted = lastAssistantStopReason === "aborted"; const runAborted = params.runAborted === true || lastAssistantAborted; const lastAssistantNeedsErrorSurface = lastAssistantErrored || lastAssistantAborted; const rawErrorMessage = lastAssistantNeedsErrorSurface ? normalizeOptionalString(assistantForPayload?.errorMessage) : void 0; const oauthRefreshFailure = rawErrorMessage ? classifyOAuthRefreshFailure(rawErrorMessage) : null; const providerLoginRecovery = buildProviderLoginRecovery({ provider: oauthRefreshFailure?.provider ?? params.provider, oauthReason: oauthRefreshFailure?.reason }); const errorContext = { cfg: params.config, sessionKey: params.sessionKey, agentId: params.agentId, provider: params.provider, providerOwner: params.providerOwner, model: params.model, authMode: params.authMode }; const errorText = assistantForPayload && lastAssistantNeedsErrorSurface ? suppressFailureArtifacts ? void 0 : lastAssistantErrored || rawErrorMessage ? providerLoginRecovery?.hint ?? formatUserFacingAssistantErrorText(assistantForPayload, errorContext) : formatAssistantErrorText(assistantForPayload, errorContext) : void 0; const deferAssistantTimeoutError = params.deferAssistantTimeoutError === true && rawErrorMessage !== void 0 && isTimeoutErrorMessage(rawErrorMessage) && errorText === "LLM request timed out."; if (errorText && !deferAssistantTimeoutError) { const errorPayload = { text: errorText, isError: true, ...providerLoginRecovery ? { presentation: providerLoginRecovery.presentation } : {} }; replyItems.push(setReplyPayloadMetadata(errorPayload, { terminalProviderError: true })); } const reasoningText = suppressAssistantArtifacts || runAborted || lastAssistantNeedsErrorSurface ? "" : assistantForPayload && params.reasoningLevel === "on" && params.thinkingLevel !== "off" ? extractAssistantThinking(assistantForPayload) : ""; if (reasoningText) replyItems.push({ text: reasoningText, isReasoning: true }); hasUserFacingReply ||= Boolean(errorText); if (!suppressAssistantArtifacts && !runAborted && !lastAssistantNeedsErrorSurface) { const fallbackAnswerText = assistantForPayload ? extractAssistantVisibleText(assistantForPayload) : ""; const fallbackRawAnswerText = resolveRawAssistantAnswerText(assistantForPayload); const rawAnswerDirectiveState = fallbackRawAnswerText ? parseReplyDirectives(fallbackRawAnswerText) : null; const rawAnswerHasMedia = (rawAnswerDirectiveState?.mediaUrls?.length ?? 0) > 0 || rawAnswerDirectiveState?.audioAsVoice; const normalizedAssistantTexts = rawAnswerHasMedia && nonEmptyAssistantTexts.length > 0 && !assistantTexts.some((text) => { const parsed = parseReplyDirectives(text); return (parsed.mediaUrls?.length ?? 0) > 0 || parsed.audioAsVoice; }) ? normalizeTextForComparison(nonEmptyAssistantTexts.join("\n\n")) : ""; const shouldPreferRawAnswerText = rawAnswerDirectiveState?.isSilent || rawAnswerHasMedia && (!nonEmptyAssistantTexts.length || normalizedAssistantTexts.length > 0 && normalizedAssistantTexts === normalizeTextForComparison(rawAnswerDirectiveState?.text ?? "")); const fallbackAnswerSourceText = shouldPreferRawAnswerText && fallbackRawAnswerText ? fallbackRawAnswerText : fallbackAnswerText; const fallbackAnswerDirectiveState = fallbackAnswerSourceText === fallbackRawAnswerText ? rawAnswerDirectiveState : fallbackAnswerSourceText ? parseReplyDirectives(fallbackAnswerSourceText) : null; const shouldUseCanonicalFinalAnswer = Boolean(fallbackAnswerDirectiveState && (normalizeTextForComparison(fallbackAnswerDirectiveState.text) || fallbackAnswerDirectiveState.mediaUrls?.length) || storedDelivery?.tts?.text?.trim()); const hasAssistantTextPayload = nonEmptyAssistantTexts.length > 0; const answerTexts = shouldUseCanonicalFinalAnswer || shouldPreferRawAnswerText ? [fallbackAnswerSourceText] : hasAssistantTextPayload ? nonEmptyAssistantTexts : fallbackAnswerText ? [fallbackAnswerText] : []; const preparedAnswerDirectives = shouldUseCanonicalFinalAnswer || shouldPreferRawAnswerText || !hasAssistantTextPayload ? fallbackAnswerDirectiveState : null; for (const text of answerTexts) { const { text: cleanedText, mediaUrls, audioAsVoice, replyToId, replyToTag, replyToCurrent, isSilent } = preparedAnswerDirectives ?? parseReplyDirectives(text); hasIntentionalSilentFinal = isSilent; const ttsFacts = shouldUseCanonicalFinalAnswer ? storedDelivery?.tts : void 0; const delivery = shouldUseCanonicalFinalAnswer ? { audioAsVoice: storedDelivery?.audioAsVoice, replyToCurrent: storedDelivery?.replyToCurrent, replyToId: storedDelivery?.replyToId, replyToTag: Boolean(storedDelivery?.replyToCurrent || storedDelivery?.replyToId) } : { audioAsVoice, replyToId, replyToTag, replyToCurrent }; if (!cleanedText && (!mediaUrls || mediaUrls.length === 0) && !delivery.audioAsVoice && !ttsFacts) continue; const replyPayload = { text: cleanedText, media: mediaUrls, ...delivery }; if (assistantMessageIndex !== void 0) setReplyPayloadMetadata(replyPayload, { assistantMessageIndex }); replyItems.push(ttsFacts ? setReplyPayloadMetadata(replyPayload, { tts: ttsFacts }) : replyPayload); hasUserFacingReply = true; } } }; let textStart = 0; for (const segment of params.answerSegments ?? []) { const replyStart = replyItems.length; appendSegmentAnswer({ assistantTexts: params.assistantTexts.slice(textStart, segment.textEnd), lastAssistant: segment.lastAssistant, currentAssistant: segment.lastAssistant, assistantMessageIndex: segment.messageEnd }); for (const reply of replyItems.slice(replyStart)) setReplyPayloadMetadata(reply, { precedingInputAnswer: true }); textStart = segment.textEnd; } appendSegmentAnswer({ assistantTexts: params.assistantTexts.slice(textStart), lastAssistant: params.lastAssistant, currentAssistant: params.currentAssistant, assistantMessageIndex: params.assistantMessageIndex }); const respectIntentionalSilence = hasIntentionalSilentFinal && (!params.isCronTrigger || hasVisibleCommittedMessagingToolDeliveryEvidence(params) && hasCompletedMessagingToolDeliveryEvidence(params)) && !params.isHeartbeatTrigger && !params.runAborted; if (params.lastToolError && !respectIntentionalSilence) { const isRestartStatus = params.runStopReason === "restart"; const warningText = isRestartStatus ? "Gateway restarting…" : buildFailureWarning({ lastToolError: params.lastToolError, hasUserFacingReply, verboseLevel: params.verboseLevel, useMarkdown }); if (warningText) { const normalizedWarning = normalizeTextForComparison(warningText); if (!(normalizedWarning ? replyItems.some((item) => item.text && normalizeTextForComparison(item.text) === normalizedWarning) : false)) { const warning = { text: warningText, ...!isRestartStatus ? { isError: true } : {} }; if (!isRestartStatus) setReplyPayloadMetadata(warning, { toolErrorWarning: { toolName: params.lastToolError.toolName } }); replyItems.push(warning); } } } if (heartbeatTerminalToolFailure && !replyItems.some((item) => item.isReasoning !== true)) replyItems.push({ text: HEARTBEAT_TOKEN }); const hasAudioAsVoiceTag = replyItems.some((item) => item.audioAsVoice); return replyItems.map((item) => { const assistantMessageIndex = getReplyPayloadMetadata(item)?.assistantMessageIndex ?? params.assistantMessageIndex; const payload = copyReplyPayloadMetadata(item, { text: trimTextPreservingCode(item.text ?? "") || void 0 }); const mediaUrl = item.mediaUrl ?? item.media?.[0]; if (mediaUrl) payload.mediaUrl = mediaUrl; if (item.media?.length) payload.mediaUrls = item.media; if (item.attachments?.length) payload.attachments = item.attachments; if (item.trustedLocalMedia !== void 0) payload.trustedLocalMedia = item.trustedLocalMedia; if (item.isError !== void 0) payload.isError = item.isError; if (item.isReasoning === true) payload.isReasoning = true; if (item.isError === true && params.sourceReplyDeliveryMode === "message_tool_only" && !suppressFailureArtifacts) markReplyPayloadForSourceSuppressionDelivery(payload); if (heartbeatTerminalToolFailure) setReplyPayloadMetadata(payload, { heartbeatTerminalToolFailure }); if (!item.isError && !item.isReasoning && (assistantMessageIndex !== void 0 || params.assistantTranscriptOwned === true)) setReplyPayloadMetadata(payload, { ...assistantMessageIndex !== void 0 ? { assistantMessageIndex } : {}, ...item.media?.length ? { assistantTranscriptMediaUrls: [...item.media] } : {}, ...params.assistantTranscriptOwned === true ? { assistantTranscriptOwned: true } : {}, ...params.assistantTranscriptIdempotencyKey ? { assistantTranscriptIdempotencyKey: params.assistantTranscriptIdempotencyKey } : {} }); if (item.replyToId) payload.replyToId = item.replyToId; if (item.replyToTag !== void 0) payload.replyToTag = item.replyToTag; if (item.replyToCurrent !== void 0) payload.replyToCurrent = item.replyToCurrent; if (item.audioAsVoice || Boolean(hasAudioAsVoiceTag && item.media?.length)) payload.audioAsVoice = true; if (item.presentation) payload.presentation = item.presentation; if (item.interactive) payload.interactive = item.interactive; if (item.channelData) payload.channelData = item.channelData; if (item.sourceReplyMirror) { markReplyPayloadForSourceSuppressionDelivery(payload); if (params.sessionKey) setReplyPayloadMetadata(payload, { sourceReplyTranscriptMirror: { sessionKey: params.sessionKey, ...params.agentId ? { agentId: params.agentId } : {}, ...payload.text ? { text: payload.text } : {}, ...payload.mediaUrls?.length ? { mediaUrls: payload.mediaUrls } : {}, ...item.sourceReplyMirror.idempotencyKey ? { idempotencyKey: item.sourceReplyMirror.idempotencyKey } : {}, ...item.sourceReplyMirror.transcriptOwner ? { transcriptOwner: true } : {} } }); } if (payload.text && isSilentReplyPayloadText(payload.text, "NO_REPLY")) { const silentText = payload.text; payload.text = void 0; if (hasReplyPayloadContent(payload) || hasReplyPayloadSpeechContent(payload)) return payload; payload.text = silentText; } return payload; }).filter((p) => (hasReplyPayloadContent(p) || hasReplyPayloadSpeechContent(p)) && !(p.text && isSilentReplyPayloadText(p.text, "NO_REPLY"))); } //#endregion export { buildEmbeddedRunPayloads as t };