chore(tui): sync the packaged changelog with the root slice

crates/tui/CHANGELOG.md is embedded in the binary via include_str! for
/change, and scripts/release/check-versions.sh (check 5) fails when it
drifts from the root CHANGELOG.md. It was last regenerated at 75706b760,
so the five 0.10.0 entries added since -- the Extensions panel acting on
its rows, the 'needs review' vocabulary, the MCP global/project/plugin
row labels, the removed 'Plugins · Problems' footer chip, the trimmed
marketplace, and the Xiaomi MiMo legacy-base_url 401 -- never reached
the shipped binary. The dogfood QA drove every one of those behaviors,
so the binary described less than it did.

Regenerated with scripts/sync-changelog.sh (15 released sections kept,
Unreleased excluded from the window per #3768).
This commit is contained in:
CodeWhale Bot committed 2026-09-21 21:22:06 -07:00
1 parent 7bf3f15e95
commit 18eee0c684
1 file changed
+45
+45
View File
@@ -257,6 +257,51 @@ tag, packages, checksums and release assets exist.
### Fixed
- A Xiaomi MiMo key no longer fails verification with another vendor's 401.
The legacy top-level `base_url` is a DeepSeek field, and a route without an
endpoint of its own inherited it — so a config carrying
`base_url = "https://api.deepseek.com"` made that host the MiMo route's
endpoint. The custom-endpoint guard correctly withheld the MiMo credential
from a host the route does not own, and the setup wizard's probe, which
bypassed the guard, sent the key as `api-key:` — a header DeepSeek ignores.
The result was `HTTP 401 Unauthorized: Authentication Fails (governor)`,
DeepSeek's *unauthenticated* 401, shown to someone who believed they were
testing their own key. Every layer that reads the root now inherits it only
when the URL belongs to that provider's own official endpoint family;
DeepSeek, which owns the field, is unchanged, and any other host is still
expressible on `[providers.xiaomi_mimo] base_url`. Key verification
failures now also name the endpoint that was probed, so a wrong endpoint
reads as a wrong endpoint instead of a bad key.
- The Extensions panel can act on the rows it shows. Every plugin now carries
its on/off switch — Space, or `e` — including one that has never been
reviewed: `/plugin enable` already routes an unreviewed bundle into the
exact-capability review and only flips the switch once you confirm the
digest, so withholding the control bought no safety and left the shipped
`computer-use` bundle reading `disabled` with nothing that could enable it.
- The panel stopped saying "untrusted". A bundle that is waiting on its
capability review now reads `needs review` — `off · needs review` when the
switch is off too — and its detail line says what Codewhale is withholding
and which key ends the wait, instead of restating an internal pair of
booleans. Enter's verb on that row is `review`, not `inspect`.
- MCP servers say where they live, and mutations write there. Each row is
labelled `global`, `project`, or `plugin: <name>`. Enabling, disabling or
removing a workspace-scoped server previously edited the user's global file
and failed with "MCP server '<name>' not found" on a row the panel had just
offered; the write now lands in the file that declares the server, and a
plugin-contributed server says it is switched off by disabling its plugin.
- The permanent "Plugins · Problems: N" footer chip is gone. It could not be
acted on from the footer, and its count and the Plugins tab disagreed by
construction — the chip counted bundles waiting on a review while the tab's
Problems group lists only registry-level diagnostics, so the rows behind the
number were never the rows you found. A bundle waiting on a review is a row
with an action, and `/plugins` states it per bundle next to the key that
resolves it.
- The Extensions marketplace no longer advertises what it cannot install.
Browser Use and the sandbox runtime were pinned rows whose only possible
action was `unavailable`; they are removed, along with the browser-driver
and sandbox-runtime component vocabulary that existed solely to describe
them.
- Configuration parsing keeps the parsed base config boxed, so loading a
profile no longer carries the full `Config` by value through the
deserializer and overflows a default 2 MiB test-thread stack; the