mirror of
https://github.com/hanzoai/bot.git
synced 2026-10-30 17:24:26 +00:00
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.
3.6 KiB
3.6 KiB
summary, read_when, title
| summary | read_when | title | |
|---|---|---|---|
| Image and media handling rules for send, gateway, and agent replies |
|
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>]--mediaoptional; caption can be empty for media-only sends.--dry-runprints the resolved payload;--jsonemits{ 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.
- Images: resize & recompress to JPEG (max side 2048px) targeting
- 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
--messageorreply.text; empty caption is allowed. - Logging: non-verbose shows
↩️/✅; verbose includes size and source path/URL.
Auto-Reply Pipeline
getReplyFromConfigreturns{ 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/MediaUrlare rewritten to a relative path likemedia/inbound/<filename>. - Media understanding (if configured via
tools.media.*or sharedtools.media.models) runs before templating and can insert[Image],[Audio], and[Video]blocks intoBody.- 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.
- Audio sets
- By default only the first matching image/audio/video attachment is processed; set
tools.media.<cap>.attachmentsto 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.