Changelog
Version 0.15.0
Every @aparte/* package ships at this version (they are released in lockstep).
Minor Changes
-
7502ed0:
appendMessage(message, { historical: true })now reaches the host from every wrapper — the React ref handle anduseAparteChat, the Vue instance anduseAparteChat, the Svelte component andcreateAparteChat, the Angular component — andAparteChatImperativeApideclares the option. A restored message is adopted as it is: no fresh timing stamps,isStreamingforced off, so a tool call read back from your own backend renders settled rather than spinning.The host had accepted the option all along (it is how a stored conversation loads), but every wrapper’s
appendMessage(m)dropped the second argument on the way, so the replay-one-message-at-a-time path the core tests exercise was unreachable from a framework. Found by the second consumer, whose history lives on its own server.@aparte/core,@aparte/angular,@aparte/react,@aparte/svelte,@aparte/vue -
952e488:
ASK_USER_DECLINEDis exported: the exact sentence the tool returns as its result when the user declines ('The user declined to answer.'). Import it instead of copying the literal — a host that turns tool results into prose, or recognises a declined question in its own transcript, matched the string by hand until now, and a rewording here would have broken it without a word.The constant existed for the receipt’s own sake (the card must show “declined” rather than pair that sentence with the first question as though the user had said it) and never left the module. Reported by a consumer who had checked.
@aparte/plugin-ask-user -
0152d42:
createAskUserTool({ systemPrompt: false })(andsetupAskUserwith the same option) registers the tool with no system message at all. Until now the prompt could be replaced but not removed:''still put a field on the tool, and since 0.13 that field is really sent as a system message. A product whose model is trained on a fixed contract, and must not read any added prose, had to strip the field off the returned object by hand.@aparte/plugin-ask-user
Patch Changes
-
4590cbe: A focused option in the elicitation panel keeps its whole focus ring. The options sit in a scroll container, which clips at its padding edge, and the ring is drawn outside the option’s box — so a keyboard-focused option lost 4px of ring on every side (the border looked cut). The container now pads by the ring’s size and takes the space back with a negative margin, in the same tokens the ring reads (
--aparte-focus-outline-width,--aparte-btn-focus-offset), so nothing moves and a wider ring gets a wider room.scroll-paddingkeeps a focused option’s ring in view when the list scrolls.@aparte/core -
4b73f83:
AparteAIProviderMetadata— the return type of a provider’sgetMetadata()(name, id, icon, colour) — is exported from@aparte/core. A provider written outside this repository had to spell itReturnType<AparteAIProvider['getMetadata']>; reported by a consumer in July and again now.@aparte/core -
06e028b: A tool call’s input and result now wrap inside the bubble instead of running past its edge. A one-line result — an error message, a long path — was 1 823px of text in a 723px body (407px on a phone): the
<pre>kept its defaultwhite-space: pre, so the whole disclosure was clipped at the message’s edge. It gets the same pair the code block already had,white-space: pre-wrap+overflow-wrap: anywhere; a stylesheet that targeted.aparte-tool-part-body prekeeps working, the rule only moved fromprose.cssto the tool-call segment’s own sheet.@aparte/core -
47dddaa: The
showcasepreset gains asurveyturn — “two questions”, “a few questions” or “survey” makes the model ask two questions in oneask_usercall, so the panel’s stepper (1 2, a Skip per step) has a scenario that shows it. Nothing in the repository rendered that mode until a consumer reported clipped borders on it; a state no example renders is a state nobody looks at.@aparte/provider-scenario
Version-only bumps (no changes of their own): @aparte/engine, @aparte/provider-ai-sdk, @aparte/provider-openai-compat, @aparte/provider-transformers, @aparte/plugin-marked, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/plugin-streaming-markdown, @aparte/locale-fr.