d5f4d89352
percent_decode in web_run.rs builds the result via `out.push(b as char)`, mapping each decoded byte to its Latin-1 codepoint. For percent-encoded multi-byte UTF-8 sequences (e.g. %E4%B8%AA = 个) this produces visible mojibake: bytes E4 B8 AA become three Latin-1 chars `个` and the final String is the UTF-8 encoding of those codepoints, not the original character. The sister module web_search.rs::percent_decode (line 490) already uses the correct pattern: collect bytes into Vec<u8>, then finalize with String::from_utf8_lossy. Align web_run.rs with that implementation. Affects DuckDuckGo redirect URLs containing non-ASCII paths, where normalize_search_url -> percent_decode previously corrupted the decoded URL before it was shown to the model and to the user. Add a regression test covering percent-encoded CJK input, raw UTF-8 input, and mixed ASCII+UTF-8. Co-authored-by: Elowen <xrnc@outlook.com>