diff --git a/apps/desktop/src/features/featuresets/FeatureSetsPage.tsx b/apps/desktop/src/features/featuresets/FeatureSetsPage.tsx
index c09d3334..e0c3b1c2 100644
--- a/apps/desktop/src/features/featuresets/FeatureSetsPage.tsx
+++ b/apps/desktop/src/features/featuresets/FeatureSetsPage.tsx
@@ -12,6 +12,7 @@ import {
AlertCircle,
CheckCircle2,
Zap,
+ Sparkles,
} from 'lucide-react';
import {
Card,
@@ -268,6 +269,32 @@ export function FeatureSetsPage() {
+ {/* @mux self-optimization hint — let the assistant curate the toolset from chat */}
+
+
+
+
+
+
+
+ Let your AI build these for you
+
+
+ In any connected client, just say{' '}
+
+ @mux optimize
+ {' '}
+ — your assistant can discover the available tools, compose a FeatureSet, and pin it
+ to the current folder. Every change is gated behind a one-click approval, so you
+ stay in control.
+
+
+
+
+
{/* Feature-set model explainer */}
diff --git a/apps/desktop/src/features/metaTools/MetaToolApprovalDialog.tsx b/apps/desktop/src/features/metaTools/MetaToolApprovalDialog.tsx
index ace428ae..99ce9cb3 100644
--- a/apps/desktop/src/features/metaTools/MetaToolApprovalDialog.tsx
+++ b/apps/desktop/src/features/metaTools/MetaToolApprovalDialog.tsx
@@ -3,6 +3,7 @@ import { listen } from '@tauri-apps/api/event';
import { invoke } from '@tauri-apps/api/core';
import { AlertTriangle, CheckCircle2, XCircle } from 'lucide-react';
import { Button, Card, CardContent, CardHeader, CardTitle } from '@mcpmux/ui';
+import { useNavigateTo } from '@/stores';
/**
* Incoming approval request emitted by the gateway's ApprovalBroker.
@@ -53,6 +54,7 @@ type Decision = 'allow_once' | 'always_for_this_session_and_client' | 'deny';
export function MetaToolApprovalDialog() {
const [queue, setQueue] = useState([]);
const current = queue[0];
+ const navigateTo = useNavigateTo();
useEffect(() => {
const unlistenPromise = listen(
@@ -87,6 +89,16 @@ export function MetaToolApprovalDialog() {
[current]
);
+ // "Prefer not to be asked?" escape hatch. Deny the current request first —
+ // fail-closed and immediate, so the calling client isn't left hanging for
+ // the full 60s broker timeout — then jump to the Built-in tab, where the
+ // "Require approval for tool changes" switch lets the user turn these
+ // prompts off entirely.
+ const manageApprovals = useCallback(() => {
+ void respond('deny');
+ navigateTo('builtin-servers');
+ }, [respond, navigateTo]);
+
// Normalize the freeform diff defensively — a missing field must never
// throw (this previously crashed on `mcpmux_create_feature_set`, whose diff
// is `{ added_tools }` and has no `after`).
@@ -206,11 +218,22 @@ export function MetaToolApprovalDialog() {