feat(whatsapp): add configurable media max size

- Add whatsapp.mediaMaxMb config option (default: 50MB)
- Increases default from previous 5MB hardcoded limit
- Allows receiving larger documents/media files
- Per-account override via whatsapp.accounts.*.mediaMaxMb

Fixes #<issue-number> (if applicable)
This commit is contained in:
Elie Habib
2026-01-08 17:22:35 +00:00
committed by Peter Steinberger
parent da2323f80e
commit 3026367c1b
3 changed files with 9 additions and 0 deletions

View File

@@ -131,6 +131,8 @@ export type WhatsAppConfig = {
groupPolicy?: GroupPolicy;
/** Outbound text chunk size (chars). Default: 4000. */
textChunkLimit?: number;
/** Maximum media file size in MB. Default: 50. */
mediaMaxMb?: number;
/** Disable block streaming for this account. */
blockStreaming?: boolean;
/** Merge streamed block replies before sending. */
@@ -160,6 +162,7 @@ export type WhatsAppAccountConfig = {
groupAllowFrom?: string[];
groupPolicy?: GroupPolicy;
textChunkLimit?: number;
mediaMaxMb?: number;
blockStreaming?: boolean;
/** Merge streamed block replies before sending. */
blockStreamingCoalesce?: BlockStreamingCoalesceConfig;

View File

@@ -1227,6 +1227,7 @@ export const ClawdbotSchema = z.object({
groupAllowFrom: z.array(z.string()).optional(),
groupPolicy: GroupPolicySchema.optional().default("open"),
textChunkLimit: z.number().int().positive().optional(),
mediaMaxMb: z.number().int().positive().optional(),
blockStreaming: z.boolean().optional(),
blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(),
groups: z
@@ -1262,6 +1263,7 @@ export const ClawdbotSchema = z.object({
groupAllowFrom: z.array(z.string()).optional(),
groupPolicy: GroupPolicySchema.optional().default("open"),
textChunkLimit: z.number().int().positive().optional(),
mediaMaxMb: z.number().int().positive().optional().default(50),
blockStreaming: z.boolean().optional(),
blockStreamingCoalesce: BlockStreamingCoalesceSchema.optional(),
actions: z

View File

@@ -83,6 +83,7 @@ export async function monitorWebInbox(options: {
accountId: string;
authDir: string;
onMessage: (msg: WebInboundMessage) => Promise<void>;
mediaMaxMb?: number;
}) {
const inboundLogger = getChildLogger({ module: "web-inbound" });
const inboundConsoleLog = createSubsystemLogger(
@@ -375,9 +376,12 @@ export async function monitorWebInbox(options: {
try {
const inboundMedia = await downloadInboundMedia(msg, sock);
if (inboundMedia) {
const maxBytes = (options.mediaMaxMb ?? 50) * 1024 * 1024;
const saved = await saveMediaBuffer(
inboundMedia.buffer,
inboundMedia.mimetype,
"inbound",
maxBytes,
);
mediaPath = saved.path;
mediaType = inboundMedia.mimetype;