What's Changed
- chore(release): v0.18.3 by @qwen-code-ci-bot in #5255
- fix(core): Track supported sed edits in file history by @doudouOUC in #5141
- fix(vscode-ide-companion): create independent McpServer per IDE session by @huww98 in #5264
- fix(core): read BMP height as signed int32 for top-down bitmaps by @he-yufeng in #5227
- docs: add CLI subcommands section with qwen sessions list by @DragonnZhang in #5254
- feat(serve): make ACP permission timeout configurable by @doudouOUC in #5260
- fix(cli): Preserve mid-turn image messages by @doudouOUC in #5183
- docs: fix SSE ring size errors and add /workflows command by @DragonnZhang in #5205
- fix(core): detect dat files by content by @tt-a1i in #5256
- fix(model): remember selected provider when multiple share a model id (#5173) by @doudouOUC in #5179
- docs: Revamp README for clarity and focus by @pomelo-nwu in #5257
- feat(i18n): localize tool display names in TUI and web-shell badges by @wenshao in #5220
- fix(daemon): centralize mid-turn event constant + recover timed-out drains by @wenshao in #5266
- fix(core): keep DeepSeek presets text-only by @tt-a1i in #5268
- fix(cli): drop AgentView cleanup setState that can trip React #185 (#5199) by @wenshao in #5286
- fix(core): read WebP VP8X canvas height from the correct byte offset by @he-yufeng in #5194
- fix(cli): support Ctrl+P/N in completions by @tt-a1i in #5259
- feat(serve): add daemon idle detection to GET /health?deep=true by @jifeng in #4934
- fix(core): never let telemetry file exporters crash the process by @DragonnZhang in #5246
- fix(cli): correct context filename settings schema by @tt-a1i in #5269
- feat(hooks): pass original API call ID (toolCallId) to hook system by @shiloong in #4918
- fix(core): per-turn tool-call circuit breaker — always-on cap + opt-in loop heuristics (#5234) by @wenshao in #5279
- fix(desktop): handle git branch badge edge cases by @tt-a1i in #5247
- feat(core,cli): Workflow tool token budget + per-run UI surfacing (P5) by @LaZzyMan in #5231
- feat(extensions): add i18n support for extension displayName and description by @callmeYe in #5289
- feat(loop): wire prompt-only /loop to self-paced wakeups by @qqqys in #5197
- fix(cli): correct sandbox settings schema by @tt-a1i in #5272
- test(cli): enable load config model selection coverage by @tt-a1i in #5274
- docs(cli): document tmux scroll workaround by @tt-a1i in #5248
- test(cli): cover selection list scroll up by @tt-a1i in #5276
- fix(weixin): show allowed image directories by @tt-a1i in #5296
- fix(cli): reject malformed OSC rgb colors by @tt-a1i in #5307
- test(cli): enable table foreground reset coverage by @tt-a1i in #5278
- test(core): enable agent headless termination coverage by @tt-a1i in #5282
- fix(web-shell): summarize grep_search results by @tt-a1i in #5294
- fix(core): read short VP8L WebP dimensions by @tt-a1i in #5292
- fix(core): track attached stdout fd redirects by @tt-a1i in #5317
- fix(dingtalk): split oversized markdown lines by @tt-a1i in #5299
- fix(cli): preserve multiline shell history by @tt-a1i in #5335
- fix(cli): validate GitHub remote hosts by @tt-a1i in #5327
- test(cli): enable command search long suggestion coverage by @tt-a1i in #5283
- fix(core): preserve migrated command description strings by @tt-a1i in #5321
- fix(cli): enforce stdin byte limit by @tt-a1i in #5331
- fix(core): respect home path boundary when tildeifying by @tt-a1i in #5333
- fix(cli): truncate session picker text by display width by @tt-a1i in #5338
- fix(core): support GIF image token metadata by @tt-a1i in #5340
- fix(cli): handle session search graphemes by @tt-a1i in #5342
- fix(cli): normalize english output language by @tt-a1i in #5346
- fix(core): parse OAuth resource metadata params by @tt-a1i in #5344
- fix(core): handle stale worktree session markers by @tt-a1i in #5229
- feat(loop): add second-resolution session wakeup engine by @qqqys in #5182
- fix(core): ignore duplicate provider tool-call ids by @YingchaoX in #5038
- fix(cli): show thinking in full transcript mode by @tt-a1i in #5354
- feat(desktop): compile macOS 26+ Liquid Glass Assets.car in brand-create by @pomelo-nwu in #5284
- fix(cli): return fresh empty mcp json results by @tt-a1i in #5349
- fix(weixin): normalize markdown image syntax by @tt-a1i in #5297
- fix(core): skip sleep inhibitor in headless ssh by @tt-a1i in #5295
- fix(cli): reject malformed terminal sequences by @tt-a1i in #5305
- fix(cli): expand windows-style tilde paths by @tt-a1i in #5298
- fix(core): validate oauth expires_in values by @tt-a1i in #5356
- fix(core): reject malformed cron numeric fields by @tt-a1i in #5352
- fix(cli): parse sandbox image registry ports by @tt-a1i in #5325
- fix(cli): preserve empty MCP prompt args by @tt-a1i in #5323
- fix(core): reject invalid cron task entries by @tt-a1i in #5309
- fix(cli): avoid agent composer unmount reset by @tt-a1i in #5302
- fix(cli): validate channel service pidfile by @tt-a1i in #5300
- fix(core): preserve invalid schema length strings by @tt-a1i in #5312
- fix(weixin): confirm the WEBP signature, not just the RIFF prefix by @he-yufeng in #5285
- feat(channel): add QQ Bot (QQ机器人) channel adapter by @Eric-GoodBoy-Tech in #5202
- fix(cli): reject malformed ACP timeout strings by @tt-a1i in #5315
- fix(cli): import extension channels via file urls by @tt-a1i in #5301
- fix(cli): bound streaming thought render buffers by @kkhomej33-netizen in #5314
- feat(core): auto-reveal exit_plan_mode tool when entering plan mode by @aspnmy in #5311
- fix(cli): window title shows session name instead of model activity status by @ZijianZhang989 in #5288
- fix(core): keep qwen3.6-flash and kimi-k2.6 presets text-only by @he-yufeng in #5328
- feat(skills): add desktop-pet skill for creating pixel-art companions by @xxlaura in #4808
- fix(cli): render a sub-minute duration that rounds to 60s as "1m" by @he-yufeng in #5287
- fix: Expand Windows ~\ home paths and hide phantom (session) entries in the desktop session list by @mvanhorn in #5253
- feat(stats): expose token usage for cost visibility by @shenyankm in #4564
- fix(plan-gate): isolate gate agent AbortSignal from parent signal chain by @CubeLander in #5185
- fix(core): honor output language in side queries by @Jerry2003826 in #4519
- fix(cli): avoid stale git branch watcher setup by @tt-a1i in #5271
- fix(desktop): detect WebP and AVI in RIFF magic-byte sniffing by @he-yufeng in #5336
- fix(input): restore IME cursor positioning reverted in #4779 by @BenGuanRan in #4993
- fix(cli): close @path completion dropdown on Enter accept by @Alex-ai-future in #4841
- fix(core): fall back to encrypted-file storage for extension secrets when keychain is unavailable by @DragonnZhang in #5221
- fix(core): support whitespace in session metadata fields by @tt-a1i in #5353
- fix(core): prevent OOM in auto-memory extraction during /quit (#5147) by @ZijianZhang989 in #5181
- refactor(tools): rename TodoWrite tool display name to TodoList by @wenshao in #5319
- fix(core): expire tokens at buffer boundary by @tt-a1i in #5360
- fix(cli): validate restore checkpoints before mutation by @tt-a1i in #5358
- fix(core): honor ripgrep builtin setting at runtime by @tt-a1i in #5362
- fix(core): create token file on first save by @tt-a1i in #5367
- fix(cli): preserve workspace trust state for extensions by @tt-a1i in #5369
- fix(cli): Stop after cancelled permissions by @doudouOUC in #5258
- fix(core): resolve tilde paths before search permission checks by @tt-a1i in #5378
- fix(cli): respect sandbox path boundaries by @tt-a1i in #5375
- fix(cli): update acp cancel test flag by @tt-a1i in #5384
- fix(core): avoid reconnecting on MCP tool errors by @tt-a1i in #5382
- fix(core): accept uppercase web fetch schemes by @tt-a1i in #5391
- fix(cli): preserve equals in mcp env values by @tt-a1i in #5377
- feat(cli): show follow-up suggestion in input placeholder by @MikeWang0316tw in #5145
- fix(core): avoid glob prefix cache reuse by @tt-a1i in #5364
- fix(core): validate grep result limits by @tt-a1i in #5389
- fix(core): parse grep results with colon paths by @tt-a1i in #5372
- feat(config): add settings file change detection via chokidar watcher… by @water-in-stone in #4933
- fix(acp): scrub simple env for spawned children by @tt-a1i in #5395
- fix(core): pass --no-ask-password to systemd-inhibit to prevent TUI corruption by @OrbitZore in #5318
- fix(cli): parse sandbox mounts with windows drives by @tt-a1i in #5388
- fix(core): add GLM-5.2 to Z.AI preset by @tt-a1i in #5397
- fix(openai): add string tool result compatibility mode by @tt-a1i in #5399
- fix(cli): clarify cumulative statusline token labels by @tt-a1i in #5400
- feat(cli): show optional response token rate by @tt-a1i in #5401
- fix(cli): reduce retained interactive tool output memory by @kkhomej33-netizen in #4971
- fix(cli): calculate response rate from phase token delta by @tt-a1i in #5402
- fix(cli): clarify unavailable model configuration hint by @tt-a1i in #5403
- feat(cli): serve the Web Shell UI from
qwen serveby @wenshao in #5392 - fix(cli): gate cron scheduler startup on config initialization (#5022) by @qwen-code-ci-bot in #5230
- fix(core): keep estimated token split summing to total by @he-yufeng in #5420
- fix(core): share memory filename config state by @tt-a1i in #5419
- fix(channel): scope qqbot session backup path by @tt-a1i in #5417
- fix(channel): track qqbot close reconnect timer by @tt-a1i in #5416
- fix(auth): preserve custom provider models on install by @tt-a1i in #5404
- fix(core): target microcompaction cache disarms by @tt-a1i in #5407
- fix(channel): keep qqbot token refresh retrying by @tt-a1i in #5414
- fix(cli): keep keypress handlers current by @tt-a1i in #5421
- refactor(serve): unify session title/displayName into single displayName field by @chiga0 in #5002
- feat(cli): add persistent history collapse on resume with refined commands by @Gove2004 in #4085
- fix(cli): narrow settings enum schemas by @tt-a1i in #5418
- fix(channel): bound qqbot gateway reconnect retries by @tt-a1i in #5415
- fix(core): block broad shell self-kill commands by @tt-a1i in #5409
- fix(cli): preserve trustedFolders comments on save by @Zoean-z in #4746
- fix(hooks): remove the dead updatedMCPToolOutput field (#5422) by @ken-jo in #5423
- feat(web-shell): add extension management by @ytahdn in #5398
- fix(cli): accept uppercase URL schemes in mcp add transport detection by @he-yufeng in #5426
- fix(extensions): accept uppercase URL schemes when parsing install sources by @he-yufeng in #5429
- fix(core): provide escape path when plan gate is unavailable by @Alex-ai-future in #5430
- feat(extensions): interactive multi-tab /extensions manager (Installed / Discover / Sources) by @BZ-D in #4850
- fix(cli): stabilize extension list spacing by @yiliang114 in #5445
- fix(weixin): handle uppercase CDN upload schemes by @tt-a1i in #5439
New Contributors
- @shiloong made their first contribution in #4918
- @Eric-GoodBoy-Tech made their first contribution in #5202
- @aspnmy made their first contribution in #5311
- @xxlaura made their first contribution in #4808
- @mvanhorn made their first contribution in #5253
- @CubeLander made their first contribution in #5185
- @water-in-stone made their first contribution in #4933
- @OrbitZore made their first contribution in #5318
- @Gove2004 made their first contribution in #4085
- @Zoean-z made their first contribution in #4746
- @ken-jo made their first contribution in #5423
Full Changelog: v0.18.3...v0.18.4-preview.0