diff --git a/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx b/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx index 19c1642e37ca40..425a150b18f8ed 100644 --- a/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx +++ b/static/app/components/events/interfaces/performance/spanEvidenceKeyValueList.tsx @@ -347,6 +347,25 @@ function DBQueryInjectionVulnerabilityEvidence({ ); } +function AIDetectedSpanEvidence({ + event, + organization, + location, + projectSlug, +}: SpanEvidenceKeyValueListProps) { + const evidenceData = event?.occurrence?.evidenceData ?? {}; + return ( + + ); +} + const PREVIEW_COMPONENTS: Partial< Record React.ReactElement | null> > = { @@ -368,6 +387,7 @@ const PREVIEW_COMPONENTS: Partial< [IssueType.PROFILE_FUNCTION_REGRESSION]: RegressionEvidence, [IssueType.QUERY_INJECTION_VULNERABILITY]: DBQueryInjectionVulnerabilityEvidence, [IssueType.WEB_VITALS]: WebVitalsEvidence, + [IssueType.LLM_DETECTED_EXPERIMENTAL]: AIDetectedSpanEvidence, }; export function SpanEvidenceKeyValueList({ @@ -401,7 +421,6 @@ export function SpanEvidenceKeyValueList({ /> ); } - const Component = PREVIEW_COMPONENTS[issueType] ?? DefaultSpanEvidence; return ( diff --git a/static/app/types/group.tsx b/static/app/types/group.tsx index 65b1c40078a7d5..0d97d15dcc3c7e 100644 --- a/static/app/types/group.tsx +++ b/static/app/types/group.tsx @@ -103,6 +103,8 @@ export enum IssueCategory { HTTP_CLIENT = 'http_client', DB_QUERY = 'db_query', MOBILE = 'mobile', + + AI_DETECTED = 'ai_detected', } /** @@ -133,6 +135,7 @@ export const ISSUE_CATEGORY_TO_DESCRIPTION: Record = { [IssueCategory.CRON]: '', [IssueCategory.REPLAY]: '', [IssueCategory.UPTIME]: '', + [IssueCategory.AI_DETECTED]: t('AI detected issues.'), }; export enum IssueType { @@ -179,10 +182,14 @@ export enum IssueType { // Insights Web Vitals WEB_VITALS = 'web_vitals', + + LLM_DETECTED_EXPERIMENTAL = 'llm_detected_experimental', } // Update this if adding an issue type that you don't want to show up in search! -export const VISIBLE_ISSUE_TYPES = Object.values(IssueType); +export const VISIBLE_ISSUE_TYPES = Object.values(IssueType).filter( + type => ![IssueType.LLM_DETECTED_EXPERIMENTAL].includes(type) +); export enum IssueTitle { ERROR = 'Error', @@ -226,6 +233,8 @@ export enum IssueTitle { // Insights Web Vitals WEB_VITALS = 'Web Vitals', + + LLM_DETECTED_EXPERIMENTAL = 'LLM Detected Issue', } export const ISSUE_TYPE_TO_ISSUE_TITLE = { @@ -263,6 +272,8 @@ export const ISSUE_TYPE_TO_ISSUE_TITLE = { uptime_domain_failure: IssueTitle.UPTIME_DOMAIN_FAILURE, web_vitals: IssueTitle.WEB_VITALS, + + llm_detected_experimental: IssueTitle.LLM_DETECTED_EXPERIMENTAL, }; export function getIssueTitleFromType(issueType: string): IssueTitle | undefined { @@ -295,6 +306,7 @@ const OCCURRENCE_TYPE_TO_ISSUE_TYPE = { 2007: IssueType.PROFILE_REGEX_MAIN_THREAD, 2008: IssueType.PROFILE_FRAME_DROP, 2010: IssueType.PROFILE_FUNCTION_REGRESSION, + 3501: IssueType.LLM_DETECTED_EXPERIMENTAL, 10001: IssueType.WEB_VITALS, }; diff --git a/static/app/utils/issueTypeConfig/aiDetectedConfig.tsx b/static/app/utils/issueTypeConfig/aiDetectedConfig.tsx new file mode 100644 index 00000000000000..f8ead2154a1b5a --- /dev/null +++ b/static/app/utils/issueTypeConfig/aiDetectedConfig.tsx @@ -0,0 +1,47 @@ +import {t} from 'sentry/locale'; +import type {IssueCategoryConfigMapping} from 'sentry/utils/issueTypeConfig/types'; +import {Tab} from 'sentry/views/issueDetails/types'; + +const aiDetectedConfig: IssueCategoryConfigMapping = { + _categoryDefaults: { + actions: { + archiveUntilOccurrence: {enabled: true}, + delete: { + enabled: true, + }, + deleteAndDiscard: { + enabled: false, + disabledReason: t('Not yet supported for performance issues'), + }, + merge: { + enabled: false, + disabledReason: t('Not yet supported for performance issues'), + }, + ignore: {enabled: true}, + resolve: {enabled: true}, + resolveInRelease: {enabled: true}, + share: {enabled: true}, + }, + pages: { + landingPage: Tab.DETAILS, + events: {enabled: true}, + openPeriods: {enabled: false}, + checkIns: {enabled: false}, + uptimeChecks: {enabled: false}, + attachments: {enabled: false}, + userFeedback: {enabled: false}, + replays: {enabled: false}, + tagsTab: {enabled: false}, + }, + autofix: false, + mergedIssues: {enabled: false}, + similarIssues: {enabled: false}, + stacktrace: {enabled: false}, + spanEvidence: {enabled: true}, + evidence: null, + usesIssuePlatform: true, + issueSummary: {enabled: false}, + }, +}; + +export default aiDetectedConfig; diff --git a/static/app/utils/issueTypeConfig/index.tsx b/static/app/utils/issueTypeConfig/index.tsx index 067ecceb11abb6..7c9d8fe934057c 100644 --- a/static/app/utils/issueTypeConfig/index.tsx +++ b/static/app/utils/issueTypeConfig/index.tsx @@ -1,6 +1,7 @@ import {t} from 'sentry/locale'; import {IssueCategory, IssueType} from 'sentry/types/group'; import type {Project} from 'sentry/types/project'; +import aiDetectedConfig from 'sentry/utils/issueTypeConfig/aiDetectedConfig'; import cronConfig from 'sentry/utils/issueTypeConfig/cronConfig'; import dbQueryConfig from 'sentry/utils/issueTypeConfig/dbQueryConfig'; import { @@ -102,6 +103,7 @@ const issueTypeConfig: Config = { [IssueCategory.DB_QUERY]: dbQueryConfig, [IssueCategory.MOBILE]: mobileConfig, [IssueCategory.METRIC]: metricConfig, + [IssueCategory.AI_DETECTED]: aiDetectedConfig, }; /**