← Back to PRs

#20722: fix(signal): use correct JSON-RPC param names for sendReaction

by arjunblj open 2026-02-19 07:45 View on GitHub →
channel: signal size: XS
## Summary - Problem: Signal reactions via `message action=react` can be dropped because OpenClaw sends the wrong JSON-RPC parameter names to the signal-cli daemon. - Why it matters: reactions are a primary low-noise interaction mode; drops look like the agent ignored the message. - What changed: align `sendReaction` RPC params to signal-cli JSON-RPC (`recipient` / `groupId` / `remove`). - What did NOT change: no config defaults, no new endpoints, no behavior changes for non-Signal channels. ## Root cause OpenClaw talks to signal-cli’s JSON-RPC daemon over HTTP (`POST /api/v1/rpc`). The daemon maps CLI args to JSON-RPC params in camelCase; for `sendReaction`, the target args are: - positional `recipient` (multi-value) - `--group-id` (multi-value) - `--remove` (flag) So the JSON-RPC params are `recipient`, `groupId`, and `remove`. OpenClaw was sending `recipients` / `groupIds` (plural), so the daemon didn’t receive a recipient/group target and the reaction never delivered. References: - signal-cli JSON-RPC HTTP endpoints: https://github.com/AsamK/signal-cli/blob/master/man/signal-cli-jsonrpc.5.adoc - sendReaction command args: https://github.com/AsamK/signal-cli/blob/master/src/main/java/org/asamk/signal/commands/SendReactionCommand.java ## Changes - `recipient: [<uuid|e164>]` instead of `recipients: [...]` - `groupId: "<base64>"` instead of `groupIds: [...]` - keep `remove: true` for reaction removal (matches `--remove`) - update unit tests to assert the exact param shape - formatting-only: reorder one import in `src/browser/extension-relay.ts` to satisfy `pnpm format:check` with the repo’s pinned oxfmt ## Test plan - `pnpm check` - `npx vitest run src/signal/send-reactions.test.ts` ## Manual verification (not in CI) Not run against a live Signal daemon in this PR. Suggested quick check: 1. DM: `message action=react channel=signal target=uuid:<peer> messageId=<ts> emoji=🔥` 2. Group: `message action=react channel=signal target=signal:group:<id> targetAuthor=uuid:<sender> messageId=<ts> emoji=✅` 3. Removal: same call with `remove=true` ## AI assistance AI-assisted (Cursor). I reviewed the code paths and updated targeted unit tests.

Most Similar PRs