agent-zero/plugins/_browser/api/extensions.py
Alessandro c32e328287 Polish Browser settings and viewport handling
Add Browser settings for the default starting page and tool-result autofocus, and wire them through config, APIs, runtime opens, and the settings UI.

Resolve Chrome extension __MSG_* manifest labels from locale metadata so installed extensions show readable names. Stabilize Browser viewport negotiation across canvas and modal surfaces by clearing stale frames, waiting for stable surface dimensions, and forcing sync after dock transitions. Move Browser loading/error state into a thin bottom status bar so it no longer overlays the page viewport.
2026-04-26 21:47:50 +02:00

91 lines
3.4 KiB
Python

from types import SimpleNamespace
from helpers import plugins
from helpers.api import ApiHandler, Request
from plugins._browser.helpers.config import (
AUTOFOCUS_ACTIVE_PAGE_KEY,
DEFAULT_HOMEPAGE_KEY,
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(),
DEFAULT_HOMEPAGE_KEY: config[DEFAULT_HOMEPAGE_KEY],
AUTOFOCUS_ACTIVE_PAGE_KEY: config[AUTOFOCUS_ACTIVE_PAGE_KEY],
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),
}