diff --git a/pyproject.toml b/pyproject.toml index af50cabb9b9540..cbf0f462485b2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,7 +46,7 @@ dependencies = [ # Note, grpcio>1.30.0 requires setting GRPC_POLL_STRATEGY=epoll1 # See https://github.com/grpc/grpc/issues/23796 and # https://github.com/grpc/grpc/blob/v1.35.x/doc/core/grpc-polling-engines.md#polling-engine-implementations-in-grpc - "grpcio>=1.67.0", + "grpcio>=1.71.2", # not directly used, but provides a speedup for redis "hiredis>=2.3.2", "httpx>=0.28.1", @@ -93,7 +93,7 @@ dependencies = [ "sentry-ophio>=1.1.3", # sentry-options is only used in getsentry for now "sentry-options>=1.0.13", - "sentry-protos>=0.13.0", + "sentry-protos>=0.15.0", "sentry-redis-tools>=0.5.0", "sentry-relay>=0.9.27", "sentry-scm==0.16.0", diff --git a/src/sentry/seer/autofix/coding_agent.py b/src/sentry/seer/autofix/coding_agent.py index 5553f2d44aaa71..21f26e0fde657e 100644 --- a/src/sentry/seer/autofix/coding_agent.py +++ b/src/sentry/seer/autofix/coding_agent.py @@ -56,9 +56,9 @@ class StateReposNotFound(NotFound): StoreCodingAgentStatesRequest, extract_api_error_message, get_autofix_state, + get_automation_handoff, get_coding_agent_prompt, make_store_coding_agent_states_request, - read_preference_from_sentry_db, update_coding_agent_state, ) from sentry.seer.models import SeerApiError @@ -243,9 +243,9 @@ def _launch_agents_for_repos( auto_create_pr = False try: project = Project.objects.get_from_cache(id=autofix_state.request.project_id) - preference = read_preference_from_sentry_db(project) - if preference.automation_handoff: - auto_create_pr = preference.automation_handoff.auto_create_pr + handoff = get_automation_handoff(project.get_option) + if handoff: + auto_create_pr = handoff.auto_create_pr except Project.DoesNotExist: logger.exception( "coding_agent.project_not_found", diff --git a/src/sentry/seer/autofix/issue_summary.py b/src/sentry/seer/autofix/issue_summary.py index 9b0f73ef53ec9d..ff6ce342973c88 100644 --- a/src/sentry/seer/autofix/issue_summary.py +++ b/src/sentry/seer/autofix/issue_summary.py @@ -36,7 +36,6 @@ is_seer_autotriggered_autofix_rate_limited, is_seer_autotriggered_autofix_rate_limited_and_increment, is_seer_seat_based_tier_enabled, - read_preference_from_sentry_db, ) from sentry.seer.entrypoints.cache import SeerOperatorAutofixCache from sentry.seer.entrypoints.operator import SeerAutofixOperator @@ -466,7 +465,7 @@ def get_automation_stopping_point(group: Group) -> AutofixStoppingPoint | None: """ Get the automation stopping point for a group. """ - user_preference = read_preference_from_sentry_db(group.project).automated_run_stopping_point + user_preference = group.project.get_option("sentry:seer_automated_run_stopping_point") if is_seer_seat_based_tier_enabled(group.organization): fixability_score = get_and_update_group_fixability_score(group) @@ -474,10 +473,7 @@ def get_automation_stopping_point(group: Group) -> AutofixStoppingPoint | None: return _apply_user_preference_upper_bound(fixability_stopping_point, user_preference) - if user_preference: - return AutofixStoppingPoint(user_preference) - - return None + return AutofixStoppingPoint(user_preference) def _generate_summary( diff --git a/src/sentry/seer/autofix/on_completion_hook.py b/src/sentry/seer/autofix/on_completion_hook.py index 67cb156ae63213..1106e31bc8e814 100644 --- a/src/sentry/seer/autofix/on_completion_hook.py +++ b/src/sentry/seer/autofix/on_completion_hook.py @@ -35,7 +35,7 @@ from sentry.seer.autofix.utils import ( AutofixStoppingPoint, clear_preference_automation_handoff, - read_preference_from_sentry_db, + get_automation_handoff, ) from sentry.seer.entrypoints.operator import SeerAutofixOperator, process_autofix_updates from sentry.seer.models import ( @@ -536,7 +536,7 @@ def _get_handoff_config_if_applicable( ]: return None - return read_preference_from_sentry_db(group.project).automation_handoff + return get_automation_handoff(group.project.get_option) @classmethod def _clear_handoff_preference( diff --git a/src/sentry/seer/autofix/utils.py b/src/sentry/seer/autofix/utils.py index b563ad80dff616..34a7443dd3b38c 100644 --- a/src/sentry/seer/autofix/utils.py +++ b/src/sentry/seer/autofix/utils.py @@ -628,7 +628,7 @@ def build_repo_definition_from_project_repo( ) -def build_automation_handoff( +def get_automation_handoff( get_option: Callable[[str], Any], ) -> SeerAutomationHandoffConfiguration | None: """Build a SeerAutomationHandoffConfiguration from option key/value pairs, or None if incomplete.""" @@ -668,7 +668,7 @@ def read_preference_from_sentry_db(project: Project) -> SeerProjectPreference: project_id=project.id, repositories=repo_definitions, automated_run_stopping_point=project.get_option("sentry:seer_automated_run_stopping_point"), - automation_handoff=build_automation_handoff(project.get_option), + automation_handoff=get_automation_handoff(project.get_option), autofix_automation_tuning=project.get_option("sentry:autofix_automation_tuning"), ) @@ -719,7 +719,7 @@ def _get_project_option(key: str) -> Any: automated_run_stopping_point=_get_project_option( "sentry:seer_automated_run_stopping_point" ), - automation_handoff=build_automation_handoff(_get_project_option), + automation_handoff=get_automation_handoff(_get_project_option), autofix_automation_tuning=_get_project_option("sentry:autofix_automation_tuning"), ) diff --git a/src/sentry/seer/endpoints/project_seer_settings.py b/src/sentry/seer/endpoints/project_seer_settings.py index 34c9c1338f1fb2..9b13fdb3e3707a 100644 --- a/src/sentry/seer/endpoints/project_seer_settings.py +++ b/src/sentry/seer/endpoints/project_seer_settings.py @@ -36,8 +36,8 @@ from sentry.seer.autofix.utils import ( AutofixStoppingPoint, AutomationCodingAgent, - build_automation_handoff, bulk_update_seer_project_settings, + get_automation_handoff, get_valid_automated_run_stopping_points, update_seer_project_settings, ) @@ -89,7 +89,7 @@ def _get_project_settings(project: Project) -> SeerProjectSettings: automation_tuning=project.get_option("sentry:autofix_automation_tuning"), scanner_automation=project.get_option("sentry:seer_scanner_automation"), stopping_point=project.get_option("sentry:seer_automated_run_stopping_point"), - handoff=build_automation_handoff(project.get_option), + handoff=get_automation_handoff(project.get_option), repos_count=SeerProjectRepository.objects.filter( project_repository__project=project, project_repository__repository__status=ObjectStatus.ACTIVE, @@ -131,7 +131,7 @@ def _get_option(key: str): automation_tuning=_get_option("sentry:autofix_automation_tuning"), scanner_automation=_get_option("sentry:seer_scanner_automation"), stopping_point=_get_option("sentry:seer_automated_run_stopping_point"), - handoff=build_automation_handoff(_get_option), + handoff=get_automation_handoff(_get_option), repos_count=repo_counts.get(project.id, 0), ) diff --git a/src/sentry/seer/entrypoints/operator.py b/src/sentry/seer/entrypoints/operator.py index 74a4d14272e9d5..2eee7b381a3ba8 100644 --- a/src/sentry/seer/entrypoints/operator.py +++ b/src/sentry/seer/entrypoints/operator.py @@ -24,6 +24,7 @@ AutofixState, AutofixStoppingPoint, get_autofix_state, + get_automation_handoff, ) from sentry.seer.autofix.utils import CodingAgentState as LegacyCodingAgentState from sentry.seer.entrypoints.cache import SeerOperatorAgentCache, SeerOperatorAutofixCache @@ -316,7 +317,6 @@ def trigger_handoff( from sentry.seer.autofix.utils import ( CodingAgentProviderType, CodingAgentStatus, - read_preference_from_sentry_db, ) from sentry.utils.locking import UnableToAcquireLock @@ -328,7 +328,7 @@ def trigger_handoff( with event_lifecycle.capture() as lifecycle: lifecycle.add_extras({"group_id": str(group.id), "run_id": str(run_id)}) - handoff_config = read_preference_from_sentry_db(group.project).automation_handoff + handoff_config = get_automation_handoff(group.project.get_option) if handoff_config is None: # Handoff was unset between message render and click. lifecycle.record_halt(halt_reason="no_handoff_configured") diff --git a/tests/sentry/seer/autofix/test_autofix_on_completion_hook.py b/tests/sentry/seer/autofix/test_autofix_on_completion_hook.py index 500b13c9ae25c6..b9b7f885e1ac7b 100644 --- a/tests/sentry/seer/autofix/test_autofix_on_completion_hook.py +++ b/tests/sentry/seer/autofix/test_autofix_on_completion_hook.py @@ -452,8 +452,10 @@ def _make_handoff_config( auto_create_pr=True, ) - @patch("sentry.seer.autofix.on_completion_hook.read_preference_from_sentry_db") - def test_get_handoff_config_returns_none_when_not_root_cause_step(self, mock_read_pref) -> None: + @patch("sentry.seer.autofix.on_completion_hook.get_automation_handoff") + def test_get_handoff_config_returns_none_when_not_root_cause_step( + self, mock_get_handoff + ) -> None: """Returns None without reading preferences when current step is not ROOT_CAUSE.""" result = AutofixOnCompletionHook._get_handoff_config_if_applicable( stopping_point=AutofixStoppingPoint.CODE_CHANGES, @@ -462,11 +464,11 @@ def test_get_handoff_config_returns_none_when_not_root_cause_step(self, mock_rea ) assert result is None - mock_read_pref.assert_not_called() + mock_get_handoff.assert_not_called() - @patch("sentry.seer.autofix.on_completion_hook.read_preference_from_sentry_db") + @patch("sentry.seer.autofix.on_completion_hook.get_automation_handoff") def test_get_handoff_config_returns_none_when_stopping_at_root_cause( - self, mock_read_pref + self, mock_get_handoff ) -> None: """Returns None without reading preferences when stopping point is ROOT_CAUSE.""" result = AutofixOnCompletionHook._get_handoff_config_if_applicable( @@ -476,7 +478,7 @@ def test_get_handoff_config_returns_none_when_stopping_at_root_cause( ) assert result is None - mock_read_pref.assert_not_called() + mock_get_handoff.assert_not_called() def test_get_handoff_config_returns_none_when_no_handoff_configured(self) -> None: """Returns None when project has no automation handoff configured.""" diff --git a/tests/sentry/seer/autofix/test_issue_summary.py b/tests/sentry/seer/autofix/test_issue_summary.py index 5abbaaafc7fb43..399cbaea7af933 100644 --- a/tests/sentry/seer/autofix/test_issue_summary.py +++ b/tests/sentry/seer/autofix/test_issue_summary.py @@ -1304,21 +1304,3 @@ def test_low_fixability_returns_root_cause(self, mock_fixability, mock_seat_base self.group.project.update_option("sentry:seer_automated_run_stopping_point", "open_pr") assert get_automation_stopping_point(self.group) == AutofixStoppingPoint.ROOT_CAUSE - - @patch("sentry.seer.autofix.issue_summary.read_preference_from_sentry_db") - @patch("sentry.seer.autofix.issue_summary.get_and_update_group_fixability_score") - def test_null_stopping_point_uses_fixability_only( - self, mock_fixability, mock_read_pref, mock_seat_based_tier - ): - """When preference.automated_run_stopping_point is None, fixability score alone drives the result.""" - from sentry.seer.models.seer_api_models import SeerProjectPreference - - mock_fixability.return_value = 0.80 - mock_read_pref.return_value = SeerProjectPreference( - organization_id=self.group.project.organization_id, - project_id=self.group.project.id, - repositories=[], - automated_run_stopping_point=None, - ) - - assert get_automation_stopping_point(self.group) == AutofixStoppingPoint.OPEN_PR diff --git a/tests/sentry/seer/entrypoints/test_operator.py b/tests/sentry/seer/entrypoints/test_operator.py index 7993c641a41c4e..6cc0fad8f1f15c 100644 --- a/tests/sentry/seer/entrypoints/test_operator.py +++ b/tests/sentry/seer/entrypoints/test_operator.py @@ -40,7 +40,6 @@ SeerEntrypointKey, SeerOperatorCacheResult, ) -from sentry.seer.models import SeerAutomationHandoffConfiguration, SeerProjectPreference from sentry.sentry_apps.metrics import SentryAppEventType from sentry.testutils.asserts import assert_failure_metric from sentry.testutils.cases import TestCase @@ -107,19 +106,12 @@ def setUp(self) -> None: self.entrypoint = MockAutofixEntrypoint() self.operator = SeerAutofixOperator(self.entrypoint) - def _build_preference_with_handoff( + def _set_automation_handoff( self, target: CodingAgentProviderType = CodingAgentProviderType.CURSOR_BACKGROUND_AGENT - ) -> SeerProjectPreference: - return SeerProjectPreference( - organization_id=self.organization.id, - project_id=self.project.id, - repositories=[], - automation_handoff=SeerAutomationHandoffConfiguration( - handoff_point="root_cause", - target=target, - integration_id=789, - ), - ) + ) -> None: + self.project.update_option("sentry:seer_automation_handoff_point", "root_cause") + self.project.update_option("sentry:seer_automation_handoff_target", target.value) + self.project.update_option("sentry:seer_automation_handoff_integration_id", 789) def _build_autofix_state_with_agents( self, agents: dict[str, LegacyCodingAgentState] @@ -316,12 +308,9 @@ def test_trigger_autofix_error(self, mock_get_autofix_state, mock_trigger_autofi assert self.entrypoint.autofix_run_ids == [] @patch("sentry.seer.entrypoints.operator.get_autofix_state", return_value=None) - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") - def test_trigger_handoff_success( - self, mock_trigger_handoff_helper, mock_read_pref, mock_get_state - ): - mock_read_pref.return_value = self._build_preference_with_handoff() + def test_trigger_handoff_success(self, mock_trigger_handoff_helper, mock_get_state): + self._set_automation_handoff() self.operator.trigger_handoff(group=self.group, run_id=MOCK_RUN_ID) mock_trigger_handoff_helper.assert_called_once() assert mock_trigger_handoff_helper.call_args.kwargs["referrer"] == AutofixReferrer.SLACK @@ -332,12 +321,11 @@ def test_trigger_handoff_success( assert self.entrypoint.handoff_errors == [] @patch("sentry.seer.entrypoints.operator.get_autofix_state") - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_already_exists_running( - self, mock_trigger_handoff_helper, mock_read_pref, mock_get_state + self, mock_trigger_handoff_helper, mock_get_state ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() mock_get_state.return_value = self._build_autofix_state_with_agents( { "agent-1": LegacyCodingAgentState( @@ -357,12 +345,11 @@ def test_trigger_handoff_already_exists_running( assert self.entrypoint.handoff_successes == [] @patch("sentry.seer.entrypoints.operator.get_autofix_state") - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_already_exists_completed( - self, mock_trigger_handoff_helper, mock_read_pref, mock_get_state + self, mock_trigger_handoff_helper, mock_get_state ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() mock_get_state.return_value = self._build_autofix_state_with_agents( { "agent-1": LegacyCodingAgentState( @@ -381,12 +368,11 @@ def test_trigger_handoff_already_exists_completed( ] @patch("sentry.seer.entrypoints.operator.get_autofix_state") - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_proceeds_when_all_agents_failed( - self, mock_trigger_handoff_helper, mock_read_pref, mock_get_state + self, mock_trigger_handoff_helper, mock_get_state ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() mock_get_state.return_value = self._build_autofix_state_with_agents( { "agent-1": LegacyCodingAgentState( @@ -405,17 +391,8 @@ def test_trigger_handoff_proceeds_when_all_agents_failed( ] assert self.entrypoint.handoff_already_exists == [] - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") - def test_trigger_handoff_no_config_is_silent_halt( - self, mock_trigger_handoff_helper, mock_read_pref - ): - mock_read_pref.return_value = SeerProjectPreference( - organization_id=self.organization.id, - project_id=self.project.id, - repositories=[], - automation_handoff=None, - ) + def test_trigger_handoff_no_config_is_silent_halt(self, mock_trigger_handoff_helper): self.operator.trigger_handoff(group=self.group, run_id=MOCK_RUN_ID) mock_trigger_handoff_helper.assert_not_called() assert self.entrypoint.handoff_successes == [] @@ -426,27 +403,25 @@ def test_trigger_handoff_no_config_is_silent_halt( "sentry.seer.entrypoints.operator.get_autofix_state", side_effect=Exception("seer down"), ) - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_state_fetch_error_calls_error_hook( - self, mock_trigger_handoff_helper, mock_read_pref, mock_get_state + self, mock_trigger_handoff_helper, mock_get_state ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() self.operator.trigger_handoff(group=self.group, run_id=MOCK_RUN_ID) mock_trigger_handoff_helper.assert_not_called() assert self.entrypoint.handoff_errors == ["Encountered an error while talking to Seer"] assert self.entrypoint.handoff_successes == [] @patch("sentry.seer.entrypoints.operator.get_autofix_state", return_value=None) - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch( "sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff", side_effect=RuntimeError("boom"), ) def test_trigger_handoff_launch_error_calls_error_hook( - self, mock_trigger_handoff_helper, mock_read_pref, mock_get_state + self, mock_trigger_handoff_helper, mock_get_state ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() self.operator.trigger_handoff(group=self.group, run_id=MOCK_RUN_ID) assert self.entrypoint.handoff_errors == [ "Encountered an error while launching the coding agent" @@ -465,12 +440,9 @@ def _build_explorer_state_with_agents( ) @patch("sentry.seer.entrypoints.operator.fetch_run_status") - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") - def test_trigger_handoff_explorer_success( - self, mock_trigger_handoff_helper, mock_read_pref, mock_fetch_status - ): - mock_read_pref.return_value = self._build_preference_with_handoff() + def test_trigger_handoff_explorer_success(self, mock_trigger_handoff_helper, mock_fetch_status): + self._set_automation_handoff() mock_fetch_status.return_value = self._build_explorer_state_with_agents({}) with self.feature("organizations:autofix-on-explorer"): self.operator.trigger_handoff(group=self.group, run_id=MOCK_RUN_ID) @@ -483,12 +455,11 @@ def test_trigger_handoff_explorer_success( assert self.entrypoint.handoff_errors == [] @patch("sentry.seer.entrypoints.operator.fetch_run_status") - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_explorer_already_exists_running( - self, mock_trigger_handoff_helper, mock_read_pref, mock_fetch_status + self, mock_trigger_handoff_helper, mock_fetch_status ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() mock_fetch_status.return_value = self._build_explorer_state_with_agents( { "agent-1": CodingAgentState( @@ -508,12 +479,11 @@ def test_trigger_handoff_explorer_already_exists_running( ] @patch("sentry.seer.entrypoints.operator.fetch_run_status") - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_explorer_already_exists_completed( - self, mock_trigger_handoff_helper, mock_read_pref, mock_fetch_status + self, mock_trigger_handoff_helper, mock_fetch_status ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() mock_fetch_status.return_value = self._build_explorer_state_with_agents( { "agent-1": CodingAgentState( @@ -533,12 +503,11 @@ def test_trigger_handoff_explorer_already_exists_completed( ] @patch("sentry.seer.entrypoints.operator.fetch_run_status") - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_explorer_proceeds_when_all_agents_failed( - self, mock_trigger_handoff_helper, mock_read_pref, mock_fetch_status + self, mock_trigger_handoff_helper, mock_fetch_status ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() mock_fetch_status.return_value = self._build_explorer_state_with_agents( { "agent-1": CodingAgentState( @@ -562,12 +531,11 @@ def test_trigger_handoff_explorer_proceeds_when_all_agents_failed( "sentry.seer.entrypoints.operator.fetch_run_status", side_effect=Exception("seer down"), ) - @patch("sentry.seer.autofix.utils.read_preference_from_sentry_db") @patch("sentry.seer.autofix.autofix_agent.trigger_coding_agent_handoff") def test_trigger_handoff_explorer_state_fetch_error_calls_error_hook( - self, mock_trigger_handoff_helper, mock_read_pref, mock_fetch_status + self, mock_trigger_handoff_helper, mock_fetch_status ): - mock_read_pref.return_value = self._build_preference_with_handoff() + self._set_automation_handoff() with self.feature("organizations:autofix-on-explorer"): self.operator.trigger_handoff(group=self.group, run_id=MOCK_RUN_ID) mock_trigger_handoff_helper.assert_not_called() diff --git a/uv.lock b/uv.lock index 810372d3af4894..d0e18a4e62e91e 100644 --- a/uv.lock +++ b/uv.lock @@ -595,8 +595,7 @@ wheels = [ [package.optional-dependencies] grpc = [ - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "grpcio-status", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] @@ -620,8 +619,7 @@ source = { registry = "https://pypi.devinfra.sentry.io/simple" } dependencies = [ { name = "google-api-core", extra = ["grpc"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "google-auth", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "proto-plus", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] @@ -742,8 +740,7 @@ dependencies = [ { name = "google-api-core", extra = ["grpc"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "google-auth", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "grpc-google-iam-v1", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "grpcio-status", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "proto-plus", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -836,8 +833,7 @@ wheels = [ [package.optional-dependencies] grpc = [ - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] [[package]] @@ -873,8 +869,7 @@ version = "0.13.1" source = { registry = "https://pypi.devinfra.sentry.io/simple" } dependencies = [ { name = "googleapis-common-protos", extra = ["grpc"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] wheels = [ @@ -886,36 +881,18 @@ name = "grpc-stubs" version = "1.53.0.5" source = { registry = "https://pypi.devinfra.sentry.io/simple" } dependencies = [ - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] wheels = [ { url = "https://pypi.devinfra.sentry.io/wheels/grpc_stubs-1.53.0.5-py3-none-any.whl", hash = "sha256:04183fb65a1b166a1febb9627e3d9647d3926ccc2dfe049fe7b6af243428dbe1" }, ] -[[package]] -name = "grpcio" -version = "1.67.0" -source = { registry = "https://pypi.devinfra.sentry.io/simple" } -resolution-markers = [ - "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')", -] -wheels = [ - { url = "https://pypi.devinfra.sentry.io/wheels/grpcio-1.67.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:42199e704095b62688998c2d84c89e59a26a7d5d32eed86d43dc90e7a3bd04aa" }, - { url = "https://pypi.devinfra.sentry.io/wheels/grpcio-1.67.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:c4c425f440fb81f8d0237c07b9322fc0fb6ee2b29fbef5f62a322ff8fcce240d" }, - { url = "https://pypi.devinfra.sentry.io/wheels/grpcio-1.67.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:662c8e105c5e5cee0317d500eb186ed7a93229586e431c1bf0c9236c2407352c" }, -] - [[package]] name = "grpcio" version = "1.75.1" source = { registry = "https://pypi.devinfra.sentry.io/simple" } -resolution-markers = [ - "(python_full_version >= '3.15' and sys_platform == 'darwin') or (python_full_version >= '3.15' and sys_platform == 'linux')", - "(python_full_version == '3.14.*' and sys_platform == 'darwin') or (python_full_version == '3.14.*' and sys_platform == 'linux')", -] dependencies = [ - { name = "typing-extensions", marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] wheels = [ { url = "https://pypi.devinfra.sentry.io/wheels/grpcio-1.75.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:5b8f381eadcd6ecaa143a21e9e80a26424c76a0a9b3d546febe6648f3a36a5ac" }, @@ -932,8 +909,7 @@ version = "1.67.0" source = { registry = "https://pypi.devinfra.sentry.io/simple" } dependencies = [ { name = "googleapis-common-protos", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] wheels = [ @@ -2215,8 +2191,7 @@ dependencies = [ { name = "googleapis-common-protos", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "granian", extra = ["pname", "reload", "uvloop"], marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "grpc-google-iam-v1", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "hiredis", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "iso3166", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2390,7 +2365,7 @@ requires-dist = [ { name = "googleapis-common-protos", specifier = ">=1.63.2" }, { name = "granian", extras = ["pname", "reload", "uvloop"], specifier = ">=2.7" }, { name = "grpc-google-iam-v1", specifier = ">=0.13.1" }, - { name = "grpcio", specifier = ">=1.67.0" }, + { name = "grpcio", specifier = ">=1.71.2" }, { name = "hiredis", specifier = ">=2.3.2" }, { name = "httpx", specifier = ">=0.28.1" }, { name = "iso3166", specifier = ">=2.1.1" }, @@ -2437,7 +2412,7 @@ requires-dist = [ { name = "sentry-kafka-schemas", specifier = ">=2.1.27" }, { name = "sentry-ophio", specifier = ">=1.1.3" }, { name = "sentry-options", specifier = ">=1.0.13" }, - { name = "sentry-protos", specifier = ">=0.13.0" }, + { name = "sentry-protos", specifier = ">=0.15.0" }, { name = "sentry-redis-tools", specifier = ">=0.5.0" }, { name = "sentry-relay", specifier = ">=0.9.27" }, { name = "sentry-scm", specifier = "==0.16.0" }, @@ -2621,16 +2596,15 @@ wheels = [ [[package]] name = "sentry-protos" -version = "0.13.0" +version = "0.15.0" source = { registry = "https://pypi.devinfra.sentry.io/simple" } dependencies = [ { name = "grpc-stubs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] wheels = [ - { url = "https://pypi.devinfra.sentry.io/wheels/sentry_protos-0.13.0-py3-none-any.whl", hash = "sha256:06ee1bfb38d62e8d89ecc65605b94f8a51e4c48e23ddb0c3e1fb2410bbbc91c3" }, + { url = "https://pypi.devinfra.sentry.io/wheels/sentry_protos-0.15.0-py3-none-any.whl", hash = "sha256:de8a8c2c00b1d8e145cbda58c6f728c5c6d7b3d28edf6867c13cde1614c58f0f" }, ] [[package]] @@ -2852,8 +2826,7 @@ source = { registry = "https://pypi.devinfra.sentry.io/simple" } dependencies = [ { name = "confluent-kafka", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "cronsim", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "grpcio", version = "1.67.0", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (python_full_version < '3.14' and sys_platform == 'linux')" }, - { name = "grpcio", version = "1.75.1", source = { registry = "https://pypi.devinfra.sentry.io/simple" }, marker = "(python_full_version >= '3.14' and sys_platform == 'darwin') or (python_full_version >= '3.14' and sys_platform == 'linux')" }, + { name = "grpcio", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "msgpack", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "orjson", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" },