Session ingest has normalized legacy assistant string content into
[{ type: "text" }] blocks since #98908, which updated the core
cli-runner session-history analog but missed this extension file.
The suite only runs in full local runs and the dispatch-only
plugin-prerelease lane, so push/PR CI stayed green while local
scripts/pr prepare-gates failed on any OS.
refs #99857
The chat composer's model picker and provider-usage pill become quiet borderless text controls; the reasoning flyout swaps its button list for a discrete Faster–Smarter slider (native range input) with stop dots, filled track, inherited-default marker, ghosted off-scale defaults, live value label, and one-click 'Use default' reset — single-level models render a toggle instead. The persistent sidebar VERSION pill is replaced by a slim connection-status line; the gateway version remains in Settings' Quick Settings footer. Includes review fixes from Codex autoreview (singleton level selectable) and the GitHub Codex review (off-scale default thumb), plus a 40px mobile touch target.
Closes#99837
Store the pricing fingerprint once on the cache root and stop persisting redundant filePath/sessionId metadata in each cache entry. Pricing changes still invalidate cached entries before refresh, and v5 caches rebuild through the schema version bump.
Fixes#99511
Co-authored-by: weco.ai <noreply@weco.ai>
* fix(line): truncate outbound altText, location, menu, and code fields on code-point boundaries
* fix(line): use safe truncation for receipt card altText
* fix(line): count rich menu limits by grapheme
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
The Control UI is an app shell: inner panes scroll, the root never should. macOS WKWebView (Mac app dashboard window) and desktop Safari still rubber-band the root scroller, so the whole UI bounced up and down whenever content fit the viewport. Apply overscroll-behavior: none to html/body globally instead of only in standalone PWA mode, and drop the now-redundant standalone-mode declaration.
* fix(config): reconcile legacy config health state
* fix(config): reconcile legacy config health state
---------
Co-authored-by: Josh Lehman <josh@martian.engineering>
* fix(ssh-tunnel): handle spawn error to prevent unhandled rejection crash
When /usr/bin/ssh is missing (ENOENT), spawn() emits an async 'error'
event. Without a handler, the unhandled error crashes the process
and the Promise.race hangs until timeout. Forward the spawn error
into the rejection path so tunnel setup fails gracefully.
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(ssh-tunnel): add missing localPortPreferred in test call
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(ssh-tunnel): avoid failed-spawn cleanup delay
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix(supervisor): suppress unhandled stream errors on child stdout/stderr
Child process stdout and stderr streams can emit 'error' events
(EPIPE, resource limits, I/O errors) that crash the process when
no listener is attached. Add noop error handlers to prevent crashes
while preserving normal data/end/close event flow.
Co-Authored-By: Claude <noreply@anthropic.com>
* test(supervisor): add regression test for stream error suppression
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(supervisor): guard child stream errors during setup
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix(mcp): suppress unhandled error on stderr pipe in stdio transport
When child.stderr is piped to stderrStream without an error
handler, a stream-level error (EPIPE, I/O failure) crashes the
process. Add a noop error handler before the pipe, consistent
with the error handlers already present on stdin and stdout.
Co-Authored-By: Claude <noreply@anthropic.com>
* test(mcp): add regression test for stderr pipe error suppression
Co-Authored-By: Claude <noreply@anthropic.com>
* fix(mcp): report stderr stream errors
* fix(mcp): report stderr stream errors
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
* fix(markdown-core): use Object.hasOwn instead of in operator in parseFrontmatterBlock
* test(markdown-core): add regression test for prototype-named null frontmatter keys
* style(markdown-core): fix unbound-method lint in regression test
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>