1.1.0
Every @aparte/* package ships at this version (they are released in lockstep).
Minor Changes
-
c980d67: Add
composer.setAttachmentState(file, { status, progress }): a bar on the tile while a file uploads, for an app that uploads as soon as a file is picked.While a file is
uploadingthe composer holds the send and wearsdata-uploading.{ status: 'error' }marks the tile.@aparte/core -
c7ee63f: Add tokens to the composer:
insertToken(),getTokens(),getCaret(),getRangeRect()andreplaceRange()on<aparte-composer-input>.A token is a pill in the draft that sends a text of its own (
{ label: 'Paul', text: '@paul', kind: 'mention', data: { id: 7 } }). It reachesaparte-sendasdetail.tokenswith its place in the message,AparteMessage.tokenskeeps it, the request carries it as_meta.tokens, and the user’s bubble draws it as it looked. A message with no token changes nothing.aparte-sendalso acceptsdetail.meta, kept as the message’smetadataand merged into the request’s_meta.placeFloating()is exported: it writestopandlefton a fixed box beside an anchor and turns it when the window ends first.The
.aparte-menurecipe gains the row a keyboard is on (aria-selected), the row whose submenu is open (aria-expanded), and.aparte-menu__chevron.@aparte/core -
c980d67: Add
aparteGlobalConfig.setDateSeparators(true): the date above the first message of each day.Today and Yesterday in words, then the full date in the page’s language. It follows the branch on screen.
@aparte/core -
c980d67: Add
setBubbleActions({ feedbackReasons: ['Not accurate', 'Too long'] }): a thumbs-down then asks why.One press sends the new
aparte-feedback-reasonevent with the message id and the reason.aparte-feedbackstill goes out on the thumb itself, as before. New locale keys:feedbackReasonTitle,feedbackReasonDismiss.@aparte/core,@aparte/locales -
c980d67: Add
new AparteConversationController(binding, { keepDrafts: true }): what was typed in a conversation comes back on return.Kept in memory. A storage adapter with the optional
loadDraftandsaveDraftkeeps it across reloads, andupdatedAtdoes not move.@aparte/core -
a5c3f82: Retry no longer sends
temperature: 0.4, which recent models refuse, unless the provider asks for it.A provider that decodes greedily without a temperature, so a retry would repeat the same answer, now sets the new optional
retryTemperature.@aparte/provider-transformersdoes. No other provider sends one on a retry, and models that sample by default still vary their answer.@aparte/core,@aparte/provider-ai-sdk,@aparte/provider-transformers -
c980d67: Add
aparteGlobalConfig.setStreamingCaret(true): a blinking caret where the words of a reply are arriving.It sits at the end of the last paragraph or list item, and is still under
prefers-reduced-motion.@aparte/core -
2753047: Add
aparteGlobalConfig.setTurnSummary(): reasoning and consecutive tool calls fold behind one line. Off by default, and with it off the DOM does not change.While the steps run the line says
Working…and names the current tool; afterwards it saysWorked 9 s · 7 tools, orUsed 7 toolson a stored turn that carries no timing.setTurnSummary({ openWhileRunning: true })keeps the fold open while it works, and never closes one somebody opened.A call waiting for approval, a call that failed and a tool with its own
registerToolRendererstay outside the fold, since those are what somebody has to read. Ahiddentool is neither counted nor breaks the run, and a single step is never folded.New locale keys, added in all nine bundles:
turnWorking,turnWorked,turnUsed,turnTools.turnToolsis a plural form string byIntl.PluralRulescategory (one:{n} tool|other:{n} tools).@aparte/core,@aparte/locales -
650610b: The AG-UI runner now asks for an approval on the interrupt reason
approval_required, and sends the words of a refusal to the agent.approval_requiredis what the Laravel AI SDK sends. A refusal goes back as{ approved: false, instruction }when the person wrote what to do instead; the agent readsapprovedas before.@aparte/runner-ag-ui -
855778c: These plugins now add
/compact,/modeland/approvalto@aparte/plugin-triggers’ menu when it is on the page.They answer an event, so neither side depends on the other, and nothing changes without the menu. Turn one off with
setupCompaction({ commands: false }),setupApproval({ commands: false })or<aparte-model-selector commands="false">.@aparte/plugin-approval,@aparte/plugin-compaction,@aparte/plugin-model-selector -
855778c: New package:
/commands,@mentions and any other trigger character in the composer.Write
<aparte-triggers>inside<aparte-composer>and give it the triggers you want: static lists or a search function withAbortSignal, groups, submenus of any depth, your own row rendering. A row runs something, inserts text, or inserts a pill that sends a text of its own. The focus stays in the field; arrows, Enter, Tab and Escape act on the menu, in right to left too, and a phone gets one panel at a time.@aparte/plugin-triggers/commandsadds/new,/stop,/retryand/copywhen you ask for them.@aparte/plugin-triggers
Patch Changes
-
Pasting several lines keeps its line breaks. They were sent run together.
In Chromium each pasted line became a block, and the draft read blocks as one line. There is nothing to change in your code.
@aparte/core -
setSelection()sendsaparte-model-changeonce, with the model it changed from. It used to send it twice, neither time with that model.@aparte/plugin-model-selector -
The composer’s toolbar is hidden while an approval or a question is open: the panel is all the composer shows.
It comes back with the answer, and there is nothing to change in your code. A toolbar holding
<aparte-composer-send>stays, since a written answer is sent with it. The approval switch sits in that row: turned to Plan under an open card, it said no writes while the card’s Approve still ran one.@aparte/core -
51adc92:
@aparte/docs-mcpdeclares its name for the official MCP registry.@aparte/docs-mcp
Version-only bumps (no changes of their own): @aparte/engine, @aparte/runner-n8n, @aparte/provider-openai-compat, @aparte/provider-scenario, @aparte/plugin-artifacts, @aparte/plugin-ask-user, @aparte/plugin-cards, @aparte/plugin-chartjs, @aparte/plugin-echarts, @aparte/plugin-katex, @aparte/plugin-marked, @aparte/plugin-mermaid, @aparte/plugin-shiki, @aparte/plugin-storage-idb, @aparte/plugin-streaming-markdown, @aparte/plugin-titler, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue.
1.1.1
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
3bc8977: A Markdown artifact is no longer cut off after its first code block, on screen or in Copy, Download and Open. There is nothing to change in your code.
The card looked for a closing code fence whether or not the document had opened one, so the first code block of a report ended the report. It now removes a fence only when one wraps the whole document, and it still drops what a model repeats after that fence.
A wrapped document keeps the code blocks inside it, and a Markdown document that opens on a code block of its own is left as it is.
stripCodeFencesis internal to the plugin, so its newkindargument changes no public name.@aparte/plugin-artifacts
Version-only bumps (no changes of their own): @aparte/core, @aparte/engine, @aparte/runner-ag-ui, @aparte/runner-n8n, @aparte/provider-ai-sdk, @aparte/provider-openai-compat, @aparte/provider-scenario, @aparte/provider-transformers, @aparte/plugin-approval, @aparte/plugin-ask-user, @aparte/plugin-cards, @aparte/plugin-chartjs, @aparte/plugin-compaction, @aparte/plugin-echarts, @aparte/plugin-katex, @aparte/plugin-marked, @aparte/plugin-mermaid, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/plugin-storage-idb, @aparte/plugin-streaming-markdown, @aparte/plugin-titler, @aparte/plugin-triggers, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales, @aparte/docs-mcp.
1.1.2 Latest
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
ef10c91:
<aparte-launcher>brought back from saved HTML now shows one working button, not two.Livewire’s
wire:navigatekeeps a page’s HTML for the Back button and parses it back in, and so does any page cache that restores markup. The launcher it brings back is a new element whose markup already holds the button the old one drew. It drew a second one beside it, and the first never opened anything. It now takes up the button in its markup, and drops any other copy. Nothing to change in your code.@aparte/core
Version-only bumps (no changes of their own): @aparte/engine, @aparte/runner-ag-ui, @aparte/runner-n8n, @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-cards, @aparte/plugin-chartjs, @aparte/plugin-compaction, @aparte/plugin-echarts, @aparte/plugin-katex, @aparte/plugin-marked, @aparte/plugin-mermaid, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/plugin-storage-idb, @aparte/plugin-streaming-markdown, @aparte/plugin-titler, @aparte/plugin-triggers, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales, @aparte/docs-mcp.