0.28.1
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
63a5a01: A transcript that got shorter just after the chat scrolled itself no longer switches auto-follow off; the view no longer stops short of the bottom at the end of a reply on a slow WebKit.
The viewport reads a
scrollTopdecrease on a shorter transcript, within a second of its own scroll and with no reader input, as the engine clamping to a smaller maximum — the rule its own comment states. The code only applied it within 100 ms of a transcript mutation it had observed. Measured on CI WebKit: a settling reply dipped (1201 → 1068 px at the event), WebKit clamped 666 → 419, and the scroll event came 104 ms after the last mutation — so it was read as the reader going up, and the view stayed 409 px short for good. A jump with no shrink behind it, a reader’s hand, a held pointer and a jump outside that second still disarm as before.@aparte/core -
d7f8fe0: An LM Studio server that cannot be reached no longer gets a second request to its older
/api/v0/modelsAPI when the context window is read.The fallback is for a server that answers without the v1 REST API (an HTTP error); a request that got no answer at all — the server is down, or the page is being left — now ends the probe with no window, as any other failed probe does. In WebKit the second request, sent while a page was being left, surfaced as a page error.
@aparte/provider-openai-compat -
9a2ce96: A diagram still arriving now shows a placeholder box instead of its source, then draws each node as soon as its line is complete; it no longer flashes an empty image.
Before, a fence streamed its Mermaid source as text, then the header alone (
flowchart LR, anaccTitle) drew an empty 16×16 image in its place, and nothing changed until the whole of a half-written line parsed: characters, then a blank, then the diagram. Now its first frame is the skeleton recipe, each later frame draws the source up to its last complete line, and a frame whose drawing would paint nothing keeps what is shown. A closed fence is drawn as before;progressive: falsestill waits for it.@aparte/plugin-mermaid
Version-only bumps (no changes of their own): @aparte/engine, @aparte/runner-ag-ui, @aparte/runner-n8n, @aparte/provider-ai-sdk, @aparte/provider-scenario, @aparte/provider-transformers, @aparte/plugin-approval, @aparte/plugin-artifacts, @aparte/plugin-ask-user, @aparte/plugin-compaction, @aparte/plugin-katex, @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/locales, @aparte/docs-mcp.
0.28.2
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
- 2d108c1: The npm page of each of these packages now links to its docs page; nine of them pointed at
/plugins/…addresses that only redirect since the docs moved, anddocs-mcppointed at the site’s home.@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/docs-mcp
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-katex, @aparte/plugin-mermaid, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales.
0.28.3
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
Nothing to change in your code: this version carries what 0.28.2 announced, which never reached npm.
0.28.2’s release stopped at its build step in CI, before anything was published, so the version after 0.28.1 on npm is this one. Its changes are 0.28.2’s: each package’s npm page links to its docs page.
@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-compaction, @aparte/plugin-katex, @aparte/plugin-marked, @aparte/plugin-mermaid, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/plugin-streaming-markdown, @aparte/plugin-titler, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales, @aparte/docs-mcp.
0.29.0
Every @aparte/* package ships at this version (they are released in lockstep).
Minor Changes
-
324d2ba: New package:
@aparte/plugin-cardsdraws a tool’s result as a rich card instead of a row. Import one card’s entry and call its setup, e.g.setupWeatherCard({ tool: 'get_weather', map }).Eleven cards, each its own entry so an app ships only the ones it imports:
weather,items(articles and search results),product,place,stats(key figures),order(orders and bookings),stock(a quote with its line or candlestick chart),plan(an agent’s task list, updated in place),score(matches),media(pictures, videos, sounds, with a lightbox) andlink(a page preview). Each has three or four variants, chosen by name or by a function of the data, and a reader that already takes the shapes the usual APIs return (Open-Meteo, Shopify, Stripe, Google Places, Yahoo Finance, API-Football, Open Graph…);mapturns your tool’s own fields into the card’s. While the call runs the card shows its skeleton; a call refused, stopped or failed is one line that says so, never a card. Every card is also acardsegment (weatherCard.segment(data)) with a fallback sentence for a text-only reader, and its words come in the ten languages of@aparte/locales, rewritten in place on a language switch.A card can answer back: with an
onChange, the stock card draws range buttons over its chart, and whatonChangereturns is drawn in place — the same element, the focus kept. Changes run one at a time, each from the data the one before left, and what they returned is kept while the page lives: a turn ending, the conversation saved or reopened, in every framework, draws the card as the person left it. A button the app declares (actions) can open a link, send a message or only report; a button read from a tool’s result can only be a web link or anid, never text sent as the person. Setting a card up twice stacks: the newer setup draws, and removing the older one leaves it in place. The root entry is the kit the cards are made with (defineCard,segmented,toggle,slider,carousel,sparkline, theIntlformatters), for a card of your own that behaves the same way.@aparte/plugin-cards -
324d2ba: New package:
@aparte/plugin-chartjsdraws the```chartjsfences a model writes, and a tool’s result, as Chart.js charts. CallsetupChartjs(); passtool(andmap) to draw a tool’s result in place of its row.The fence’s body is Chart.js’ own
{ type, data, options }as JSON (```chart.jsworks too), drawn while it streams. Each chart gets the chat’s look in its own config —Chart.defaultsis never touched — and is recoloured on a light/dark switch. It is afigurewith a hidden table of its numbers. A config from a model carries no code: its ownpluginslist is dropped, and so are strings where Chart.js would call a function and looping animations; its size is bounded — points, labels and datasets bymaxPoints(5000 by default), a scale to a hundred ticks, the hidden table to 10 000 cells (readChartConfigis the reader).chart.js/autois loaded on the first chart, and@aparte/plugin-chartjs/coretakes aChartyou registered yourself (setupChartjsWith).@aparte/plugin-chartjs -
324d2ba: New package:
@aparte/plugin-echartsdraws the```echartsfences a model writes, and a tool’s result, as Apache ECharts charts. CallsetupECharts(); passtool(andmap) to draw a tool’s result in place of its row.The fence’s body is ECharts’ own
optionas JSON, drawn while it streams from the part that has arrived, at most every 300 ms. The chart wears the chat’s tokens as an ECharts theme, recoloured in place on a light/dark switch, with series colours that stay apart for colour-blind readers. It is drawn as SVG, as afigurewith ECharts’ own description and a hidden table of its numbers. A model’s option cannot write HTML, load a picture, open a link or download a file: tooltips are forced to rich text; images, links,saveAsImage,dataView, a CSSurl()however it is spelled and a dataset filter’s regular expression are taken out; a colour key takes colour syntax only (sanitizeEChartsOption). ECharts is loaded on the first chart, and@aparte/plugin-echarts/coretakes an ECharts build you hand it (setupEChartsWith).@aparte/plugin-echarts
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-artifacts, @aparte/plugin-ask-user, @aparte/plugin-compaction, @aparte/plugin-katex, @aparte/plugin-marked, @aparte/plugin-mermaid, @aparte/plugin-model-selector, @aparte/plugin-shiki, @aparte/plugin-streaming-markdown, @aparte/plugin-titler, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales, @aparte/docs-mcp.
0.29.1
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
Add
setupCardFences(): a```card-weathercode block of JSON in an answer is drawn as the weather card (every card has itscard-<name>language).For backends that send only text and keep their tool calls to themselves — a workflow engine, a server that streams its answer, a model with no tools.
loadmaps a card’s name to its entry (() => import('@aparte/plugin-cards/weather')), fetched the first time a block names it. While the block streams a placeholder holds its place; a block whose JSON does not parse, or whose card the page cannot draw, shows its source. Works with any Markdown provider, or none.@aparte/plugin-cards
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-artifacts, @aparte/plugin-ask-user, @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-streaming-markdown, @aparte/plugin-titler, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales, @aparte/docs-mcp.
0.29.2
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
df050ad: A card written as a
```card-<name>block is drawn on its own, without the code card’s header, language label and copy button around it.Core: a code-language renderer can say
bare: true— its drawing then stands for the whole fenced block, and the code card around it goes. Diagrams, charts and maths keep their card and the copy of their source.setupCardFences()sets it.A link in the person’s own bubble (an email or a URL they typed) now takes the bubble’s text colour, underlined: it was drawn in the link colour, which on a bubble filled with the primary was the bubble’s own colour.
@aparte/core,@aparte/plugin-cards
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-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-streaming-markdown, @aparte/plugin-titler, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales, @aparte/docs-mcp.
0.29.3 Latest
Every @aparte/* package ships at this version (they are released in lockstep).
Patch Changes
-
89e03ee: A card of your own (
defineCard) is drawn from its```card-<name>block even when it is set up aftersetupCardFences(), and a block can pick the card’s layout with"variant"in its JSON.- plugin-cards:
setupCardFences()hears of each card set up on its config from then on and draws its blocks too; before, only the cards known when it started were, and a card defined later showed its source. - plugin-cards:
"variant": "<name>"in a block’s JSON picks that layout when it is one of the card’s; any other value is the card’s data as before. - plugin-cards: a product alone in its answer is drawn with a landscape picture, and with a low band when it has none. The square frame, the width of a chat column, made the card taller than the chat’s view, and empty when the product had no picture. In a row of products the tiles stay square.
- core, plugin-cards: a message with padding and a card with its border no longer run past their column. Both took
max-width: 100%and counted padding or border outside it, so a bubble clipped their right edge. - plugin-cards: a change a live card was still waiting on when the conversation was left and opened again lands on the card now shown. It was drawn on the element the person had left, and the card they came back to kept the old value until the next redraw.
@aparte/core,@aparte/plugin-cards
- plugin-cards:
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-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-streaming-markdown, @aparte/plugin-titler, @aparte/angular, @aparte/react, @aparte/svelte, @aparte/vue, @aparte/locales, @aparte/docs-mcp.