Offsite stuff

This commit is contained in:
Konstantin Wohlwend 2026-07-10 11:47:25 -07:00
parent 09e5a97d77
commit 4d308b2ba3
15 changed files with 884 additions and 204 deletions

View File

@ -1,11 +1,6 @@
{
"version": 1,
"hooks": {
"afterFileEdit": [
{
"command": "./hooks/lint-file.sh"
}
],
"stop": [
{
"command": "./hooks/stop-check.sh"

View File

@ -11,7 +11,7 @@
"with-env:dev": "dotenv -c development --",
"with-env:prod": "dotenv -c production --",
"with-env:test": "dotenv -c test --",
"dev": "BACKEND_PORT=${STACK_DEV_FALLBACK_BACKEND:+${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}10} && BACKEND_PORT=${BACKEND_PORT:-${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}02} && concurrently -n \"dev,codegen,prisma-studio,email-queue,cron-jobs,bulldozer-studio\" -k \"STACK_DISABLE_REACT_ASYNC_DEBUG_INFO=${STACK_DISABLE_REACT_ASYNC_DEBUG_INFO:-true} NODE_ENV=development BACKEND_PORT=$BACKEND_PORT dotenv -c development -- tsx watch src/server/server.ts ${STACK_BACKEND_DEV_EXTRA_ARGS:-}\" \"pnpm run codegen:watch\" \"pnpm run prisma-studio\" \"pnpm run run-email-queue\" \"pnpm run run-cron-jobs\" \"pnpm run run-bulldozer-studio\"",
"dev": "BACKEND_PORT=${STACK_DEV_FALLBACK_BACKEND:+${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}10} && BACKEND_PORT=${BACKEND_PORT:-${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}02} && concurrently -n \"dev,codegen,prisma-studio\" -k \"STACK_DISABLE_REACT_ASYNC_DEBUG_INFO=${STACK_DISABLE_REACT_ASYNC_DEBUG_INFO:-true} NODE_ENV=development BACKEND_PORT=$BACKEND_PORT dotenv -c development -- tsx watch --clear-screen=false src/server/server.ts ${STACK_BACKEND_DEV_EXTRA_ARGS:-}\" \"pnpm run codegen:watch\" \"pnpm run prisma-studio\"",
"dev:inspect": "STACK_BACKEND_DEV_EXTRA_ARGS=\"--inspect\" pnpm run dev",
"dev:profile": "STACK_BACKEND_DEV_EXTRA_ARGS=\"--experimental-cpu-prof\" pnpm run dev",
"build": "pnpm run codegen && tsdown --config tsdown.config.ts",

View File

@ -1,4 +1,5 @@
import { SmartRouter } from "@/smart-router";
import { writeFileSyncIfChanged } from "@hexclave/shared/dist/utils/fs";
import fs from "fs";
const httpMethodNames = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"] as const;
@ -40,9 +41,9 @@ async function main() {
const routes = await SmartRouter.listRoutes();
const apiVersions = await SmartRouter.listApiVersions();
fs.mkdirSync("src/generated", { recursive: true });
fs.writeFileSync("src/generated/routes.json", JSON.stringify(routes, null, 2));
fs.writeFileSync("src/generated/api-versions.json", JSON.stringify(apiVersions, null, 2));
fs.writeFileSync("src/generated/route-modules.ts", generateRouteModules(routes));
writeFileSyncIfChanged("src/generated/routes.json", JSON.stringify(routes, null, 2));
writeFileSyncIfChanged("src/generated/api-versions.json", JSON.stringify(apiVersions, null, 2));
writeFileSyncIfChanged("src/generated/route-modules.ts", generateRouteModules(routes));
console.log("Successfully updated route info");
}
// eslint-disable-next-line no-restricted-syntax

View File

@ -18,4 +18,5 @@ console.log(`Hexclave backend listening on http://${hostname}:${port}`);
process.once("SIGTERM", () => {
runAsynchronously(app.stop());
process.exit(0);
});

View File

@ -7,7 +7,7 @@
"scripts": {
"start": "tsx --expose-gc src/index.ts",
"dev": "NODE_ENV=development tsx watch --clear-screen=false --expose-gc src/index.ts",
"run-bulldozer-studio": "tsx watch --clear-screen=false scripts/run-bulldozer-studio.ts",
"run-bulldozer-studio": "NODE_ENV=development tsx watch --clear-screen=false scripts/run-bulldozer-studio.ts",
"profile:performance": "tsx scripts/profile-bulldozer-performance.ts",
"test": "vitest run",
"test:watch": "vitest watch",

View File

@ -66,6 +66,7 @@
"@tanstack/react-virtual": "^3.13.18",
"@vercel/analytics": "^1.2.2",
"@vercel/speed-insights": "^1.0.12",
"@xyflow/react": "^12.11.1",
"ai": "^6.0.0",
"browser-image-compression": "^2.0.2",
"canvas-confetti": "^1.9.2",

View File

@ -0,0 +1,212 @@
"use client";
import { DesignButton, DesignMenu } from "@/components/design-components";
import {
ArrowCounterClockwiseIcon,
ArrowsOutIcon,
CloudArrowUpIcon,
CpuIcon,
DatabaseIcon,
HardDrivesIcon,
LightningIcon,
PlusIcon,
StackIcon,
} from "@phosphor-icons/react";
import {
addEdge,
Background,
BackgroundVariant,
MiniMap,
Panel,
ReactFlow,
type Connection,
type NodeTypes,
useEdgesState,
useNodesState,
useReactFlow,
} from "@xyflow/react";
import "@xyflow/react/dist/style.css";
import { useState } from "react";
import {
ADDABLE_SERVICE_KINDS,
createInitialDeploymentGraph,
createServiceNode,
type DeploymentEdge,
type DeploymentNode,
type ServiceKind,
} from "./deployment-model";
import { DeploymentNodeCard } from "./deployment-node";
const NODE_TYPES = {
deployment: DeploymentNodeCard,
} satisfies NodeTypes;
const SERVICE_MENU_ITEMS = [
{ kind: "serverless", label: "Serverless", icon: <CloudArrowUpIcon size={16} /> },
{ kind: "server", label: "Server", icon: <HardDrivesIcon size={16} /> },
{ kind: "postgres", label: "Postgres", icon: <DatabaseIcon size={16} /> },
{ kind: "convex", label: "Convex", icon: <LightningIcon size={16} /> },
{ kind: "redis", label: "Redis", icon: <StackIcon size={16} /> },
{ kind: "worker", label: "Worker", icon: <CpuIcon size={16} /> },
] satisfies readonly {
kind: typeof ADDABLE_SERVICE_KINDS[number],
label: string,
icon: React.ReactNode,
}[];
function GraphControls(props: {
onReset: () => void,
}) {
const { fitView } = useReactFlow<DeploymentNode, DeploymentEdge>();
return (
<Panel className="flex gap-2" position="top-right">
<DesignButton
className="gap-1.5 bg-background/90 shadow-sm backdrop-blur-xl"
onClick={async () => {
await fitView({ duration: 200, padding: 0.2 });
}}
size="sm"
variant="outline"
>
<ArrowsOutIcon size={15} />
Fit view
</DesignButton>
<DesignButton
className="gap-1.5 bg-background/90 shadow-sm backdrop-blur-xl"
onClick={props.onReset}
size="sm"
variant="outline"
>
<ArrowCounterClockwiseIcon size={15} />
Reset
</DesignButton>
</Panel>
);
}
function miniMapColor(node: DeploymentNode): string {
const colors = new Map<ServiceKind, string>([
["serverless", "#3b82f6"],
["server", "#64748b"],
["postgres", "#06b6d4"],
["convex", "#f97316"],
["redis", "#ef4444"],
["worker", "#a855f7"],
["public-internet", "#10b981"],
["hexclave", "#8b5cf6"],
]);
const color = colors.get(node.data.kind);
if (color == null) {
throw new Error(`Missing minimap color for deployment service kind "${node.data.kind}".`);
}
return color;
}
export function DeploymentGraph({ projectId }: { projectId: string }) {
const [initialGraph] = useState(() => createInitialDeploymentGraph(projectId));
const [nodes, setNodes, onNodesChange] = useNodesState<DeploymentNode>(initialGraph.nodes);
const [edges, setEdges, onEdgesChange] = useEdgesState<DeploymentEdge>(initialGraph.edges);
function addService(kind: ServiceKind) {
setNodes((currentNodes) => [
...currentNodes,
createServiceNode(kind, currentNodes.filter((node) => !node.data.immutable).length),
]);
}
function connect(connection: Connection) {
if (connection.sourceHandle == null || connection.targetHandle == null) {
throw new Error("Deployment connections must join a specific output to a specific input.");
}
setEdges((currentEdges) => addEdge(
{
...connection,
id: crypto.randomUUID(),
type: "smoothstep",
animated: true,
},
currentEdges.filter((edge) => (
edge.target !== connection.target
|| edge.targetHandle !== connection.targetHandle
)),
));
}
function resetGraph() {
const reset = createInitialDeploymentGraph(projectId);
setNodes(reset.nodes);
setEdges(reset.edges);
}
return (
<div className="relative min-h-[560px] flex-1 overflow-hidden rounded-2xl border border-border/70 bg-background shadow-sm">
<ReactFlow<DeploymentNode, DeploymentEdge>
connectionLineStyle={{ stroke: "hsl(var(--primary))", strokeWidth: 2 }}
defaultEdgeOptions={{
style: { stroke: "hsl(var(--muted-foreground))", strokeWidth: 1.5 },
}}
deleteKeyCode={["Backspace", "Delete"]}
edges={edges}
fitView
fitViewOptions={{ maxZoom: 1, padding: 0.2 }}
isValidConnection={(connection) => (
connection.source !== connection.target
&& connection.sourceHandle != null
&& connection.targetHandle != null
)}
maxZoom={1.6}
minZoom={0.2}
nodeTypes={NODE_TYPES}
nodes={nodes}
onConnect={connect}
onEdgesChange={onEdgesChange}
onNodesChange={onNodesChange}
panOnScroll
proOptions={{ hideAttribution: true }}
selectionOnDrag
snapGrid={[16, 16]}
snapToGrid
>
<Background
color="hsl(var(--muted-foreground))"
gap={24}
size={1}
variant={BackgroundVariant.Dots}
/>
<Panel position="top-left">
<DesignMenu
align="start"
contentClassName="w-56"
items={SERVICE_MENU_ITEMS.map((service) => ({
id: service.kind,
label: service.label,
icon: service.icon,
onClick: () => addService(service.kind),
}))}
label="Service type"
triggerLabel="Add service"
triggerIcon={<PlusIcon size={15} />}
variant="actions"
withIcons
/>
</Panel>
<GraphControls onReset={resetGraph} />
<Panel
className="rounded-xl border border-border/70 bg-background/90 px-3 py-2 text-[11px] text-muted-foreground shadow-sm backdrop-blur-xl"
position="bottom-left"
>
Drag nodes to arrange · Drag between ports to connect · Select and press Delete
</Panel>
<MiniMap
className="!rounded-xl !border !border-border/70 !bg-background/90 !shadow-sm"
maskColor="hsl(var(--background) / 0.65)"
nodeColor={miniMapColor}
pannable
zoomable
/>
</ReactFlow>
</div>
);
}

View File

@ -0,0 +1,223 @@
import type { Edge, Node } from "@xyflow/react";
export type ServiceKind =
| "serverless"
| "server"
| "postgres"
| "convex"
| "redis"
| "worker"
| "public-internet"
| "hexclave";
export type DeploymentField = {
id: string,
label: string,
value: string,
secret?: boolean,
};
export type DeploymentNodeData = {
kind: ServiceKind,
title: string,
immutable: boolean,
inputs: DeploymentField[],
outputs: DeploymentField[],
};
export type DeploymentNode = Node<DeploymentNodeData, "deployment">;
export type DeploymentEdge = Edge;
type ServiceTemplate = {
title: string,
inputs: readonly string[],
outputs: readonly string[],
};
export const ADDABLE_SERVICE_KINDS = [
"serverless",
"server",
"postgres",
"convex",
"redis",
"worker",
] as const satisfies readonly ServiceKind[];
const SERVICE_TEMPLATES = new Map<ServiceKind, ServiceTemplate>([
["serverless", {
title: "Serverless",
inputs: ["DATABASE_URL", "HEXCLAVE_PROJECT_ID"],
outputs: ["Deployment URL"],
}],
["server", {
title: "Server",
inputs: ["DATABASE_URL", "HEXCLAVE_SECRET_SERVER_KEY"],
outputs: ["Deployment URL", "Private address"],
}],
["postgres", {
title: "Postgres",
inputs: [],
outputs: ["Connection string", "Host"],
}],
["convex", {
title: "Convex",
inputs: ["HEXCLAVE_PROJECT_ID"],
outputs: ["Deployment URL"],
}],
["redis", {
title: "Redis",
inputs: [],
outputs: ["Connection string"],
}],
["worker", {
title: "Worker",
inputs: ["QUEUE_URL", "HEXCLAVE_SECRET_SERVER_KEY"],
outputs: [],
}],
]);
function field(id: string, label: string, value = ""): DeploymentField {
return { id, label, value };
}
function templateFor(kind: ServiceKind): ServiceTemplate {
const template = SERVICE_TEMPLATES.get(kind);
if (template == null) {
throw new Error(`Service kind "${kind}" cannot be added from the service menu.`);
}
return template;
}
export function createServiceNode(kind: ServiceKind, index: number): DeploymentNode {
const template = templateFor(kind);
const nodeId = crypto.randomUUID();
return {
id: nodeId,
type: "deployment",
position: {
x: 360 + (index % 3) * 80,
y: 100 + (index % 5) * 70,
},
data: {
kind,
title: `${template.title} ${index + 1}`,
immutable: false,
inputs: template.inputs.map((label, fieldIndex) => field(`${nodeId}-input-${fieldIndex}`, label)),
outputs: template.outputs.map((label, fieldIndex) => field(`${nodeId}-output-${fieldIndex}`, label)),
},
};
}
export function createInitialDeploymentGraph(projectId: string): {
nodes: DeploymentNode[],
edges: DeploymentEdge[],
} {
const hexclaveProjectIdHandle = "hexclave-project-id";
const hexclaveSecretKeyHandle = "hexclave-secret-server-key";
const postgresConnectionHandle = "postgres-connection-string";
const serverlessProjectInput = "serverless-project-id";
const serverlessDatabaseInput = "serverless-database-url";
const serverlessUrlHandle = "serverless-deployment-url";
const publicDomainHandle = "public-domain-app";
return {
nodes: [
{
id: "public-internet",
type: "deployment",
position: { x: 1050, y: 80 },
deletable: false,
data: {
kind: "public-internet",
title: "Public internet",
immutable: true,
inputs: [
field(publicDomainHandle, "Domain", "app.example.com"),
field("public-domain-api", "Domain", "api.example.com"),
],
outputs: [],
},
},
{
id: "hexclave",
type: "deployment",
position: { x: 0, y: 120 },
deletable: false,
data: {
kind: "hexclave",
title: "Hexclave",
immutable: true,
inputs: [],
outputs: [
field(hexclaveProjectIdHandle, "Project ID", projectId),
{ ...field(hexclaveSecretKeyHandle, "Secret server key", "••••••••••••"), secret: true },
field("hexclave-publishable-key", "Publishable client key", "pck_••••••••"),
],
},
},
{
id: "postgres-main",
type: "deployment",
position: { x: 40, y: 500 },
data: {
kind: "postgres",
title: "Primary database",
immutable: false,
inputs: [],
outputs: [
field(postgresConnectionHandle, "Connection string", "postgresql://••••••••"),
field("postgres-host", "Host", "db.internal"),
],
},
},
{
id: "serverless-web",
type: "deployment",
position: { x: 540, y: 220 },
data: {
kind: "serverless",
title: "Web application",
immutable: false,
inputs: [
field(serverlessProjectInput, "HEXCLAVE_PROJECT_ID"),
field(serverlessDatabaseInput, "DATABASE_URL"),
field("serverless-api-key", "THIRD_PARTY_API_KEY", "sk_live_••••"),
],
outputs: [
field(serverlessUrlHandle, "Deployment URL", "https://web.example.dev"),
],
},
},
],
edges: [
{
id: "hexclave-project-to-web",
source: "hexclave",
sourceHandle: hexclaveProjectIdHandle,
target: "serverless-web",
targetHandle: serverlessProjectInput,
type: "smoothstep",
animated: true,
},
{
id: "postgres-to-web",
source: "postgres-main",
sourceHandle: postgresConnectionHandle,
target: "serverless-web",
targetHandle: serverlessDatabaseInput,
type: "smoothstep",
animated: true,
},
{
id: "web-to-public-domain",
source: "serverless-web",
sourceHandle: serverlessUrlHandle,
target: "public-internet",
targetHandle: publicDomainHandle,
type: "smoothstep",
animated: true,
},
],
};
}

View File

@ -0,0 +1,265 @@
"use client";
import { DesignButton, DesignInput } from "@/components/design-components";
import { cn } from "@/lib/utils";
import {
CloudArrowUpIcon,
CpuIcon,
DatabaseIcon,
GlobeHemisphereWestIcon,
HardDrivesIcon,
HexagonIcon,
LightningIcon,
PlusIcon,
StackIcon,
TrashIcon,
type Icon as PhosphorIcon,
} from "@phosphor-icons/react";
import {
Handle,
Position,
type NodeProps,
useReactFlow,
useStore,
} from "@xyflow/react";
import { useMemo } from "react";
import type {
DeploymentEdge,
DeploymentField,
DeploymentNode,
ServiceKind,
} from "./deployment-model";
const SERVICE_ICONS = new Map<ServiceKind, PhosphorIcon>([
["serverless", CloudArrowUpIcon],
["server", HardDrivesIcon],
["postgres", DatabaseIcon],
["convex", LightningIcon],
["redis", StackIcon],
["worker", CpuIcon],
["public-internet", GlobeHemisphereWestIcon],
["hexclave", HexagonIcon],
]);
const SERVICE_ACCENTS = new Map<ServiceKind, string>([
["serverless", "bg-blue-500/10 text-blue-600 dark:text-blue-400"],
["server", "bg-slate-500/10 text-slate-600 dark:text-slate-300"],
["postgres", "bg-cyan-500/10 text-cyan-600 dark:text-cyan-400"],
["convex", "bg-orange-500/10 text-orange-600 dark:text-orange-400"],
["redis", "bg-red-500/10 text-red-600 dark:text-red-400"],
["worker", "bg-purple-500/10 text-purple-600 dark:text-purple-400"],
["public-internet", "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"],
["hexclave", "bg-purple-500/10 text-purple-600 dark:text-purple-400"],
]);
function mapValueOrThrow<TKey, TValue>(map: Map<TKey, TValue>, key: TKey, name: string): TValue {
const value = map.get(key);
if (value == null) {
throw new Error(`Missing ${name} for deployment service kind "${String(key)}".`);
}
return value;
}
function FieldHandle(props: {
field: DeploymentField,
direction: "input" | "output",
connected: boolean,
keepValueWhenConnected?: boolean,
onLabelChange?: (label: string) => void,
onValueChange?: (value: string) => void,
}) {
const isInput = props.direction === "input";
return (
<div className="relative px-3 py-2.5">
<Handle
id={props.field.id}
type={isInput ? "target" : "source"}
position={isInput ? Position.Left : Position.Right}
className={cn(
"!h-3 !w-3 !border-2 !border-background !shadow-sm",
props.connected ? "!bg-blue-500" : "!bg-muted-foreground",
)}
/>
<div className="mb-1 flex items-center justify-between gap-3">
{props.onLabelChange ? (
<DesignInput
aria-label="Environment variable key"
className="nodrag nowheel min-w-0 flex-1 font-mono"
onChange={(event) => props.onLabelChange?.(event.target.value)}
size="sm"
value={props.field.label}
/>
) : (
<span className="truncate text-[10px] font-semibold uppercase tracking-wider text-muted-foreground">
{props.field.label}
</span>
)}
{props.connected && (
<span className="text-[10px] font-medium text-blue-600 dark:text-blue-400">
Connected
</span>
)}
</div>
{isInput && props.onValueChange ? (
<DesignInput
aria-label={`${props.field.label} value`}
className="nodrag nowheel"
disabled={props.connected}
onChange={(event) => props.onValueChange?.(event.target.value)}
placeholder={props.connected ? "Value supplied by connection" : "Enter a value"}
size="sm"
value={props.connected && !props.keepValueWhenConnected ? "" : props.field.value}
/>
) : (
<div
className="truncate rounded-lg bg-foreground/[0.035] px-2.5 py-1.5 font-mono text-[11px] text-foreground"
title={props.field.secret ? "Secret value hidden" : props.field.value}
>
{props.field.value || "Available after deploy"}
</div>
)}
</div>
);
}
export function DeploymentNodeCard({
id,
data,
selected,
}: NodeProps<DeploymentNode>) {
const edges = useStore((state) => state.edges);
const { deleteElements, updateNodeData } = useReactFlow<DeploymentNode, DeploymentEdge>();
const Icon = mapValueOrThrow(SERVICE_ICONS, data.kind, "service icon");
const accent = mapValueOrThrow(SERVICE_ACCENTS, data.kind, "service accent");
const connectedInputHandles = useMemo(() => new Set(
edges
.filter((edge) => edge.target === id && edge.targetHandle != null)
.map((edge) => edge.targetHandle)
.filter((handle) => handle != null),
), [edges, id]);
const connectedOutputHandles = useMemo(() => new Set(
edges
.filter((edge) => edge.source === id && edge.sourceHandle != null)
.map((edge) => edge.sourceHandle)
.filter((handle) => handle != null),
), [edges, id]);
function updateInput(fieldId: string, value: string) {
updateNodeData(id, {
inputs: data.inputs.map((input) => input.id === fieldId ? { ...input, value } : input),
});
}
function updateInputLabel(fieldId: string, label: string) {
updateNodeData(id, {
inputs: data.inputs.map((input) => input.id === fieldId ? { ...input, label } : input),
});
}
function addInput() {
const isDomain = data.kind === "public-internet";
updateNodeData(id, {
inputs: [
...data.inputs,
{
id: `${id}-${crypto.randomUUID()}`,
label: isDomain ? "Domain" : "NEW_ENV_VAR",
value: isDomain ? "new.example.com" : "",
},
],
});
}
return (
<div
className={cn(
"w-[320px] overflow-hidden rounded-2xl border bg-background/95 shadow-lg backdrop-blur-xl",
"transition-[border-color,box-shadow] duration-150 hover:transition-none",
selected
? "border-blue-500/70 shadow-blue-500/10 ring-2 ring-blue-500/15"
: "border-border/80 hover:border-foreground/20",
)}
>
<div className="flex items-center gap-3 border-b border-border/70 p-3">
<div className={cn("flex h-9 w-9 shrink-0 items-center justify-center rounded-xl", accent)}>
<Icon size={19} weight="duotone" />
</div>
<div className="min-w-0 flex-1">
{data.immutable ? (
<>
<div className="truncate text-sm font-semibold text-foreground">{data.title}</div>
<div className="text-[11px] text-muted-foreground">Managed by Hexclave</div>
</>
) : (
<DesignInput
aria-label="Service name"
className="nodrag nowheel"
onChange={(event) => updateNodeData(id, { title: event.target.value })}
size="sm"
value={data.title}
/>
)}
</div>
{!data.immutable && (
<DesignButton
aria-label={`Delete ${data.title}`}
className="nodrag h-8 w-8 shrink-0 p-0 text-muted-foreground"
onClick={async () => {
await deleteElements({ nodes: [{ id }] });
}}
size="icon"
variant="ghost"
>
<TrashIcon size={16} />
</DesignButton>
)}
</div>
{data.inputs.length > 0 && (
<div className="divide-y divide-border/60">
{data.inputs.map((input) => (
<FieldHandle
key={input.id}
connected={connectedInputHandles.has(input.id)}
direction="input"
field={input}
keepValueWhenConnected={data.kind === "public-internet"}
onLabelChange={data.kind === "public-internet" ? undefined : (label) => updateInputLabel(input.id, label)}
onValueChange={(value) => updateInput(input.id, value)}
/>
))}
</div>
)}
{data.outputs.length > 0 && (
<div className="divide-y divide-border/60 border-t border-border/70 bg-foreground/[0.018]">
{data.outputs.map((output) => (
<FieldHandle
key={output.id}
connected={connectedOutputHandles.has(output.id)}
direction="output"
field={output}
/>
))}
</div>
)}
{data.kind !== "hexclave" && (
<div className="border-t border-border/70 p-2">
<DesignButton
className="nodrag w-full justify-center gap-1.5 text-xs"
onClick={addInput}
size="sm"
variant="ghost"
>
<PlusIcon size={13} />
{data.kind === "public-internet" ? "Add domain" : "Add environment variable"}
</DesignButton>
</div>
)}
</div>
);
}

View File

@ -0,0 +1,23 @@
"use client";
import { AppEnabledGuard } from "../app-enabled-guard";
import { PageLayout } from "../page-layout";
import { useAdminApp } from "../use-admin-app";
import { DeploymentGraph } from "./deployment-graph";
export default function PageClient() {
const project = useAdminApp().useProject();
return (
<AppEnabledGuard appId="deployments">
<PageLayout
containedHeight
description="Map services, credentials, databases, and public routes into a connected deployment graph."
fillWidth
title="Deployments"
>
<DeploymentGraph projectId={project.id} />
</PageLayout>
</AppEnabledGuard>
);
}

View File

@ -0,0 +1,9 @@
import PageClient from "./page-client";
export const metadata = {
title: "Deployments",
};
export default function Page() {
return <PageClient />;
}

View File

@ -1,6 +1,6 @@
import type { JSX } from "react";
import { Link } from "@/components/link";
import { ChartLineIcon, ChatCircleDotsIcon, ClipboardTextIcon, CodeIcon, CreditCardIcon, CursorClickIcon, EnvelopeSimpleIcon, FingerprintSimpleIcon, KeyIcon, MailboxIcon, MonitorPlayIcon, RocketIcon, ShieldCheckIcon, SparkleIcon, TelevisionSimpleIcon, TerminalWindowIcon, TriangleIcon, UserGearIcon, UsersIcon, VaultIcon, WebhooksLogoIcon } from "@phosphor-icons/react";
import { ChartLineIcon, ChatCircleDotsIcon, ClipboardTextIcon, CloudArrowUpIcon, CodeIcon, CreditCardIcon, CursorClickIcon, EnvelopeSimpleIcon, FingerprintSimpleIcon, KeyIcon, MailboxIcon, MonitorPlayIcon, RocketIcon, ShieldCheckIcon, SparkleIcon, TelevisionSimpleIcon, TerminalWindowIcon, TriangleIcon, UserGearIcon, UsersIcon, VaultIcon, WebhooksLogoIcon } from "@phosphor-icons/react";
import { StackAdminApp } from "@hexclave/next";
import type { AppId } from "@hexclave/shared/dist/apps/apps-config";
import { getRelativePart, isChildUrl } from "@hexclave/shared/dist/utils/urls";
@ -437,6 +437,20 @@ export const ALL_APPS_FRONTEND = {
</>
),
},
deployments: {
icon: CloudArrowUpIcon,
href: "deployments",
navigationItems: [
{ displayName: "Deployments", href: "." },
],
screenshots: [],
storeDescription: (
<>
<p>Deployments turns your project architecture into a visual, connected service graph.</p>
<p>Map compute, databases, public domains, environment variables, and Hexclave credentials in one place.</p>
</>
),
},
} as const satisfies Record<AppId, AppFrontend>;
function createSvgIcon(ChildrenComponent: () => React.ReactNode): (props: any) => React.ReactNode {

View File

@ -48,7 +48,7 @@
"db:regen-internal-subscriptions-to-latest": "pnpm pre && pnpm run --filter=@hexclave/backend db:regen-internal-subscriptions-to-latest",
"dev:full": "pnpm pre && concurrently -k \"pnpm run build-packages:watch\" \"pnpm run generate-sdks:watch\" \"pnpm run generate-setup-prompt-docs:watch\" \"turbo run dev --concurrency 99999\"",
"dev": "pnpm pre && concurrently -k \"pnpm run build-packages:watch\" \"pnpm run generate-sdks:watch\" \"pnpm run generate-openapi-docs:watch\" \"pnpm run generate-setup-prompt-docs:watch\" \"turbo run dev --concurrency 99999 --filter=./apps/* --filter=@hexclave/docs-mintlify --filter=./packages/* --filter=./examples/demo --filter=./examples/tanstack-start-demo \"",
"dev:tui": "pnpm pre && (trap 'kill 0' EXIT; pnpm run build-packages:watch & pnpm run generate-sdks:watch & pnpm run generate-openapi-docs:watch & pnpm run generate-setup-prompt-docs:watch & turbo run dev --ui tui --concurrency 99999 --filter=./apps/* --filter=@hexclave/docs-mintlify --filter=./packages/* --filter=./examples/demo --filter=./examples/tanstack-start-demo)",
"dev:tui": "pnpm pre && turbo run dev --ui tui --concurrency 99999 --filter=./apps/* --filter=@hexclave/docs-mintlify --filter=./packages/* --filter=./examples/demo --filter=./examples/tanstack-start-demo",
"dev:inspect": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--inspect\" pnpm run dev",
"dev:profile": "pnpm pre && STACK_BACKEND_DEV_EXTRA_ARGS=\"--experimental-cpu-prof\" pnpm run dev",
"dev:basic": "pnpm pre && concurrently -k \"pnpm run build-packages:watch\" \"pnpm run generate-sdks:watch\" \"turbo run dev --concurrency 99999 --filter=@hexclave/backend --filter=@hexclave/bulldozer-js --filter=@hexclave/mcp --filter=@hexclave/dashboard --filter=@hexclave/mock-oauth-server\"",

View File

@ -193,6 +193,12 @@ export const ALL_APPS = {
stage: "alpha",
parentAppId: "authentication",
},
"deployments": {
displayName: "Deployments",
subtitle: "Design and connect your deployment architecture",
tags: ["developers", "operations"],
stage: "alpha",
},
} as const satisfies Record<string, App>;
export function getParentAppId(appId: AppId): AppId | null {

View File

@ -533,6 +533,9 @@ importers:
'@vercel/speed-insights':
specifier: ^1.0.12
version: 1.0.12(next@16.2.9(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)
'@xyflow/react':
specifier: ^12.11.1
version: 12.11.1(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(immer@9.0.21)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
ai:
specifier: ^6.0.0
version: 6.0.81(zod@4.1.12)
@ -795,7 +798,7 @@ importers:
version: 1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@tanstack/react-start':
specifier: ^1.121.3
version: 1.166.6(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
version: 1.166.6(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
'@tanstack/react-start-client':
specifier: ^1.121.3
version: 1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
@ -810,7 +813,7 @@ importers:
version: 1.166.6
'@tanstack/start-plugin-core':
specifier: ^1.121.3
version: 1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
version: 1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
'@tanstack/start-server-core':
specifier: ^1.121.3
version: 1.166.6(crossws@0.4.4(srvx@0.8.16))
@ -834,7 +837,7 @@ importers:
version: 0.468.0(react@19.2.1)
nitro:
specifier: ^3.0.0
version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.1.2)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2)
version: 3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.1.2)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2)
qrcode:
specifier: ^1.5.4
version: 1.5.4
@ -871,7 +874,7 @@ importers:
version: 19.2.3(@types/react@19.2.7)
'@vitejs/plugin-react':
specifier: ^5.0.0
version: 5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))
version: 5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))
autoprefixer:
specifier: ^10.4.20
version: 10.4.21(postcss@8.5.6)
@ -889,10 +892,10 @@ importers:
version: 6.0.3
vite:
specifier: ^7.0.0
version: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
version: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
vite-tsconfig-paths:
specifier: ^4.3.2
version: 4.3.2(typescript@6.0.3)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))
version: 4.3.2(typescript@6.0.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))
apps/internal-tool:
dependencies:
@ -1182,7 +1185,7 @@ importers:
devDependencies:
mint:
specifier: ^4.2.487
version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
version: 4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
examples/cjs-test:
dependencies:
@ -2437,7 +2440,7 @@ importers:
devDependencies:
'@quetzallabs/i18n':
specifier: ^0.1.19
version: 0.1.19(next@16.2.9(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
version: 0.1.19(next@16.2.9(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))
'@tanstack/react-router':
specifier: ^1.167.4
version: 1.169.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -10299,6 +10302,22 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
'@xyflow/react@12.11.1':
resolution: {integrity: sha512-L+zBoLGSXham0MnlY8QqjfR7/C5JNw0zxkaey5aZ5XmCgJBAdH4+WRIu8CR40d3l/BdU635V6YbhBK1jMo8/6Q==}
peerDependencies:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3
react: '>=17'
react-dom: '>=17'
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
'@xyflow/system@0.0.78':
resolution: {integrity: sha512-lY0z2qP33fUhTva9Vaxrk0lqZta2pkbxB1trHAx1omnJqRtPvDlAQYV2r5fhS6AdpkulYmbNW0svy+A4/t4B/g==}
'@zeit/schemas@2.36.0':
resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==}
@ -11096,6 +11115,9 @@ packages:
class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
classcat@5.0.5:
resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==}
classnames@2.5.1:
resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
@ -18605,6 +18627,21 @@ packages:
zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
zustand@4.5.7:
resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==}
engines: {node: '>=12.7.0'}
peerDependencies:
'@types/react': 19.2.7
immer: '>=9.0.6'
react: '>=16.8'
peerDependenciesMeta:
'@types/react':
optional: true
immer:
optional: true
react:
optional: true
zustand@5.0.6:
resolution: {integrity: sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A==}
engines: {node: '>=12.20.0'}
@ -21585,13 +21622,13 @@ snapshots:
dependencies:
'@chevrotain/types': 11.1.2
'@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/cli@4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@inquirer/prompts': 7.9.0(@types/node@20.17.6)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/link-rot': 3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/previewing': 4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/link-rot': 3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/previewing': 4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.3)
adm-zip: 0.5.16
chalk: 5.2.0
@ -21691,7 +21728,7 @@ snapshots:
- ts-node
- typescript
'@mintlify/common@1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/common@1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@asyncapi/parser': 3.4.0
'@asyncapi/specs': 6.8.1
@ -21733,7 +21770,7 @@ snapshots:
remark-rehype: 11.1.1
remark-stringify: 11.0.0
sucrase: 3.35.0
tailwindcss: 3.4.18(tsx@4.19.3)(yaml@2.6.0)
tailwindcss: 3.4.18(tsx@4.21.0)(yaml@2.8.0)
unified: 11.0.5
unist-builder: 4.0.0
unist-util-map: 4.0.0
@ -21755,7 +21792,7 @@ snapshots:
- typescript
- yaml
'@mintlify/common@1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/common@1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@asyncapi/parser': 3.4.0
'@asyncapi/specs': 6.8.1
@ -21797,7 +21834,7 @@ snapshots:
remark-rehype: 11.1.1
remark-stringify: 11.0.0
sucrase: 3.35.0
tailwindcss: 3.4.18(tsx@4.19.3)(yaml@2.6.0)
tailwindcss: 3.4.18(tsx@4.21.0)(yaml@2.8.0)
unified: 11.0.5
unist-builder: 4.0.0
unist-util-map: 4.0.0
@ -21819,11 +21856,11 @@ snapshots:
- typescript
- yaml
'@mintlify/link-rot@3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/link-rot@3.0.1010(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/previewing': 4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/previewing': 4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/scraping': 4.0.522(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(typescript@6.0.3)
'@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(typescript@6.0.3)
fs-extra: 11.1.0
@ -21921,11 +21958,11 @@ snapshots:
leven: 4.0.0
yaml: 2.8.0
'@mintlify/prebuild@1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/prebuild@1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/openapi-parser': 0.0.8
'@mintlify/scraping': 4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/scraping': 4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(typescript@6.0.3)
chalk: 5.3.0
favicons: 7.2.0
@ -21953,11 +21990,11 @@ snapshots:
- utf-8-validate
- yaml
'@mintlify/prebuild@1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/prebuild@1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/openapi-parser': 0.0.8
'@mintlify/scraping': 4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/scraping': 4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.3)
chalk: 5.3.0
favicons: 7.2.0
@ -21985,10 +22022,10 @@ snapshots:
- utf-8-validate
- yaml
'@mintlify/previewing@4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/previewing@4.0.1038(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/prebuild': 1.0.977(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/validation': 0.1.653(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@6.0.3)
adm-zip: 0.5.16
better-opn: 3.0.2
@ -22058,9 +22095,9 @@ snapshots:
- typescript
- utf-8-validate
'@mintlify/scraping@4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/scraping@4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@18.3.1)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/openapi-parser': 0.0.8
fs-extra: 11.1.1
hast-util-to-mdast: 10.1.0
@ -22093,9 +22130,9 @@ snapshots:
- utf-8-validate
- yaml
'@mintlify/scraping@4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)':
'@mintlify/scraping@4.0.699(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)':
dependencies:
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/common': 1.0.835(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
'@mintlify/openapi-parser': 0.0.8
fs-extra: 11.1.1
hast-util-to-mdast: 10.1.0
@ -24237,7 +24274,7 @@ snapshots:
- next
- supports-color
'@quetzallabs/i18n@0.1.19(next@16.2.9(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))':
'@quetzallabs/i18n@0.1.19(next@16.2.9(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))':
dependencies:
'@babel/parser': 7.29.0
'@babel/traverse': 7.29.0
@ -24245,7 +24282,7 @@ snapshots:
dotenv: 10.0.0
i18next: 21.10.0
i18next-parser: 9.0.2
next-intl: 3.19.1(next@16.2.9(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1)
next-intl: 3.19.1(next@16.2.9(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1)
path: 0.12.7
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
@ -28155,19 +28192,19 @@ snapshots:
transitivePeerDependencies:
- crossws
'@tanstack/react-start@1.166.6(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))':
'@tanstack/react-start@1.166.6(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))':
dependencies:
'@tanstack/react-router': 1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@tanstack/react-start-client': 1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@tanstack/react-start-server': 1.166.6(crossws@0.4.4(srvx@0.8.16))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
'@tanstack/router-utils': 1.161.4
'@tanstack/start-client-core': 1.166.6
'@tanstack/start-plugin-core': 1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
'@tanstack/start-plugin-core': 1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
'@tanstack/start-server-core': 1.166.6(crossws@0.4.4(srvx@0.8.16))
pathe: 2.0.3
react: 19.2.1
react-dom: 19.2.1(react@19.2.1)
vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
transitivePeerDependencies:
- '@rsbuild/core'
- crossws
@ -28332,7 +28369,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-plugin@1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))':
'@tanstack/router-plugin@1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
@ -28349,7 +28386,7 @@ snapshots:
zod: 3.25.76
optionalDependencies:
'@tanstack/react-router': 1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1)
vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
webpack: 5.92.0(esbuild@0.24.2)
transitivePeerDependencies:
- supports-color
@ -28468,7 +28505,7 @@ snapshots:
'@tanstack/start-fn-stubs@1.161.6': {}
'@tanstack/start-plugin-core@1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))':
'@tanstack/start-plugin-core@1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(crossws@0.4.4(srvx@0.8.16))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/core': 7.28.5
@ -28476,7 +28513,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.40
'@tanstack/router-core': 1.166.6
'@tanstack/router-generator': 1.166.6
'@tanstack/router-plugin': 1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
'@tanstack/router-plugin': 1.166.6(@tanstack/react-router@1.166.6(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(webpack@5.92.0(esbuild@0.24.2))
'@tanstack/router-utils': 1.161.4
'@tanstack/start-client-core': 1.166.6
'@tanstack/start-server-core': 1.166.6(crossws@0.4.4(srvx@0.8.16))
@ -28488,8 +28525,8 @@ snapshots:
srvx: 0.11.9
tinyglobby: 0.2.15
ufo: 1.5.4
vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
vitefu: 1.1.2(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))
vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
vitefu: 1.1.2(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))
xmlbuilder2: 4.0.3
zod: 3.25.76
transitivePeerDependencies:
@ -29364,18 +29401,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
'@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0)
'@rolldown/pluginutils': 1.0.0-rc.3
'@types/babel__core': 7.20.5
react-refresh: 0.18.0
vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
'@vitejs/plugin-react@5.1.4(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))':
dependencies:
'@babel/core': 7.29.0
@ -29501,6 +29526,31 @@ snapshots:
'@xtuc/long@4.2.2': {}
'@xyflow/react@12.11.1(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(immer@9.0.21)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies:
'@xyflow/system': 0.0.78
classcat: 5.0.5
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
zustand: 4.5.7(@types/react@19.2.7)(immer@9.0.21)(react@19.2.3)
optionalDependencies:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
transitivePeerDependencies:
- immer
'@xyflow/system@0.0.78':
dependencies:
'@types/d3-drag': 3.0.7
'@types/d3-interpolate': 3.0.4
'@types/d3-selection': 3.0.11
'@types/d3-transition': 3.0.9
'@types/d3-zoom': 3.0.8
d3-drag: 3.0.0
d3-interpolate: 3.0.1
d3-selection: 3.0.0
d3-zoom: 3.0.0
'@zeit/schemas@2.36.0': {}
abbrev@2.0.0: {}
@ -30439,6 +30489,8 @@ snapshots:
dependencies:
clsx: 2.1.1
classcat@5.0.5: {}
classnames@2.5.1: {}
clean-stack@4.2.0:
@ -33326,15 +33378,6 @@ snapshots:
optionalDependencies:
crossws: 0.4.4(srvx@0.8.16)
h3@2.0.1-rc.2(crossws@0.4.4(srvx@0.11.15)):
dependencies:
cookie-es: 2.0.0
fetchdts: 0.1.7
rou3: 0.7.12
srvx: 0.8.16
optionalDependencies:
crossws: 0.4.4(srvx@0.11.15)
h3@2.0.1-rc.2(crossws@0.4.4(srvx@0.8.16)):
dependencies:
cookie-es: 2.0.0
@ -35358,9 +35401,9 @@ snapshots:
dependencies:
minipass: 7.1.3
mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0):
mint@4.2.487(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0):
dependencies:
'@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.19.3)(typescript@6.0.3)(yaml@2.6.0)
'@mintlify/cli': 4.0.1090(@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@types/node@20.17.6)(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(tsx@4.21.0)(typescript@6.0.3)(yaml@2.8.0)
transitivePeerDependencies:
- '@radix-ui/react-popover'
- '@types/node'
@ -35526,11 +35569,11 @@ snapshots:
react: 18.3.1
use-intl: 3.19.1(react@18.3.1)
next-intl@3.19.1(next@16.2.9(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1):
next-intl@3.19.1(next@16.2.9(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@18.3.1):
dependencies:
'@formatjs/intl-localematcher': 0.5.4
negotiator: 0.6.4
next: 16.2.9(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
next: 16.2.9(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
react: 18.3.1
use-intl: 3.19.1(react@18.3.1)
@ -35845,58 +35888,6 @@ snapshots:
jsonpath-plus: 10.4.0
lodash.topath: 4.5.2
nitro@3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.1.2)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2):
dependencies:
consola: 3.4.2
cookie-es: 2.0.0
crossws: 0.4.4(srvx@0.8.16)
db0: 0.3.4(@electric-sql/pglite@0.3.2)(mysql2@3.15.3)
esbuild: 0.25.11
fetchdts: 0.1.7
h3: 2.0.1-rc.2(crossws@0.4.4(srvx@0.8.16))
jiti: 2.6.1
nf3: 0.1.12
ofetch: 1.5.1
ohash: 2.0.11
rendu: 0.0.6
rollup: 4.57.1
srvx: 0.8.16
undici: 7.18.2
unenv: 2.0.0-rc.21
unstorage: 2.0.0-alpha.3(chokidar@4.0.3)(db0@0.3.4(@electric-sql/pglite@0.3.2)(mysql2@3.15.3))(lru-cache@11.2.2)(ofetch@1.5.1)
optionalDependencies:
rolldown: 1.1.2
vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
xml2js: 0.6.2
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
- '@azure/data-tables'
- '@azure/identity'
- '@azure/keyvault-secrets'
- '@azure/storage-blob'
- '@capacitor/preferences'
- '@deno/kv'
- '@electric-sql/pglite'
- '@libsql/client'
- '@netlify/blobs'
- '@planetscale/database'
- '@upstash/redis'
- '@vercel/blob'
- '@vercel/functions'
- '@vercel/kv'
- aws4fetch
- better-sqlite3
- chokidar
- drizzle-orm
- idb-keyval
- ioredis
- lru-cache
- mongodb
- mysql2
- sqlite3
- uploadthing
nitro@3.0.0(@electric-sql/pglite@0.3.2)(chokidar@4.0.3)(lru-cache@11.2.2)(mysql2@3.15.3)(rolldown@1.1.2)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0))(xml2js@0.6.2):
dependencies:
consola: 3.4.2
@ -35905,7 +35896,7 @@ snapshots:
db0: 0.3.4(@electric-sql/pglite@0.3.2)(mysql2@3.15.3)
esbuild: 0.25.11
fetchdts: 0.1.7
h3: 2.0.1-rc.2(crossws@0.4.4(srvx@0.11.15))
h3: 2.0.1-rc.2(crossws@0.4.4(srvx@0.8.16))
jiti: 2.6.1
nf3: 0.1.12
ofetch: 1.5.1
@ -36536,15 +36527,6 @@ snapshots:
optionalDependencies:
postcss: 8.5.6
postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.19.3)(yaml@2.6.0):
dependencies:
lilconfig: 3.1.3
optionalDependencies:
jiti: 1.21.7
postcss: 8.5.6
tsx: 4.19.3
yaml: 2.6.0
postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.0):
dependencies:
lilconfig: 3.1.3
@ -38832,34 +38814,6 @@ snapshots:
transitivePeerDependencies:
- ts-node
tailwindcss@3.4.18(tsx@4.19.3)(yaml@2.6.0):
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2
chokidar: 3.6.0
didyoumean: 1.2.2
dlv: 1.1.3
fast-glob: 3.3.3
glob-parent: 6.0.2
is-glob: 4.0.3
jiti: 1.21.7
lilconfig: 3.1.3
micromatch: 4.0.8
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.1.1
postcss: 8.5.6
postcss-import: 15.1.0(postcss@8.5.6)
postcss-js: 4.0.1(postcss@8.5.6)
postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.19.3)(yaml@2.6.0)
postcss-nested: 6.2.0(postcss@8.5.6)
postcss-selector-parser: 6.1.2
resolve: 1.22.11
sucrase: 3.35.0
transitivePeerDependencies:
- tsx
- yaml
tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.0):
dependencies:
'@alloc/quick-lru': 5.2.0
@ -39904,17 +39858,6 @@ snapshots:
- supports-color
- typescript
vite-tsconfig-paths@4.3.2(typescript@6.0.3)(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)):
dependencies:
debug: 4.4.3
globrex: 0.1.2
tsconfck: 3.1.5(typescript@6.0.3)
optionalDependencies:
vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
transitivePeerDependencies:
- supports-color
- typescript
vite-tsconfig-paths@4.3.2(typescript@6.0.3)(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)):
dependencies:
debug: 4.4.3
@ -40004,23 +39947,6 @@ snapshots:
tsx: 4.19.3
yaml: 2.6.0
vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0):
dependencies:
esbuild: 0.27.1
fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3
postcss: 8.5.6
rollup: 4.57.1
tinyglobby: 0.2.15
optionalDependencies:
'@types/node': 22.19.0
fsevents: 2.3.3
jiti: 1.21.7
lightningcss: 1.32.0
terser: 5.44.0
tsx: 4.21.0
yaml: 2.8.0
vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0):
dependencies:
esbuild: 0.27.1
@ -40038,10 +39964,6 @@ snapshots:
tsx: 4.21.0
yaml: 2.8.0
vitefu@1.1.2(vite@7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)):
optionalDependencies:
vite: 7.3.1(@types/node@22.19.0)(jiti@1.21.7)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
vitefu@1.1.2(vite@7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)):
optionalDependencies:
vite: 7.3.1(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.0)
@ -40532,6 +40454,14 @@ snapshots:
zod@4.3.6: {}
zustand@4.5.7(@types/react@19.2.7)(immer@9.0.21)(react@19.2.3):
dependencies:
use-sync-external-store: 1.6.0(react@19.2.3)
optionalDependencies:
'@types/react': 19.2.7
immer: 9.0.21
react: 19.2.3
zustand@5.0.6(@types/react@19.2.7)(immer@9.0.21)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)):
optionalDependencies:
'@types/react': 19.2.7