teknium1
7fb5d2bc39
fix(process): decode background process output with incremental UTF-8 decoders
...
Port from openclaw/openclaw#112325 : multibyte UTF-8 characters split
across a 4096-byte pipe or PTY read boundary were decoded statelessly
per chunk with errors='replace', corrupting both halves into U+FFFD
mojibake in background process output (poll/log/wait/completion
notifications). The foreground path already used an incremental decoder
(tools/environments/base.py::_wait_for_process); this applies the same
treatment to the background reader loops:
- _reader_loop (select and blocking paths): one
codecs.getincrementaldecoder('utf-8') per reader holds partial
sequences across chunks; the finally block flushes a truncated tail
as a single U+FFFD instead of dropping it.
- _pty_reader_loop: same treatment for ptyprocess byte chunks
(pywinpty str chunks pass through unchanged).
Genuinely invalid bytes keep errors='replace' behavior.
2026-07-31 21:21:13 -07:00
..
2026-07-29 12:19:37 -07:00
2026-07-29 19:48:37 -07:00
2026-07-28 07:58:16 -07:00
2026-07-17 04:53:38 -07:00
2026-07-29 19:48:37 -07:00
2026-07-29 18:13:09 -07:00
2026-07-28 11:52:44 -07:00
2026-07-29 11:53:39 -07:00
2026-07-03 03:27:47 -07:00
2026-07-27 14:32:05 -07:00
2026-07-29 10:54:04 -07:00
2026-07-29 10:02:03 -07:00
2026-06-21 17:46:38 +05:30
2026-07-29 10:14:11 -07:00
2026-07-26 17:46:55 -07:00
2026-07-29 10:14:00 -07:00
2026-07-29 11:53:39 -07:00
2026-07-29 19:48:37 -07:00
2026-07-29 12:19:37 -07:00
2026-07-31 17:43:37 -04:00
2026-07-29 12:41:40 -07:00
2026-07-02 04:20:43 -07:00
2026-06-25 13:52:06 -07:00
2026-07-29 11:53:39 -07:00
2026-07-20 06:50:31 -07:00
2026-07-22 12:13:01 -05:00
2026-07-29 11:53:39 -07:00
2026-07-01 14:37:22 +05:30
2026-07-29 19:48:37 -07:00
2026-07-31 14:22:38 +05:30
2026-07-29 19:48:37 -07:00
2026-07-31 10:17:55 -04:00
2026-07-22 12:13:01 -05:00
2026-07-26 20:58:43 -07:00
2026-07-29 10:14:00 -07:00
2026-07-29 09:33:48 -07:00
2026-07-14 02:59:39 +05:30
2026-07-31 17:43:37 -04:00
2026-07-06 04:58:42 -07:00
2026-07-30 07:18:08 -05:00
2026-07-31 13:42:03 -04:00
2026-07-31 10:17:55 -04:00
2026-07-17 04:50:47 -07:00
2026-07-28 00:53:16 -05:00
2026-07-29 10:02:03 -07:00
2026-07-18 04:15:13 -07:00
2026-07-31 21:21:10 -07:00
2026-07-29 16:49:07 +05:30
2026-07-29 10:13:50 -07:00
2026-07-28 14:07:21 -07:00
2026-07-22 12:13:01 -05:00
2026-06-06 18:30:39 -07:00
2026-07-13 02:42:18 -07:00
2026-07-29 10:14:00 -07:00
2026-07-31 21:21:13 -07:00
2026-06-25 16:40:27 -05:00
2026-07-30 00:08:28 -05:00
2026-06-13 14:42:51 -07:00
2026-07-29 11:53:39 -07:00
2026-07-29 10:14:00 -07:00
2026-07-28 14:37:19 -07:00
2026-07-29 11:53:39 -07:00
2026-07-31 13:53:04 -05:00
2026-07-29 13:01:36 -07:00
2026-07-29 13:01:36 -07:00
2026-07-12 02:59:27 -07:00
2026-07-29 11:53:39 -07:00
2026-07-30 22:31:42 -07:00
2026-07-28 04:24:50 -05:00
2026-07-29 19:48:37 -07:00
2026-07-29 19:48:37 -07:00
2026-07-01 01:05:28 -07:00
2026-07-24 11:45:57 -07:00
2026-07-22 06:56:53 -07:00
2026-07-28 11:53:09 -07:00
2026-06-30 16:39:41 -07:00
2026-07-29 10:14:00 -07:00
2026-07-29 00:01:33 -07:00
2026-07-28 22:31:40 -07:00
2026-07-28 11:55:01 -07:00
2026-07-29 08:24:00 -07:00
2026-07-28 14:17:45 -07:00
2026-07-14 02:59:39 +05:30
2026-07-29 10:54:04 -07:00
2026-07-29 10:08:53 -07:00
2026-07-29 14:04:21 -06:00
2026-07-29 11:53:39 -07:00
2026-07-04 15:08:49 -07:00
2026-07-26 18:28:20 -07:00
2026-06-10 02:57:15 -07:00
2026-07-23 21:06:47 -07:00
2026-07-28 11:53:09 -07:00
2026-06-29 21:11:58 -07:00