Changelog
On this page
Version 0.24.0 Latest
Every @aparte/* package ships at this version (they are released in lockstep).
Minor Changes
-
6b28491:
<aparte-conversation-list>shows what each conversation is doing: its title shimmers while an AI answers in it, and a mark appears while its run is paused on the page (a server run waiting on an approval, a question or a browser tool). With a conversation controller, nothing to write.setConversationStatus(id, 'running' | 'waiting' | null)andgetConversationStatus(id)on the list; the row carriesdata-status, a screen reader hears the state with the title (new locale keysconversationRunning,conversationWaiting), and the mark (.aparte-conv-item__status) is an empty slot until a state draws it, so the look is yours in CSS. The conversation controller sends the newaparte-conversation-statusevent onwindowas turns start (running), pause on the person (waiting) and end (null), always about the conversation the turn started in; every list applies it. New types:AparteConversationStatus,AparteConversationStatusDetail.A state is kept for the page, not per list: every list draws it, one that connects later (a drawer, a remount) included, keyed by conversation id. The controller follows the turn in flight by its message id, so a replaced turn’s end does not clear the new turn’s state, and a chat unbound mid-turn (a route change) leaves no row running.
@aparte/core -
010ed41:
AparteClientsends the newaparte-message-resumedwhen a paused turn goes on after the page answered its paused calls, and a turn that starts from a saved pause now sendsaparte-message-pausedright afteraparte-message-start.aparte-message-pausedhad no other half: a listener tracking a turn heard it stop to wait and never heard it run again untilaparte-message-done, and a turn resumed after a reload said “start” while it was asking. New type:AparteMessageResumedEventDetail;APARTE_DEFAULT_UI_EVENTSlists the event.resumeDeferredno longer starts a reply a turn is already running into: loading the open conversation again (a click on it) while its pause waited put the same question twice and started the same reply a second time.@aparte/core -
6b28491: New kit recipe
.aparte-shimmer: a light sweeping across a label while something runs.Put it on the span that holds the words of a step in progress (“Searching the web…”, “Thinking”). It is drawn through the text fill, so the element keeps a real colour; it holds still under
prefers-reduced-motion, and reads as plain text in forced colours and wherebackground-clip: textis not supported. New tokens:--aparte-shimmer-baseand--aparte-shimmer-shine(muted to full ink, which keeps its order in both themes) and--aparte-duration-shimmer(2s). The reasoning line, a quiet tool row and a running conversation’s title wear it.@aparte/core -
6b28491: The reasoning label now shimmers while the block streams. Nothing to change in your code; the light stops when the block settles.
“Thinking” was a still word above a block that was filling up; conversational chats sweep a light across it while the model is still reasoning, and AI Elements and assistant-ui do it by default. It follows the block’s own
isStreaming: true, so a block written by hand or restored from storage stays still, and it never moves underprefers-reduced-motion. The label is drawn through its text fill while it shimmers, so a colour you set on.aparte-thinking-labelshows once the block settles (recolour the sweep with--aparte-shimmer-base/--aparte-shimmer-shine). To keep the label still:css.aparte-thinking-label.aparte-shimmer { animation: none; background-image: none; -webkit-text-fill-color: currentColor; color: inherit; }The client now marks a streamed reasoning block
isStreaming: truewhile it arrives (it was left unset), and settles it at the model’s first tool call and at a new step as well as at its first answer token, so a block followed by a tool call no longer reads “Thinking” while the tool runs. Only the answer folds it: a tool call does not close a block the reader opened.@aparte/core -
140517e:
registerToolDisplaytakesdetails:falsefor the line alone, or a function that draws what is behind it in place of Input and Output.Behind a tool row’s line, core shows the arguments and the result, raw: a developer’s view, and it stays the default. A chat for people had no way out of it but hiding the call or rewriting the whole row.
details: falsekeeps core’s line with no disclosure at all, so nothing raw is one click away; on'*'it covers every tool nothing more specific describes. A function returns what stands in for Input and Output under core’s line, a list of sources for a search, say: an element, or a string inserted as HTML after the config’s HTML sanitizer (the one Markdown goes through), since what it shows comes from a tool’s result. It is called on every update of the call, and on a language switch, whose words are written into the nodes already there;''means nothing behind the line yet, and the row gets its disclosure once there is something. A function that throws costs the row its detail, never its line, and never brings the raw parts back.hiddenand a tool renderer keep their precedence. Registering or droppingdetailsredraws the rows already on screen, ashiddenandopendo. New type:AparteToolDetails.@aparte/core -
6b28491:
registerToolDisplaytakesquiet: the line a person reads, with a shimmer while the call runs and no “Done” once it is done.The default row is an agent’s: a spinner and “Running”, then ”✓ Done”, and it stays the default.
quiet: truedrops the spinner and the word while the call runs (the label shimmers instead), and shows nothing once it succeeded: the label’s tense says it, so give it one that reads the status (“Searching the web…” / “Searched the web” / a plain “Search the web” for the rest). A wait for approval, a refusal, a failure and a stop still show their word and note; the words a quiet row does not show are still read by a screen reader. The target is set in the chat’s font and the chevron moves to the end of the line; the row carriesdata-quiet. Registering or dropping it redraws the rows on screen.@aparte/core -
6b28491: French for the conversation list’s new states: « Réponse en cours », « Attend votre réponse ».
@aparte/locale-fr
Patch Changes
- @aparte/engine@0.24.0
@aparte/core
Version-only bumps (no changes of their own): @aparte/engine, @aparte/runner-ag-ui, @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/react, @aparte/svelte, @aparte/vue, @aparte/docs-mcp.