diff --git a/src/sentry/web/urls.py b/src/sentry/web/urls.py index da825a0828a1..5f3a45c60555 100644 --- a/src/sentry/web/urls.py +++ b/src/sentry/web/urls.py @@ -172,7 +172,9 @@ JavaScriptSdkLoader.as_view(), name="sentry-js-sdk-loader", ), - re_path(r"^agent-handoff/$", AgentHandoffView.as_view(), name="sentry-agent-handoff"), + re_path(r"^agent-handoff\.md$", AgentHandoffView.as_view(), name="sentry-agent-handoff"), + # Prompts copied before the .md URL still point here. + re_path(r"^agent-handoff/$", AgentHandoffView.as_view(), name="sentry-agent-handoff-legacy"), # docs reference this for acquiring the sentry cli re_path(r"^get-cli/$", get_cli, name="get_cli_script"), re_path( diff --git a/static/app/data/controlsiloUrlPatterns.ts b/static/app/data/controlsiloUrlPatterns.ts index 5c68325fc333..85836b36b470 100644 --- a/static/app/data/controlsiloUrlPatterns.ts +++ b/static/app/data/controlsiloUrlPatterns.ts @@ -83,6 +83,7 @@ export const controlsiloUrlPatterns: RegExp[] = [ new RegExp('^_admin/'), new RegExp('^debug/mail/relocate-account/$'), new RegExp('^service-worker\\.js$'), + new RegExp('^agent-handoff\\.md$'), new RegExp('^agent-handoff/$'), new RegExp('^get-cli/$'), new RegExp('^get-cli/[^/]+/[^/]+/?$'), diff --git a/tests/sentry/agent_handoff/endpoints/test_organization_agent_handoff.py b/tests/sentry/agent_handoff/endpoints/test_organization_agent_handoff.py index 346bab47d4b1..f6b62f3119b0 100644 --- a/tests/sentry/agent_handoff/endpoints/test_organization_agent_handoff.py +++ b/tests/sentry/agent_handoff/endpoints/test_organization_agent_handoff.py @@ -41,7 +41,7 @@ def test_create_prompt(self) -> None: status_code=201, ) url = urlsplit(response.data["guideUrl"]) - assert url.path == "/agent-handoff/" + assert url.path == "/agent-handoff.md" assert not url.query assert not url.fragment code = response.data["code"] diff --git a/tests/sentry/agent_handoff/test_views.py b/tests/sentry/agent_handoff/test_views.py index 241c08712c5d..d8441de1b39d 100644 --- a/tests/sentry/agent_handoff/test_views.py +++ b/tests/sentry/agent_handoff/test_views.py @@ -61,7 +61,7 @@ def issue( def claim(self, code: str, ip_address: str = "127.0.0.1") -> HttpResponse: return self.client.post( - "/agent-handoff/", + "/agent-handoff.md", urlencode({"handoff_code": code}), content_type="application/x-www-form-urlencoded", REMOTE_ADDR=ip_address, @@ -70,7 +70,7 @@ def claim(self, code: str, ip_address: str = "127.0.0.1") -> HttpResponse: def test_claim_mints_once_and_returns_the_private_guide(self) -> None: code = self.issue() response = self.client.post( - "/agent-handoff/", + "/agent-handoff.md", urlencode({"handoff_code": code}), content_type="application/x-www-form-urlencoded", HTTP_ACCEPT="text/markdown", @@ -221,7 +221,7 @@ def test_membership_revocation_prevents_claim(self) -> None: def test_preview_is_public_and_preserves_the_code(self) -> None: code = self.issue() - response = self.client.get("/agent-handoff/", HTTP_ACCEPT="text/markdown") + response = self.client.get("/agent-handoff.md", HTTP_ACCEPT="text/markdown") assert response.status_code == 200 assert "The user initiated this agent handoff in Sentry" in response.content.decode() assert "It does not run those instructions" in response.content.decode() @@ -273,7 +273,7 @@ def test_unpinned_handoff_accepts_remote_agent(self) -> None: @control_silo_test class AgentHandoffPreviewTest(TestCase): def test_public_preview_uses_placeholders(self) -> None: - response = self.client.get("/agent-handoff/", {"preview": "1"}) + response = self.client.get("/agent-handoff.md", {"preview": "1"}) assert response.status_code == 200 body = response.content.decode() @@ -291,7 +291,7 @@ def test_onboarding_preview_does_not_issue_reporting_code(self) -> None: with patch( "sentry.agent_handoff.flows.onboarding.organization_service.issue_onboarding_reporting_code" ) as issue: - response = self.client.get("/agent-handoff/", {"preview": "1", "flow": "onboarding"}) + response = self.client.get("/agent-handoff.md", {"preview": "1", "flow": "onboarding"}) assert response.status_code == 200 body = response.content.decode() @@ -300,15 +300,15 @@ def test_onboarding_preview_does_not_issue_reporting_code(self) -> None: issue.assert_not_called() def test_preview_is_independent_of_the_session(self) -> None: - anonymous = self.client.get("/agent-handoff/", {"preview": "1"}) + anonymous = self.client.get("/agent-handoff.md", {"preview": "1"}) self.login_as(self.user) - authenticated = self.client.get("/agent-handoff/", {"preview": "1"}) + authenticated = self.client.get("/agent-handoff.md", {"preview": "1"}) assert anonymous.status_code == authenticated.status_code == 200 assert anonymous.content == authenticated.content def test_unknown_preview_flow(self) -> None: - response = self.client.get("/agent-handoff/", {"preview": "1", "flow": "unknown"}) + response = self.client.get("/agent-handoff.md", {"preview": "1", "flow": "unknown"}) assert response.status_code == 400 assert "Unknown Handoff Flow" in response.content.decode()