fix(imessage): honor actions.reply=false when resolving replyToId#92920
fix(imessage): honor actions.reply=false when resolving replyToId#929201052326311 wants to merge 1 commit into
Conversation
When `channels.imessage.accounts.<id>.actions.reply` is explicitly `false` (e.g. because SIP prevents private-API injection), the iMessage send path still forwarded `replyToId` to the imsg bridge, causing outbound delivery to fail with: System Integrity Protection (SIP) is enabled. Refusing to inject into Messages.app. Disable SIP before using imsg launch. Gate `resolvedReplyToId` on `account.config.actions?.reply !== false`. The default (actions.reply undefined or true) preserves existing behavior. Tests: 46 → 51 (5 new regression tests) Closes openclaw#92142
|
Codex review: needs real behavior proof before merge. Reviewed June 14, 2026, 4:49 AM ET / 08:49 UTC. Summary PR surface: Source +5, Tests +112. Total +117 across 2 files. Reproducibility: yes. for source-level reproduction: current Review metrics: none identified. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Merge the narrow send-boundary gate after the contributor adds redacted real macOS/iMessage proof and the exact PR head has green validation. Do we have a high-confidence way to reproduce the issue? Yes for source-level reproduction: current Is this the best way to solve the issue? Yes, the patch shape appears to be the narrow maintainable fix because it gates at the resolved iMessage send boundary shared by text, media, and final delivery callers. Merge readiness still depends on real behavior proof and exact-head checks. AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 439a9e97fd61. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +5, Tests +112. Total +117 across 2 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
|
Thanks for sending this fix. I’m closing this as superseded by maintainer PR #93137. That PR carries the same #92142 fix at the iMessage sender boundary while keeping the maintainer-owned branch authoritative. Your PR’s broader sender-boundary coverage helped confirm the desired test shape, and #93137 includes focused text and media regression checks. The issue remains tracked through #93137. |
Summary
When
channels.imessage.accounts.<id>.actions.replyis explicitlyfalse, the iMessage send path still forwardedreplyToIdto the imsg bridge, causing outbound delivery to fail with:The bridge attempts a threaded/native reply via Messages.app private API, which requires SIP to be disabled. When
actions.replyisfalse, the user has explicitly opted out of reply actions (making this a no-SIP-safe configuration), but the send layer ignored this setting.Fix
Gate
resolvedReplyToIdonaccount.config.actions?.reply !== false. Whenactions.replyisfalse,replyToIdis stripped before any delivery path, so the bridge sends a normal top-level message instead of a threaded reply.Default behavior (
actions.replyundefined ortrue) is preserved unchanged.Files changed
extensions/imessage/src/send.ts— gateresolvedReplyToIdonactions.replyextensions/imessage/src/send.test.ts— 5 new regression testsReal behavior proof
Behavior addressed: iMessage final reply delivery fails under SIP because
replyToIdis forwarded to the imsg bridge even whenactions.replyisfalse.Real environment tested: Local OpenClaw checkout at PR head, macOS/Darwin arm64, Node v22.22.0.
Before-fix (source-level):
After-fix (source-level):
Test results:
New regression tests in
actions.reply gatingblock:includes reply_to when actions.reply is true— explicit enable still worksincludes reply_to when actions.reply is not set— default (not configured) preserves existing behaviorstrips reply_to when actions.reply is false— core fixstrips reply_to from media sends when actions.reply is false— media path also gatedstrips reply_to from attachment send-attachment when actions.reply is false and audioAsVoice— voice attachment path gatedCloses #92142