[pull] master from getsentry:master#1849
Merged
Merged
Conversation
…e_context (#112181) + When the frontend sends a structured LLMContextSnapshot as JSON in on_page_context (instead of the legacy ASCII DOM screenshot), the explorer chat endpoint now detects it and converts it to a readable markdown string before forwarding to Seer. Non-JSON on_page_context (the existing ASCII screenshot) passes through unchanged. + This is the backend half of the structured page context feature. The frontend counterpart (conditionally sending JSON instead of ASCII when organizations:context-engine-structured-page-context flag is on + dashboards page) will follow in a separate PR per the frontend/backend split deploy requirement. + This won't do anything currently right cuz the this is always false - snapshot = json.loads(on_page_context) Follow-up PRs 1. Frontend PR: Wire getLLMContext() into useSeerExplorer.tsx — when the feature flag is on and the user is on a dashboards page, send JSON.stringify(getLLMContext()) as on_page_context instead of the ASCII screenshot 2. Widget/chart context nodes: Add registerLLMContext('widget', ...) and registerLLMContext('chart', ...) to dashboard widget and chart components so the snapshot tree has richer data (query config, filters, etc. — not raw timeseries data) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Currently, we only sync the available repositories from Github on installing the integration. So over time, if new repositories are added to the github organization, or access to specific repositories is added or removed, we end up out of sync with which repositories we store in Sentry. To fix this, we are going to start handling the `installation_repositories` webhook. This is fired whenever the repositories that a github app can access change. This allows us to keep all the repos in sync. Note that when access to a repo is removed, we only ever disable the repo and never delete it. This allows us to keep the history of commits and so on so far.
…tate (#112188) ## Summary - The `paymentForm.spec.tsx` test "renders an error when intent creation fails" was flaky because it asserted `toBeEnabled()` on the "Pay Now" button synchronously - The mock Stripe `PaymentElement` fires `onChange({complete: true})` inside a `setTimeout(..., 0)`, so the button's enabled state update races with the assertion - Wrapped the assertion in `waitFor()` to reliably wait for the async state update ## Root Cause In `tests/js/setup.ts`, the global Stripe mock for `PaymentElement` uses `setTimeout(() => { onChange({complete: true}) }, 0)` to simulate form completion. In `InnerIntentForm`, the submit button starts disabled (`submitDisabled = true`) and only becomes enabled when `onChange` fires with `complete: true`. The synchronous `toBeEnabled()` assertion could run before the setTimeout callback executed, causing intermittent failures. ## Test plan - [x] Pre-commit passes - [x] CI passes
…gs (#111952) Implements double reads of occurrences from EAP for `get_release_tags` in `src/sentry/tagstore/snuba/backend.py`.
…112054) An iteration on the loading state. Before it would show a sort-of incremental count and still be spinning along. It looked like it was stuck or something because it wasn't ticking up consistently. Now we hold back on showing the count and buttons until we're fully ready to go. For these >800 repos it takes ~20seconds to load up for me. https://github.com/user-attachments/assets/c865cb0c-014b-4239-a50e-e685c28e36c3
…tep for metric laerts (#112189)
…SENTRY_REGION (#112140) these can be safely removed now getsentry is updated
) This makes this much easier to read/review and test. The stories are small and still work The bigs wins are a) moving a lot of logic out of the component and into hooks, b) and then leveraging useQuery and `select: () => ...` inside those hooks to format the data. Everything is more centered around `type PreferredAgent`, including the filename. i like how those things align tbh. And the tests are easier to read, and more plentiful, than before.
…p changes (#112202) When a group is archived and a new one backfills in, keep the previous supergroup data visible while the new query fetches in the background. Only show a loading state when navigating to an entirely new page of results (no overlap with previous group IDs). Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…#112201) This test didn't run in my branch, so fixing this now. <!-- Describe your PR here. -->
Patched vulnerabilities in the action https://github.com/getsentry/action-add-labels
…default (#112208) When handoff is not None and auto_create_pr is False (its registered default), delete the option rather than writing it. The other handoff fields are fine because they can't be None if handoff is not None.
+ When on dashboard pages with the context-engine-structured-page-context feature flag enabled, send JSON.stringify(getLLMContext()) instead of an ASCII DOM screenshot as on_page_context. The backend (already merged) detects JSON and converts it to markdown before forwarding to Seer. + Uses an explicit STRUCTURED_CONTEXT_ROUTES set for route matching rather than string includes, making it easy to extend as more pages register LLMContext providers. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Just a bunch of missing types. Added it to strictlist at the file-level (rather than the usual module level) because I think this file is important and tasks is too big to do all at once.
Remove the `execute()` function from `sentry/utils/concurrent.py`. It spawns a bare `threading.Thread` that does not propagate `contextvars`, making it a potential hazard for ViewerContext propagation work. Its last caller was the legacy pre-Arroyo Kafka post-process forwarder, removed in Feb 2023 (#44631). No code in the Sentry codebase imports or calls it today. Removing it rather than fixing its context propagation since `ContextPropagatingThreadPoolExecutor` is the blessed pattern (enforced by S016 lint rule). One less function that could silently lose context if rediscovered. Agent transcript: https://claudescope.sentry.dev/share/-gVA8oDYrqoHR4FJeNP_snlwGf7vKDU_cG4AV4FH4pA
… tag value (#111963) Implements double reads of occurrences from EAP for `get_group_list_tag_value` & `get_generic_group_list_tag_value` in `src/sentry/tagstore/snuba/backend.py`. --------- Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
…)" This reverts commit a8a8009. Co-authored-by: wedamija <6288560+wedamija@users.noreply.github.com>
…gPoint (#112211) Just the basics as a dropdown. Following this will be the summary blurb and bulk-edit button <img width="942" height="205" alt="SCR-20260403-jyzo" src="https://github.com/user-attachments/assets/b1a9af15-0301-42fb-8bf6-1e01de39434c" />
Adds new Slot primitive for building detached slots into Scraps and
around the UI.
The Slot primitive follows a factory pattern which returns the relevant
React building blocks to build slots. Slots need to be rendered into DOM
elements (constraint due to the use of portals).
An example of how a slot may be used is
```tsx
import {slot} from '@sentry/scraps/slot'
const SlotModule = slot(['Foo'] as const);
function Component(props){
return (
<SlotModule.Provider>
<SlotModule.slot.Foo.Root>
{ref => <Container {...ref}/>
</SlotModule.slot.Foo.Root>
{children}
</SlotModule.Provider>
)
}
// The children can later render items to the slot via
function Child(){
return <SlotModule.slot.Foo>...</SlotModule.slot.Foo>
}
// The final effect is the equivalent of
function Component(props){
return (
<SlotModule.Provider>
<Container><Child /></Container>
{children}
</SlotModule.Provider>
)
}
```
---------
Co-authored-by: Claude Sonnet 4 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Jonas <JonasBa@users.noreply.github.com>
Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
…2228) copies what's in https://github.com/getsentry/getsentry/blob/c1981e566beef6e95011ab0fa586800d02e638b6/getsentry/billing/platform/services/usage/_category_mapping.py future pr will remove the getsentry definitions and use this version
…reflected in status column (#112223) "Approved" wasn't being set in the "status" column of status checks as we simply never wired that up. This fixes it to properly post "approved" once snapshot diffs are approved. Resolves EME-1004
…112221) `make_signed_seer_api_request` now auto-reads from the `ViewerContext` contextvar when no explicit `viewer_context` parameter is passed. This means Seer calls made during API requests (where the middleware sets the contextvar) automatically get identity context without callers needing to construct and pass `SeerViewerContext`. **Behavior:** - Contextvar is the base — includes `actor_type` and `token` (kind + scopes) when available - Explicit `SeerViewerContext` param overrides `organization_id` / `user_id` if passed - If both exist and disagree on non-None values, logs `seer.viewer_context_mismatch` warning and strips the token from the payload This is safe to land independently — it's a no-op until the ViewerContext middleware is enabled (`viewer-context.enabled` option). Existing callers that pass explicit context continue to work unchanged. Part of the [ViewerContext RFC](https://www.notion.so/sentry/RFC-Unified-ViewerContext-via-ContextVar-32f8b10e4b5d81988625cb5787035e02). --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…value iter (#112122) Implements double reads of occurrences from EAP for `get_group_tag_value_iter` in `src/sentry/tagstore/snuba/backend.py`. --------- Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Fix DE-1061
+ Prepend a blockquote explaining that the content is a structured summary, not an exact screenshot. This helps the LLM understand the context type and also serves as a marker to differentiate structured context from raw ASCII screenshots downstream. + Planning to add a few more lines to this preamble later too Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Fixes widgetBuilder panel container by anchoring its position to the main element
Implements async actions inside our CMDK by allowing each action to define a resource callback function that returns `queryOptions`. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
…test_through_api_gateway (#112238)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )