From 4c99693bcdbde8987b517e7a2149e048404afa7a Mon Sep 17 00:00:00 2001 From: Hayden <154503486+groupthinking@users.noreply.github.com> Date: Sun, 6 Sep 2026 02:34:19 -0500 Subject: [PATCH 1/2] fix(agents): tighten Antigravity input contract --- .../services/agents/antigravity_backend.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/youtube_extension/services/agents/antigravity_backend.py b/src/youtube_extension/services/agents/antigravity_backend.py index f2e245a6f..84ae445c0 100644 --- a/src/youtube_extension/services/agents/antigravity_backend.py +++ b/src/youtube_extension/services/agents/antigravity_backend.py @@ -20,7 +20,7 @@ ANTIGRAVITY_AGENT = "antigravity-preview-05-2026" -_MCP_NAME = re.compile(r"^[a-z0-9_-]+$") +_MCP_NAME = re.compile(r"^[a-z0-9]+$") class AntigravityConfigurationError(ValueError): @@ -51,7 +51,7 @@ class AntigravityMCPServer: def validate(self, read_only_tools: frozenset[str]) -> None: if not _MCP_NAME.fullmatch(self.name): raise AntigravityConfigurationError( - "MCP server name must match ^[a-z0-9_-]+$" + "MCP server name must contain lowercase ASCII letters and digits only" ) parsed = urlparse(self.url) if parsed.scheme != "https" or not parsed.netloc: @@ -171,12 +171,17 @@ def build_payload( "video_uri", "audio", "audio_file", + "image", + "images", + "image_bytes", + "image_file", + "image_uri", "document", } present = sorted(forbidden.intersection(context)) if present: raise AntigravityConfigurationError( - "Antigravity accepts normalized text/image context, not direct media: " + "This adapter accepts normalized text context, not direct media: " + ", ".join(present) ) From 06e1539314fe1a2f10f81dcc65825cc10480c871 Mon Sep 17 00:00:00 2001 From: Hayden <154503486+groupthinking@users.noreply.github.com> Date: Sun, 6 Sep 2026 02:34:31 -0500 Subject: [PATCH 2/2] test(agents): cover strict names and image rejection --- tests/unit/test_antigravity_backend.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/unit/test_antigravity_backend.py b/tests/unit/test_antigravity_backend.py index 2286bde84..60bb3dee0 100644 --- a/tests/unit/test_antigravity_backend.py +++ b/tests/unit/test_antigravity_backend.py @@ -107,17 +107,18 @@ async def test_live_transport_requires_two_explicit_gates() -> None: await backend.execute("do work") +@pytest.mark.parametrize("media_key", ["video_uri", "image_uri"]) @pytest.mark.asyncio -async def test_direct_media_is_rejected_before_transport() -> None: +async def test_direct_media_is_rejected_before_transport(media_key: str) -> None: transport = FakeTransport() backend = AntigravityBackend(config(), transport) with pytest.raises(AntigravityConfigurationError, match="direct media"): - await backend.execute("analyze", {"video_uri": "gs://bucket/video.mp4"}) + await backend.execute("analyze", {media_key: "gs://bucket/media"}) assert transport.payloads == [] -@pytest.mark.parametrize("name", ["EventRelay", "event relay", "eventrelay!"]) +@pytest.mark.parametrize("name", ["EventRelay", "event relay", "eventrelay!", "event-relay", "event_relay"]) def test_mcp_name_must_match_provider_contract(name: str) -> None: invalid = config( mcp_servers=(