browser: replace browser-use agent with native browser

Introduce the new built-in Browser plugin for Agent Zero, replacing the legacy
browser-use-based browser agent with a direct Playwright-powered browser tool,
live WebUI viewer, browser session controls, status APIs, configuration, and
extension-management support.

Add browser-specific modal behavior so the browser can run as a floating,
resizable, no-backdrop window, including modal focus, toggle, and idempotent
open helpers for richer WebUI surfaces.

Remove the old `_browser_agent` core plugin and the `browser-use` dependency,
then clean up stale browser-model wiring and references across agent code,
model configuration docs, setup guides, troubleshooting docs, skills, and
Agent Zero knowledge.

Update regression and WebUI extension-surface coverage for the new browser
architecture and modal behavior.

The legacy browser-use implementation has been extracted from core so it can
continue separately as a community plugin published through the A0 Plugin Index for any user or professional that were relying on it for workflow.
This commit is contained in:
Alessandro 2026-04-24 15:43:52 +02:00
parent 603fc2064b
commit 983d431a5e
65 changed files with 6936 additions and 1926 deletions

View file

@ -0,0 +1,10 @@
from helpers.extension import Extension
from plugins._browser.helpers.runtime import close_runtime_sync
class CleanupBrowserRuntimeOnRemove(Extension):
def execute(self, data: dict = {}, **kwargs):
args = data.get("args", ())
context_id = args[0] if isinstance(args, tuple) and args else ""
if context_id:
close_runtime_sync(str(context_id), delete_profile=True)

View file

@ -0,0 +1,11 @@
from helpers.extension import Extension
from plugins._browser.helpers.runtime import close_runtime_sync
class CleanupBrowserRuntimeOnReset(Extension):
def execute(self, data: dict = {}, **kwargs):
args = data.get("args", ())
context = args[0] if isinstance(args, tuple) and args else None
context_id = getattr(context, "id", "")
if context_id:
close_runtime_sync(context_id, delete_profile=True)