feat(studio): store-side source filter, provenance pills, one-click recommended sources (v0.29.0)

The Store is now the centre of capability discovery — provider
configuration moves out of Settings into the Store itself.
Three changes work together:

1. Source filter chips next to the existing status chips:
   All sources / Native / MCP / n8n. Applied client-side after
   the hub returns results so toggling is instant. The result
   count and the "Clear filters" reset both account for the
   source filter too.

2. Per-card provenance pill (`_ProvenancePill`): shows whether
   each entry is native, mcp · <provider>, or n8n · <provider>
   so the operator can triage the source at a glance — same
   role the "verified" badge plays in commercial app stores.

3. `_RecommendedSourcesStrip` replaces the older
   `_FederationNudge`. Renders curated public MCP servers
   (DeepWiki, Semgrep) as one-click cards with an inline
   `[+ Add]` button — no Settings detour, no form. Both servers
   are HTTPS Streamable-HTTP, no API key, no subprocess.
   Useful AI was considered but its 340+ tools would drown the
   index — kept out of the curated list. The strip auto-hides
   the moment any federated entry exists.

Removed the now-orphaned storeFederationNudge* ARB keys.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-08 12:25:59 +02:00
parent b5a4c74c4b
commit 581ebbeaf7
8 changed files with 603 additions and 79 deletions

View file

@ -890,23 +890,101 @@ abstract class AppLocalizations {
/// **'Could not load README.'**
String get storeDocsErrorGeneric;
/// No description provided for @storeFederationNudgeTitle.
/// No description provided for @storeSourceLabel.
///
/// In en, this message translates to:
/// **'Want more capabilities?'**
String get storeFederationNudgeTitle;
/// **'Source'**
String get storeSourceLabel;
/// No description provided for @storeFederationNudgeBody.
/// No description provided for @storeSourceAll.
///
/// In en, this message translates to:
/// **'Configure an MCP server or n8n endpoint in Settings → MCP Clients / N8N Endpoints. Discovered tools and workflows surface here as `mcp.<server>.<tool>` and `n8n.<endpoint>.<workflow>` capabilities — every Anthropic / community MCP server adds a handful at once.'**
String get storeFederationNudgeBody;
/// **'All sources'**
String get storeSourceAll;
/// No description provided for @storeFederationNudgeButton.
/// No description provided for @storeSourceNative.
///
/// In en, this message translates to:
/// **'Open Settings'**
String get storeFederationNudgeButton;
/// **'Native'**
String get storeSourceNative;
/// No description provided for @storeSourceMcp.
///
/// In en, this message translates to:
/// **'MCP'**
String get storeSourceMcp;
/// No description provided for @storeSourceN8n.
///
/// In en, this message translates to:
/// **'n8n'**
String get storeSourceN8n;
/// No description provided for @storeProvenanceNative.
///
/// In en, this message translates to:
/// **'native'**
String get storeProvenanceNative;
/// No description provided for @storeProvenanceMcp.
///
/// In en, this message translates to:
/// **'mcp · {provider}'**
String storeProvenanceMcp(String provider);
/// No description provided for @storeProvenanceN8n.
///
/// In en, this message translates to:
/// **'n8n · {provider}'**
String storeProvenanceN8n(String provider);
/// No description provided for @storeRecommendedTitle.
///
/// In en, this message translates to:
/// **'Add a public source — one click'**
String get storeRecommendedTitle;
/// No description provided for @storeRecommendedBody.
///
/// In en, this message translates to:
/// **'Curated MCP servers reachable over HTTPS. No subprocess, no API key, no Node. Federated capabilities appear in the store immediately.'**
String get storeRecommendedBody;
/// No description provided for @storeRecommendedAddTooltip.
///
/// In en, this message translates to:
/// **'Add and discover'**
String get storeRecommendedAddTooltip;
/// No description provided for @storeRecommendedAdding.
///
/// In en, this message translates to:
/// **'Adding…'**
String get storeRecommendedAdding;
/// No description provided for @storeRecommendedDeepWikiTagline.
///
/// In en, this message translates to:
/// **'GitHub repo documentation search (AI-powered)'**
String get storeRecommendedDeepWikiTagline;
/// No description provided for @storeRecommendedSemgrepTagline.
///
/// In en, this message translates to:
/// **'Security scanning for code vulnerabilities'**
String get storeRecommendedSemgrepTagline;
/// No description provided for @storeProviderAddedToast.
///
/// In en, this message translates to:
/// **'Added {name} — {n} federated {n, plural, =1{capability} other{capabilities}}.'**
String storeProviderAddedToast(String name, int n);
/// No description provided for @storeProviderAddFailed.
///
/// In en, this message translates to:
/// **'Could not add {name}: {error}'**
String storeProviderAddFailed(String name, String error);
/// No description provided for @auditTitle.
///