Просмотр исходного кода

web: Cloud page and updates to Pricing to explain Cloud Agent Credits (#8605)

* Adds mention of Cloud agents to /pricing

* Credit pricing FAQ

* Skeleton of a /cloud page and more pricing page tweaks

* Lint

* Update apps/web-roo-code/src/app/cloud/page.tsx

Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>

* Code review

* Updates copy to new credit system

* Moves Terms of Service to be backed by a markdown file, easier to read/edit/diff

* Updated ToS

* Twerm copy tweaks

* Cloud screenshot and style adjustments

* Style tweaks

* Styles

---------

Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Bruno Bergher 4 месяцев назад
Родитель
Сommit
9aee31f28a

+ 3 - 0
apps/web-roo-code/package.json

@@ -31,7 +31,10 @@
 		"react-cookie-consent": "^9.0.0",
 		"react-dom": "^18.3.1",
 		"react-icons": "^5.5.0",
+		"react-markdown": "^9.0.3",
 		"recharts": "^2.15.3",
+		"rehype-raw": "^7.0.0",
+		"remark-gfm": "^4.0.1",
 		"tailwind-merge": "^3.3.0",
 		"tailwindcss-animate": "^1.0.7",
 		"tldts": "^6.1.86",

BIN
apps/web-roo-code/public/heroes/cloud-screen.png


+ 247 - 0
apps/web-roo-code/src/app/cloud/page.tsx

@@ -0,0 +1,247 @@
+import {
+	ArrowRight,
+	ChartLine,
+	Cloud,
+	Lock,
+	LucideIcon,
+	Megaphone,
+	MessageCircleQuestionMark,
+	ReplaceAll,
+	Router,
+	Share2,
+	Users,
+} from "lucide-react"
+import type { Metadata } from "next"
+
+import { Button } from "@/components/ui"
+import { AnimatedBackground } from "@/components/homepage"
+import { SEO } from "@/lib/seo"
+import { EXTERNAL_LINKS } from "@/lib/constants"
+import Image from "next/image"
+
+const TITLE = "Roo Code Cloud"
+const DESCRIPTION =
+	"Roo Code Cloud gives you and your team the tools to take AI-coding to the next level with cloud agents, remote control, and more."
+const PATH = "/cloud"
+const OG_IMAGE = SEO.ogImage
+
+export const metadata: Metadata = {
+	title: TITLE,
+	description: DESCRIPTION,
+	alternates: {
+		canonical: `${SEO.url}${PATH}`,
+	},
+	openGraph: {
+		title: TITLE,
+		description: DESCRIPTION,
+		url: `${SEO.url}${PATH}`,
+		siteName: SEO.name,
+		images: [
+			{
+				url: OG_IMAGE.url,
+				width: OG_IMAGE.width,
+				height: OG_IMAGE.height,
+				alt: OG_IMAGE.alt,
+			},
+		],
+		locale: SEO.locale,
+		type: "website",
+	},
+	twitter: {
+		card: SEO.twitterCard,
+		title: TITLE,
+		description: DESCRIPTION,
+		images: [OG_IMAGE.url],
+	},
+	keywords: [...SEO.keywords, "cloud", "subscription", "cloud agents", "AI cloud development"],
+}
+
+interface Feature {
+	icon: LucideIcon
+	title: string
+	description: string
+	logos?: string[]
+}
+
+const cloudFeatures: Feature[] = [
+	{
+		icon: Router,
+		title: "Roomote Control",
+		description: "Control your IDE from anywhere and keep coding away from your computer.",
+	},
+	{
+		icon: Cloud,
+		title: "Cloud Agents",
+		description:
+			"Specialized agents running in the Cloud to get stuff done while you sleep, with a credit-based system that doesn't lock you in or dumb your models down.",
+	},
+	{
+		icon: ReplaceAll,
+		title: "Still Model-agnostic",
+		description: "Bring your own provider key — no markup, lock-in, no restrictions.",
+		logos: ["Anthropic", "OpenAI", "Gemini", "Grok", "Qwen", "Kimi", "Mistral", "Ollama"],
+	},
+	{
+		icon: ChartLine,
+		title: "Usage Analytics",
+		description: "Detailed token analytics to help you optimize your costs and usage.",
+	},
+	{
+		icon: Megaphone,
+		title: "Early Model Access",
+		description: "Get early, free access to new, stealth coding models as they become available.",
+	},
+	{
+		icon: Share2,
+		title: "Task Sharing",
+		description: "Share tasks with friends and co-workers and let them follow your work.",
+	},
+	{
+		icon: Users,
+		title: "Team Management",
+		description:
+			"Manage your team and their access to tasks and resources, with centralized billing, analytics and configuration.",
+	},
+	{
+		icon: Lock,
+		title: "Secure and Private",
+		description:
+			"Your data is never used for training, and we're SOC2 Type 2 and GDPR compliant, following state-of-the-art security practices, with deep respect for your IP.",
+	},
+	{
+		icon: MessageCircleQuestionMark,
+		title: "Priority support",
+		description: "Get quick help from the people who know Roo best.",
+	},
+]
+
+// Workaround for next/image choking on these for some reason
+import screenshotDark from "/public/heroes/cloud-screen.png"
+
+export default function CloudPage() {
+	return (
+		<>
+			<section className="relative flex md:h-[calc(80vh-theme(spacing.12))] items-center overflow-hidden">
+				<AnimatedBackground />
+				<div className="container relative flex items-center h-full z-10 mx-auto px-4 sm:px-6 lg:px-8">
+					<div className="grid h-full relative gap-8 md:gap-12 lg:grid-cols-2 lg:gap-16">
+						<div className="flex flex-col px-4 justify-center space-y-6 sm:space-y-8">
+							<div>
+								<h1 className="text-4xl font-bold tracking-tight mt-8 text-center md:text-left md:text-4xl lg:text-5xl lg:mt-0">
+									Go <em>way</em> beyond the IDE
+								</h1>
+								<p className="mt-4 max-w-md text-lg text-muted-foreground text-center md:text-left sm:mt-6">
+									Roo Code Cloud gives you (and your team) the tools to take AI-coding to the next
+									level
+								</p>
+							</div>
+							<div className="flex flex-col space-y-3 sm:flex-row sm:space-x-4 sm:space-y-0">
+								<Button
+									variant="outline"
+									size="lg"
+									className="w-full sm:w-auto bg-white/20 dark:bg-white/10 backdrop-blur-sm border border-black/40 dark:border-white/30 hover:border-blue-400 hover:bg-white/30 dark:hover:bg-white/20 hover:shadow-[0_0_20px_rgba(59,130,246,0.5)] transition-all duration-300">
+									<a
+										href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP}
+										target="_blank"
+										rel="noopener noreferrer"
+										className="flex w-full items-center justify-center">
+										Start Free Trial
+										<ArrowRight className="ml-2" />
+									</a>
+								</Button>
+							</div>
+						</div>
+						<div className="flex items-center justify-end mx-auto h-full mt-8 lg:mt-0">
+							<div className="md:w-[900px] md:h-[530px]  bg-black dark:bg-white relative rounded-md overflow-clip shadow-2xl">
+								<div className="block">
+									<Image
+										src={screenshotDark}
+										alt="Screenshot of Roo Code Cloud"
+										className="max-w-full h-auto"
+										width={2680}
+										height={1784}
+									/>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</section>
+
+			<section className="relative overflow-hidden border-t border-border py-32">
+				<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
+					<div className="mx-auto mb-12 md:mb-24 max-w-4xl text-center">
+						<div>
+							<h2 className="text-4xl font-bold tracking-tight sm:text-5xl">Power and Flexibility</h2>
+							<p className="mt-6 text-lg text-muted-foreground">
+								Code in the cloud, access free models, get usage analytics and more
+							</p>
+						</div>
+					</div>
+
+					<div className="relative mx-auto md:max-w-[1200px]">
+						<ul className="grid grid-cols-1 place-items-center gap-6 md:grid-cols-2 lg:grid-cols-3 lg:gap-8">
+							{cloudFeatures.map((feature, index) => {
+								const Icon = feature.icon
+								return (
+									<li
+										key={index}
+										className="relative h-full border border-border rounded-2xl bg-background p-8 transition-all duration-300">
+										<Icon className="size-6 text-foreground/80" />
+										<h3 className="mb-3 mt-3 text-xl font-semibold text-foreground">
+											{feature.title}
+										</h3>
+										<p className="leading-relaxed font-light text-muted-foreground">
+											{feature.description}
+										</p>
+										{feature.logos && (
+											<div className="mt-4 flex flex-wrap items-center gap-4">
+												{feature.logos.map((logo) => (
+													<Image
+														key={logo}
+														width={20}
+														height={20}
+														className="w-5 h-5 overflow-clip opacity-50 dark:invert"
+														src={`/logos/${logo.toLowerCase()}.svg`}
+														alt={`${logo} Logo`}
+													/>
+												))}
+											</div>
+										)}
+									</li>
+								)
+							})}
+						</ul>
+					</div>
+				</div>
+			</section>
+
+			<div id="faq"></div>
+
+			{/* CTA Section */}
+			<section className="py-20">
+				<div className="container mx-auto px-4 sm:px-6 lg:px-8">
+					<div className="mx-auto max-w-4xl rounded-3xl border border-border/50 bg-gradient-to-br from-blue-500/5 via-cyan-500/5 to-purple-500/5 p-8 text-center shadow-2xl backdrop-blur-xl dark:border-white/20 dark:bg-gradient-to-br dark:from-gray-800 dark:via-gray-900 dark:to-black sm:p-12">
+						<h2 className="mb-4 text-3xl font-bold tracking-tight sm:text-4xl">Try Roo Code Cloud now</h2>
+						<p className="mx-auto mb-8 max-w-2xl text-lg text-muted-foreground">Code from anywhere.</p>
+						<div className="flex flex-col justify-center space-y-4 sm:flex-row sm:space-x-4 sm:space-y-0">
+							<Button
+								size="lg"
+								className="bg-black text-white hover:bg-gray-800 hover:shadow-lg hover:shadow-black/20 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:hover:shadow-white/20 transition-all duration-300"
+								asChild>
+								<a
+									href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP}
+									target="_blank"
+									rel="noopener noreferrer"
+									className="flex items-center justify-center">
+									Create a free Cloud account
+									<ArrowRight className="ml-2 h-4 w-4" />
+								</a>
+							</Button>
+						</div>
+					</div>
+				</div>
+			</section>
+		</>
+	)
+}

+ 55 - 31
apps/web-roo-code/src/app/pricing/page.tsx

@@ -14,6 +14,8 @@ const DESCRIPTION =
 const PATH = "/pricing"
 const OG_IMAGE = SEO.ogImage
 
+const PRICE_CREDITS = 5
+
 export const metadata: Metadata = {
 	title: TITLE,
 	description: DESCRIPTION,
@@ -59,6 +61,7 @@ interface PricingTier {
 	icon: LucideIcon
 	price: string
 	period?: string
+	creditPrice?: string
 	trial?: string
 	cancellation?: string
 	description: string
@@ -80,8 +83,9 @@ const pricingTiers: PricingTier[] = [
 		description: "For folks just getting started",
 		features: [
 			"Token usage analytics",
-			"Access your task history across devices",
 			"Follow your tasks from anywhere",
+			"Share tasks with friends and co-workers",
+			"Early access to free AI Models",
 			"Community support",
 		],
 		cta: {
@@ -95,13 +99,13 @@ const pricingTiers: PricingTier[] = [
 		price: "$20",
 		period: "/mo",
 		trial: "Free 14-day trial · ",
+		creditPrice: `$${PRICE_CREDITS}`,
 		cancellation: "Cancel anytime",
 		description: "For pro Roo coders",
-		featuresIntro: "Everything in Free, plus:",
+		featuresIntro: "Everything in Free +",
 		features: [
-			"Roomote Control",
-			"Start, stop and control tasks from anywhere",
-			"Course-correct Roo from afar",
+			"Cloud Agents: PR Reviewer and more",
+			"Roomote Control: Start, stop and control tasks from anywhere",
 			"Paid support",
 		],
 		cta: {
@@ -114,33 +118,17 @@ const pricingTiers: PricingTier[] = [
 		icon: Users,
 		price: "$99",
 		period: "/mo",
+		creditPrice: `$${PRICE_CREDITS}`,
 		trial: "Free 14-day trial · ",
 		cancellation: "Cancel anytime",
 		description: "For AI-forward teams",
-		featuresIntro: "Everything in Pro, plus:",
+		featuresIntro: "Everything in Pro +",
 		features: ["Unlimited users (no per-seat cost)", "Shared configuration & policies", "Centralized billing"],
 		cta: {
 			text: "Get started",
 			href: EXTERNAL_LINKS.CLOUD_APP_SIGNUP + "?redirect_url=/billing",
 		},
 	},
-	{
-		name: "Enterprise",
-		icon: Building2,
-		price: "Custom",
-		description: "For complex orgs",
-		featuresIntro: "Everything in Team, plus:",
-		features: [
-			"SAML SSO provisioning",
-			"Custom integrations and terms",
-			"Security questionnaires and all that fun stuff",
-			"Dedicated support",
-		],
-		cta: {
-			text: "Talk to Sales",
-			isContactForm: true,
-		},
-	},
 ]
 
 export default function PricingPage() {
@@ -156,7 +144,7 @@ export default function PricingPage() {
 						<p className="mx-auto mt-4 max-w-2xl text-lg text-muted-foreground">
 							Simple, transparent pricing that scales with your needs.
 							<br />
-							Free 14-day trials to kick the tires.
+							No inference markups. Free 14-day trials to kick the tires.
 						</p>
 					</div>
 				</div>
@@ -175,7 +163,7 @@ export default function PricingPage() {
 			{/* Pricing Tiers */}
 			<section className="">
 				<div className="container mx-auto px-4 sm:px-6 lg:px-8">
-					<div className="mx-auto grid max-w-6xl gap-4 lg:grid-cols-4">
+					<div className="mx-auto grid max-w-6xl gap-4 lg:grid-cols-3">
 						{pricingTiers.map((tier) => {
 							const Icon = tier.icon
 							return (
@@ -194,7 +182,7 @@ export default function PricingPage() {
 										<p className="text-sm text-muted-foreground font-light mb-2">
 											{tier.featuresIntro}&nbsp;
 										</p>
-										<ul className="space-y-3 my-0">
+										<ul className="space-y-3 my-0 h-[148px]">
 											{tier.features.map((feature) => (
 												<li key={feature} className="flex items-start gap-2">
 													<Check className="mt-0.5 h-4 w-4 text-muted-foreground shrink-0" />
@@ -208,9 +196,16 @@ export default function PricingPage() {
 										<strong>{tier.price}</strong>
 										{tier.period}
 									</p>
+
+									{tier.creditPrice && (
+										<p className="text-sm text-muted-foreground mb-1">
+											+ {tier.creditPrice}/hour for Cloud tasks
+										</p>
+									)}
+
 									<p className="text-xs text-muted-foreground mb-4">
 										{tier.trial}
-										{tier.cancellation}&nbsp;
+										{tier.cancellation}
 									</p>
 
 									{tier.cta.isContactForm ? (
@@ -231,6 +226,19 @@ export default function PricingPage() {
 						})}
 					</div>
 				</div>
+
+				<div className="mx-auto grid max-w-6xl gap-4 mt-4 relative">
+					<p className="bg-background border rounded-2xl p-6 text-center text-sm text-muted-foreground">
+						<Building2 className="inline size-4 mr-2 mb-0.5" />
+						Need SAML, advanced security, custom integrations or terms? Enterprise is for you.
+						<Link
+							href="/enterprise#contact"
+							className="font-medium ml-1 text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300">
+							Talk to Sales
+						</Link>
+						.
+					</p>
+				</div>
 			</section>
 
 			{/* Additional Information */}
@@ -238,7 +246,6 @@ export default function PricingPage() {
 				<div className="container mx-auto px-4 sm:px-6 lg:px-8">
 					<div className="mx-auto max-w-3xl text-center">
 						<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">Frequently Asked Questions</h2>
-						<p className="mt-4 text-lg text-muted-foreground">Got questions about our pricing?</p>
 					</div>
 					<div className="mx-auto mt-12 grid max-w-5xl gap-8 md:grid-cols-2">
 						<div className="rounded-lg border border-border bg-card p-6">
@@ -252,15 +259,32 @@ export default function PricingPage() {
 						<div className="rounded-lg border border-border bg-card p-6">
 							<h3 className="font-semibold">Is there a free trial?</h3>
 							<p className="mt-2 text-sm text-muted-foreground">
-								Yes, all paid plans come with a 14-day free trial.
+								Yes, all paid plans come with a 14-day free trial to try out functionality.
+							</p>
+							<p className="mt-2 text-sm text-muted-foreground">
+								To use Cloud Agents, you can buy credits.
+							</p>
+						</div>
+						<div className="rounded-lg border border-border bg-card p-6">
+							<h3 className="font-semibold">How do Cloud Agent credits work?</h3>
+							<p className="mt-2 text-sm text-muted-foreground">
+								Cloud Agents are a version of Roo running in the cloud without depending on your IDE.
+								You can run as many as you want, and bring your own inference provider key.
+							</p>
+							<p className="mt-2 text-sm text-muted-foreground">
+								To cover our infrastructure costs, we charge ${PRICE_CREDITS}/hour while the agent is
+								running (independent of inference costs).
+							</p>
+							<p className="mt-2 text-sm text-muted-foreground">
+								There are no markups, no tiers, no dumbing-down of models to increase our profit.
 							</p>
 						</div>
 						<div className="rounded-lg border border-border bg-card p-6">
 							<h3 className="font-semibold">Do I need a credit card for the free trial?</h3>
 							<p className="mt-2 text-sm text-muted-foreground">
-								Yes, but you won&apos;t be charged until your trial ends. You can cancel anytime with
-								one click .
+								Yes, but you won&apos;t be charged until your trial ends, except for credit purchases.
 							</p>
+							<p className="mt-2 text-sm text-muted-foreground">You can cancel anytime with one click.</p>
 						</div>
 						<div className="rounded-lg border border-border bg-card p-6">
 							<h3 className="font-semibold">What payment methods do you accept?</h3>

+ 50 - 304
apps/web-roo-code/src/app/terms/page.tsx

@@ -1,5 +1,10 @@
 import type { Metadata } from "next"
 import { SEO } from "@/lib/seo"
+import fs from "fs"
+import path from "path"
+import ReactMarkdown from "react-markdown"
+import remarkGfm from "remark-gfm"
+import rehypeRaw from "rehype-raw"
 
 const TITLE = "Terms of Service"
 const DESCRIPTION =
@@ -38,315 +43,56 @@ export const metadata: Metadata = {
 	keywords: [...SEO.keywords, "terms of service", "legal", "agreement", "subscription"],
 }
 
-export default function Terms() {
-	return (
-		<>
-			<div className="container mx-auto px-4 py-12 sm:px-6 lg:px-8">
-				<div className="prose prose-lg mx-auto max-w-4xl dark:prose-invert">
-					<h1 className="text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl">
-						Roo Code Cloud Terms of Service
-					</h1>
-					<p className="text-muted-foreground">
-						<em>(Version 1.0 – Effective June 19, 2025)</em>
-					</p>
-
-					<p className="lead">
-						These Terms of Service (&quot;<strong>TOS</strong>&quot;) govern access to and use of the Roo
-						Code Cloud service (the &quot;<strong>Service</strong>&quot;). They apply to:
-					</p>
-					<ul className="lead">
-						<li>
-							<strong>(a)</strong> every <strong>Sales Order Form</strong> or similar document mutually
-							executed by Roo Code and the customer that references these TOS; <strong>and</strong>
-						</li>
-						<li>
-							<strong>(b)</strong> any{" "}
-							<strong>online plan-selection, self-service sign-up, or in-app purchase flow</strong>{" "}
-							through which a customer clicks an &quot;I Agree&quot; (or equivalent) button to accept
-							these TOS — such flow also being an <strong>&quot;Order Form.&quot;</strong>
-						</li>
-					</ul>
-
-					<p>
-						By <strong>creating an account, clicking to accept, or using the Service</strong>, the person or
-						entity doing so (&quot;<strong>Customer</strong>&quot;) agrees to be bound by these TOS, even if
-						no separate Order Form is signed.
-					</p>
+function getTermsContent() {
+	const filePath = path.join(process.cwd(), "src/app/terms/terms.md")
+	return fs.readFileSync(filePath, "utf8")
+}
 
-					<p>
-						If Roo Code and Customer later execute a Master Subscription Agreement (&quot;
-						<strong>MSA</strong>&quot;), the MSA governs; otherwise, these TOS and the applicable Order Form
-						together form the entire agreement (the &quot;<strong>Agreement</strong>&quot;).
-					</p>
+export default function Terms() {
+	const content = getTermsContent()
 
-					<h2 className="mt-12 text-2xl font-bold">1. Agreement Framework</h2>
-					<ol>
-						<li>
-							<strong>Incorporation of Standard Terms.</strong>
-							<br />
-							The{" "}
+	return (
+		<div className="container mx-auto px-4 py-12 sm:px-6 lg:px-8">
+			<div className="prose prose-lg mx-auto max-w-4xl dark:prose-invert">
+				<ReactMarkdown
+					remarkPlugins={[remarkGfm]}
+					rehypePlugins={[rehypeRaw]}
+					components={{
+						h1: ({ ...props }) => (
+							<h1 className="text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl" {...props} />
+						),
+						h2: ({ ...props }) => <h2 className="mt-12 text-2xl font-bold" {...props} />,
+						a: ({ ...props }) => (
 							<a
-								href="https://commonpaper.com/standards/cloud-service-agreement/2.0/"
+								className="text-primary hover:underline"
 								target="_blank"
 								rel="noopener noreferrer"
-								className="text-primary hover:underline">
-								<em>Common Paper Cloud Service Standard Terms v 2.0</em>
-							</a>{" "}
-							(the &quot;<strong>Standard Terms</strong>&quot;) are incorporated by reference. If these
-							TOS conflict with the Standard Terms, these TOS control.
-						</li>
-						<li>
-							<strong>Order of Precedence.</strong>
-							<br />
-							(a) Order Form (b) these TOS (c) Standard Terms.
-						</li>
-					</ol>
-
-					<h2 className="mt-12 text-2xl font-bold">2. Key Commercial Terms</h2>
-
-					<div className="overflow-x-auto">
-						<table className="min-w-full border-collapse border border-border">
-							<thead>
-								<tr className="bg-muted/50">
-									<th className="border border-border px-4 py-2 text-left font-semibold">Term</th>
-									<th className="border border-border px-4 py-2 text-left font-semibold">Value</th>
-								</tr>
-							</thead>
-							<tbody>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Governing Law / Forum
-									</td>
-									<td className="border border-border px-4 py-2">
-										Delaware law; exclusive jurisdiction and venue in the state or federal courts
-										located in Delaware
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">
-										Plans & Subscription Periods
-									</td>
-									<td className="border border-border px-4 py-2">
-										<em>Free Plan:</em> month-to-month.
-										<br />
-										<em>Paid Plans:</em> Monthly <strong>or</strong> Annual, as selected in an Order
-										Form or the online flow.
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Auto-Renewal & Non-Renewal Notice
-									</td>
-									<td className="border border-border px-4 py-2">
-										<em>Free Plan:</em> renews continuously until cancelled in the dashboard.
-										<br />
-										<em>Paid Plans:</em> renew for the same period unless either party gives 30
-										days&apos; written notice before the current period ends.
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">Fees & Usage</td>
-									<td className="border border-border px-4 py-2">
-										<em>Free Plan:</em> Subscription Fee = $0.
-										<br />
-										<em>Paid Plans:</em> Fees stated in the Order Form or online checkout{" "}
-										<strong>plus</strong> usage-based fees, calculated and invoiced monthly.
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">Payment Terms</td>
-									<td className="border border-border px-4 py-2">
-										<em>Monthly paid plans:</em> credit-card charge on the billing date.
-										<br />
-										<em>Annual paid plans:</em> invoiced Net 30 (credit card optional).
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">
-										General Liability Cap
-									</td>
-									<td className="border border-border px-4 py-2">
-										The greater of (i) USD 100 and (ii) 1 × Fees paid or payable in the 12 months
-										before the event giving rise to liability.
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Increased Cap / Unlimited Claims
-									</td>
-									<td className="border border-border px-4 py-2">None</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">Trial / Pilot</td>
-									<td className="border border-border px-4 py-2">Not offered</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">Beta Features</td>
-									<td className="border border-border px-4 py-2">
-										None – only generally available features are provided
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">Security Standard</td>
-									<td className="border border-border px-4 py-2">
-										Roo Code maintains commercially reasonable administrative, physical, and
-										technical safeguards
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">Machine-Learning Use</td>
-									<td className="border border-border px-4 py-2">
-										Roo Code <strong>does not</strong> use Customer Content to train, fine-tune, or
-										improve any ML or AI models
-									</td>
-								</tr>
-								<tr className="bg-muted/25">
-									<td className="border border-border px-4 py-2 font-medium">
-										Data Processing Addendum (DPA)
-									</td>
-									<td className="border border-border px-4 py-2">
-										GDPR/CCPA-ready DPA available upon written request
-									</td>
-								</tr>
-								<tr>
-									<td className="border border-border px-4 py-2 font-medium">
-										Publicity / Logo Rights
-									</td>
-									<td className="border border-border px-4 py-2">
-										Roo Code may identify Customer (name & logo) in marketing materials unless
-										Customer opts out in writing
-									</td>
-								</tr>
-							</tbody>
-						</table>
-					</div>
-
-					<h2 className="mt-12 text-2xl font-bold">3. Modifications to the Standard Terms</h2>
-					<ol>
-						<li>
-							<strong>Section 1.6 (Machine Learning).</strong>
-							<br />
-							&quot;Provider will not use Customer Content or Usage Data to train, fine-tune, or improve
-							any machine-learning or AI model, except with Customer&apos;s prior written consent.&quot;
-						</li>
-						<li>
-							<strong>Section 3 (Security).</strong>
-							<br />
-							Replace &quot;reasonable&quot; with &quot;commercially reasonable.&quot;
-						</li>
-						<li>
-							<strong>Section 4 (Fees & Payment).</strong>
-							<br />
-							Add usage-billing language above and delete any provision allowing unilateral fee increases.
-						</li>
-						<li>
-							<strong>Section 5 (Term & Termination).</strong>
-							<br />
-							Insert auto-renewal and free-plan language above.
-						</li>
-						<li>
-							<strong>Sections 7 (Trials / Betas) and any SLA references.</strong>
-							<br />
-							Deleted – Roo Code offers no trials, pilots, betas, or SLA credits under these TOS.
-						</li>
-						<li>
-							<strong>Section 12.12 (Publicity).</strong>
-							<br />
-							As reflected in the &quot;Publicity / Logo Rights&quot; row above.
-						</li>
-					</ol>
-
-					<h2 className="mt-12 text-2xl font-bold">4. Use of the Service</h2>
-					<p>
-						Customer may access and use the Service solely for its internal business purposes and subject to
-						the Acceptable Use Policy in the Standard Terms.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">5. Account Management & Termination</h2>
-					<ul>
-						<li>
-							<strong>Self-service cancellation or downgrade.</strong>
-							<br />
-							Customer may cancel a Free Plan immediately, or cancel/downgrade a Paid Plan effective at
-							the end of the current billing cycle, via the web dashboard.
-						</li>
-						<li>
-							Either party may otherwise terminate the Agreement as allowed under Section 5 of the
-							Standard Terms.
-						</li>
-					</ul>
-
-					<h2 className="mt-12 text-2xl font-bold">6. Privacy & Data</h2>
-					<p>
-						Roo Code&apos;s Privacy Notice (
-						<a
-							href="https://roocode.com/privacy"
-							rel="noopener noreferrer"
-							className="text-primary hover:underline">
-							https://roocode.com/privacy
-						</a>
-						) explains how Roo Code collects and handles personal information. If Customer requires a DPA,
-						email{" "}
-						<a href="mailto:[email protected]" className="text-primary hover:underline">
-							[email protected]
-						</a>
-						.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">7. Warranty Disclaimer</h2>
-					<p>
-						Except as expressly stated in the Agreement, the Service is provided{" "}
-						<strong>&quot;as is,&quot;</strong> and all implied warranties are disclaimed to the maximum
-						extent allowed by law.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">8. Limitation of Liability</h2>
-					<p>
-						The caps in Section 2 apply to all claims under the Agreement, whether in contract, tort, or
-						otherwise, except for Excluded Claims defined in the Standard Terms.
-					</p>
-
-					<h2 className="mt-12 text-2xl font-bold">9. Miscellaneous</h2>
-					<ol>
-						<li>
-							<strong>Assignment.</strong>
-							<br />
-							Customer may not assign the Agreement without Roo Code&apos;s prior written consent, except
-							to a successor in a merger or sale of substantially all assets.
-						</li>
-						<li>
-							<strong>Export Compliance.</strong>
-							<br />
-							Each party will comply with all applicable export-control laws and regulations and will not
-							export or re-export any software or technical data without the required government licences.
-						</li>
-						<li>
-							<strong>Entire Agreement.</strong>
-							<br />
-							The Agreement supersedes all prior or contemporaneous agreements for the Service.
-						</li>
-						<li>
-							<strong>Amendments.</strong>
-							<br />
-							Roo Code may update these TOS by posting a revised version at the same URL and emailing or
-							in-app notifying Customer at least 30 days before changes take effect. Continued use after
-							the effective date constitutes acceptance.
-						</li>
-					</ol>
-
-					<h2 className="mt-12 text-2xl font-bold">10. Contact</h2>
-					<p>
-						<strong>Roo Code, Inc.</strong>
-						<br />
-						98 Graceland Dr, San Rafael, CA 94901 USA
-						<br />
-						Email:{" "}
-						<a href="mailto:[email protected]" className="text-primary hover:underline">
-							[email protected]
-						</a>
-					</p>
-				</div>
+								{...props}
+							/>
+						),
+						table: ({ ...props }) => (
+							<div className="overflow-x-auto">
+								<table className="min-w-full border-collapse border border-border" {...props} />
+							</div>
+						),
+						th: ({ ...props }) => (
+							<th
+								className="border border-border px-4 py-2 text-left font-bold bg-muted-foreground/5"
+								{...props}
+							/>
+						),
+						td: ({ node: _node, ...props }) => {
+							// Check if this is the first column (Term column)
+							const isTermColumn = _node?.position?.start.column === 1
+							if (isTermColumn) {
+								return <td className="border border-border px-4 py-2 font-medium" {...props} />
+							}
+							return <td className="border border-border px-4 py-2" {...props} />
+						},
+					}}>
+					{content}
+				</ReactMarkdown>
 			</div>
-		</>
+		</div>
 	)
 }

+ 101 - 0
apps/web-roo-code/src/app/terms/terms.md

@@ -0,0 +1,101 @@
+# Roo Code Cloud Terms of Service
+
+_(Version 1.1 – Effective Oct 16, 2025)_
+
+These Terms of Service ("**TOS**") govern access to and use of the Roo Code Cloud service (the "**Service**"). They apply to:
+
+- **(a)** every **Sales Order Form** or similar document mutually executed by Roo Code and the customer that references these TOS; **and**
+- **(b)** any **online plan-selection, self-service sign-up, or in-app purchase flow** through which a customer clicks an "I Agree" (or equivalent) button to accept these TOS — such flow also being an **"Order Form."**
+
+By **creating an account, clicking to accept, or using the Service**, the person or entity doing so ("**Customer**") agrees to be bound by these TOS, even if no separate Order Form is signed.
+
+If Roo Code and Customer later execute a Master Subscription Agreement ("**MSA**"), the MSA governs; otherwise, these TOS and the applicable Order Form together form the entire agreement (the "**Agreement**").
+
+## 1. Agreement Framework
+
+1. **Incorporation of Standard Terms.**  
+   The [_Common Paper Cloud Service Standard Terms v 2.0_](https://commonpaper.com/standards/cloud-service-agreement/2.0/) (the "**Standard Terms**") are incorporated by reference. If these TOS conflict with the Standard Terms, these TOS control.
+
+2. **Order of Precedence.**  
+   (a) Order Form (b) these TOS (c) Standard Terms.
+
+## 2. Key Commercial Terms
+
+| Term                              | Value                                                                                                                                                                                             |
+| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Governing Law / Forum             | Delaware law; exclusive jurisdiction and venue in the state or federal courts located in Delaware                                                                                                 |
+| Plans & Subscription Periods      | _Free Plan:_ month-to-month. <br> _Paid Plans:_ Monthly **or** Annual, as selected in an Order Form or the online flow.                                                                           |
+| Auto-Renewal & Non-Renewal Notice | _Free Plan:_ renews continuously until cancelled in the dashboard. <br> _Paid Plans:_ renew for the same period unless either party gives 30 days' written notice before the current period ends. |
+| Fees & Usage                      | _Free Plan:_ Subscription Fee = $0.<br/>_Paid Plans:_ Fees stated in the Order Form or online checkout, invoiced monthly, **plus** Credits, credit-card charge upon online checkout.              |
+| Payment Terms                     | _Monthly paid plans:_ credit-card charge on the billing date.<br/>_Annual paid plans:_ invoiced Net 30 (credit card optional).<br/>_Credits:_ credit-card charge upon online checkout.            |
+| Credit Expiration.                | Credits expire one calendar year after purchase                                                                                                                                                   |
+| General Liability Cap             | The greater of (i) USD 100 and (ii) 1 × Fees paid or payable in the 12 months before the event giving rise to liability.                                                                          |
+| Increased Cap / Unlimited Claims  | None.                                                                                                                                                                                             |
+| Trial / Pilot                     | Self-service paid plans offer a 14-day free trial, with no subscription charge during the period. Credits are always charged, including during the free trial.                                    |
+| Beta Features                     | None – only generally available features are provided.                                                                                                                                            |
+| Security Standard                 | Roo Code is SOC2 Type 2 compliant and follows industry-standard security practices.                                                                                                               |
+| Machine-Learning Use              | Roo Code **does not** use Customer Content to train, fine-tune, or improve any ML or AI models.                                                                                                   |
+| Data Processing Addendum (DPA)    | GDPR/CCPA-ready DPA available upon written request. Subprocessors listed [here](/legal/subprocessors).                                                                                            |
+| Publicity / Logo Rights           | Roo Code may identify Customer (name & logo) in marketing materials unless Customer opts out in writing.                                                                                          |
+
+## 3. Modifications to the Standard Terms
+
+1. **Section 1.6 (Machine Learning).**  
+   "Provider will not use Customer Content or Usage Data to train, fine-tune, or improve any machine-learning or AI model, except with Customer's prior written consent."
+
+2. **Section 3 (Security).**  
+   Replace "reasonable" with "commercially reasonable."
+
+3. **Section 4 (Fees & Payment).**  
+   Add usage-billing language above and delete any provision allowing unilateral fee increases.
+
+4. **Section 5 (Term & Termination).**  
+   Insert auto-renewal and free-plan language above.
+
+5. **Sections 7 (Trials / Betas) and any SLA references.**  
+   Deleted – Roo Code offers no pilots, betas, or SLA credits under these TOS.
+
+6. **Section 12.12 (Publicity).**  
+   As reflected in the "Publicity / Logo Rights" row above.
+
+## 4. Use of the Service
+
+Customer may access and use the Service solely for its internal business purposes and subject to the Acceptable Use Policy in the Standard Terms.
+
+## 5. Account Management & Termination
+
+- **Self-service cancellation or downgrade.**  
+  Customer may cancel a Free Plan immediately, or cancel/downgrade a Paid Plan effective at the end of the current billing cycle, via the web dashboard.
+- Either party may otherwise terminate the Agreement as allowed under Section 5 of the Standard Terms.
+
+## 6. Privacy & Data
+
+Roo Code's Privacy Notice ([https://roocode.com/privacy](https://roocode.com/privacy)) explains how Roo Code collects and handles personal information. If Customer requires a DPA, email [[email protected]](mailto:[email protected]).
+
+## 7. Warranty Disclaimer
+
+Except as expressly stated in the Agreement, the Service is provided **"as is,"** and all implied warranties are disclaimed to the maximum extent allowed by law.
+
+## 8. Limitation of Liability
+
+The caps in Section 2 apply to all claims under the Agreement, whether in contract, tort, or otherwise, except for Excluded Claims defined in the Standard Terms.
+
+## 9. Miscellaneous
+
+1. **Assignment.**  
+   Customer may not assign the Agreement without Roo Code's prior written consent, except to a successor in a merger or sale of substantially all assets.
+
+2. **Export Compliance.**  
+   Each party will comply with all applicable export-control laws and regulations and will not export or re-export any software or technical data without the required government licences.
+
+3. **Entire Agreement.**  
+   The Agreement supersedes all prior or contemporaneous agreements for the Service.
+
+4. **Amendments.**  
+   Roo Code may update these TOS by posting a revised version at the same URL and emailing or in-app notifying Customer at least 30 days before changes take effect. Continued use after the effective date constitutes acceptance.
+
+## 10. Contact
+
+**Roo Code, Inc.**  
+98 Graceland Dr, San Rafael, CA 94901 USA  
+Email: [[email protected]](mailto:[email protected])

+ 13 - 2
apps/web-roo-code/src/components/chromes/nav-bar.tsx

@@ -38,8 +38,13 @@ export function NavBar({ stars, downloads }: NavBarProps) {
 					<ScrollButton
 						targetId="product"
 						className="text-muted-foreground px-4 py-6 transition-transform duration-200 hover:scale-105 hover:text-foreground max-lg:hidden">
-						Product
+						Extension
 					</ScrollButton>
+					<Link
+						href="/cloud"
+						className="text-muted-foreground px-4 py-6 transition-transform duration-200 hover:scale-105 hover:text-foreground">
+						Cloud
+					</Link>
 					<a
 						href={EXTERNAL_LINKS.DOCUMENTATION}
 						target="_blank"
@@ -140,8 +145,14 @@ export function NavBar({ stars, downloads }: NavBarProps) {
 							targetId="product"
 							className="block w-full p-5 py-3 text-left text-foreground active:opacity-50"
 							onClick={() => setIsMenuOpen(false)}>
-							Product
+							Extension
 						</ScrollButton>
+						<Link
+							href="/cloud"
+							className="block w-full p-5 text-left text-foreground active:opacity-50"
+							onClick={() => setIsMenuOpen(false)}>
+							Cloud
+						</Link>
 						<a
 							href={EXTERNAL_LINKS.DOCUMENTATION}
 							target="_blank"

+ 58 - 18
pnpm-lock.yaml

@@ -311,9 +311,18 @@ importers:
       react-icons:
         specifier: ^5.5.0
         version: 5.5.0([email protected])
+      react-markdown:
+        specifier: ^9.0.3
+        version: 9.1.0(@types/[email protected])([email protected])
       recharts:
         specifier: ^2.15.3
         version: 2.15.4([email protected]([email protected]))([email protected])
+      rehype-raw:
+        specifier: ^7.0.0
+        version: 7.0.0
+      remark-gfm:
+        specifier: ^4.0.1
+        version: 4.0.1
       tailwind-merge:
         specifier: ^3.3.0
         version: 3.3.0
@@ -4061,9 +4070,6 @@ packages:
   '@types/[email protected]':
     resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==}
 
-  '@types/[email protected]':
-    resolution: {integrity: sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg==}
-
   '@types/[email protected]':
     resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==}
 
@@ -6351,12 +6357,18 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
 
+  [email protected]:
+    resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
+
   [email protected]:
     resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
 
   [email protected]:
     resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
 
+  [email protected]:
+    resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
+
   [email protected]:
     resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
 
@@ -8287,6 +8299,9 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
 
+  [email protected]:
+    resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
   [email protected]:
     resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
 
@@ -8580,6 +8595,9 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==}
 
+  [email protected]:
+    resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+
   [email protected]:
     resolution: {integrity: sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg==}
 
@@ -9521,9 +9539,6 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
 
-  [email protected]:
-    resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
-
   [email protected]:
     resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==}
 
@@ -13662,11 +13677,6 @@ snapshots:
     dependencies:
       undici-types: 6.19.8
 
-  '@types/[email protected]':
-    dependencies:
-      undici-types: 6.21.0
-    optional: true
-
   '@types/[email protected]':
     dependencies:
       undici-types: 7.10.0
@@ -13736,7 +13746,7 @@ snapshots:
 
   '@types/[email protected]':
     dependencies:
-      '@types/node': 20.19.19
+      '@types/node': 24.2.1
     optional: true
 
   '@types/[email protected]': {}
@@ -13909,7 +13919,7 @@ snapshots:
       sirv: 3.0.1
       tinyglobby: 0.2.14
       tinyrainbow: 2.0.0
-      vitest: 3.2.4(@types/[email protected])(@types/node@24.2.1)(@vitest/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])
+      vitest: 3.2.4(@types/[email protected])(@types/node@20.17.57)(@vitest/[email protected])([email protected])([email protected])([email protected])([email protected])([email protected])
 
   '@vitest/[email protected]':
     dependencies:
@@ -15021,7 +15031,6 @@ snapshots:
   [email protected]:
     dependencies:
       ms: 2.1.3
-    optional: true
 
   [email protected]: {}
 
@@ -16291,6 +16300,22 @@ snapshots:
     dependencies:
       '@types/hast': 3.0.4
 
+  [email protected]:
+    dependencies:
+      '@types/hast': 3.0.4
+      '@types/unist': 3.0.3
+      '@ungap/structured-clone': 1.3.0
+      hast-util-from-parse5: 8.0.3
+      hast-util-to-parse5: 8.0.0
+      html-void-elements: 3.0.0
+      mdast-util-to-hast: 13.2.0
+      parse5: 7.3.0
+      unist-util-position: 5.0.0
+      unist-util-visit: 5.0.0
+      vfile: 6.0.3
+      web-namespaces: 2.0.1
+      zwitch: 2.0.4
+
   [email protected]:
     dependencies:
       '@types/hast': 3.0.4
@@ -16325,6 +16350,16 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  [email protected]:
+    dependencies:
+      '@types/hast': 3.0.4
+      comma-separated-tokens: 2.0.3
+      devlop: 1.1.0
+      property-information: 6.5.0
+      space-separated-tokens: 2.0.2
+      web-namespaces: 2.0.1
+      zwitch: 2.0.4
+
   [email protected]:
     dependencies:
       '@types/hast': 3.0.4
@@ -17722,7 +17757,7 @@ snapshots:
   [email protected]:
     dependencies:
       '@types/debug': 4.1.12
-      debug: 4.4.1([email protected])
+      debug: 4.4.3
       decode-named-character-reference: 1.1.0
       devlop: 1.1.0
       micromark-core-commonmark: 2.0.3
@@ -18519,6 +18554,8 @@ snapshots:
     dependencies:
       xtend: 4.0.2
 
+  [email protected]: {}
+
   [email protected]: {}
 
   [email protected]:
@@ -18919,6 +18956,12 @@ snapshots:
       unist-util-visit-parents: 6.0.1
       vfile: 6.0.3
 
+  [email protected]:
+    dependencies:
+      '@types/hast': 3.0.4
+      hast-util-raw: 9.1.0
+      vfile: 6.0.3
+
   [email protected]:
     dependencies:
       '@mapbox/hast-util-table-cell-style': 0.2.1
@@ -20011,9 +20054,6 @@ snapshots:
 
   [email protected]: {}
 
-  [email protected]:
-    optional: true
-
   [email protected]: {}
 
   [email protected]: {}