45 Commits
Author SHA1 Message Date
8d4d02a3cf fix(usage): guard malformed Z.AI usage payloads (#110741)
* fix(usage): guard malformed Z.ai usage payloads

* fix(usage): normalize Z.ai usage payloads

* fix(usage): preserve empty Z.ai snapshots

---------

Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>
Co-authored-by: Altay <altay@hey.com>
2026-07-20 16:14:42 +03:00
fab745b82d fix(infra): guard malformed Claude usage responses (#111088)
* fix(infra): guard malformed Claude usage responses

* fix(infra): normalize Claude usage payloads

Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>

---------

Co-authored-by: Leon-SK668 <17695126+Leon-SK668@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-20 03:26:33 -07:00
4e6bb619f7 fix(onboarding): preserve emoji in recommendation reasons (#110401)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 23:19:33 +01:00
Leon-SK668andGitHub d1153e4e2b fix(android): preserve graphemes in compact badges (#109486)
* fix(android): preserve graphemes in compact badges

* chore(android): satisfy native source gates

* fix(android): keep compact badge casing stable
2026-07-18 09:27:07 +01:00
dcd8f962e3 fix(qqbot): add timeouts to API response reads (#103855)
* fix(qqbot): add timeouts to API response reads

* fix(qqbot): use guarded request deadlines

---------

Co-authored-by: Alix-007 <li.long15@xydigit.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-18 02:06:09 +01:00
6caf637163 fix(hooks): prevent rejected inbound conversation claims (#109857)
* fix(hooks): honor rejected inbound conversations

* test(hooks): trim rejection fixture

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-17 23:52:58 +01:00
Leon-SK668andGitHub f977649065 fix(auto-reply): preserve emoji in bash session snippets (#109468) 2026-07-16 22:43:40 -07:00
Leon-SK668andGitHub 7e34687015 fix(scripts): preserve emoji in issue label prompts (#109477) 2026-07-16 22:27:04 -07:00
2e3b4ab586 fix(scripts): preserve emoji in dev tooling previews (#109469)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:56:18 -07:00
1f5c8239d7 fix(scripts): preserve emoji in request log previews (#109481)
* fix(scripts): preserve emoji in request log previews

* fix(scripts): keep mock preview standalone

* refactor(scripts): reuse UTF-16 truncation helper

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

* test(scripts): cover raw Node mock loading

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

* docs(scripts): note raw Node type stripping contract

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:49:36 -07:00
8fef264f70 fix(release): preserve emoji in ClawHub error details (#108172)
* fix(release): keep ClawHub errors valid Unicode

* fix(release): keep ClawHub helper source-resolvable

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 18:20:34 -07:00
3da3318c56 fix(audit): preserve emoji in npm registry errors (#108208)
* fix(audit): keep registry errors valid Unicode

* style(audit): format registry error boundary test

* docs(audit): document direct Node import floor

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:53:09 -07:00
56d0721eb7 fix(release): preserve emoji in cross-OS response diagnostics (#108193)
* fix(release): keep cross-OS responses valid Unicode

* style(release): format cross-OS boundary test

* fix(release): resolve UTF-16 helper in direct Node runs

* fix(release): keep cross-OS summaries UTF-16 safe

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:43:56 -07:00
bdf3886024 fix(scripts): preserve emoji in GitHub API errors (#108184)
* fix(scripts): keep GitHub errors valid Unicode

* style(scripts): format GitHub error boundary test

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 17:33:35 -07:00
5dce814ca1 fix(android): preserve emoji in shell initials (#108830)
* fix(android): preserve emoji in shell initials

* chore(android): refresh native i18n inventory

* refactor(android): share Unicode initial extraction

* fix(android): preserve grapheme cluster initials

* chore(android): refresh native i18n inventory

* fix(android): satisfy ICU iterator nullability

* test(android): run shell initials under Robolectric

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

* style(android): format localized initial helper

Co-authored-by: Leon-SK668 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 13:38:27 -07:00
a8fe7dd834 fix(android): preserve emoji in debug diagnostics (#108823)
* fix(android): preserve unicode in debug diagnostics

* chore(android): refresh native i18n inventory

* test(android): satisfy debug handler ktlint

* refactor(android): centralize UTF-safe diagnostics

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-16 09:53:14 -07:00
Leon-SK668andGitHub 2fd3d8608d fix(skills): keep history scans UTF-16 safe (#107720) 2026-07-16 00:11:53 -07:00
Leon-SK668andGitHub 66b09405d0 fix(android): preserve emoji in presence reason logs (#108103) 2026-07-16 00:03:24 -07:00
Leon-SK668andGitHub b9e399eec3 fix(active-memory): normalize legacy toggle timestamps (#103116)
* fix(active-memory): normalize legacy toggle timestamps

* test(active-memory): cover non-finite legacy timestamps
2026-07-15 09:25:35 -07:00
Leon-SK668andGitHub 8cc7cac556 fix(android): preserve emoji in app session labels (#108102) 2026-07-15 02:03:48 -07:00
Leon-SK668andGitHub 9b6361a50c fix(android): preserve emoji in voice error status (#108101)
* fix(android): preserve emoji in voice error status

* chore(android): sync native i18n inventory

* fix(android): align voice status i18n allowlist
2026-07-15 01:16:27 -07:00
Leon-SK668andGitHub 42d42703e6 fix(session-catalog): keep searches UTF-16 safe (#107719) 2026-07-15 01:16:01 -07:00
Leon-SK668andGitHub 9a8ed45935 fix(linux-node): keep command errors UTF-16 safe (#107717) 2026-07-15 00:16:39 -07:00
Leon-SK668andGitHub 9f471d0189 fix(gateway): keep worker failures UTF-16 safe (#107718) 2026-07-14 22:51:38 -07:00
Leon-SK668andGitHub 4100d19f2a fix(cli): tolerate removed cwd in plugin authoring output (#106425) 2026-07-13 18:58:54 -07:00
5864fa2dbf fix(onepassword): preserve Unicode in audit reason truncation (#106424)
* fix(onepassword): preserve Unicode in audit reason truncation

* test(onepassword): strengthen Unicode audit boundary proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-13 17:01:14 -07:00
7ed7840c94 fix(google-meet): validate calendar Meet URLs (#104863)
* fix(google-meet): validate calendar meet urls

* fix(google-meet): share meet url normalization

* fix(google-meet): normalize Calendar Meet URLs

* fix(google-meet): keep calendar text fallback stable

* fix(google-meet): validate calendar text candidates

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-12 09:12:40 +01:00
llagy007andGitHub f5a50db569 fix(microsoft-foundry): reject malformed endpoints (#104796) 2026-07-12 08:23:44 +01:00
llagy007andGitHub f6d11d0e29 fix(google-meet): guard node-host meet URLs (#104687) 2026-07-12 06:55:38 +01:00
d8bcd014c7 fix(signal): align supported message actions (#104788)
* fix(signal): align supported message actions

* test(signal): clarify supported message actions

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 17:34:07 -07:00
7027d2c227 fix(browser): reject non-page json new targets (#104129)
* fix(browser): reject non-page json new targets

* fix(browser): adopt only validated raw CDP targets

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 16:58:43 -07:00
c059d7d062 fix(browser): refresh target after guarded existing-session actions (#104094)
* fix(browser): refresh target after guarded existing-session actions

* test(browser): isolate guarded target cases

* test(browser): mock safe replacement URL resolution

* fix(browser): refresh target after guarded evaluate

* style(browser): format guarded action matrix

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 16:11:48 -07:00
llagy007andGitHub 4057d4b623 fix(browser): keep direct CDP version diagnostics (#104678) 2026-07-11 16:09:42 -07:00
4bf4cacb37 fix(browser): guard act hooks on current tab URL (#104095)
* fix(browser): guard act hooks on current tab URL

* test(browser): align navigation policy hook mock

* test(browser): exercise real hook navigation guard

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 14:27:34 -07:00
85a8f4ba8d fix(browser): run mutation guard before JSON parsing (#104677)
* fix(browser): run mutation guard before JSON parsing

* test(browser): cover auth in mutation guard ordering

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-11 14:05:38 -07:00
6036413766 fix(plugins): honor empty document extractor scope (#103731)
* fix(plugins): honor empty document extractor scope

* fix(plugins): honor empty document extractor scope

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-11 19:52:19 +08:00
cba9ffb177 fix(memory): skip blank search provider bootstrap (#103728)
* fix(memory): skip blank search provider bootstrap

* refactor(memory): simplify blank search preflight

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Peter Steinberger <peter@steipete.me>
2026-07-11 04:19:40 -07:00
llagy007andGitHub f8aa995856 fix(google-meet): validate chrome node policy params (#103752) 2026-07-11 04:00:28 -07:00
a1571f2118 fix(browser): normalize local dispatch request paths (#103727)
* fix(browser): normalize local dispatch request paths

* refactor(browser): inline request path normalization

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 18:10:26 -07:00
56fb460b83 fix(memory): keep batch failure attempts finite (#103117)
* fix(memory): keep batch failure attempts finite

* fix(memory): own batch retry attempt accounting

Co-authored-by: llagy007 <0668001470@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 08:03:23 +01:00
823c153577 fix(browser): reject ambiguous tab references (#103119)
* fix(browser): reject ambiguous tab references

Co-authored-by: llagy007 <0668001470@xydigit.com>

* fix(browser): close tracked tabs by raw target id

* fix(browser): harden raw tab cleanup routing

* test(browser): type raw close request mock

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 00:51:18 +01:00
910886814d fix(browser): filter non-page CDP targets (#103115)
* fix(browser): filter non-page CDP targets

* fix(browser): require page CDP targets

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-10 00:18:04 +01:00
685c22dfb7 fix(irc): chunk PRIVMSG on UTF-16 boundary to avoid lone surrogates (#96572)
* fix(irc): chunk PRIVMSG on UTF-16 boundary to avoid lone surrogates

sendPrivmsg split long messages with String.slice on a UTF-16 code-unit
index, so an emoji (or other astral character) straddling the split
point was cut into a lone high/low surrogate, sending broken bytes in
the PRIVMSG to the IRC server.

Slice each chunk with sliceUtf16Safe so a surrogate pair is never split.
When the budget is too small to fit even the leading astral character,
emit that character whole so chunking still makes progress.

Adds a socket-level test (fake net/tls socket) asserting no PRIVMSG
chunk contains a lone surrogate, including the one-code-unit budget
edge case, while the existing space-preferring split is preserved.

* refactor(irc): make surrogate-safe chunking direct

* fix(irc): preserve one-unit chunk limits

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-05 12:14:05 -07:00
llagy009andGitHub 2b77862b92 fix(irc): guard surrogate-range codepoints in \u literal-escape decoder (#97683)
Two-step decode in decodeLiteralEscapes:
- Step 1: regex anchored to high-surrogate range (U+D800–U+DBFF) so a
  preceding BMP escape (e.g. \u0041) cannot consume the high-surrogate
  half of a valid pair like \uD83D\uDE00 (😀), leaving \uDE00 lone.
- Step 2: decode remaining BMP codepoints; preserve lone surrogates as
  six-character literals instead of corrupting them to U+FFFD in the
  outbound IRC UTF-8 stream.
2026-06-30 17:46:57 -07:00
llagy009GitHubopenclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
6299b679c0 fix(tlon): truncate approval message preview on UTF-16 boundary (#97599)
* fix(tlon): truncate approval message preview on UTF-16 boundary

formatApprovalRequest called truncate() with raw .slice() before the
trailing ellipsis. A Tlon ship display name or message preview whose
emoji landed on the 100-character preview cap was split mid-surrogate
pair, emitting a lone surrogate in the owner notification. Use
sliceUtf16Safe so the truncation always falls on a code-point boundary.

* fix(tlon): guard all three messagePreview UTF-16 truncation sites

The prior commit only guarded the formatter (truncate in approval.ts).
The root-cause sites are in monitor/index.ts where PendingApproval is
constructed:

  messagePreview: rawText.slice(0, 100),     // channel mention path
  messagePreview: messageText.slice(0, 100), // DM path

An emoji whose high surrogate falls at position 99 was sliced mid-pair,
storing a lone \uD83D in the persistent PendingApproval before the
formatter ever ran.

Fix: replace both production sites with sliceUtf16Safe(), and also
guard the createPendingApproval() constructor itself so any future
caller that passes an untruncated preview is automatically safe.

Add regression tests that drive the full
createPendingApproval -> messagePreview -> formatApprovalRequest chain
for both the DM and channel paths with an emoji placed exactly at the
100-unit boundary.

* fix(tlon): truncate approval message preview on UTF-16 boundary

* fix(clownfish): repair validation for live-pr-inventory-20260629T032026-001 (2)

---------

Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
2026-06-28 20:40:32 -07:00