diff --git a/frontend/src/components/plugins/PluginRouteRenderer.tsx b/frontend/src/components/plugins/PluginRouteRenderer.tsx
index c4822fb..72b5be9 100644
--- a/frontend/src/components/plugins/PluginRouteRenderer.tsx
+++ b/frontend/src/components/plugins/PluginRouteRenderer.tsx
@@ -2,6 +2,7 @@ import { useMemo } from 'react';
import { useLocation } from 'react-router-dom';
import { Loader2 } from 'lucide-react';
import { usePluginStore } from '@/store/pluginStore';
+import { ProtectedRoute } from '@/components/common/ProtectedRoute';
import { PluginPage } from './PluginLoader';
/**
@@ -43,12 +44,20 @@ export function PluginRouteRenderer() {
);
const pluginName = plugin?.display_name || plugin?.name || matchedRoute.path;
- return (
+ const page = (
);
+
+ // ARCH-006: enforce the manifest permission like the static routes do.
+ // Empty permission = any authenticated user (route is already inside the
+ // protected route group).
+ if (matchedRoute.permission) {
+ return {page};
+ }
+ return page;
}
// If manifests haven't loaded yet, show a spinner (not null/blank)
diff --git a/frontend/src/store/pluginStore.ts b/frontend/src/store/pluginStore.ts
index 86d2ccd..5736465 100644
--- a/frontend/src/store/pluginStore.ts
+++ b/frontend/src/store/pluginStore.ts
@@ -17,6 +17,7 @@ export interface PluginPageRoute {
parent: string;
protected: boolean;
order: number;
+ permission?: string;
}
export interface PluginDetailTab {