The conversation whose browser is open, or null when none is.
The browser's last known URL.
Whether the app-wide registry holds THIS controller's browser_* handlers.
Bumps on every open, close and URL change, so a host can cache what it derives from the state.
Binds the drawer's live surface (starts the screencast, audio and human takeover).
Ends the conversation's browser: stops its streams, gives up the tools this controller still owns, and ends the server browser so no Chromium process (or billed hosted browser) is left running.
Ends the browser and releases the tools, push subscription and channel.
Runs one browser_* tool against this conversation's browser.
What the agent is told about the browser.
Routes a pushed RemoteBrowserScreencastFrame or RemoteBrowserAudioChunk to the channel when it
belongs to this controller's browser.
Connects the controller to the agent client (tool dispatch) and the provider (server calls, pushed frames).
Navigates the browser, e.g. from the drawer's URL bar; a refusal or failure comes back in ErrorMessage.
Opens the browser for conversationId and claims the browser_* tools. A browser this controller
held for a different conversation is ended first.
Unbinds the surface when the drawer is hidden; the browser itself stays open.
Adds the browser to an app context while it is open: its state under
AdditionalContext.RemoteBrowser, and, while this controller owns them, the browser_* tools
under Capabilities.Tools, the tier an agent run reads a surface's tools from. Returns base
unchanged while no browser is open.
Gives one text conversation (
MJ: Conversations) a live Remote Browser its agents can drive.The browser belongs to the conversation that opened it (Open); the controller captures that ID, so a later conversation switch still stops and ends the right browser (Close).
Agents reach the browser through the
browser_*client tools. Their handlers live inAgentClientService, whose registry is app-wide, so they are registered only while this controller's browser is open, and removed on close only if this controller still owns them (a chat area that opened a browser later takes them over). The tools are advertised to this conversation's agent runs alone, throughappContext.Capabilities.Tools(WithBrowserContext).