cmux-next: remove streaming cursor when turns finish
Summary
- publish assistant row changes when a turn completes
- remove the streaming cursor as soon as the reply settles
Changelog
- Fixed the streaming reply cursor remaining visible after a completed turn.
Validation
- Added a focused direct-client regression for the turn completion snapshot update.
Updated validation
At a5ea2824220645f9ac7b54dd70f67b0570f71f59, the per-file runner executed direct.test.ts: 84 passed. The same test file against base direct.ts produced 83 passes and the expected streaming-row regression failure. The obsolete generated bundle was removed when merging the base.
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.
Summary by cubic
Fixes the streaming reply caret lingering after a turn completes: the settled assistant row is now replaced with a new object carrying streaming: false and an incremented version instead of being mutated in place, so snapshot subscribers detect the update and clear the caret. Covered by a direct-client regression test.
The branch also carries unrelated work merged from the feat-cmux-next base: divider hover now recomputes from the current pointer (so it follows a strip scroll under a still pointer), a handle removed mid-drag ends the drag, and a resize drag anchors the strip on the resized column; the supervisor now relays first-party app servers' Cloud API calls to the Mac provider; the Web listener keeps its Host rule on non-loopback binds; and ensure-web-bundles survives a same-key publish race and respects CMUX_WEB_BUNDLES_NO_INSTALL=1.
[!NOTE]
High Risk
Touches layout gesture/hover and column-scroll behavior, adds cloud credential relay routing, and tightens WebSocket Host rules—areas where bugs affect UX or security boundaries.
Overview
Cmux-next layout (cx-ww20) reworks divider hover so it follows the pointer and current handle frames, not per-view tracking events alone. ScreenDividers recomputes hover on scroll, key-window changes, and click-catching panel moves; column-edge resize drags anchor the strip camera on the resized column; mid-drag handle removal calls LayoutModel.cancelGesture and LayoutIntent.cancelGesture. DEBUG debug.mouse updates LayoutRootView.setDebugPointer (including a leave action) so tests and agents drive the same hover path.
Agent pane: when a turn ends, the streaming assistant row is replaced with streaming: false and a bumped version so subscribers clear the caret (plus a direct-client test).
Daemon apps: adds the credential relay (relay.op / relay.session on first-party app servers → credential provider on the Mac app), with scope checks, per-server limits, origin-user gating, and cancel on server stop. Provider routing is generalized with Target::Relay.
acpmux WebSocket: non-loopback websocket.listen keeps the Host allowlist (IP literals allowed; other hostnames need websocket.allowedHosts), documented and tested.
CI: ensure-web-bundles.sh uses per-build temp dirs and safe publish to avoid cache races; CMUX_WEB_BUNDLES_NO_INSTALL=1 skips toolchain curl on nx-remote hosts.
Reviewed by Cursor Bugbot for commit a5ea2824220645f9ac7b54dd70f67b0570f71f59. Bugbot is set up for automated code reviews on this repo. Configure here.