main
py 107 lines 3.93 KB
Raw
1 import asyncio
2 from types import SimpleNamespace
3
4 from helpers import plugins
5 from helpers.api import ApiHandler, Request
6 from plugins._browser.helpers.config import (
7 AUTOFOCUS_ACTIVE_PAGE_KEY,
8 DEFAULT_HOMEPAGE_KEY,
9 MODEL_PRESET_KEY,
10 PLUGIN_NAME,
11 get_browser_config,
12 get_browser_main_model_summary,
13 get_browser_model_preset_options,
14 )
15 from plugins._browser.helpers.extension_manager import (
16 get_extensions_root,
17 install_chrome_web_store_extension,
18 list_browser_extensions,
19 set_browser_extension_enabled,
20 uninstall_browser_extension,
21 )
22
23
24 class Extensions(ApiHandler):
25 async def process(self, input: dict, request: Request) -> dict:
26 action = input.get("action", "list")
27 agent = self._agent_from_input(input)
28
29 if action == "list":
30 return self._browser_extension_payload(agent=agent)
31
32 if action == "install_web_store":
33 try:
34 result = await asyncio.to_thread(
35 install_chrome_web_store_extension,
36 str(input.get("url", "")),
37 )
38 except ValueError as exc:
39 return {"ok": False, "error": str(exc)}
40 return {
41 **self._browser_extension_payload(agent=agent),
42 **result,
43 }
44
45 if action == "set_extension_enabled":
46 try:
47 set_browser_extension_enabled(
48 str(input.get("path", "")),
49 bool(input.get("enabled", False)),
50 )
51 except ValueError as exc:
52 return {"ok": False, "error": str(exc)}
53 return self._browser_extension_payload(agent=agent)
54
55 if action == "uninstall_extension":
56 try:
57 result = uninstall_browser_extension(str(input.get("path", "")))
58 except ValueError as exc:
59 return {"ok": False, "error": str(exc)}
60 return {
61 **self._browser_extension_payload(agent=agent),
62 **result,
63 }
64
65 if action == "set_model_preset":
66 preset_name = str(input.get(MODEL_PRESET_KEY, "") or "").strip()
67 available_presets = {
68 option["name"]
69 for option in get_browser_model_preset_options(agent=agent)
70 if option.get("name") and not option.get("missing")
71 }
72 if preset_name and preset_name not in available_presets:
73 return {"ok": False, "error": "Choose an available browser model preset."}
74
75 config = get_browser_config()
76 config[MODEL_PRESET_KEY] = preset_name
77 plugins.save_plugin_config(PLUGIN_NAME, "", "", config)
78 return self._browser_extension_payload(agent=agent)
79
80 return {"ok": False, "error": f"Unknown action: {action}"}
81
82 def _agent_from_input(self, input: dict):
83 context_id = str(input.get("context_id", "") or "").strip()
84 if not context_id:
85 return None
86 try:
87 context = self.use_context(context_id, create_if_not_exists=False)
88 except Exception:
89 return None
90 config = getattr(context, "config", None)
91 if config is None:
92 return None
93 return SimpleNamespace(context=context, config=config)
94
95 def _browser_extension_payload(self, agent=None) -> dict:
96 config = get_browser_config()
97 return {
98 "ok": True,
99 "root": str(get_extensions_root()),
100 "extensions": list_browser_extensions(),
101 "extension_paths": config["extension_paths"],
102 DEFAULT_HOMEPAGE_KEY: config[DEFAULT_HOMEPAGE_KEY],
103 AUTOFOCUS_ACTIVE_PAGE_KEY: config[AUTOFOCUS_ACTIVE_PAGE_KEY],
104 MODEL_PRESET_KEY: config[MODEL_PRESET_KEY],
105 "main_model_summary": get_browser_main_model_summary(agent=agent),
106 "model_preset_options": get_browser_model_preset_options(agent=agent, settings=config),
107 }