v5.12.0
Minor Changes
-
c7039b9: Widget speaks eight more languages: Estonian, Latvian, Lithuanian, Czech, Slovak, Hungarian,
Romanian and Nynorsk.The set was Nordics + Western Europe + Polish, which left conspicuous holes: the Baltics, where a
Nordic-first product's customers already operate as one region, and Central Europe, where Polish was
in but its neighbours were not. Twenty-one locales now ship:en nb nn da sv fi is et lv lt de fr es it pt nl pl cs sk hu ro.Nynorsk is the odd one out and the cheapest: it was previously aliased away —
nn,nnoandnn-NO
all resolved to Bokmål. It now has its own strings, sonngets Nynorsk whileno,nobandnor
stay on Bokmål. Norwegian public bodies are obliged to serve both written standards, which makes this
closer to a requirement than a nicety for public-sector deals.Locales are statically imported, so every visitor downloads every language. Measured cost of the
eight: +4.4 KB gzipped on the widget bundle (174.1 → 178.6 KB), about 0.55 KB per language.FALLBACK_LOCALESin@getmunin/agent-runtimemirrors the widget list and moves with it, so the
runtime's canned greeting and handover notice speak the new languages too rather than silently
dropping to English. The chat-widget guide documentsdata-munin-localefor the first time — the
attribute has existed since the widget shipped, was described inskill://conv/setup-chat-widget,
and was missing from the human-facing optional-attributes list.Translation notes worth a native reviewer's eye before this reaches production traffic: register is
informal for Estonian and Nynorsk, polite for Latvian, Lithuanian, Czech, Slovak, Hungarian and
Romanian, matching how support desks in each market actually address customers. Where a template
interpolates an agent's name into a case-inflecting language, the copy uses a colon form
(Kõne: {who},Hovor: {who},Hívás: {who}) rather than a preposition that would demand a
declined name. The Romanian month abbreviation{n} land the Estonian{n} kare the two terse
relative-time strings most likely to want a second opinion. -
1836666: Upgrade better-auth to 1.7.1 and clear the open dependency advisories.
@better-auth/oauth-providerbefore 1.7.0-beta.4 could issue access tokens for
unauthorized audiences via unbound resource indicators (GHSA-p2fr-6hmx-4528).
Munin's/mcpgates on scope, so a token minted for one resource being accepted
at another is directly on-threat — this is the advisory that mattered, and the
only one reachable outside the build.1.7 pays for that fix with schema. Two migrations:
0079_better_auth_account_issuer— accounts are now keyed by
(issuer, account_id)rather than(provider_id, account_id).issueris
NOT NULL upstream, so existing rows are backfilled with the synthetic issuers
better-auth derives for providers that have none of their own:
local:credentialfor internal credentials,local:oauth:<providerId>for
Google and GitHub. JWKS rows gainalgandcrv.0080_better_auth_resource_indicators— the resource-indicator storage the
fix runs on: anoauth_resourceregistry, anoauth_client_resourcegrant
table, anoauth_client_assertionreplay guard, and the columns the provider
now persists on clients, access tokens and consents. Entirely additive; every
column is nullable or defaulted, so no backfill.
Both are idempotent, and both were smoke-tested against a database already at
the preceding migration with representative rows, not a fresh one.Two behaviour changes worth knowing about, both upstream tightening rather than
anything Munin chose:- Dynamic client registration returns
201 Created, per RFC 7591 §3.2.1. It
previously returned200. - A client that registers a loopback redirect URI (
http://localhost:…) is now
rejected unless it declaresapplication_type: "native". OIDC defaults an
omittedapplication_typetoweb, and web clients must use https on a
non-loopback host. Hosted connectors are unaffected — they redirect over
https — but a local MCP client that registershttp://localhost:…without
declaring itself native will now be turned away at registration.
Also refreshes the stale
brace-expansionoverride floors, pinsnanoidpast
GHSA-2v37-7h3g-55p8 and@hono/node-serverpast GHSA-frvp-7c67-39w9, and
deduplicates@better-auth/utilsto 0.5.0. That last one works around an
upstream contradiction:@better-auth/core@1.7.1peer-pins both
better-call@1.4.0and@better-auth/utils@0.4.2, butbetter-call@1.4.0
itself depends on@better-auth/utils@^0.5.0. Left alone, pnpm installs three
copies of@better-auth/core, and the duplicate type identities make the
oauth-provider plugin fail to typecheck againstBetterAuthPlugin.
Patch Changes
-
d1ad5a5: Restore the spaces that vanished after inline
<code>/<em>/<strong>in the guide prose.Seven guides rendered joined-up words — "Open _Choose tools_on the connection's menu", "must not
take anemailorcustomerIdargument", "**All spoofable.**Anyone can send mail". The space was in
the source; Next's bundled SWC dropped it. A multi-line JSX text run whose text contains an HTML
entity (’,",<, …) loses its leading space during the entity decode — the
trailing space survives, a single-line run survives, and the same source compiled with upstream
@swc/corekeeps it, so this only shows up in a Next build. It reproduces on both 16.2.12 (OSS
apps/web) and 16.2.6 (cloud marketing), and there is nothing in the source to hint at it: the
paragraph looks correct.Each of the 18 affected boundaries now carries an explicit
{' '}, which compiles to its own string
child and is immune to the bug. Verified by compiling every.tsxin the repo with Next's SWC and
asserting no element child is followed by a text child that starts mid-word, and by diffing the
rendered text of the touched files against the same files compiled with an unaffected SWC. Only
packages/docs-pages/src/guides/was affected; nothing underapps/webhit the pattern.One neighbouring defect fixed along the way, this one genuinely in the source: in the chat-widget
guide,<code>"dark"</code>ended a line andpins the panelbegan the next, so ordinary JSX
line-joining left no space at all.Also gives a
docs-attrsdefinition list breathing room before a following paragraph. On the
custom-MCP-server guide the "Provenance describes the turn happening right now" paragraph butted
straight against theself_reportedrow, reading as a fourth definition rather than prose.
Published packages
@getmunin/analytics-tracker@5.12.0@getmunin/chat-widget@5.12.0@getmunin/agent-host@5.12.0@getmunin/agent-runtime@5.12.0@getmunin/backend-core@5.12.0@getmunin/core@5.12.0@getmunin/dashboard-pages@5.12.0@getmunin/db@5.12.0@getmunin/docs-pages@5.12.0@getmunin/emails@5.12.0@getmunin/inspector-app@5.12.0@getmunin/mcp-toolkit@5.12.0@getmunin/sdk@5.12.0@getmunin/types@5.12.0@getmunin/ui@5.12.0