UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

93 lines (92 loc) • 4 kB
import { a as copyReplyPayloadMetadata } from "./reply-payload-DBtQZ6PK.mjs"; import { t as parseReplyDirectives } from "./reply-directives-Dy5vZKi1.mjs"; import { a as resolveSendableOutboundReplyParts } from "./reply-payload-parts-8DJKWSDo.mjs"; import { o as toRelativeWorkspacePath } from "./path-policy-o1nxUmmt.mjs"; import { t as createBoundedOutboundMediaReadFile } from "./bounded-read-file-BXBH3Nms.mjs"; import { r as resolveOutboundMediaMaxBytes } from "./configured-max-bytes-X3NTOxEj.mjs"; import { t as resolveOutboundAttachmentFromBuffer } from "./outbound-attachment-B9kI1l4M.mjs"; import { i as createReplyMediaSourcePreparer, t as applyPreparedReplyMedia } from "./reply-media-paths-BCcyfxGW.mjs"; import { t as buildEmbeddedRunPayloads } from "./payloads-D13B4pzW.mjs"; //#region src/agents/harness/reply-media-runtime.ts async function prepareHarnessReplyMedia(params) { const { request, context, signal, assertCurrent } = params; const maxBytes = resolveOutboundMediaMaxBytes({ cfg: context.cfg, channel: context.messageProvider, accountId: context.accountId }); if (request.kind === "artifact") { const saved = await resolveOutboundAttachmentFromBuffer(request.buffer, maxBytes, { filename: request.fileName }); assertCurrent(); return { kind: "payload", payload: { mediaUrl: saved.path, mediaUrls: [saved.path], trustedLocalMedia: true } }; } const prepare = createReplyMediaSourcePreparer({ ...context, workspaceMediaRoot: request.workspaceRoot ?? context.workspaceDir, workspaceMediaAccess: { localRoots: [context.workspaceDir], workspaceDir: context.workspaceDir, readFile: createBoundedOutboundMediaReadFile(async (filePath, options) => { assertCurrent(); const relativePath = toRelativeWorkspacePath(context.workspaceDir, filePath); const bytes = await request.readWorkspaceFile(relativePath, { maxBytes: Math.min(maxBytes, options?.maxBytes ?? maxBytes), signal }); assertCurrent(); return bytes; }) } }); if (request.kind === "payload") { const directives = parseReplyDirectives(request.payload.text ?? ""); const payload = copyReplyPayloadMetadata(request.payload, { ...request.payload, text: directives.text, mediaUrls: [.../* @__PURE__ */ new Set([...resolveSendableOutboundReplyParts(request.payload).mediaUrls, ...directives.mediaUrls ?? []])], ...directives.audioAsVoice ? { audioAsVoice: true } : {}, ...directives.replyToId ? { replyToId: directives.replyToId } : {}, ...directives.replyToCurrent ? { replyToCurrent: true } : {} }); const prepared = await prepare(resolveSendableOutboundReplyParts(payload).mediaUrls); assertCurrent(); return { kind: "payload", payload: applyPreparedReplyMedia(payload, prepared) }; } const result = request.attempt; const assistant = result.yieldDetected ? result.lastAssistant : result.currentAttemptCompletedAssistant; const payloads = buildEmbeddedRunPayloads({ ...context, config: context.cfg, sessionKey: context.sessionKey ?? "", assistantTexts: result.assistantTexts, answerSegments: result.answerSegments, lastAssistant: assistant, currentAssistant: result.yieldDetected ? null : assistant ?? null, lastToolError: result.lastToolError, didSendViaMessagingTool: result.didSendViaMessagingTool, didDeliverSourceReplyViaMessageTool: result.didDeliverSourceReplyViaMessageTool, messagingToolSentTargets: result.messagingToolSentTargets, messagingToolSourceReplyPayloads: result.messagingToolSourceReplyPayloads, didSendDeterministicApprovalPrompt: result.didSendDeterministicApprovalPrompt, heartbeatToolResponse: result.heartbeatToolResponse, runAborted: result.terminal.kind === "aborted" }); const preparedMedia = await prepare([...new Set(payloads.flatMap((payload) => resolveSendableOutboundReplyParts(payload).mediaUrls))]); assertCurrent(); return { kind: "attempt", preparedMedia }; } //#endregion export { prepareHarnessReplyMedia };