-
- }
- title="This server is all set!"
- description="No additional configuration is needed. Everything is ready to go."
- />
+
+
+
+ No additional configuration needed
+
);
}
@@ -228,23 +218,14 @@ function SettingsTabContent(props: SettingsTabProps) {
);
}
- // Authenticated but no MCP binding - show success state
+ // Authenticated but no MCP binding - no extra config needed
if (!hasMcpBinding) {
return (
-
-
- }
- title="This server is all set!"
- description="No additional configuration is needed. Everything is ready to go."
- />
+
+
+
+ No additional configuration needed
+
);
}
diff --git a/apps/mesh/src/web/components/integration-icon.tsx b/apps/mesh/src/web/components/integration-icon.tsx
index d07a77590e..5e9104494d 100644
--- a/apps/mesh/src/web/components/integration-icon.tsx
+++ b/apps/mesh/src/web/components/integration-icon.tsx
@@ -16,6 +16,7 @@ const SIZE_CLASSES = {
sm: "h-8 w-8",
md: "h-12 w-12",
lg: "h-16 w-16",
+ xl: "h-14 w-14",
};
type Size = keyof typeof SIZE_CLASSES;
@@ -26,6 +27,7 @@ const MIN_WIDTH_CLASSES: Record = {
sm: "min-w-8",
md: "min-w-12",
lg: "min-w-16",
+ xl: "min-w-14",
};
const ICON_SIZES: Record = {
@@ -34,6 +36,7 @@ const ICON_SIZES: Record = {
sm: 16,
md: 24,
lg: 32,
+ xl: 28,
};
export function IntegrationIcon({
diff --git a/apps/mesh/src/web/hooks/use-project-sidebar-items.tsx b/apps/mesh/src/web/hooks/use-project-sidebar-items.tsx
index bfa358d935..759b1d1405 100644
--- a/apps/mesh/src/web/hooks/use-project-sidebar-items.tsx
+++ b/apps/mesh/src/web/hooks/use-project-sidebar-items.tsx
@@ -8,7 +8,6 @@ import { usePreferences } from "@/web/hooks/use-preferences.ts";
import { useNavigate, useRouterState } from "@tanstack/react-router";
import {
BarChart10,
- Building02,
CheckDone01,
Container,
Dataflow03,
@@ -103,18 +102,6 @@ export function useProjectSidebarItems(): SidebarSection[] {
}),
};
- const storeItem: NavigationSidebarItem = {
- key: "store",
- label: "Store",
- icon: ,
- isActive: isActiveRoute("store"),
- onClick: () =>
- navigate({
- to: "/$org/$project/store",
- params: { org, project: ORG_ADMIN_PROJECT_SLUG },
- }),
- };
-
const agentsItem: NavigationSidebarItem = {
key: "agents",
label: "Agents",
@@ -234,7 +221,7 @@ export function useProjectSidebarItems(): SidebarSection[] {
group: {
id: "build",
label: "Build",
- items: [agentsItem, connectionsItem, storeItem],
+ items: [agentsItem, connectionsItem],
defaultExpanded: true,
},
},
diff --git a/apps/mesh/src/web/lib/query-keys.ts b/apps/mesh/src/web/lib/query-keys.ts
index 20a38913a7..df4bd95e66 100644
--- a/apps/mesh/src/web/lib/query-keys.ts
+++ b/apps/mesh/src/web/lib/query-keys.ts
@@ -147,6 +147,8 @@ export const KEYS = {
}) => ["monitoring", "logs", filters] as const,
monitoringLogsInfinite: (locator: string, paramsKey: string) =>
["monitoring", "logs-infinite", locator, paramsKey] as const,
+ connectionActivity: (connectionId: string, timeframe: string) =>
+ ["monitoring", "activity", connectionId, timeframe] as const,
// Monitoring dashboards
monitoringDashboards: (locator: ProjectLocator) =>
diff --git a/apps/mesh/src/web/routes/orgs/connections.tsx b/apps/mesh/src/web/routes/orgs/connections.tsx
index 67517f5a63..7f6745bdc5 100644
--- a/apps/mesh/src/web/routes/orgs/connections.tsx
+++ b/apps/mesh/src/web/routes/orgs/connections.tsx
@@ -3,18 +3,20 @@ import { CollectionDisplayButton } from "@/web/components/collections/collection
import { CollectionSearch } from "@/web/components/collections/collection-search.tsx";
import { CollectionTableWrapper } from "@/web/components/collections/collection-table-wrapper.tsx";
import { type TableColumn } from "@/web/components/collections/collection-table.tsx";
-import { ConnectionCard } from "@/web/components/connections/connection-card.tsx";
+import { ConnectionServiceGroup } from "@/web/components/connections/connection-service-group.tsx";
import { ConnectionStatus } from "@/web/components/connections/connection-status.tsx";
import { EmptyState } from "@/web/components/empty-state.tsx";
import { ErrorBoundary } from "@/web/components/error-boundary";
import { IntegrationIcon } from "@/web/components/integration-icon.tsx";
import { Page } from "@/web/components/page";
+import { StoreDiscovery } from "@/web/components/store";
import type { RegistryItem } from "@/web/components/store/types";
import { User } from "@/web/components/user/user.tsx";
import { useRegistryConnections } from "@/web/hooks/use-binding";
import { useListState } from "@/web/hooks/use-list-state";
import { authClient } from "@/web/lib/auth-client";
import { useAuthConfig } from "@/web/providers/auth-config-provider";
+import { groupConnections } from "@/web/utils/group-connections.ts";
import {
extractItemsFromResponse,
findListToolName,
@@ -90,7 +92,7 @@ import {
Terminal,
Trash01,
} from "@untitledui/icons";
-import { Suspense, useEffect, useReducer } from "react";
+import { Suspense, useEffect, useReducer, useState } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
import { formatTimeAgo } from "@/web/lib/format-time";
@@ -410,9 +412,12 @@ function OrgMcpsContent() {
const { stdioEnabled } = useAuthConfig();
// Consolidated list UI state (search, filters, sorting, view mode)
+ // Using "connections-v2" resource key to reset persisted view mode preference
+ // to "cards" now that the accordion design is the primary list view.
const listState = useListState({
namespace: org.slug,
- resource: "connections",
+ resource: "connections-v2",
+ defaultViewMode: "cards",
});
const actions = useConnectionActions();
@@ -581,6 +586,8 @@ function OrgMcpsContent() {
orgId: org.id,
});
+ const [storeOpen, setStoreOpen] = useState(false);
+
const invalidateConnections = () => {
queryClient.invalidateQueries({
predicate: (query) => {
@@ -1002,29 +1009,47 @@ function OrgMcpsContent() {