File size: 4,024 Bytes
f680f3e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import asyncio
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,
    uninstall_browser_extension,
)


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 = await asyncio.to_thread(
                    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 == "uninstall_extension":
            try:
                result = uninstall_browser_extension(str(input.get("path", "")))
            except ValueError as exc:
                return {"ok": False, "error": str(exc)}
            return {
                **self._browser_extension_payload(agent=agent),
                **result,
            }

        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(),
            "extension_paths": config["extension_paths"],
            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),
        }