Release notes
Thinkrail v0.4.0
What's Changed
- fix(workspaces): create worktrees in the background so a large checkout never freezes the app by @rsolmano in https://github.com/JetBrains/thinkrail/pull/1202
- chore(github): remove SBOne-Kenobi from CODEOWNERS by @rsolmano in https://github.com/JetBrains/thinkrail/pull/1230
- fix(web): highlight every catalog language in chat by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1187
- fix(workspaces): send the last checkout progress when git exits inside the push throttle by @rsolmano in https://github.com/JetBrains/thinkrail/pull/1231
- feat(ask-user-question): redesign the questionnaire card — stable height, notes and Other in place, rich previews, Discuss, receipt by @danyaberezun in https://github.com/JetBrains/thinkrail/pull/1192
- fix(fs): identify SVG by its document root by @Afloat16 in https://github.com/JetBrains/thinkrail/pull/1184
- fix(cli): reject empty/non-decimal --port and --host, ignore invalid env values by @harshal-paltse in https://github.com/JetBrains/thinkrail/pull/1125
- feat: host search for the palette — files, specs, plans, chat transcripts and previews by @danyaberezun in https://github.com/JetBrains/thinkrail/pull/805
- ci: install Linux dependencies without restoring the Bun cache by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1242
- test: await promises the tests left floating by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1252
- chore(lint): fail biome on warnings and lock in clean rules by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1083
- fix(e2e): let the desktop runner exit as soon as the host shuts down by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1241
- fix(web): focus the composer input when its padding is clicked by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1163
- fix(web): fold fs-tick reads in branch status and preview by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1016
- scripts: parse boundary and seam imports with oxc-parser by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1233
- dialog: keep buttons and text inside the modal by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1157
- chat: follow a streaming answer by pinning its newest line instead of stepping by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1026
- chore: mark intentional fire-and-forget promises in shipped code by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1253
- chore(lint): reject floating promises by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1254
- feat: dictate into any text field with local NVIDIA Nemotron speech recognition by @rsolmano in https://github.com/JetBrains/thinkrail/pull/1228
- fix(workspaces): follow a branch switched in a managed workspace's terminal by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1028
- README update by @makingthematrix in https://github.com/JetBrains/thinkrail/pull/1219
- build(release): repack the Linux tarball with root ownership by @viwe-monai in https://github.com/JetBrains/thinkrail/pull/1003
- refactor: enable erasableSyntaxOnly and drop parameter properties by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1061
- test(contracts): widen the size gap in the linear-fold timing test by @danyaberezun in https://github.com/JetBrains/thinkrail/pull/1272
- refactor: remove no-op type assertions from production code by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1068
- build: typecheck with TypeScript 7 and drop TypeScript 6 by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1232
- docs(desktop): record that release signing must carry the microphone entitlement by @rsolmano in https://github.com/JetBrains/thinkrail/pull/1287
- fix(ui): keep a dialog open when a toast over it is pressed by @danyaberezun in https://github.com/JetBrains/thinkrail/pull/1271
- fix(packages): read the catalog fresh when the Extensions page opens by @danyaberezun in https://github.com/JetBrains/thinkrail/pull/1273
- perf(locales): load bundled translations on demand by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1251
- ci(e2e): deal browser tests to shards round-robin instead of contiguous blocks by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1238
- ci(e2e): run the no-agent browser suite as three jobs by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1239
- chore(github): add artyomxx and Mark-Life to CODEOWNERS by @danyaberezun in https://github.com/JetBrains/thinkrail/pull/1291
- test(contracts): bound folding a large decomposed text in absolute time by @danyaberezun in https://github.com/JetBrains/thinkrail/pull/1292
- fix(chat): fold the turn's Done row into one footer line by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1290
- feat(web): highlight chat code with Pierre in the worker by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1274
- perf(web): send and parse only new lines while chat code streams by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1275
- chore(deps): upgrade @pierre/diffs to 1.6.4 and vite to 8.3.5 by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1276
- feat(web): highlight diffs with Pierre and the chat color table by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1277
- feat(web): highlight the file editor with Pierre by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1278
- chore(web): keep Shiki out of the build by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1279
- feat(web): color every Pierre language in the file editor by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1280
- chore(web): keep unused Pierre theme catalogs out of the build by @Mark-Life in https://github.com/JetBrains/thinkrail/pull/1281
…