* [AI] fix(auto-reply): strip stray punctuation before silent-reply token detection
When the model emits .NO_REPLY or *NO_REPLY* instead of bare NO_REPLY,
isSilentReplyText() failed to detect it because the regex requires
the text to consist only of the token with optional whitespace.
Add stripEdgeNonAlnum() that strips leading/trailing non-letter,
non-number characters (Unicode-aware) before the regex test. This
catches stray punctuation while preserving the existing safeguard
against suppressing mixed-content text.
Related to #98166
Co-Authored-By: Claude <noreply@anthropic.com>
* [AI] fix: strip only punct not emoji before silent-reply detection
Change stripEdgeNonAlnum to stripEdgePunct: strip only punctuation (\p{P}) instead of all non-letter/non-number characters. Emoji would be stripped by the former, causing false silent-reply on mixed content.
Related to #98166
Co-Authored-By: Claude <noreply@anthropic.com>
* [AI] fix: preserve exact custom-token match before edge-punct normalization
Try exact regex match first, then fall back to stripEdgePunct.
This preserves exact matching for custom tokens whose first/last
character is punctuation (e.g. *SILENT*, #QUIET#), while still
catching the common case of NO_REPLY wrapped in stray punctuation.
Add regression test for punctuation-edged custom tokens.
ClawSweeper: https://github.com/openclaw/openclaw/pull/98224#issuecomment-4846415801
Related to #98166
Co-Authored-By: Claude <noreply@anthropic.com>
* [AI] fix: handle whitespace-wrapped punctuation in silent-reply fallback
Trim whitespace before stripping edge punctuation in the fallback
path so variants like " .NO_REPLY " and "NO_REPLY. " are also
caught by the silent-reply detector.
Add regression coverage for whitespace-wrapped edge punctuation.
ClawSweeper: https://github.com/openclaw/openclaw/pull/98224#issuecomment-4846415801
Related to #98166
Co-Authored-By: Claude <noreply@anthropic.com>
* test(auto-reply): tighten silent-token boundaries
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* fix(media): guard ffprobe JSON parse against malformed output
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore: trigger CI re-run
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* chore: trigger CI re-run
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix(media): validate ffprobe JSON shape
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* improve: tighten iOS Control row density
* test(ios): drop brittle control row source guards
* chore(i18n): sync iOS Control inventory
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>