Changelog
Version 0.16.7
Every @aparte/* package ships at this version (they are released in lockstep).
Every published README opens on its category line, and core’s quickstart says what the client now does on its own (echo included).
Patch Changes
-
42a9d09:
AparteClientechoes the user’s message by default — and echo ownership is a handshake, so nothing doubles.The optimistic user bubble used to be every raw-core host’s job: everyone wrote the same
aparte-sendhandler, and whoever forgot shipped a chat where the person cannot see what they typed — it compiles, it streams, and nothing errors. Three consumers hit exactly that.Whoever appends the user message marks the event (
detail.echoed), and whoever sees the mark yields: theConversationController(capture phase, so always first) marks for the wrappers’ pairing with a raw client, and the client marks after its own echo, so even two clients on one page render the message once. Attached files ride the echoed bubble as attachments; the wire cannot double — the history builder already excludes trailing unanswered user messages. A raw-core host that still appends its own bubble should drop that handler, or passechoUserMessage: falseto keep ownership.@aparte/core -
9df0877: Every package names its documentation page (
homepage) — nothing in the code changes.npm shows the link first on each package page; none of the twenty had one. Each now points at its own docs page, verified live before it was written. every package
-
b5891b9: The chat follows the system color scheme by default;
data-aparte-themenow forces either way —"light"is new.Dark existed only behind
data-aparte-theme="dark": on a dark OS, an un-attributed chat rendered light on the host’s dark page — unreadable, with no error. Measured by a consumer building from the docs alone. With no attribute,prefers-color-schemenow decides;"dark"still forces dark;"light"(new) forces light, which is the veto a light-always page needs and the escape a themed island inside an opposite page uses. If your app already flips the attribute from its own toggle, nothing changes — the attribute beats the OS in both directions. The dark palette exists twice in the sheet (a media query and an attribute selector cannot share a block);check:derived-varsnow holds the copies byte-identical, and holds the light veto to the:rootliterals, so the duplicates cannot drift.@aparte/core -
44a3611: The
{ text }docs no longer say core parses markdown — a markdown plugin renders it.Without
@aparte/plugin-markedor@aparte/plugin-streaming-markdown, scripted text streams as plain text,**stars**included. The docs said “parsed by core”, which is not what ships: core deliberately has no markdown renderer. Wording only.@aparte/provider-scenario -
8f9d56f: A
scenarios-mode tool call without itsafterroute warns at creation.whenplus a turn containing a tool is perfectly plausible to write — and the default match then routes the tool result back through the samewhen: identical rounds until the client’smaxTurnserror. The hole is visible at creation, so it is said at creation, naming each unrouted tool. Orderedturnsmode and a custommatchare exempt.@aparte/provider-scenario