Skip to content

LW-358 [FEAT] Add a top-level LLMWhisperer marketplace landing route for the AWS Marketplace redirect#2152

Open
athul-rs wants to merge 1 commit into
mainfrom
LW-358-llmw-marketplace-landing-route
Open

LW-358 [FEAT] Add a top-level LLMWhisperer marketplace landing route for the AWS Marketplace redirect#2152
athul-rs wants to merge 1 commit into
mainfrom
LW-358-llmw-marketplace-landing-route

Conversation

@athul-rs

@athul-rs athul-rs commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

What

  • Adds the top-level route /llm-whisperer/marketplace-landing to Router.jsx, wired to the LLMWhisperer marketplace landing page plugin (cloud), sitting outside RequireAuth exactly like the existing Unstract marketplace entries.

Why

Tackle's post-purchase redirect is one static URL per listing and cannot carry a per-buyer :orgName segment. LLMWhisperer only had the org-scoped llm-whisperer/:orgName/marketplace-landing route, so the LLMWhisperer AWS Marketplace listings had no valid redirect URL to configure — and pointing them at the existing /marketplace-landing would fire the Unstract claim for an LLMWhisperer purchase (wrong product provisioned). Found during the 2026-07-07 staging marketplace E2E (staging findings log #1).

How

  • New lazyPlugin entry importing the LLMWhisperer MarketplaceLandingPage (cloud plugin) + a <Route path="/llm-whisperer/marketplace-landing"> alongside the Unstract marketplace entries.
  • The page itself (shipped in unstract-cloud [MISC] Track usage in PostHog by default #1622) already handles unauthenticated buyers (redirects through signup preserving the query params) and claims against the portal backend (/api/v1/llmwhisperer/marketplace/claim/) with no orgId in the URL.
  • Route ranking: the static two-segment path outranks the llm-whisperer subtree's :orgName dynamic match, so in-app org-scoped navigation is unaffected.

Can this PR break any existing features? If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)

No. Additive route only. In OSS builds the plugin import resolves to the optional-plugin stub (vite optionalPluginImports) and the route harmlessly renders NotFound — verified: OSS vite build succeeds with the stub. Cloud builds ship the real plugin. Existing routes and ranking are untouched.

Relevant Docs

  • llmwhisperer-portal docs/marketplace/ROLLOUT.md ("Post-purchase redirect: the shared frontend marketplace landing — LLMWhisperer variant")

Related Issues or PRs

Dependencies Versions / Env Variables

  • None. After deploy, the LLMWhisperer Tackle listings' redirect URL becomes https://<env>/llm-whisperer/marketplace-landing?marketplace=aws.

Notes on Testing

  • vite build green (stub path, OSS); biome check clean on the changed file.
  • End-to-end redirect → claim flow to be exercised on staging against the LLMWhisperer [TEST] listing once deployed (Phase 1 of the staging E2E plan).

Screenshots

n/a

Checklist

I have read and understood the Contribution Guidelines.

🤖 Generated with Claude Code

…r the Tackle redirect

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 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Frontend Lint Report (Biome)

All checks passed! No linting or formatting issues found.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 581b2c25-65fd-402d-8f22-bb9284f87de5

📥 Commits

Reviewing files that changed from the base of the PR and between 219b7e2 and e0733f8.

📒 Files selected for processing (1)
  • frontend/src/routes/Router.jsx

Summary by CodeRabbit

  • New Features
    • Added a new marketplace landing page for buyers, available at /llm-whisperer/marketplace-landing.
    • The page now loads within the authenticated app shell and benefits from the app’s existing loading and error handling behavior.

Walkthrough

Adds a new lazily-loaded plugin entry, LlmWhispererMarketplaceLandingEntry, and registers a guarded route for it at /llm-whisperer/marketplace-landing within the authenticated app shell in Router.jsx.

Changes

Marketplace Landing Route

Layer / File(s) Summary
Lazy plugin entry and route registration
frontend/src/routes/Router.jsx
Adds a code-split lazy plugin entry for the LLMWhisperer marketplace landing page and registers a guarded route rendering it at the new path.

Estimated code review effort: 1 (Trivial) | ~3 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is clear and accurately summarizes the main change: adding a top-level LLMWhisperer marketplace landing route.
Description check ✅ Passed The description covers What, Why, How, breakage, testing, links, and checklist; only a few template sections are omitted or lightly filled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch LW-358-llmw-marketplace-landing-route

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@sonarqubecloud

sonarqubecloud Bot commented Jul 7, 2026

Copy link
Copy Markdown

@greptile-apps

greptile-apps Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a top-level /llm-whisperer/marketplace-landing route for AWS Marketplace post-purchase redirects, following the same pattern already established for the Unstract marketplace routes (/marketplace-landing, /marketplace-stripe-conflict).

  • Adds LlmWhispererMarketplaceLandingEntry via lazyPlugin, pointing at the cloud plugin's MarketplaceLandingPage. In OSS builds the plugin resolves to the stub and the route renders NotFound, consistent with the rest of the plugin-gated routes.
  • Places the new <Route> outside RequireAuth — identical placement to the existing Unstract marketplace entry — so unauthenticated AWS Marketplace buyers land here directly; the page itself handles the auth/signup redirect and claim flow.

Confidence Score: 5/5

Additive, single-file change that follows an already-proven route pattern; no existing routes are modified or reordered.

The new route mirrors the existing Unstract marketplace entries exactly — same lazyPlugin call shape, same placement relative to RequireAuth, same conditional rendering guard. The static two-segment path /llm-whisperer/marketplace-landing cannot clash with the three-segment org-scoped dynamic route inside RequireAuth. OSS stub behaviour is consistent with every other cloud-only plugin in this file.

No files require special attention.

Important Files Changed

Filename Overview
frontend/src/routes/Router.jsx Adds LlmWhispererMarketplaceLandingEntry lazy plugin and its corresponding Route outside RequireAuth, precisely mirroring the existing Unstract marketplace route pattern. No structural issues found.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["AWS Marketplace redirect\n/llm-whisperer/marketplace-landing?marketplace=aws"] --> B["PersistentLogin"]
    B --> C{Route match}
    C -->|"static: /llm-whisperer/marketplace-landing\n(NEW — outside RequireAuth)"| D["LlmWhispererMarketplaceLandingEntry\n(cloud plugin)"]
    C -->|"dynamic: llm-whisperer/:orgName/...\n(inside RequireAuth)"| E["RequireAuth → llmWhispererRouter\n(in-app org-scoped nav)"]
    D --> F{Authenticated?}
    F -->|No| G["Redirect through signup\n(preserving query params)"]
    F -->|Yes| H["POST /api/v1/llmwhisperer/marketplace/claim/\n(portal backend)"]
    G --> H
    H --> I["Provisioned ✓"]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A["AWS Marketplace redirect\n/llm-whisperer/marketplace-landing?marketplace=aws"] --> B["PersistentLogin"]
    B --> C{Route match}
    C -->|"static: /llm-whisperer/marketplace-landing\n(NEW — outside RequireAuth)"| D["LlmWhispererMarketplaceLandingEntry\n(cloud plugin)"]
    C -->|"dynamic: llm-whisperer/:orgName/...\n(inside RequireAuth)"| E["RequireAuth → llmWhispererRouter\n(in-app org-scoped nav)"]
    D --> F{Authenticated?}
    F -->|No| G["Redirect through signup\n(preserving query params)"]
    F -->|Yes| H["POST /api/v1/llmwhisperer/marketplace/claim/\n(portal backend)"]
    G --> H
    H --> I["Provisioned ✓"]
Loading

Reviews (1): Last reviewed commit: "LW-358 [FEAT] Add top-level LLMWhisperer..." | Re-trigger Greptile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant