diff --git a/.cursor/hooks.json b/.cursor/hooks.json index 93b1c827b..3c46eb589 100644 --- a/.cursor/hooks.json +++ b/.cursor/hooks.json @@ -1,11 +1,6 @@ { "version": 1, "hooks": { - "afterFileEdit": [ - { - "command": "./hooks/lint-file.sh" - } - ], "stop": [ { "command": "./hooks/stop-check.sh" diff --git a/apps/backend/package.json b/apps/backend/package.json index 55de68c8c..4184564be 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -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", diff --git a/apps/backend/scripts/generate-route-info.ts b/apps/backend/scripts/generate-route-info.ts index debf643e2..e805e557f 100644 --- a/apps/backend/scripts/generate-route-info.ts +++ b/apps/backend/scripts/generate-route-info.ts @@ -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 diff --git a/apps/backend/src/server/server.ts b/apps/backend/src/server/server.ts index 063556221..d1d43d041 100644 --- a/apps/backend/src/server/server.ts +++ b/apps/backend/src/server/server.ts @@ -18,4 +18,5 @@ console.log(`Hexclave backend listening on http://${hostname}:${port}`); process.once("SIGTERM", () => { runAsynchronously(app.stop()); + process.exit(0); }); diff --git a/apps/bulldozer-js/package.json b/apps/bulldozer-js/package.json index 1f079dd62..ee053d4d0 100644 --- a/apps/bulldozer-js/package.json +++ b/apps/bulldozer-js/package.json @@ -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", diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index a243d47c2..ceb54ea45 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -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", diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-graph.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-graph.tsx new file mode 100644 index 000000000..d470656de --- /dev/null +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-graph.tsx @@ -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: }, + { kind: "server", label: "Server", icon: }, + { kind: "postgres", label: "Postgres", icon: }, + { kind: "convex", label: "Convex", icon: }, + { kind: "redis", label: "Redis", icon: }, + { kind: "worker", label: "Worker", icon: }, +] satisfies readonly { + kind: typeof ADDABLE_SERVICE_KINDS[number], + label: string, + icon: React.ReactNode, +}[]; + +function GraphControls(props: { + onReset: () => void, +}) { + const { fitView } = useReactFlow(); + + return ( + + { + await fitView({ duration: 200, padding: 0.2 }); + }} + size="sm" + variant="outline" + > + + Fit view + + + + Reset + + + ); +} + +function miniMapColor(node: DeploymentNode): string { + const colors = new Map([ + ["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(initialGraph.nodes); + const [edges, setEdges, onEdgesChange] = useEdgesState(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 ( +
+ + 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 + > + + + ({ + id: service.kind, + label: service.label, + icon: service.icon, + onClick: () => addService(service.kind), + }))} + label="Service type" + triggerLabel="Add service" + triggerIcon={} + variant="actions" + withIcons + /> + + + + Drag nodes to arrange · Drag between ports to connect · Select and press Delete + + + +
+ ); +} diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-model.ts b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-model.ts new file mode 100644 index 000000000..e88a68812 --- /dev/null +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-model.ts @@ -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; +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([ + ["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, + }, + ], + }; +} diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-node.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-node.tsx new file mode 100644 index 000000000..4c126b89c --- /dev/null +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/deployment-node.tsx @@ -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([ + ["serverless", CloudArrowUpIcon], + ["server", HardDrivesIcon], + ["postgres", DatabaseIcon], + ["convex", LightningIcon], + ["redis", StackIcon], + ["worker", CpuIcon], + ["public-internet", GlobeHemisphereWestIcon], + ["hexclave", HexagonIcon], +]); + +const SERVICE_ACCENTS = new Map([ + ["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(map: Map, 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 ( +
+ +
+ {props.onLabelChange ? ( + props.onLabelChange?.(event.target.value)} + size="sm" + value={props.field.label} + /> + ) : ( + + {props.field.label} + + )} + {props.connected && ( + + Connected + + )} +
+ {isInput && props.onValueChange ? ( + 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} + /> + ) : ( +
+ {props.field.value || "Available after deploy"} +
+ )} +
+ ); +} + +export function DeploymentNodeCard({ + id, + data, + selected, +}: NodeProps) { + const edges = useStore((state) => state.edges); + const { deleteElements, updateNodeData } = useReactFlow(); + 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 ( +
+
+
+ +
+
+ {data.immutable ? ( + <> +
{data.title}
+
Managed by Hexclave
+ + ) : ( + updateNodeData(id, { title: event.target.value })} + size="sm" + value={data.title} + /> + )} +
+ {!data.immutable && ( + { + await deleteElements({ nodes: [{ id }] }); + }} + size="icon" + variant="ghost" + > + + + )} +
+ + {data.inputs.length > 0 && ( +
+ {data.inputs.map((input) => ( + updateInputLabel(input.id, label)} + onValueChange={(value) => updateInput(input.id, value)} + /> + ))} +
+ )} + + {data.outputs.length > 0 && ( +
+ {data.outputs.map((output) => ( + + ))} +
+ )} + + {data.kind !== "hexclave" && ( +
+ + + {data.kind === "public-internet" ? "Add domain" : "Add environment variable"} + +
+ )} +
+ ); +} diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page-client.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page-client.tsx new file mode 100644 index 000000000..df03300c6 --- /dev/null +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page-client.tsx @@ -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 ( + + + + + + ); +} diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page.tsx new file mode 100644 index 000000000..4bb6870ac --- /dev/null +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/deployments/page.tsx @@ -0,0 +1,9 @@ +import PageClient from "./page-client"; + +export const metadata = { + title: "Deployments", +}; + +export default function Page() { + return ; +} diff --git a/apps/dashboard/src/lib/apps-frontend.tsx b/apps/dashboard/src/lib/apps-frontend.tsx index ad47392af..d027478e9 100644 --- a/apps/dashboard/src/lib/apps-frontend.tsx +++ b/apps/dashboard/src/lib/apps-frontend.tsx @@ -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: ( + <> +

Deployments turns your project architecture into a visual, connected service graph.

+

Map compute, databases, public domains, environment variables, and Hexclave credentials in one place.

+ + ), + }, } as const satisfies Record; function createSvgIcon(ChildrenComponent: () => React.ReactNode): (props: any) => React.ReactNode { diff --git a/package.json b/package.json index a051effde..78f2581d8 100644 --- a/package.json +++ b/package.json @@ -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\"", diff --git a/packages/shared/src/apps/apps-config.ts b/packages/shared/src/apps/apps-config.ts index f427ea205..6841e7d36 100644 --- a/packages/shared/src/apps/apps-config.ts +++ b/packages/shared/src/apps/apps-config.ts @@ -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; export function getParentAppId(appId: AppId): AppId | null { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 071f3c523..e68caba79 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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