Files
zeekay acaeda400a Eradicate OpenClaw — resolve merge conflicts and finish the rebrand
Three coordinated things:

1. Resolve the committed upstream/main merge conflicts. 94 files were
   sitting with raw <<<<<<< HEAD ... >>>>>>> upstream/main blocks. Every
   conflict had HanzoBot/Bot on HEAD and OpenClaw on upstream. Resolved
   by keeping HEAD everywhere — 540 conflict blocks.

2. Rewrite remaining OpenClaw text refs.
     OPENCLAW   → HANZO_BOT
     OpenClaw   → HanzoBot          (PascalCase type identifiers)
     openclaw   → bot               (codebase convention — botToken,
                                    botUsername etc.; avoids invalid
                                    hyphenated JS identifiers)
     openclaw[_]/openclaw[A-Z] → bot[_]/bot[A-Z]   (compound)
     ai.openclaw.x → ai.hanzo.bot.x  (JVM package path)

3. Delete or rename openclaw-named file paths (116 of them). Dead
   duplicates with a Bot-named canonical from the partial migration:
   deleted. Otherwise renamed.
     ai/openclaw/**           → deleted (ai/hanzo/bot/** canonical)
     Sources/OpenClaw*/       → deleted (Sources/Bot* canonical)
     Tests/OpenClawIPCTests/  → deleted (Tests/BotIPCTests canonical)
     OpenClawKit/             → deleted (BotKit canonical)
     openclaw-tools.*.ts      → deleted (bot-tools.*.ts canonical)
     openclaw-root.ts etc.    → deleted (bot-root.ts canonical)
     types.openclaw.ts        → deleted (types.bot.ts canonical)
     extensions/*/openclaw.plugin.json → renamed hanzo-bot.plugin.json
     docs/start/openclaw.md   → renamed hanzo-bot.md (+ zh-CN)
     docs/assets/openclaw-*.png, whatsapp-openclaw*.jpg → deleted
     scripts/.../openclaw-*   → deleted (bot/hanzo-bot parallels)
     openclaw.mjs             → deleted (hanzo-bot.mjs is package.bin)

Then patched 65 broken JS/TS import strings where hanzo-bot had ended
up inside an import path ('./types.hanzo-bot.js' → './types.bot.js'
etc., since the on-disk filename uses the brand-neutral bot- prefix).

Pre-existing lint debt cleaned up to get oxlint --type-aware to 0/0:
removed the dead i18n test that referenced a path no longer existing;
defined the missing DIDConfig and WalletConfig types in types.base.ts
(they were imported but never declared); dropped unused imports;
collapsed redundant type assertion and a tautological meta.bot lookup
that the openclaw→bot rename made redundant.

The a2ui.bundle.js generated artifact is kept at its pre-rebrand
contents — it gets regenerated by 'pnpm canvas:a2ui:bundle' from
sources I cannot rebuild in this commit; the source side is clean.

Verified: 0 occurrences of openclaw (case-insensitive) in tree source
content, 0 file or directory paths with openclaw in the name; oxlint
--type-aware src test reports 0/0.
2026-05-11 17:56:29 -07:00

3.6 KiB
Raw Permalink Blame History

summary, read_when, title
summary read_when title
Image and media handling rules for send, gateway, and agent replies
Modifying media pipeline or attachments
Image and Media Support

Image & Media Support — 2025-12-05

The WhatsApp channel runs via Baileys Web. This document captures the current media handling rules for send, gateway, and agent replies.

Goals

  • Send media with optional captions via hanzo-bot message send --media.
  • Allow auto-replies from the web inbox to include media alongside text.
  • Keep per-type limits sane and predictable.

CLI Surface

  • hanzo-bot message send --media <path-or-url> [--message <caption>]
    • --media optional; caption can be empty for media-only sends.
    • --dry-run prints the resolved payload; --json emits { channel, to, messageId, mediaUrl, caption }.

WhatsApp Web channel behavior

  • Input: local file path or HTTP(S) URL.
  • Flow: load into a Buffer, detect media kind, and build the correct payload:
    • Images: resize & recompress to JPEG (max side 2048px) targeting agents.defaults.mediaMaxMb (default 5 MB), capped at 6 MB.
    • Audio/Voice/Video: pass-through up to 16 MB; audio is sent as a voice note (ptt: true).
    • Documents: anything else, up to 100 MB, with filename preserved when available.
  • WhatsApp GIF-style playback: send an MP4 with gifPlayback: true (CLI: --gif-playback) so mobile clients loop inline.
  • MIME detection prefers magic bytes, then headers, then file extension.
  • Caption comes from --message or reply.text; empty caption is allowed.
  • Logging: non-verbose shows ↩️/✅; verbose includes size and source path/URL.

Auto-Reply Pipeline

  • getReplyFromConfig returns { text?, mediaUrl?, mediaUrls? }.
  • When media is present, the web sender resolves local paths or URLs using the same pipeline as hanzo-bot message send.
  • Multiple media entries are sent sequentially if provided.

Inbound Media to Commands (Pi)

  • When inbound web messages include media, HanzoBot downloads to a temp file and exposes templating variables:
    • {{MediaUrl}} pseudo-URL for the inbound media.
    • {{MediaPath}} local temp path written before running the command.
  • When a per-session Docker sandbox is enabled, inbound media is copied into the sandbox workspace and MediaPath/MediaUrl are rewritten to a relative path like media/inbound/<filename>.
  • Media understanding (if configured via tools.media.* or shared tools.media.models) runs before templating and can insert [Image], [Audio], and [Video] blocks into Body.
    • Audio sets {{Transcript}} and uses the transcript for command parsing so slash commands still work.
    • Video and image descriptions preserve any caption text for command parsing.
  • By default only the first matching image/audio/video attachment is processed; set tools.media.<cap>.attachments to process multiple attachments.

Limits & Errors

Outbound send caps (WhatsApp web send)

  • Images: ~6 MB cap after recompression.
  • Audio/voice/video: 16 MB cap; documents: 100 MB cap.
  • Oversize or unreadable media → clear error in logs and the reply is skipped.

Media understanding caps (transcription/description)

  • Image default: 10 MB (tools.media.image.maxBytes).
  • Audio default: 20 MB (tools.media.audio.maxBytes).
  • Video default: 50 MB (tools.media.video.maxBytes).
  • Oversize media skips understanding, but replies still go through with the original body.

Notes for Tests

  • Cover send + reply flows for image/audio/document cases.
  • Validate recompression for images (size bound) and voice-note flag for audio.
  • Ensure multi-media replies fan out as sequential sends.