The live screen now opens wide beside the chat while the bot works on it,
a file the bot presents as its result opens next to the conversation, and a
question that scrolled away gets a "Needs you" pill back to it. Focus is
derived from signals clients already have (pointer events, takeover
requests, a new `present` flag on attach_file, pending asks) by shared core
rules, so web and mobile agree and the behaviour stays deterministic.
The pane only moves on focus edges, never replaces a pane the user opened,
and learns per bot whether the screen should open on its own. Pane widths
persist per device. Mobile shows a pill that opens the computer route.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C7VSRHHzyt2KwoCkUkZ2Gc
Bots now announce every click and typing step before it runs, and the
web app draws a cursor in the bot's colour that glides to that point
over the live computer screen, ripples on clicks and shows typing.
- contracts: ComputerPointerPayload on the existing thread.computer event
- executor: computer_act and browser_act announce pointer steps
(best effort); the page-browser helper reports element screen boxes,
which are stripped before results reach the model
- web: agentPointerFeed + AgentCursor over the side-panel preview and
the full-window screen, mapped through the noVNC letterbox
- in-app browser: native WebContentsView on desktop (own session, http(s)
only, clamped bounds, back/forward, reload, DevTools, load errors) and
a sandboxed iframe on the web; replaces the dead panel, the fake
50%/40% cursors and the unimplemented devServer bridge
Claude-Session: https://claude.ai/code/session_01WiGooXtsKrZQmdszepRrNi
Co-authored-by: Claude <noreply@anthropic.com>