#15914: feat: add messages.suppressMediaPlaceholders config option
channel: discord
channel: imessage
channel: signal
gateway
agents
stale
size: S
Cluster:
Signal Plugin Enhancements
## Problem
When sending audio/voice messages via OpenClaw's message tool, the core automatically adds `<media:audio>` as fallback text (#15840). This appears even when explicitly passing an empty message parameter.
## Solution
Add `messages.suppressMediaPlaceholders` config option to disable automatic placeholder text.
## Changes
- **Config**: Add `suppressMediaPlaceholders?: boolean` to `MessagesConfig` type
- **Signal**: Skip placeholder when `suppressMediaPlaceholders` is true
- **iMessage**: Skip placeholder when `suppressMediaPlaceholders` is true
## Usage
```json
{
"messages": {
"suppressMediaPlaceholders": true
}
}
```
With this enabled, voice-only messages show just the audio attachment without `<media:audio>` text.
## Default Behavior
Default is `false` to preserve existing accessibility fallback behavior.
Fixes #15840
<!-- greptile_comment -->
<h2>Greptile Overview</h2>
<h3>Greptile Summary</h3>
This PR bundles multiple unrelated fixes into a single commit: the `suppressMediaPlaceholders` config option (Signal/iMessage), Venice streaming disable, cron timestamp normalization, daemon launchd detection stricter filtering, Discord bot self-message filtering, and hook debug logging.
- **`suppressMediaPlaceholders` config (Signal + iMessage)**: Cleanly implemented — the new boolean config option correctly gates placeholder insertion, and both channels handle the empty-message-with-attachment case safely via existing validation guards.
- **`src/daemon/inspect.ts` — Critical logic bug**: The new guard skips non-gateway openclaw services, but the *pre-existing* guard already skips gateway openclaw services. Together these two conditions cover all `marker === "openclaw"` cases, meaning **no** openclaw service is ever reported. This effectively disables gateway conflict detection entirely.
- **`src/agents/venice-models.ts` — Type error**: Adds `params: { streaming: false }` to `ModelDefinitionConfig` objects, but that type has no `params` property. This will fail strict TypeScript type-checking.
- **`src/cron/normalize.ts` — Missing kind inference**: Adds support for numeric `schedule.at` timestamps, but the kind-inference block doesn't check `typeof schedule.at === "number"`, so numeric `at` without explicit `kind` won't auto-infer `kind: "at"`.
- **Discord + hooks changes**: The Discord early bot-filter and hook debug logging are straightforward and correct.
<h3>Confidence Score: 1/5</h3>
- This PR contains a critical logic bug in daemon/inspect.ts that silently disables gateway detection, plus a type error in venice-models.ts.
- Score of 1 reflects two blocking issues: (1) the daemon inspect logic bug where both gateway and non-gateway openclaw services are skipped, completely breaking the conflict detection feature, and (2) the TypeScript type error where `params` is not a valid property of `ModelDefinitionConfig`. There is also a minor logic gap in cron normalize kind inference for numeric `at` values.
- Pay close attention to `src/daemon/inspect.ts` (logic bug silently skips all openclaw services), `src/agents/venice-models.ts` (type error), and `src/cron/normalize.ts` (missing kind inference for numeric `at`).
<sub>Last reviewed commit: 21ebfbc</sub>
<!-- greptile_other_comments_section -->
<!-- /greptile_comment -->
Most Similar PRs
#15853: feat: add option to suppress media placeholder text
by MisterGuy420 · 2026-02-14
87.3%
#22940: fix(discord): detect voice messages for preflight transcription bef...
by aldoeliacim · 2026-02-21
77.7%
#15864: feat: add deliverOnlyToolMessages config for clean messaging channe...
by gandalf-the-engineer · 2026-02-14
77.4%
#19632: fix: suppressToolErrors now suppresses exec tool failure notifications
by Gitjay11 · 2026-02-18
77.1%
#21230: Fix [Bug]: Discord attachments silently missing (Fixes #19956)
by vasujain00 · 2026-02-19
76.9%
#21132: fix: allow message(action='read') in isolated/cron sessions + add H...
by matt-bedda · 2026-02-19
76.8%
#17647: fix: Display error messages instead of (no output) for non-Claude m...
by MisterGuy420 · 2026-02-16
76.6%
#15900: fix(discord): filter bot's own messages early to prevent self-DoS
by Shuai-DaiDai · 2026-02-14
76.2%
#16733: fix(ui): avoid injected newlines when tool output is hidden
by jp117 · 2026-02-15
76.1%
#4878: fix: string/type handling and API fixes (#4537, #4380, #4373, #4547...
by lailoo · 2026-01-30
76.0%