From e0733f87e8938b8aad5eba9a5b51f9a926b64c88 Mon Sep 17 00:00:00 2001 From: Athul Date: Tue, 7 Jul 2026 20:08:09 +0530 Subject: [PATCH 1/2] LW-358 [FEAT] Add top-level LLMWhisperer marketplace landing route for the Tackle redirect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tackle's post-purchase redirect is one static URL per listing and cannot carry a per-buyer :orgName segment. The Unstract listings redirect to the existing top-level /marketplace-landing, but LLMWhisperer had only the org-scoped llm-whisperer/:orgName/marketplace-landing route — leaving the LLMWhisperer listings with no valid redirect target, and the top-level /marketplace-landing would fire the UNSTRACT claim for an LLMWhisperer purchase. Adds /llm-whisperer/marketplace-landing (outside RequireAuth, mirroring the Unstract entries; the page handles its own auth and claims against the portal backend). In OSS builds the plugin import resolves to the optional-plugin stub and the route 404s harmlessly. Co-Authored-By: Claude Fable 5 --- frontend/src/routes/Router.jsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/frontend/src/routes/Router.jsx b/frontend/src/routes/Router.jsx index 4f307a0199..d9fabe224c 100644 --- a/frontend/src/routes/Router.jsx +++ b/frontend/src/routes/Router.jsx @@ -59,6 +59,14 @@ const MarketplaceStripeConflictEntry = lazyPlugin( () => import("../plugins/marketplace"), "MarketplaceStripeConflictPage", ); +// LLMWhisperer buyers get their own entry point: the LLMWhisperer Tackle +// listings redirect here, and the page claims against the PORTAL backend +// (/api/v1/llmwhisperer/...) — routing them to /marketplace-landing would +// fire the Unstract claim instead. +const LlmWhispererMarketplaceLandingEntry = lazyPlugin( + () => import("../plugins/llm-whisperer/pages/MarketplaceLandingPage.jsx"), + "MarketplaceLandingPage", +); // Simple Prompt Studio pages. const SimplePromptStudioHelper = lazyPlugin( @@ -217,6 +225,12 @@ function Router() { element={} /> )} + {LlmWhispererMarketplaceLandingEntry && ( + } + /> + )} {CustomPlanCheckoutPage && ( Date: Wed, 8 Jul 2026 16:58:42 +0530 Subject: [PATCH 2/2] LW-358 [MISC] Address review: soften LLMWhisperer landing-route comment Don't pin the concrete portal endpoint (lives in a separate gitignored plugin; a rename can't be caught here) and lowercase 'portal backend' so it doesn't read as a defined proper noun. Comment intent (don't consolidate the two MarketplaceLandingPage entries) is unchanged. Co-Authored-By: Claude Fable 5 --- frontend/src/routes/Router.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/routes/Router.jsx b/frontend/src/routes/Router.jsx index d9fabe224c..2111417bc2 100644 --- a/frontend/src/routes/Router.jsx +++ b/frontend/src/routes/Router.jsx @@ -60,9 +60,9 @@ const MarketplaceStripeConflictEntry = lazyPlugin( "MarketplaceStripeConflictPage", ); // LLMWhisperer buyers get their own entry point: the LLMWhisperer Tackle -// listings redirect here, and the page claims against the PORTAL backend -// (/api/v1/llmwhisperer/...) — routing them to /marketplace-landing would -// fire the Unstract claim instead. +// listings redirect here, and the page claims against the LLMWhisperer portal +// backend (a different endpoint than the Unstract claim) — routing them to +// /marketplace-landing would fire the Unstract claim instead. const LlmWhispererMarketplaceLandingEntry = lazyPlugin( () => import("../plugins/llm-whisperer/pages/MarketplaceLandingPage.jsx"), "MarketplaceLandingPage",