From 29e793fc8f919cd8961c06d052817ca3d2cd38c6 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 6 Jan 2026 16:53:03 +0530 Subject: [PATCH 1/4] feat: enhance AppStatusModal with AI debugging capabilities and update types for improved context handling --- .../AppStatusModal/AppStatusBody.tsx | 40 ++++++++++++++----- .../AppStatusModal.component.tsx | 1 + src/Shared/Components/AppStatusModal/types.ts | 9 ++++- .../Providers/MainContextProvider/types.ts | 10 ++++- src/Shared/types.ts | 2 +- src/index.ts | 1 + 6 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/Shared/Components/AppStatusModal/AppStatusBody.tsx b/src/Shared/Components/AppStatusModal/AppStatusBody.tsx index 22a73354f..977c20d24 100644 --- a/src/Shared/Components/AppStatusModal/AppStatusBody.tsx +++ b/src/Shared/Components/AppStatusModal/AppStatusBody.tsx @@ -20,6 +20,7 @@ import { getAIAnalyticsEvents } from '@Common/Helper' import { Tooltip } from '@Common/Tooltip' import { ComponentSizeType } from '@Shared/constants' import { getAppDetailsURL } from '@Shared/Helpers' +import { MainContext, useMainContext } from '@Shared/Providers' import { Button, ButtonComponentType, ButtonVariantType } from '../Button' import { DeploymentStatusDetailBreakdown } from '../CICDHistory' @@ -86,7 +87,10 @@ export const AppStatusBody = ({ deploymentStatusDetailsBreakdownData, selectedTab, debugWithAIButton: ExplainWithAIButton, + handleClose, }: AppStatusBodyProps) => { + const { aiAgentContext } = useMainContext() + const appStatus = appDetails.resourceTree?.status?.toUpperCase() || appDetails.appStatus const getAppStatusInfoCardItems = (): (Omit, 'isLast'> & { id: string })[] => { @@ -101,6 +105,29 @@ export const AppStatusBody = ({ ) const debugObject = `${debugNode?.kind}/${debugNode?.name}` + const intelligenceConfig: MainContext['intelligenceConfig'] = { + clusterId: appDetails.clusterId, + metadata: { + ...(debugNode ? { object: debugObject } : { message }), + namespace: appDetails.namespace, + status: debugNode?.health?.status ?? appStatus, + }, + prompt: `Debug ${message || 'error'} ${debugNode ? `of ${debugObject}` : ''} in ${appDetails.namespace}`, + analyticsCategory: getAIAnalyticsEvents('APP_STATUS', appDetails.appType), + } + + const debugAgentContext = { + ...aiAgentContext, + prompt: `Why is application '${appDetails.appName}' of '${appDetails.environmentName}' env ${appStatus}?`, + data: { + ...aiAgentContext.data, + ...(debugNode ? { debugNodeKind: debugNode.kind, debugNodeName: debugNode.name } : {}), + ...(message ? { additionalMessage: message } : {}), + namespace: appDetails.namespace, + status: debugNode?.health?.status ?? appStatus, + }, + } as MainContext['debugAgentContext'] + return [ { id: 'app-status-row', @@ -115,16 +142,9 @@ export const AppStatusBody = ({ appStatus?.toLowerCase() !== StatusType.HEALTHY.toLowerCase() && (debugNode || message) ? ( ) : null } diff --git a/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx b/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx index e8b053ca8..8c4dfc2ed 100644 --- a/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx +++ b/src/Shared/Components/AppStatusModal/AppStatusModal.component.tsx @@ -315,6 +315,7 @@ const AppStatusModal = ({ deploymentStatusDetailsBreakdownData={deploymentStatusDetailsBreakdownData} selectedTab={selectedTab} debugWithAIButton={debugWithAIButton} + handleClose={handleClose} /> {type === 'stack-manager' && ( diff --git a/src/Shared/Components/AppStatusModal/types.ts b/src/Shared/Components/AppStatusModal/types.ts index f1b15456d..27648d648 100644 --- a/src/Shared/Components/AppStatusModal/types.ts +++ b/src/Shared/Components/AppStatusModal/types.ts @@ -17,6 +17,7 @@ import { FunctionComponent, PropsWithChildren, ReactNode } from 'react' import { APIOptions, DeploymentAppTypes } from '@Common/Types' +import { MainContext } from '@Shared/Providers' import { AppDetails, ConfigDriftModalProps, @@ -38,7 +39,11 @@ export type AppStatusModalProps = { processVirtualEnvironmentDeploymentData: ( data?: DeploymentStatusDetailsType, ) => DeploymentStatusDetailsBreakdownDataType - debugWithAIButton: FunctionComponent<{ intelligenceConfig: IntelligenceConfig }> + debugWithAIButton: FunctionComponent<{ + intelligenceConfig: IntelligenceConfig + debugAgentContext: MainContext['debugAgentContext'] + onClick?: () => void + }> } & ( | { type: 'release' @@ -59,7 +64,7 @@ export type AppStatusModalProps = { ) export interface AppStatusBodyProps - extends Required> { + extends Required> { handleShowConfigDriftModal: () => void selectedTab: AppStatusModalTabType deploymentStatusDetailsBreakdownData: DeploymentStatusDetailsBreakdownDataType diff --git a/src/Shared/Providers/MainContextProvider/types.ts b/src/Shared/Providers/MainContextProvider/types.ts index 0ca2a33e1..f4b41d805 100644 --- a/src/Shared/Providers/MainContextProvider/types.ts +++ b/src/Shared/Providers/MainContextProvider/types.ts @@ -66,16 +66,20 @@ export type AIAgentContextType = envName: string clusterId: number appType: 'devtronApp' | 'devtronHelmChart' - } + } & Record } | { source: AIAgentContextSourceType.RESOURCE_BROWSER_CLUSTER data: { clusterId: number clusterName: string - } + } & Record } +export type DebugAgentContextType = AIAgentContextType & { + prompt?: string +} + export interface TempAppWindowConfig { /** Whether the temporary window is open */ open: boolean @@ -139,6 +143,8 @@ type CommonMainContextProps = { setLicenseData: Dispatch> canFetchHelmAppStatus: boolean setIntelligenceConfig: Dispatch> + debugAgentContext: DebugAgentContextType | null + setDebugAgentContext: (aiAgentContext: DebugAgentContextType | null) => void setAIAgentContext: (aiAgentContext: AIAgentContextType) => void setSidePanelConfig: Dispatch> } & Pick diff --git a/src/Shared/types.ts b/src/Shared/types.ts index 76a6859f3..f31d87f74 100644 --- a/src/Shared/types.ts +++ b/src/Shared/types.ts @@ -1327,7 +1327,7 @@ export interface DeploymentStatusDetailsBreakdownDataType { export interface IntelligenceConfig { clusterId: number - metadata: Record + metadata: Record prompt: string analyticsCategory: string } diff --git a/src/index.ts b/src/index.ts index 55ca97b77..a33489fd6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -187,6 +187,7 @@ export interface customEnv { * @default false */ FEATURE_STORAGE_ENABLE?: boolean + FEATURE_ATHENA_DEBUG_MODE_ENABLE?: boolean } declare global { interface Window { From a0da25e7a2de28d58f9556190f26ff5c4f6ef2e8 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Tue, 6 Jan 2026 18:40:55 +0530 Subject: [PATCH 2/4] feat: update version to 1.22.0-beta-5 in package.json and package-lock.json; add external Argo and Flux app types in AIAgent context handling --- package-lock.json | 4 +- package.json | 2 +- src/Common/Constants.ts | 2 + .../Providers/MainContextProvider/types.ts | 47 +++++++++++++++---- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index e188695ae..232f9bd5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.22.0-beta-4", + "version": "1.22.0-beta-5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.22.0-beta-4", + "version": "1.22.0-beta-5", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 03efe9957..7b38d54a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@devtron-labs/devtron-fe-common-lib", - "version": "1.22.0-beta-4", + "version": "1.22.0-beta-5", "description": "Supporting common component library", "type": "module", "main": "dist/index.js", diff --git a/src/Common/Constants.ts b/src/Common/Constants.ts index d1ae960e8..070c95314 100644 --- a/src/Common/Constants.ts +++ b/src/Common/Constants.ts @@ -80,6 +80,8 @@ export const URLS = { APP_DEPLOYMNENT_HISTORY: 'deployments', APP_DETAILS: 'details', APP_DETAILS_K8: 'k8s-resources', // for V2 + EXTERNAL_ARGO_APP: 'eaa', + EXTERNAL_FLUX_APP: 'external-flux', DETAILS: '/details', CD_DETAILS: 'cd-details', APP_TRIGGER: 'trigger', diff --git a/src/Shared/Providers/MainContextProvider/types.ts b/src/Shared/Providers/MainContextProvider/types.ts index f4b41d805..d11465011 100644 --- a/src/Shared/Providers/MainContextProvider/types.ts +++ b/src/Shared/Providers/MainContextProvider/types.ts @@ -56,17 +56,48 @@ export enum AIAgentContextSourceType { RESOURCE_BROWSER_CLUSTER = 'resource-browser-cluster', } +export type AIAgentAppType = + | 'devtronApp' + | 'devtronHelmChart' + | 'externalHelmChart' + | 'externalArgoApp' + | 'externalFluxApp' + +type AIAgentAppDataMasterType = { + appId: number | string + appName: string + envId: number + envName: string + clusterId: number + namespace: string + appType: AIAgentAppType + fluxAppDeploymentType: string +} + +type AIAgentAppDataType = Pick< + AIAgentAppDataMasterType, + TRequiredFields +> & { + [K in Exclude]?: never +} & { + appType: TAppType +} + export type AIAgentContextType = | { source: AIAgentContextSourceType.APP_DETAILS - data: { - appId: number - envId: number - appName: string - envName: string - clusterId: number - appType: 'devtronApp' | 'devtronHelmChart' - } & Record + data: + | AIAgentAppDataType< + 'devtronApp' | 'devtronHelmChart', + 'appId' | 'appName' | 'envId' | 'envName' | 'clusterId' + > + | AIAgentAppDataType<'externalHelmChart', 'appId' | 'appName' | 'clusterId' | 'namespace'> + | AIAgentAppDataType<'externalArgoApp', 'appName' | 'clusterId' | 'namespace'> + | (AIAgentAppDataType< + 'externalFluxApp', + 'appName' | 'clusterId' | 'namespace' | 'fluxAppDeploymentType' + > & + Record) } | { source: AIAgentContextSourceType.RESOURCE_BROWSER_CLUSTER From 06cbd1d331a1ba68a8f723b91177b4b2375dba93 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Wed, 7 Jan 2026 17:51:52 +0530 Subject: [PATCH 3/4] feat: update AppStatusBody to use debugError instead of additionalMessage for improved error handling --- src/Shared/Components/AppStatusModal/AppStatusBody.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Shared/Components/AppStatusModal/AppStatusBody.tsx b/src/Shared/Components/AppStatusModal/AppStatusBody.tsx index 977c20d24..7506a9230 100644 --- a/src/Shared/Components/AppStatusModal/AppStatusBody.tsx +++ b/src/Shared/Components/AppStatusModal/AppStatusBody.tsx @@ -122,7 +122,7 @@ export const AppStatusBody = ({ data: { ...aiAgentContext.data, ...(debugNode ? { debugNodeKind: debugNode.kind, debugNodeName: debugNode.name } : {}), - ...(message ? { additionalMessage: message } : {}), + ...(message ? { debugError: message } : {}), namespace: appDetails.namespace, status: debugNode?.health?.status ?? appStatus, }, From deb23c6573d6d112bfd53e5946f97cd021aeba51 Mon Sep 17 00:00:00 2001 From: AbhishekA1509 Date: Wed, 7 Jan 2026 18:29:33 +0530 Subject: [PATCH 4/4] feat: enhance debugAgentContext handling in AppStatusBody for improved error context management --- .../AppStatusModal/AppStatusBody.tsx | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/Shared/Components/AppStatusModal/AppStatusBody.tsx b/src/Shared/Components/AppStatusModal/AppStatusBody.tsx index 7506a9230..2cafab040 100644 --- a/src/Shared/Components/AppStatusModal/AppStatusBody.tsx +++ b/src/Shared/Components/AppStatusModal/AppStatusBody.tsx @@ -116,17 +116,20 @@ export const AppStatusBody = ({ analyticsCategory: getAIAnalyticsEvents('APP_STATUS', appDetails.appType), } - const debugAgentContext = { - ...aiAgentContext, - prompt: `Why is application '${appDetails.appName}' of '${appDetails.environmentName}' env ${appStatus}?`, - data: { - ...aiAgentContext.data, - ...(debugNode ? { debugNodeKind: debugNode.kind, debugNodeName: debugNode.name } : {}), - ...(message ? { debugError: message } : {}), - namespace: appDetails.namespace, - status: debugNode?.health?.status ?? appStatus, - }, - } as MainContext['debugAgentContext'] + // Have to add this to handle case of devtron-stack manager and software distribution hub. + const debugAgentContext = aiAgentContext + ? ({ + ...aiAgentContext, + prompt: `Why is application '${appDetails.appName}' of '${appDetails.environmentName}' env ${appStatus}?`, + data: { + ...aiAgentContext.data, + ...(debugNode ? { debugNodeKind: debugNode.kind, debugNodeName: debugNode.name } : {}), + ...(message ? { debugError: message } : {}), + namespace: appDetails.namespace, + status: debugNode?.health?.status ?? appStatus, + }, + } as MainContext['debugAgentContext']) + : null return [ { @@ -139,6 +142,7 @@ export const AppStatusBody = ({ envId={appDetails.environmentId} actionItem={ ExplainWithAIButton && + debugAgentContext && appStatus?.toLowerCase() !== StatusType.HEALTHY.toLowerCase() && (debugNode || message) ? (