"""Project-wide constants for browser-cli. Only static values live here. Runtime-derived state (e.g. installed version, open sockets, locks) stays in the owning module. """ from __future__ import annotations import os from pathlib import Path APP_NAME = "browser-cli" PYPI_PACKAGE_NAME = "real-browser-cli" RUNTIME_DIRNAME = ".browser_cli" DEFAULT_ALIAS = "default" NATIVE_HOST_NAME = "com.browsercli.host" EXTENSION_ID = "bfpmkhngkjnfhabmfckgeohlilokodkg" WEBSTORE_EXTENSION_ID = "hekaebjhbhhdbmakimmaklbblbmccahp" FIREFOX_EXTENSION_ID = "browser-cli@yiprawr.dev" ALLOWED_EXTENSION_IDS = [EXTENSION_ID, WEBSTORE_EXTENSION_ID] SUPPORTED_BROWSERS = ["chrome", "chromium", "brave", "edge", "vivaldi", "firefox"] # Public store listings — the default install path now that the extension is # published. Chromium-family browsers (Brave/Edge/Vivaldi/Chromium) can all # install from the Chrome Web Store. CHROME_WEBSTORE_URL = f"https://chromewebstore.google.com/detail/browser-cli/{WEBSTORE_EXTENSION_ID}" FIREFOX_ADDON_URL = "https://addons.mozilla.org/firefox/addon/browser-cli/" PROTOCOL_MIN_CLIENT = "0.9.0" MAX_MSG_BYTES = 32 * 1024 * 1024 DEFAULT_REMOTE_PORT = 443 # Count cap requested per page. The extension fills each page up to this many # items OR a byte budget (whichever comes first), so large items (e.g. data-URI # favicons) stay under the 1MB native-messaging limit while small items pack # into far fewer roundtrips. DEFAULT_PAGE_SIZE = 1000 # Hard upper bound on total items collected across all pages, and the loop-guard # page count. Kept independent of page size so byte-budgeted small pages don't # falsely trip the guard. MAX_PAGED_ITEMS = 10_000 DEFAULT_TRANSPORT_THRESHOLD = 512 # How long a remote serve connection stays open waiting for the next command on # an established encrypted session before closing. Lets the client reuse one # authenticated connection for multiple commands instead of re-handshaking. REMOTE_SESSION_IDLE_TIMEOUT = 30 NO_ROUTE_COMMANDS = {"browser-cli.targets", "browser-cli.auth.keys", "browser-cli.auth.trust", "browser-cli.auth.policy"} GENTLE_MODES = ["auto", "normal", "gentle", "ultra"] PAGEABLE_COMMANDS = { "tabs.list", "tabs.filter", "tabs.query", "group.list", "group.tabs", "group.query", "windows.list", "dom.query", "dom.text", "dom.attr", "extract.links", "extract.images", "extract.json", "session.list", } NATIVE_HOST_DIRS = { "chrome": { "linux": [Path.home() / ".config/google-chrome/NativeMessagingHosts"], "darwin": [Path.home() / "Library/Application Support/Google/Chrome/NativeMessagingHosts"], }, "chromium": { "linux": [Path.home() / ".config/chromium/NativeMessagingHosts"], "darwin": [Path.home() / "Library/Application Support/Chromium/NativeMessagingHosts"], }, "brave": { "linux": [Path.home() / ".config/BraveSoftware/Brave-Browser/NativeMessagingHosts"], "darwin": [Path.home() / "Library/Application Support/BraveSoftware/Brave-Browser/NativeMessagingHosts"], }, "edge": { "linux": [Path.home() / ".config/microsoft-edge/NativeMessagingHosts"], "darwin": [Path.home() / "Library/Application Support/Microsoft Edge/NativeMessagingHosts"], }, "vivaldi": { "linux": [Path.home() / ".config/vivaldi/NativeMessagingHosts"], "darwin": [Path.home() / "Library/Application Support/Vivaldi/NativeMessagingHosts"], }, "firefox": { "linux": [Path.home() / ".mozilla/native-messaging-hosts"], "darwin": [Path.home() / "Library/Application Support/Mozilla/NativeMessagingHosts"], }, } WINDOWS_NATIVE_HOST_REGISTRY_KEYS = { "chrome": [r"Software\Google\Chrome\NativeMessagingHosts"], "chromium": [r"Software\Chromium\NativeMessagingHosts"], "brave": [r"Software\BraveSoftware\Brave-Browser\NativeMessagingHosts"], "edge": [r"Software\Microsoft\Edge\NativeMessagingHosts"], "vivaldi": [r"Software\Vivaldi\NativeMessagingHosts"], "firefox": [r"Software\Mozilla\NativeMessagingHosts"], } CONFIG_DIR = Path(os.environ.get("XDG_CONFIG_HOME", str(Path.home() / ".config"))) / APP_NAME DEFAULT_KEY_PATH = CONFIG_DIR / "client.key.pem" DEFAULT_AUTHORIZED_KEYS_PATH = CONFIG_DIR / "authorized_keys" SSH_AGENTC_REQUEST_IDENTITIES = 11 SSH_AGENT_IDENTITIES_ANSWER = 12 SSH_AGENTC_SIGN_REQUEST = 13 SSH_AGENT_SIGN_RESPONSE = 14 PQ_KEX_ALG = "ML-KEM-768" PQ_TRANSPORT_ALG = "ML-KEM-768+ChaCha20Poly1305" SER_JSON = 0 SER_MSGPACK = 1 COMP_NONE = 0 COMP_ZLIB = 1 COMP_GZIP = 2 COMP_ZSTD = 3