All versions since 0.17.2
0.17.2
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
2e4f9ee: With
@aparte/plugin-streaming-markdownas your only Markdown renderer, a reply that arrives complete — a conversation restored after a reload, a non-streaming provider’s answer — now renders as Markdown instead of its raw source. Nothing to change on your side; a one-shot provider registered as a workaround can go (#93).The plugin rendered a reply while it streamed, and a reply that never streamed went through
renderMarkdown, which knew only the one-shot provider and fell back to core’s escape-and-<br>default. So the same text rendered two ways depending on how it arrived, and the plugin page’s “that is all you need” held for half of them.renderMarkdownnow runs a complete string through the incremental provider when no one-shot provider is registered — into a detached element, then through the sanitizer, the same two steps a streamed reply takes. A registered one-shot provider still takes precedence, a server render with nodocumentstill gets the escaping default, and a provider that throws on the whole string falls back to it too.@aparte/core,@aparte/plugin-streaming-markdown -
7513253: The README follows
@aparte/titler1.2: a single-language model file is 41 KB. No code change — the plugin accepts any titler, and 1.2 keeps the sametitle(message, budget?)API.@aparte/plugin-titler
Version-only bumps (no changes of their own): @aparte/engine, @aparte/provider-ai-sdk, @aparte/provider-openai-compat, @aparte/provider-scenario, @aparte/provider-transformers, @aparte/plugin-approval, @aparte/plugin-artifacts, @aparte/plugin-ask-user, @aparte/plugin-compaction, @aparte/plugin-marked, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locale-fr, @aparte/docs-mcp.
0.17.3 Latest
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
@aparte/engine@0.17.3
@aparte/core -
5ec1e8a: Fixed: in controlled mode (
messageswithonMessagesChange), a finished reply could roll back to an earlier state — its text cut mid-word, its tool rows gone. It happened when the parent re-rendered late, which React does in Safari.The chat emits its list as it streams, the parent stores it, and the prop comes back. When the parent’s render lands after the chat’s next write, the prop that arrives is an EARLIER emit, and the wrapper took it for the parent’s word: it rolled the list back, the chat built its next writes on the stale copy, and the reply stayed broken. Measured in the examples’ browser suite at about one run in five on React + WebKit. The wrappers now recognise their own emits when they come back — current or stale — and ignore them; a list the parent builds itself is still applied. Angular is unaffected: its list is one
model()signal both sides write in step.@aparte/react,@aparte/svelte,@aparte/vue
Version-only bumps (no changes of their own): @aparte/engine, @aparte/provider-ai-sdk, @aparte/provider-openai-compat, @aparte/provider-scenario, @aparte/provider-transformers, @aparte/plugin-approval, @aparte/plugin-artifacts, @aparte/plugin-ask-user, @aparte/plugin-compaction, @aparte/plugin-marked, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/plugin-streaming-markdown, @aparte/plugin-titler, @aparte/angular, @aparte/locale-fr, @aparte/docs-mcp.