diff --git a/tests/cli/test_frontend_agent_proxy.py b/tests/cli/test_frontend_agent_proxy.py
index 09f762da..9911773c 100644
--- a/tests/cli/test_frontend_agent_proxy.py
+++ b/tests/cli/test_frontend_agent_proxy.py
@@ -45,6 +45,26 @@ def test_agent_surface_rewrite_only_changes_the_agent_base_path() -> None:
assert f'src="{prefix}/hermes/assets/app.js"' in rewritten
+def test_hermes_surface_rewrite_removes_private_gateway_query() -> None:
+ prefix = "/web/hermes/sessions/session-1/surface/token-1"
+ body = (
+ b''
+ b''
+ b''
+ )
+
+ rewritten = _rewrite_body(body, "text/html", prefix, "hermes").decode()
+
+ assert f'src="{prefix}/hermes/assets/app.js?theme=dark"' in rewritten
+ assert 'href="./assets/app.css"' in rewritten
+ assert 'href="./favicon.ico"' in rewritten
+ assert "faasInstanceName" not in rewritten
+ assert "Authorization" not in rewritten
+ assert "hermes-instance" not in rewritten
+ assert "hermes-secret" not in rewritten
+
+
def test_agent_surface_proxy_keeps_endpoint_auth_server_side(
monkeypatch: pytest.MonkeyPatch,
) -> None:
diff --git a/veadk/cli/frontend_agent_proxy.py b/veadk/cli/frontend_agent_proxy.py
index 7a808893..9eeadb52 100644
--- a/veadk/cli/frontend_agent_proxy.py
+++ b/veadk/cli/frontend_agent_proxy.py
@@ -18,6 +18,8 @@
import asyncio
import contextlib
+import html
+import re
from collections.abc import Callable
from urllib.parse import parse_qsl, urlencode, urlsplit, urlunsplit
@@ -33,6 +35,11 @@
_MAX_BODY_BYTES = 16 * 1024 * 1024
_TEXT_CONTENT_TYPES = ("text/", "javascript", "json", "manifest", "xml")
+_GATEWAY_QUERY_KEYS = frozenset({"authorization", "faasinstancename"})
+_HERMES_QUERY_URL_PATTERN = re.compile(
+ rb"[^\s\"'`<>()]+\?[^\s\"'`<>()]+",
+ re.IGNORECASE,
+)
_OPENCLAW_RESET_TAG = (
b"