agent-zero/plugins/_browser/api/extensions.py
Alessandro cf67047ad3 Polish Browser chrome and extension management UX
Refine the Browser modal UI with more native-feeling tabs, consistent chrome controls, right-side tab close buttons, and a cleaner extension dropdown. Move the Browser LLM preset into the dropdown with the active Main Model summary, simplify extension settings, remove the global extension enable switch and legacy extension root behavior, and add per-extension enable toggles.

Also updates the Chrome extension install/review flow with contextual warning copy, “Scan with A0”, cleaner labels, hidden empty extension state, and regression coverage for the new Browser UX.
2026-04-26 00:09:16 +02:00

87 lines
3.2 KiB
Python

from types import SimpleNamespace
from helpers import plugins
from helpers.api import ApiHandler, Request
from plugins._browser.helpers.config import (
MODEL_PRESET_KEY,
PLUGIN_NAME,
get_browser_config,
get_browser_main_model_summary,
get_browser_model_preset_options,
)
from plugins._browser.helpers.extension_manager import (
get_extensions_root,
install_chrome_web_store_extension,
list_browser_extensions,
set_browser_extension_enabled,
)
class Extensions(ApiHandler):
async def process(self, input: dict, request: Request) -> dict:
action = input.get("action", "list")
agent = self._agent_from_input(input)
if action == "list":
return self._browser_extension_payload(agent=agent)
if action == "install_web_store":
try:
result = install_chrome_web_store_extension(str(input.get("url", "")))
except ValueError as exc:
return {"ok": False, "error": str(exc)}
return {
**self._browser_extension_payload(agent=agent),
**result,
}
if action == "set_extension_enabled":
try:
set_browser_extension_enabled(
str(input.get("path", "")),
bool(input.get("enabled", False)),
)
except ValueError as exc:
return {"ok": False, "error": str(exc)}
return self._browser_extension_payload(agent=agent)
if action == "set_model_preset":
preset_name = str(input.get(MODEL_PRESET_KEY, "") or "").strip()
available_presets = {
option["name"]
for option in get_browser_model_preset_options(agent=agent)
if option.get("name") and not option.get("missing")
}
if preset_name and preset_name not in available_presets:
return {"ok": False, "error": "Choose an available browser model preset."}
config = get_browser_config()
config[MODEL_PRESET_KEY] = preset_name
plugins.save_plugin_config(PLUGIN_NAME, "", "", config)
return self._browser_extension_payload(agent=agent)
return {"ok": False, "error": f"Unknown action: {action}"}
def _agent_from_input(self, input: dict):
context_id = str(input.get("context_id", "") or "").strip()
if not context_id:
return None
try:
context = self.use_context(context_id, create_if_not_exists=False)
except Exception:
return None
config = getattr(context, "config", None)
if config is None:
return None
return SimpleNamespace(context=context, config=config)
def _browser_extension_payload(self, agent=None) -> dict:
config = get_browser_config()
return {
"ok": True,
"root": str(get_extensions_root()),
"extensions": list_browser_extensions(),
MODEL_PRESET_KEY: config[MODEL_PRESET_KEY],
"main_model_summary": get_browser_main_model_summary(agent=agent),
"model_preset_options": get_browser_model_preset_options(agent=agent, settings=config),
}