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-SK668 and GitHub
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-SK668 and GitHub
f977649065
fix(auto-reply): preserve emoji in bash session snippets ( #109468 )
2026-07-16 22:43:40 -07:00
Leon-SK668 and GitHub
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-SK668 and GitHub
2fd3d8608d
fix(skills): keep history scans UTF-16 safe ( #107720 )
2026-07-16 00:11:53 -07:00
Leon-SK668 and GitHub
66b09405d0
fix(android): preserve emoji in presence reason logs ( #108103 )
2026-07-16 00:03:24 -07:00
Leon-SK668 and GitHub
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-SK668 and GitHub
8cc7cac556
fix(android): preserve emoji in app session labels ( #108102 )
2026-07-15 02:03:48 -07:00
Leon-SK668 and GitHub
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-SK668 and GitHub
42d42703e6
fix(session-catalog): keep searches UTF-16 safe ( #107719 )
2026-07-15 01:16:01 -07:00
Leon-SK668 and GitHub
9a8ed45935
fix(linux-node): keep command errors UTF-16 safe ( #107717 )
2026-07-15 00:16:39 -07:00
Leon-SK668 and GitHub
9f471d0189
fix(gateway): keep worker failures UTF-16 safe ( #107718 )
2026-07-14 22:51:38 -07:00
Leon-SK668 and GitHub
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
llagy007 and GitHub
f5a50db569
fix(microsoft-foundry): reject malformed endpoints ( #104796 )
2026-07-12 08:23:44 +01:00
llagy007 and GitHub
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
llagy007 and GitHub
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
llagy007 and GitHub
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
llagy009 and GitHub
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
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