diff --git a/apps/api/src/integration-platform/controllers/connections.controller.ts b/apps/api/src/integration-platform/controllers/connections.controller.ts
index e318dce508..f605b8e05e 100644
--- a/apps/api/src/integration-platform/controllers/connections.controller.ts
+++ b/apps/api/src/integration-platform/controllers/connections.controller.ts
@@ -262,7 +262,7 @@ export class ConnectionsController {
}
/**
- * List connections for an organization
+ * List connections for an organization (excludes soft-deleted/disconnected)
*/
@Get()
@RequirePermission('integration', 'read')
@@ -270,20 +270,22 @@ export class ConnectionsController {
const connections =
await this.connectionService.getOrganizationConnections(organizationId);
- return connections.map((c) => ({
- id: c.id,
- providerId: c.providerId,
- providerSlug: (c as any).provider?.slug,
- providerName: (c as any).provider?.name,
- status: c.status,
- authStrategy: c.authStrategy,
- lastSyncAt: c.lastSyncAt,
- nextSyncAt: c.nextSyncAt,
- errorMessage: c.errorMessage,
- variables: c.variables,
- metadata: c.metadata,
- createdAt: c.createdAt,
- }));
+ return connections
+ .filter((c) => c.status !== 'disconnected')
+ .map((c) => ({
+ id: c.id,
+ providerId: c.providerId,
+ providerSlug: (c as any).provider?.slug,
+ providerName: (c as any).provider?.name,
+ status: c.status,
+ authStrategy: c.authStrategy,
+ lastSyncAt: c.lastSyncAt,
+ nextSyncAt: c.nextSyncAt,
+ errorMessage: c.errorMessage,
+ variables: c.variables,
+ metadata: c.metadata,
+ createdAt: c.createdAt,
+ }));
}
/**
@@ -1178,6 +1180,10 @@ export class ConnectionsController {
if (Array.isArray(mergedCredentials.regions)) {
metaUpdates.regions = mergedCredentials.regions;
}
+ // Mark cloud credential updates as reconnections so reconnect banners clear
+ if (manifest.category === 'Cloud') {
+ metaUpdates.reconnectedAt = new Date().toISOString();
+ }
if (Object.keys(metaUpdates).length > 0) {
const existingMeta =
(connection.metadata as Record) ?? {};
diff --git a/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx b/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx
index b414cbd5ba..0df49c479e 100644
--- a/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx
+++ b/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx
@@ -23,11 +23,13 @@ interface ProviderTabsProps {
onConnectionTabChange: (providerType: string, connectionId: string) => void;
onRunScan: (connectionId?: string) => Promise;
onAddConnection: (providerType: string) => void;
+ onReconnect: (providerType: string) => void;
onConfigure: (provider: Provider) => void;
needsConfiguration: (provider: Provider) => boolean;
requiresReconnect: (provider: Provider) => boolean;
canRunScan?: boolean;
canAddConnection?: boolean;
+ isReconnecting?: boolean;
orgId: string;
}
@@ -235,11 +237,13 @@ export function ProviderTabs({
onConnectionTabChange,
onRunScan,
onAddConnection,
+ onReconnect,
onConfigure,
needsConfiguration,
requiresReconnect,
canRunScan,
canAddConnection,
+ isReconnecting,
orgId,
}: ProviderTabsProps) {
return (
@@ -328,7 +332,12 @@ export function ProviderTabs({
{canAddConnection !== false && (
-