| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| DevoxxGenie-1.14.1.zip | 2026-08-25 | 89.4 MB | |
| README.md | 2026-08-25 | 3.5 kB | |
| v1.14.1 source code.tar.gz | 2026-08-25 | 29.1 MB | |
| v1.14.1 source code.zip | 2026-08-25 | 30.2 MB | |
| Totals: 4 Items | 148.7 MB | 0 | |
A patch release for one crash: a single fenced code block could stop the whole chat panel from rendering, and nothing about the failure pointed at the code block.
Fixed
- fix(ui): a code block containing an unmatched comment terminator no longer kills the conversation panel. A reply whose fenced code contained a
*/before the first/*— an LLM streaming a Javadoc excerpt, or showing a diff hunk that starts inside a comment — took the entire Compose panel down withIllegalArgumentException: Reversed range is not supported, not just the offending block. The cause is upstream indev.snipme:highlights, whoseMultilineCommentLocatorpairs the Nth/*index with the Nth*/index positionally, never checking that the end follows the start: for text like*/ /* */it emits a highlight location of(3, 2).multiplatform-markdown-rendererpassed that straight toAnnotatedString.Builder.addStyle, which rejects a reversed range — and it threw from aproduceStatecoroutine onDispatchers.Defaultwhere nothing caught it, tearing down the Compose frame clock and with it every message on screen. Neither library could be upgraded out of the problem: both are pinned to the IntelliJ 253 Compose/Skiko toolchain for the ABI and classloader reasons documented inbuild.gradle.kts. A newSafeHighlightedCodereimplements the two highlighted-code composables on the renderer's publicMarkdownCodeFence/MarkdownCodeBlock/MarkdownCodeBackgroundbuilding blocks, clamping every highlight location into[0, code.length], dropping whatever is left withend <= start, and falling back to unstyled but intact code on anyThrowable(rethrowingCancellationExceptionsoproduceStatedisposal still works) — so a future locator defect costs one code block its colours instead of the panel. Both the AI and user bubbles route through it. Eight regression tests cover it, including a characterization test that pins the upstream defect so a future dependency bump that fixes it fails loudly, and one asserting the unguarded path still throws the reported exception (task-258, [#1277])
Changed
- refactor(ui): syntax highlights are built per code block.
Highlights.Builderis a data class withvarfields —code(...)mutates it in place andbuild()snapshots whatever the fields hold at that instant — and the user bubble handed one builder to every code block in a message. Since each block highlights in its ownproduceStatecoroutine onDispatchers.Default, two blocks could interleave and one could be styled with offsets computed from the other block's text; after the fix above those offsets are clamped away rather than fatal, so the visible effect was mis-colouring. The mutable builder no longer crosses a block boundary: the composables take an immutableSyntaxTheme, and a newcomputeHighlights(code, language, theme)constructs a builder per call that never escapes, making the isolation structural rather than a matter of discipline. It also drops builder allocation from composition entirely — one is created only whenproduceState'scodekey changes, which is stricter than wrapping the old builder inremember. Pinned by a deterministic characterization of the interleaving plus a 200-iteration concurrency test, itself mutation-tested: reintroducing a shared builder makes it fail (task-259, [#1278])
Dependencies
- chore(deps): bump docs toolchain — brace-expansion 1.1.13 → 1.1.18 (#1275)
Contributors
- @stephanj