).jsonSchemaDialect;
+ }
+ setSpec(newSpec);
+ }
+ }, [data]);
+
+ return (
+
+ (args: any) => {
+ const result = ori(args);
+ const apiKey = args?.apiKey?.value;
+ if (apiKey) {
+ localStorage.setItem("swagger_api_key", apiKey);
+ }
+ return result;
+ },
+ logout: (ori: any) => (args: any) => {
+ const result = ori(args);
+ localStorage.removeItem("swagger_api_key");
+ return result;
+ },
+ },
+ },
+ },
+ },
+ ]}
+ requestInterceptor={(request: any) => {
+ const apiKey = localStorage.getItem("swagger_api_key");
+ if (apiKey) {
+ request.headers = request.headers || {};
+ request.headers["x-api-key"] = apiKey;
+ }
+ return request;
+ }}
+ />
+
+ );
+};
+
+export const Route = createFileRoute("/swagger")({
+ component: Home,
+ beforeLoad: async () => {
+ const session = await getCachedSession();
+ if (!session?.session) {
+ throw redirect({ to: "/" });
+ }
+ },
+});
diff --git a/apps/vite/src/shims/next-dynamic.tsx b/apps/vite/src/shims/next-dynamic.tsx
new file mode 100644
index 000000000..f40c349cd
--- /dev/null
+++ b/apps/vite/src/shims/next-dynamic.tsx
@@ -0,0 +1,35 @@
+import * as React from "react";
+
+type ComponentModule =
+ | { default: React.ComponentType
}
+ | React.ComponentType
;
+
+interface DynamicOptions {
+ ssr?: boolean;
+ loading?: React.ComponentType;
+}
+
+const dynamic =
(
+ loader: () => Promise>,
+ options?: DynamicOptions,
+) => {
+ const Lazy = React.lazy(async () => {
+ const mod = await loader();
+ if (mod && typeof mod === "object" && "default" in mod) {
+ return mod as { default: React.ComponentType };
+ }
+ return { default: mod as React.ComponentType
};
+ }) as unknown as React.ComponentType
;
+
+ const Loading = options?.loading;
+
+ const DynamicComponent = (props: P) => (
+ : null}>
+
+
+ );
+
+ return DynamicComponent;
+};
+
+export default dynamic;
diff --git a/apps/vite/src/shims/next-head.tsx b/apps/vite/src/shims/next-head.tsx
new file mode 100644
index 000000000..c56ae45a4
--- /dev/null
+++ b/apps/vite/src/shims/next-head.tsx
@@ -0,0 +1,24 @@
+import * as React from "react";
+import { useEffect } from "react";
+
+const Head = ({ children }: { children?: React.ReactNode }) => {
+ useEffect(() => {
+ React.Children.forEach(children, (child) => {
+ if (!React.isValidElement(child)) return;
+ if (child.type === "title") {
+ const titleChildren = (child.props as { children?: React.ReactNode })
+ .children;
+ const text = Array.isArray(titleChildren)
+ ? titleChildren.join("")
+ : titleChildren;
+ if (typeof text === "string") {
+ document.title = text;
+ }
+ }
+ });
+ }, [children]);
+
+ return null;
+};
+
+export default Head;
diff --git a/apps/vite/src/shims/next-link.tsx b/apps/vite/src/shims/next-link.tsx
new file mode 100644
index 000000000..ce060a82d
--- /dev/null
+++ b/apps/vite/src/shims/next-link.tsx
@@ -0,0 +1,65 @@
+import { Link as RouterLink, useLocation } from "@tanstack/react-router";
+import * as React from "react";
+import type { NextUrl } from "./next-router";
+
+type NextLinkProps = Omit, "href"> & {
+ href: NextUrl;
+ replace?: boolean;
+ prefetch?: boolean;
+ shallow?: boolean;
+ scroll?: boolean;
+ passHref?: boolean;
+ legacyBehavior?: boolean;
+ locale?: string | false;
+};
+
+const isExternal = (href: string) => /^(https?:|mailto:|tel:|\/\/)/.test(href);
+
+const Link = React.forwardRef(
+ (
+ {
+ href,
+ replace,
+ prefetch: _prefetch,
+ shallow: _shallow,
+ scroll: _scroll,
+ passHref: _passHref,
+ legacyBehavior: _legacyBehavior,
+ locale: _locale,
+ ...props
+ },
+ ref,
+ ) => {
+ const location = useLocation();
+
+ let hrefString: string;
+ if (typeof href === "string") {
+ hrefString = href;
+ } else {
+ const params = new URLSearchParams();
+ for (const [key, value] of Object.entries(href.query ?? {})) {
+ if (value === undefined || value === null) continue;
+ params.set(key, String(value));
+ }
+ const search = params.toString();
+ hrefString = `${href.pathname ?? location.pathname}${search ? `?${search}` : ""}${href.hash ? `#${href.hash.replace(/^#/, "")}` : ""}`;
+ }
+
+ if (isExternal(hrefString)) {
+ return ;
+ }
+
+ return (
+ )}
+ />
+ );
+ },
+);
+
+Link.displayName = "NextLinkShim";
+
+export default Link;
diff --git a/apps/vite/src/shims/next-navigation.ts b/apps/vite/src/shims/next-navigation.ts
new file mode 100644
index 000000000..e48ef8e2d
--- /dev/null
+++ b/apps/vite/src/shims/next-navigation.ts
@@ -0,0 +1,29 @@
+import {
+ useLocation,
+ useRouter as useTanstackRouter,
+} from "@tanstack/react-router";
+
+export const usePathname = () => {
+ return useLocation().pathname;
+};
+
+export const useSearchParams = () => {
+ const location = useLocation();
+ return new URLSearchParams(location.searchStr ?? "");
+};
+
+export const useParams = () => {
+ return useLocation().pathname;
+};
+
+export const useRouter = () => {
+ const router = useTanstackRouter();
+ return {
+ push: (href: string) => router.history.push(href),
+ replace: (href: string) => router.history.replace(href),
+ back: () => router.history.back(),
+ forward: () => router.history.forward(),
+ refresh: () => router.invalidate(),
+ prefetch: (_href: string) => {},
+ };
+};
diff --git a/apps/vite/src/shims/next-router.ts b/apps/vite/src/shims/next-router.ts
new file mode 100644
index 000000000..b6c50a48f
--- /dev/null
+++ b/apps/vite/src/shims/next-router.ts
@@ -0,0 +1,110 @@
+import {
+ type AnyRouter,
+ useLocation,
+ useParams,
+ useSearch,
+ useRouter as useTanstackRouter,
+} from "@tanstack/react-router";
+import { useMemo } from "react";
+
+export type NextUrl =
+ | string
+ | {
+ pathname?: string | null;
+ query?: Record | null;
+ hash?: string | null;
+ };
+
+let routerInstance: AnyRouter | null = null;
+
+export const setRouterInstance = (router: AnyRouter) => {
+ routerInstance = router;
+};
+
+const buildHref = (url: NextUrl, currentPathname: string): string => {
+ if (typeof url === "string") {
+ if (url.startsWith("?")) return `${currentPathname}${url}`;
+ return url;
+ }
+ const pathname = url.pathname ?? currentPathname;
+ const params = new URLSearchParams();
+ for (const [key, value] of Object.entries(url.query ?? {})) {
+ if (value === undefined || value === null) continue;
+ if (Array.isArray(value)) {
+ for (const v of value) params.append(key, String(v));
+ } else {
+ params.set(key, String(value));
+ }
+ }
+ const search = params.toString();
+ const hash = url.hash ? `#${url.hash.replace(/^#/, "")}` : "";
+ return `${pathname}${search ? `?${search}` : ""}${hash}`;
+};
+
+const routerEvents = {
+ on: (_event: string, _handler: (...args: unknown[]) => void) => {},
+ off: (_event: string, _handler: (...args: unknown[]) => void) => {},
+ emit: (_event: string, ..._args: unknown[]) => {},
+};
+
+export const useRouter = () => {
+ const tanstackRouter = useTanstackRouter();
+ const location = useLocation();
+ const params = useParams({ strict: false }) as Record;
+ const search = useSearch({ strict: false }) as Record;
+
+ return useMemo(() => {
+ const pathname = location.pathname;
+ return {
+ pathname,
+ route: pathname,
+ asPath: `${pathname}${location.searchStr ?? ""}${location.hash ? `#${location.hash}` : ""}`,
+ query: { ...search, ...params } as Record,
+ isReady: true,
+ events: routerEvents,
+ push: (url: NextUrl, _as?: unknown, _options?: unknown) => {
+ tanstackRouter.history.push(buildHref(url, pathname));
+ return Promise.resolve(true);
+ },
+ replace: (url: NextUrl, _as?: unknown, _options?: unknown) => {
+ tanstackRouter.history.replace(buildHref(url, pathname));
+ return Promise.resolve(true);
+ },
+ back: () => tanstackRouter.history.back(),
+ forward: () => tanstackRouter.history.forward(),
+ reload: () => window.location.reload(),
+ prefetch: (_url: string) => Promise.resolve(),
+ };
+ }, [
+ location.pathname,
+ location.searchStr,
+ location.hash,
+ params,
+ search,
+ tanstackRouter,
+ ]);
+};
+
+const singletonRouter = {
+ push: (url: NextUrl) => {
+ if (routerInstance) {
+ routerInstance.history.push(buildHref(url, window.location.pathname));
+ } else {
+ window.location.href = buildHref(url, window.location.pathname);
+ }
+ return Promise.resolve(true);
+ },
+ replace: (url: NextUrl) => {
+ if (routerInstance) {
+ routerInstance.history.replace(buildHref(url, window.location.pathname));
+ } else {
+ window.location.replace(buildHref(url, window.location.pathname));
+ }
+ return Promise.resolve(true);
+ },
+ back: () => window.history.back(),
+ reload: () => window.location.reload(),
+ events: routerEvents,
+};
+
+export default singletonRouter;
diff --git a/apps/vite/src/shims/next-script.tsx b/apps/vite/src/shims/next-script.tsx
new file mode 100644
index 000000000..28f1afa9b
--- /dev/null
+++ b/apps/vite/src/shims/next-script.tsx
@@ -0,0 +1,40 @@
+import { useEffect } from "react";
+
+interface ScriptProps {
+ src?: string;
+ id?: string;
+ strategy?: string;
+ onLoad?: () => void;
+ onError?: () => void;
+ children?: string;
+ dangerouslySetInnerHTML?: { __html: string };
+ [key: string]: unknown;
+}
+
+const Script = ({
+ src,
+ id,
+ strategy: _strategy,
+ onLoad,
+ onError,
+ children,
+ dangerouslySetInnerHTML,
+}: ScriptProps) => {
+ useEffect(() => {
+ if (src && document.querySelector(`script[src="${src}"]`)) return;
+ if (id && document.getElementById(id)) return;
+
+ const script = document.createElement("script");
+ if (src) script.src = src;
+ if (id) script.id = id;
+ const inline = dangerouslySetInnerHTML?.__html ?? children;
+ if (!src && inline) script.textContent = inline;
+ if (onLoad) script.onload = onLoad;
+ if (onError) script.onerror = onError;
+ document.body.appendChild(script);
+ }, [src, id]);
+
+ return null;
+};
+
+export default Script;
diff --git a/apps/vite/src/shims/toploader.tsx b/apps/vite/src/shims/toploader.tsx
new file mode 100644
index 000000000..54742522c
--- /dev/null
+++ b/apps/vite/src/shims/toploader.tsx
@@ -0,0 +1,37 @@
+import { useRouter } from "@tanstack/react-router";
+import { useEffect, useState } from "react";
+
+interface TopLoaderProps {
+ color?: string;
+ height?: number;
+}
+
+const TopLoader = ({ color, height = 3 }: TopLoaderProps) => {
+ const router = useRouter();
+ const [loading, setLoading] = useState(false);
+
+ useEffect(() => {
+ const unsubStart = router.subscribe("onBeforeNavigate", () =>
+ setLoading(true),
+ );
+ const unsubEnd = router.subscribe("onResolved", () => setLoading(false));
+ return () => {
+ unsubStart();
+ unsubEnd();
+ };
+ }, [router]);
+
+ if (!loading) return null;
+
+ return (
+
+ );
+};
+
+export default TopLoader;
diff --git a/apps/vite/src/styles/globals.css b/apps/vite/src/styles/globals.css
new file mode 100644
index 000000000..5e8316bfe
--- /dev/null
+++ b/apps/vite/src/styles/globals.css
@@ -0,0 +1,539 @@
+@import "tailwindcss";
+@import "tw-animate-css";
+@import "shadcn/tailwind.css";
+
+@plugin "tailwindcss-animate";
+@plugin "@tailwindcss/typography";
+@plugin "fancy-ansi/plugin";
+
+@source "../../../dokploy/components";
+@source "../../../dokploy/lib";
+@source "../../../dokploy/utils";
+@source "../../../dokploy/hooks";
+@source "../";
+
+@custom-variant dark (&:is(.dark *));
+
+:root {
+ --font-inter: "Inter";
+}
+
+@utility container {
+ margin-inline: auto;
+ padding-inline: 2rem;
+ @media (width >= --theme(--breakpoint-3xl)) {
+ max-width: none;
+ }
+ @media (width >= 87.5rem) {
+ max-width: 87.5rem;
+ }
+}
+
+@theme {
+ --font-sans:
+ var(--font-inter), ui-sans-serif, system-ui, sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+
+ --breakpoint-3xl: 1920px;
+
+ --container-2xl: 40rem;
+ --container-8xl: 85rem;
+ --container-9xl: 95rem;
+ --container-10xl: 105rem;
+
+ --color-border: hsl(var(--border));
+ --color-input: hsl(var(--input));
+ --color-ring: hsl(var(--ring));
+ --color-background: hsl(var(--background));
+ --color-foreground: hsl(var(--foreground));
+
+ --color-primary: hsl(var(--primary));
+ --color-primary-foreground: hsl(var(--primary-foreground));
+
+ --color-secondary: hsl(var(--secondary));
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
+
+ --color-destructive: hsl(var(--destructive));
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
+
+ --color-muted: hsl(var(--muted));
+ --color-muted-foreground: hsl(var(--muted-foreground));
+
+ --color-accent: hsl(var(--accent));
+ --color-accent-foreground: hsl(var(--accent-foreground));
+
+ --color-popover: hsl(var(--popover));
+ --color-popover-foreground: hsl(var(--popover-foreground));
+
+ --color-card: hsl(var(--card));
+ --color-card-foreground: hsl(var(--card-foreground));
+
+ --color-sidebar: hsl(var(--sidebar-background));
+ --color-sidebar-foreground: hsl(var(--sidebar-foreground));
+ --color-sidebar-primary: hsl(var(--sidebar-primary));
+ --color-sidebar-primary-foreground: hsl(var(--sidebar-primary-foreground));
+ --color-sidebar-accent: hsl(var(--sidebar-accent));
+ --color-sidebar-accent-foreground: hsl(var(--sidebar-accent-foreground));
+ --color-sidebar-border: hsl(var(--sidebar-border));
+ --color-sidebar-ring: hsl(var(--sidebar-ring));
+
+ --radius-lg: var(--radius);
+ --radius-md: calc(var(--radius) - 2px);
+ --radius-sm: calc(var(--radius) - 4px);
+
+ --animate-caret-blink: caret-blink 1.25s ease-out infinite;
+ --animate-accordion-down: accordion-down 0.2s ease-out;
+ --animate-accordion-up: accordion-up 0.2s ease-out;
+
+ @keyframes caret-blink {
+ 0%,
+ 70%,
+ 100% {
+ opacity: 1;
+ }
+ 20%,
+ 50% {
+ opacity: 0;
+ }
+ }
+ @keyframes accordion-down {
+ from {
+ height: 0;
+ }
+ to {
+ height: var(--radix-accordion-content-height);
+ }
+ }
+ @keyframes accordion-up {
+ from {
+ height: var(--radix-accordion-content-height);
+ }
+ to {
+ height: 0;
+ }
+ }
+}
+
+/*
+ The default border color has changed to `currentcolor` in Tailwind CSS v4,
+ so we've added these compatibility styles to make sure everything still
+ looks the same as it did with Tailwind CSS v3.
+
+ If we ever want to remove these styles, we need to add an explicit border
+ color utility to any element that depends on these defaults.
+*/
+@layer base {
+ html {
+ scrollbar-gutter: stable;
+ }
+
+ *,
+ ::after,
+ ::before,
+ ::backdrop,
+ ::file-selector-button {
+ border-color: var(--color-gray-200, currentcolor);
+ }
+ * {
+ @apply border-border outline-ring/50;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+}
+
+@utility no-scrollbar {
+ /* Chrome, Safari and Opera */
+ &::-webkit-scrollbar {
+ display: none;
+ }
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+@utility custom-logs-scrollbar {
+ scrollbar-width: thin;
+ scrollbar-color: hsl(var(--muted-foreground)) transparent;
+
+ &::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+ }
+
+ &::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: hsl(var(--muted-foreground) / 0.3);
+ border-radius: 20px;
+ }
+
+ &::-webkit-scrollbar-thumb:hover {
+ background-color: hsl(var(--muted-foreground) / 0.5);
+ }
+}
+
+@layer base {
+ :root {
+ --terminal-paste: rgba(0, 0, 0, 0.2);
+ --background: 0 0% 100%;
+ --foreground: 240 10% 3.9%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 240 10% 3.9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 240 10% 3.9%;
+
+ --primary: 240 5.9% 10%;
+ --primary-foreground: 0 0% 98%;
+
+ --secondary: 240 4.8% 95.9%;
+ --secondary-foreground: 240 5.9% 10%;
+
+ --muted: 240 4.8% 95.9%;
+ --muted-foreground: 240 3.8% 46.1%;
+
+ --accent: 240 4.8% 95.9%;
+ --accent-foreground: 240 5.9% 10%;
+
+ --destructive: 0 84.2% 50.2%;
+ --destructive-foreground: 0 0% 98%;
+
+ --border: 240 5.9% 90%;
+ --input: 240 5.9% 90%;
+ --ring: 240 10% 3.9%;
+
+ --radius: 0.5rem;
+ --overlay: rgba(0, 0, 0, 0.2);
+
+ --chart-1: 173 58% 39%;
+ --chart-2: 12 76% 61%;
+ --chart-3: 197 37% 24%;
+ --chart-4: 43 74% 66%;
+ --chart-5: 27 87% 67%;
+ --sidebar-background: 0 0% 98%;
+ --sidebar-foreground: 240 5.3% 26.1%;
+ --sidebar-primary: 240 5.9% 10%;
+ --sidebar-primary-foreground: 0 0% 98%;
+ --sidebar-accent: 240 4.8% 95.9%;
+ --sidebar-accent-foreground: 240 5.9% 10%;
+ --sidebar-border: 220 13% 91%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+ }
+
+ .dark {
+ --terminal-paste: rgba(255, 255, 255, 0.2);
+ --background: 0 0% 0%;
+ --foreground: 0 0% 98%;
+
+ --card: 240 4% 10%;
+ --card-foreground: 0 0% 98%;
+
+ --popover: 240 10% 3.9%;
+ --popover-foreground: 0 0% 98%;
+
+ --primary: 0 0% 98%;
+ --primary-foreground: 240 5.9% 10%;
+
+ --secondary: 240 3.7% 15.9%;
+ --secondary-foreground: 0 0% 98%;
+
+ --muted: 240 4% 10%;
+ --muted-foreground: 240 5% 64.9%;
+
+ --accent: 240 3.7% 15.9%;
+ --accent-foreground: 0 0% 98%;
+
+ --destructive: 0 84.2% 50.2%;
+ --destructive-foreground: 0 0% 98%;
+
+ --border: 240 3.7% 15.9%;
+ --input: 240 4% 10%;
+ --ring: 240 4.9% 83.9%;
+
+ --overlay: rgba(0, 0, 0, 0.5);
+
+ --chart-1: 220 70% 50%;
+ --chart-5: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-2: 340 75% 55%;
+ --sidebar-background: 240 5.9% 10%;
+ --sidebar-foreground: 240 4.8% 95.9%;
+ --sidebar-primary: 224.3 76.3% 48%;
+ --sidebar-primary-foreground: 0 0% 100%;
+ --sidebar-accent: 240 3.7% 15.9%;
+ --sidebar-accent-foreground: 240 4.8% 95.9%;
+ --sidebar-border: 240 3.7% 15.9%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+ }
+}
+
+@layer base {
+ * {
+ @apply border-border;
+ }
+
+ body {
+ @apply bg-background text-foreground;
+ }
+
+ /* Cursor pointer on buttons */
+ button:not([disabled]),
+ [role="button"]:not([disabled]) {
+ cursor: pointer;
+ }
+
+ /* Custom scrollbar styling */
+ ::-webkit-scrollbar {
+ width: 0.3125rem;
+ }
+
+ ::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: hsl(var(--border));
+ border-radius: 0.3125rem;
+ }
+
+ * {
+ scrollbar-width: thin;
+ scrollbar-color: hsl(var(--border)) transparent;
+ }
+}
+
+@layer utilities {
+ .xterm-viewport {
+ border-radius: 0.75rem /* 12px */ !important;
+ }
+
+ .xterm .xterm-viewport {
+ overflow-y: auto !important;
+ }
+
+ .xterm .xterm-screen {
+ overflow: hidden;
+ }
+}
+
+@layer utilities {
+ /* Codemirror */
+ .cm-editor {
+ @apply w-full h-full rounded-md overflow-hidden border border-solid border-border outline-hidden;
+ }
+
+ .cm-editor .cm-scroller {
+ font-family: inherit;
+ line-height: inherit;
+ }
+
+ .cm-editor.cm-focused {
+ @apply outline-hidden;
+ }
+
+ /* fix: placeholder bg */
+ .cm-editor .cm-activeLine:has(.cm-placeholder) {
+ background-color: transparent;
+ }
+
+ .compose-file-editor .cm-editor {
+ @apply min-h-100;
+ }
+
+ @keyframes heartbeat {
+ 0% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
+ 25% {
+ transform: scale(1.1);
+ opacity: 1;
+ }
+ 50% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
+ 75% {
+ transform: scale(1.1);
+ opacity: 1;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 0.7;
+ }
+ }
+
+ .animate-heartbeat {
+ animation: heartbeat 2.5s infinite;
+ }
+ @media (prefers-color-scheme: dark) {
+ .swagger-ui {
+ background-color: white;
+ }
+
+ .swagger-ui .info {
+ margin: 0px !important;
+ padding-top: 1rem !important;
+ }
+ }
+
+ .custom-logs-scrollbar {
+ scrollbar-width: thin;
+ scrollbar-color: hsl(var(--muted-foreground)) transparent;
+ }
+
+ .custom-logs-scrollbar::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+ }
+
+ .custom-logs-scrollbar::-webkit-scrollbar-track {
+ background: transparent;
+ }
+
+ .custom-logs-scrollbar::-webkit-scrollbar-thumb {
+ background-color: hsl(var(--muted-foreground) / 0.3);
+ border-radius: 20px;
+ }
+
+ .custom-logs-scrollbar::-webkit-scrollbar-thumb:hover {
+ background-color: hsl(var(--muted-foreground) / 0.5);
+ }
+
+ /* Docker Logs Scrollbar */
+}
+
+.xterm-bg-257.xterm-fg-257 {
+ background-color: var(--terminal-paste) !important;
+ color: currentColor !important;
+}
+
+.cm-content,
+.cm-lineWrapping {
+ @apply font-mono;
+}
+
+/* HubSpot Widget - Force light color-scheme to prevent white background */
+#hubspot-messages-iframe-container,
+#hubspot-messages-iframe-container * {
+ background-color: transparent !important;
+ color-scheme: light !important;
+}
+
+#hubspot-messages-iframe-container .hs-shadow-container {
+ display: none !important;
+}
+
+#hubspot-conversations-iframe {
+ color-scheme: light !important;
+}
+
+/*
+ ---break---
+*/
+
+:root {
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --destructive: oklch(0.577 0.245 27.325);
+ --border: oklch(0.922 0 0);
+ --input: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+ --radius: 0.625rem;
+ --sidebar: oklch(0.985 0 0);
+ --sidebar-foreground: oklch(0.145 0 0);
+ --sidebar-primary: oklch(0.205 0 0);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.97 0 0);
+ --sidebar-accent-foreground: oklch(0.205 0 0);
+ --sidebar-border: oklch(0.922 0 0);
+ --sidebar-ring: oklch(0.708 0 0);
+}
+
+/*
+ ---break---
+*/
+
+.dark {
+ --background: oklch(0.145 0 0);
+ --foreground: oklch(0.985 0 0);
+ --card: oklch(0.205 0 0);
+ --card-foreground: oklch(0.985 0 0);
+ --popover: oklch(0.205 0 0);
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: oklch(0.922 0 0);
+ --primary-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --destructive: oklch(0.704 0.191 22.216);
+ --border: oklch(1 0 0 / 10%);
+ --input: oklch(1 0 0 / 15%);
+ --ring: oklch(0.556 0 0);
+ --sidebar: oklch(0.205 0 0);
+ --sidebar-foreground: oklch(0.985 0 0);
+ --sidebar-primary: oklch(0.488 0.243 264.376);
+ --sidebar-primary-foreground: oklch(0.985 0 0);
+ --sidebar-accent: oklch(0.269 0 0);
+ --sidebar-accent-foreground: oklch(0.985 0 0);
+ --sidebar-border: oklch(1 0 0 / 10%);
+ --sidebar-ring: oklch(0.556 0 0);
+}
+
+/*
+ ---break---
+*/
+
+@theme inline {
+ --color-background: var(--background);
+ --color-foreground: var(--foreground);
+ --color-card: var(--card);
+ --color-card-foreground: var(--card-foreground);
+ --color-popover: var(--popover);
+ --color-popover-foreground: var(--popover-foreground);
+ --color-primary: var(--primary);
+ --color-primary-foreground: var(--primary-foreground);
+ --color-secondary: var(--secondary);
+ --color-secondary-foreground: var(--secondary-foreground);
+ --color-muted: var(--muted);
+ --color-muted-foreground: var(--muted-foreground);
+ --color-accent: var(--accent);
+ --color-accent-foreground: var(--accent-foreground);
+ --color-destructive: var(--destructive);
+ --color-border: var(--border);
+ --color-input: var(--input);
+ --color-ring: var(--ring);
+ --radius-sm: calc(var(--radius) * 0.6);
+ --radius-md: calc(var(--radius) * 0.8);
+ --radius-lg: var(--radius);
+ --radius-xl: calc(var(--radius) * 1.4);
+ --radius-2xl: calc(var(--radius) * 1.8);
+ --radius-3xl: calc(var(--radius) * 2.2);
+ --radius-4xl: calc(var(--radius) * 2.6);
+ --color-sidebar: var(--sidebar);
+ --color-sidebar-foreground: var(--sidebar-foreground);
+ --color-sidebar-primary: var(--sidebar-primary);
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
+ --color-sidebar-accent: var(--sidebar-accent);
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
+ --color-sidebar-border: var(--sidebar-border);
+ --color-sidebar-ring: var(--sidebar-ring);
+}
diff --git a/apps/vite/src/utils/api.ts b/apps/vite/src/utils/api.ts
new file mode 100644
index 000000000..aa14f8dc0
--- /dev/null
+++ b/apps/vite/src/utils/api.ts
@@ -0,0 +1,8 @@
+import { createTRPCReact } from "@trpc/react-query";
+import type { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
+import type { AppRouter } from "@/server/api/root";
+
+export const api = createTRPCReact();
+
+export type RouterInputs = inferRouterInputs;
+export type RouterOutputs = inferRouterOutputs;
diff --git a/apps/vite/src/utils/session.ts b/apps/vite/src/utils/session.ts
new file mode 100644
index 000000000..66b9ab311
--- /dev/null
+++ b/apps/vite/src/utils/session.ts
@@ -0,0 +1,20 @@
+import { authClient } from "@/lib/auth-client";
+
+type SessionData = Awaited>["data"];
+
+let cached: { at: number; session: SessionData } | null = null;
+
+const TTL_MS = 30_000;
+
+export const getCachedSession = async (): Promise => {
+ if (cached && Date.now() - cached.at < TTL_MS) {
+ return cached.session;
+ }
+ const { data } = await authClient.getSession();
+ cached = { at: Date.now(), session: data };
+ return data;
+};
+
+export const clearSessionCache = () => {
+ cached = null;
+};
diff --git a/apps/vite/src/utils/trpc-provider.tsx b/apps/vite/src/utils/trpc-provider.tsx
new file mode 100644
index 000000000..7ca583029
--- /dev/null
+++ b/apps/vite/src/utils/trpc-provider.tsx
@@ -0,0 +1,63 @@
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import {
+ createWSClient,
+ httpBatchLink,
+ httpLink,
+ splitLink,
+ wsLink,
+} from "@trpc/client";
+import { useState } from "react";
+import superjson from "superjson";
+import { api } from "./api";
+
+const getWsUrl = () => {
+ const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
+ return `${protocol}//${window.location.host}/drawer-logs`;
+};
+
+let wsClientSingleton: ReturnType | null = null;
+
+const getOrCreateWSClient = () => {
+ if (!wsClientSingleton) {
+ wsClientSingleton = createWSClient({
+ url: getWsUrl(),
+ lazy: { enabled: true, closeMs: 3000 },
+ retryDelayMs: () => 3000,
+ });
+ }
+ return wsClientSingleton;
+};
+
+const createLinks = () => [
+ splitLink({
+ condition: (op) => op.type === "subscription",
+ true: wsLink({
+ client: getOrCreateWSClient(),
+ transformer: superjson,
+ }),
+ false: splitLink({
+ condition: (op) => op.input instanceof FormData,
+ true: httpLink({
+ url: "/api/trpc",
+ transformer: superjson,
+ }),
+ false: httpBatchLink({
+ url: "/api/trpc",
+ transformer: superjson,
+ }),
+ }),
+ }),
+];
+
+export const TRPCProvider = ({ children }: { children: React.ReactNode }) => {
+ const [queryClient] = useState(() => new QueryClient());
+ const [trpcClient] = useState(() =>
+ api.createClient({ links: createLinks() }),
+ );
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/apps/vite/tsconfig.json b/apps/vite/tsconfig.json
new file mode 100644
index 000000000..e77ee6305
--- /dev/null
+++ b/apps/vite/tsconfig.json
@@ -0,0 +1,36 @@
+{
+ "compilerOptions": {
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "target": "es2022",
+ "allowJs": true,
+ "resolveJsonModule": true,
+ "moduleDetection": "force",
+ "isolatedModules": true,
+ "strict": true,
+ "noUncheckedIndexedAccess": true,
+ "lib": ["dom", "dom.iterable", "ES2022"],
+ "noEmit": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "jsx": "react-jsx",
+ "types": ["vite/client", "node"],
+ "baseUrl": ".",
+ "paths": {
+ "~/*": ["./src/*"],
+ "@/utils/api": ["./src/utils/api.ts"],
+ "next/link": ["./src/shims/next-link.tsx"],
+ "next/router": ["./src/shims/next-router.ts"],
+ "next/navigation": ["./src/shims/next-navigation.ts"],
+ "next/head": ["./src/shims/next-head.tsx"],
+ "next/dynamic": ["./src/shims/next-dynamic.tsx"],
+ "next/script": ["./src/shims/next-script.tsx"],
+ "nextjs-toploader": ["./src/shims/toploader.tsx"],
+ "@/*": ["../dokploy/*"],
+ "@dokploy/server": ["../../packages/server/src/index.ts"],
+ "@dokploy/server/*": ["../../packages/server/src/*"]
+ }
+ },
+ "include": ["src", "server", "vite.config.ts"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/apps/vite/vite.config.ts b/apps/vite/vite.config.ts
new file mode 100644
index 000000000..c379bc632
--- /dev/null
+++ b/apps/vite/vite.config.ts
@@ -0,0 +1,81 @@
+import path from "node:path";
+import tailwindcss from "@tailwindcss/vite";
+import { tanstackRouter } from "@tanstack/router-plugin/vite";
+import react from "@vitejs/plugin-react";
+import { defineConfig } from "vite";
+
+const dokployApp = path.resolve(__dirname, "../dokploy");
+const serverPkg = path.resolve(__dirname, "../../packages/server/src");
+
+const wsPaths = [
+ "/drawer-logs",
+ "/docker-container-logs",
+ "/docker-container-terminal",
+ "/listen-deployment",
+ "/listen-docker-stats-monitoring",
+ "/terminal",
+];
+
+export default defineConfig({
+ plugins: [
+ tanstackRouter({ target: "react", autoCodeSplitting: true }),
+ react(),
+ tailwindcss(),
+ ],
+ publicDir: path.resolve(dokployApp, "public"),
+ resolve: {
+ alias: [
+ {
+ find: /^@\/utils\/api$/,
+ replacement: path.resolve(__dirname, "src/utils/api.ts"),
+ },
+ {
+ find: /^next\/link$/,
+ replacement: path.resolve(__dirname, "src/shims/next-link.tsx"),
+ },
+ {
+ find: /^next\/router$/,
+ replacement: path.resolve(__dirname, "src/shims/next-router.ts"),
+ },
+ {
+ find: /^next\/navigation$/,
+ replacement: path.resolve(__dirname, "src/shims/next-navigation.ts"),
+ },
+ {
+ find: /^next\/head$/,
+ replacement: path.resolve(__dirname, "src/shims/next-head.tsx"),
+ },
+ {
+ find: /^next\/dynamic$/,
+ replacement: path.resolve(__dirname, "src/shims/next-dynamic.tsx"),
+ },
+ {
+ find: /^next\/script$/,
+ replacement: path.resolve(__dirname, "src/shims/next-script.tsx"),
+ },
+ {
+ find: /^nextjs-toploader$/,
+ replacement: path.resolve(__dirname, "src/shims/toploader.tsx"),
+ },
+ { find: /^~\//, replacement: `${path.resolve(__dirname, "src")}/` },
+ { find: /^@\//, replacement: `${dokployApp}/` },
+ { find: /^@dokploy\/server\//, replacement: `${serverPkg}/` },
+ {
+ find: /^@dokploy\/server$/,
+ replacement: path.resolve(serverPkg, "index.ts"),
+ },
+ ],
+ },
+ server: {
+ port: 5173,
+ proxy: {
+ "/api": {
+ target: "http://localhost:3000",
+ headers: { origin: "http://localhost:3000" },
+ },
+ ...Object.fromEntries(
+ wsPaths.map((p) => [p, { target: "ws://localhost:3000", ws: true }]),
+ ),
+ },
+ },
+});
diff --git a/biome.json b/biome.json
index f75baac2b..05cff59a5 100644
--- a/biome.json
+++ b/biome.json
@@ -13,6 +13,7 @@
"!**/.next/**",
"!**/dist",
"!**/drizzle/**",
+ "!**/routeTree.gen.ts",
"!node_modules/**",
"!packages/server/package.json"
],
diff --git a/packages/server/src/lib/auth.ts b/packages/server/src/lib/auth.ts
index e5de5a6dc..0637f803b 100644
--- a/packages/server/src/lib/auth.ts
+++ b/packages/server/src/lib/auth.ts
@@ -48,6 +48,7 @@ const resolveTrustedOrigins = async () => {
? [
"http://localhost:3000",
"https://absolutely-handy-falcon.ngrok-free.app",
+ "http://localhost:5173"
]
: [];
return [
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 44dba075a..20fe3c202 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -562,6 +562,373 @@ importers:
specifier: ^5.8.3
version: 5.9.3
+ apps/vite:
+ dependencies:
+ '@ai-sdk/anthropic':
+ specifier: ^3.0.44
+ version: 3.0.46(zod@4.3.6)
+ '@ai-sdk/azure':
+ specifier: ^3.0.30
+ version: 3.0.32(zod@4.3.6)
+ '@ai-sdk/cohere':
+ specifier: ^3.0.21
+ version: 3.0.21(zod@4.3.6)
+ '@ai-sdk/deepinfra':
+ specifier: ^2.0.34
+ version: 2.0.34(zod@4.3.6)
+ '@ai-sdk/mistral':
+ specifier: ^3.0.20
+ version: 3.0.20(zod@4.3.6)
+ '@ai-sdk/openai':
+ specifier: ^3.0.29
+ version: 3.0.31(zod@4.3.6)
+ '@ai-sdk/openai-compatible':
+ specifier: ^2.0.30
+ version: 2.0.30(zod@4.3.6)
+ '@aws-sdk/client-secrets-manager':
+ specifier: ^3.1097.0
+ version: 3.1097.0
+ '@better-auth/api-key':
+ specifier: 1.6.23
+ version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))
+ '@better-auth/passkey':
+ specifier: 1.6.23
+ version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))(nanostores@1.1.1)
+ '@better-auth/scim':
+ specifier: 1.6.23
+ version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))
+ '@better-auth/sso':
+ specifier: 1.6.23
+ version: 1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))
+ '@dokploy/server':
+ specifier: workspace:*
+ version: link:../../packages/server
+ '@dokploy/trpc-openapi':
+ specifier: 0.0.18
+ version: 0.0.18(@trpc/server@11.10.0(typescript@5.9.3))(zod-openapi@5.4.6(zod@4.3.6))(zod@4.3.6)
+ '@faker-js/faker':
+ specifier: ^8.4.1
+ version: 8.4.1
+ '@octokit/auth-app':
+ specifier: ^6.1.3
+ version: 6.1.4
+ '@octokit/webhooks':
+ specifier: ^13.9.0
+ version: 13.9.1
+ '@react-email/components':
+ specifier: ^1.0.12
+ version: 1.0.12(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@trpc/server':
+ specifier: ^11.10.0
+ version: 11.10.0(typescript@5.9.3)
+ adm-zip:
+ specifier: ^0.5.16
+ version: 0.5.16
+ ai:
+ specifier: ^6.0.86
+ version: 6.0.97(zod@4.3.6)
+ ai-sdk-ollama:
+ specifier: ^3.7.0
+ version: 3.7.1(ai@6.0.97(zod@4.3.6))(zod@4.3.6)
+ bcrypt:
+ specifier: 5.1.1
+ version: 5.1.1(encoding@0.1.13)
+ better-auth:
+ specifier: 1.6.23
+ version: 1.6.23(c1a003db19823d196c7d6468bf307df5)
+ bl:
+ specifier: 6.0.11
+ version: 6.0.11
+ boxen:
+ specifier: ^7.1.1
+ version: 7.1.1
+ date-fns:
+ specifier: 3.6.0
+ version: 3.6.0
+ dockerode:
+ specifier: 4.0.2
+ version: 4.0.2
+ dotenv:
+ specifier: 16.4.5
+ version: 16.4.5
+ drizzle-orm:
+ specifier: 0.45.2
+ version: 0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(prisma@7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3))
+ drizzle-zod:
+ specifier: 0.8.3
+ version: 0.8.3(drizzle-orm@0.45.2(@electric-sql/pglite@0.3.15)(@opentelemetry/api@1.9.0)(@prisma/client@5.22.0(prisma@7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)))(@types/pg@8.16.0)(better-sqlite3@12.6.2)(kysely@0.29.3)(mysql2@3.15.3)(pg@8.18.0)(postgres@3.4.4)(prisma@7.4.1(@types/react@18.3.5)(better-sqlite3@12.6.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(typescript@5.9.3)))(zod@4.3.6)
+ lodash:
+ specifier: 4.17.21
+ version: 4.17.21
+ micromatch:
+ specifier: 4.0.8
+ version: 4.0.8
+ nanoid:
+ specifier: 3.3.11
+ version: 3.3.11
+ node-os-utils:
+ specifier: 2.0.1
+ version: 2.0.1
+ node-pty:
+ specifier: 1.1.0
+ version: 1.1.0
+ node-schedule:
+ specifier: 2.1.1
+ version: 2.1.1
+ nodemailer:
+ specifier: 6.9.14
+ version: 6.9.14
+ octokit:
+ specifier: 3.1.2
+ version: 3.1.2
+ pino:
+ specifier: 9.4.0
+ version: 9.4.0
+ pino-pretty:
+ specifier: 11.2.2
+ version: 11.2.2
+ postgres:
+ specifier: 3.4.4
+ version: 3.4.4
+ public-ip:
+ specifier: 6.0.2
+ version: 6.0.2
+ react:
+ specifier: 19.2.7
+ version: 19.2.7
+ react-dom:
+ specifier: 19.2.7
+ version: 19.2.7(react@19.2.7)
+ resend:
+ specifier: ^6.0.2
+ version: 6.9.2(@react-email/render@2.0.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7))
+ semver:
+ specifier: 7.7.3
+ version: 7.7.3
+ shell-quote:
+ specifier: ^1.8.1
+ version: 1.8.3
+ slugify:
+ specifier: ^1.6.6
+ version: 1.6.6
+ ssh2:
+ specifier: ~1.16.0
+ version: 1.16.0
+ stripe:
+ specifier: 17.2.0
+ version: 17.2.0
+ superjson:
+ specifier: ^2.2.2
+ version: 2.2.6
+ toml:
+ specifier: 3.0.0
+ version: 3.0.0
+ undici:
+ specifier: ^6.21.3
+ version: 6.23.0
+ ws:
+ specifier: 8.16.0
+ version: 8.16.0
+ yaml:
+ specifier: 2.8.1
+ version: 2.8.1
+ zod:
+ specifier: ^4.3.6
+ version: 4.3.6
+ zod-form-data:
+ specifier: ^3.0.1
+ version: 3.0.1(zod@4.3.6)
+ devDependencies:
+ '@codemirror/autocomplete':
+ specifier: ^6.18.6
+ version: 6.20.3
+ '@codemirror/lang-css':
+ specifier: ^6.3.1
+ version: 6.3.1
+ '@codemirror/lang-json':
+ specifier: ^6.0.1
+ version: 6.0.2
+ '@codemirror/lang-yaml':
+ specifier: ^6.1.2
+ version: 6.1.2
+ '@codemirror/language':
+ specifier: ^6.11.0
+ version: 6.12.4
+ '@codemirror/legacy-modes':
+ specifier: 6.4.0
+ version: 6.4.0
+ '@codemirror/search':
+ specifier: ^6.6.0
+ version: 6.7.1
+ '@codemirror/view':
+ specifier: ^6.39.15
+ version: 6.43.6
+ '@hookform/resolvers':
+ specifier: ^5.2.2
+ version: 5.2.2(react-hook-form@7.71.2(react@19.2.7))
+ '@stepperize/react':
+ specifier: 4.0.1
+ version: 4.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@stripe/stripe-js':
+ specifier: 4.8.0
+ version: 4.8.0
+ '@tailwindcss/typography':
+ specifier: 0.5.16
+ version: 0.5.16(tailwindcss@4.3.1)
+ '@tailwindcss/vite':
+ specifier: ^4.3.1
+ version: 4.3.3(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))
+ '@tanstack/react-query':
+ specifier: ^5.90.21
+ version: 5.90.21(react@19.2.7)
+ '@tanstack/react-router':
+ specifier: ^1.132.0
+ version: 1.170.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/react-table':
+ specifier: ^8.21.3
+ version: 8.21.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/router-plugin':
+ specifier: ^1.132.0
+ version: 1.168.29(@tanstack/react-router@1.170.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.20.2)(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))
+ '@trpc/client':
+ specifier: ^11.10.0
+ version: 11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3)
+ '@trpc/react-query':
+ specifier: ^11.10.0
+ version: 11.10.0(@tanstack/react-query@5.90.21(react@19.2.7))(@trpc/client@11.10.0(@trpc/server@11.10.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.10.0(typescript@5.9.3))(react@19.2.7)(typescript@5.9.3)
+ '@types/js-cookie':
+ specifier: ^3.0.6
+ version: 3.0.6
+ '@types/lodash':
+ specifier: 4.17.4
+ version: 4.17.4
+ '@types/node':
+ specifier: ^24.4.0
+ version: 24.10.13
+ '@types/qrcode':
+ specifier: ^1.5.5
+ version: 1.5.6
+ '@types/react':
+ specifier: 18.3.5
+ version: 18.3.5
+ '@types/react-dom':
+ specifier: 18.3.0
+ version: 18.3.0
+ '@types/semver':
+ specifier: 7.7.1
+ version: 7.7.1
+ '@types/swagger-ui-react':
+ specifier: ^4.19.0
+ version: 4.19.0
+ '@uiw/codemirror-theme-github':
+ specifier: ^4.23.12
+ version: 4.25.4(@codemirror/language@6.12.4)(@codemirror/state@6.7.1)(@codemirror/view@6.43.6)
+ '@uiw/react-codemirror':
+ specifier: ^4.23.12
+ version: 4.25.4(@babel/runtime@7.28.6)(@codemirror/autocomplete@6.20.3)(@codemirror/language@6.12.4)(@codemirror/lint@6.9.4)(@codemirror/search@6.7.1)(@codemirror/state@6.7.1)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.43.6)(codemirror@6.0.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@vitejs/plugin-react':
+ specifier: ^5.0.0
+ version: 5.2.0(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))
+ '@xterm/addon-attach':
+ specifier: 0.10.0
+ version: 0.10.0(@xterm/xterm@5.5.0)
+ '@xterm/addon-clipboard':
+ specifier: 0.1.0
+ version: 0.1.0(@xterm/xterm@5.5.0)
+ '@xterm/xterm':
+ specifier: ^5.5.0
+ version: 5.5.0
+ class-variance-authority:
+ specifier: ^0.7.1
+ version: 0.7.1
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ cmdk:
+ specifier: ^0.2.1
+ version: 0.2.1(@types/react@18.3.5)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ copy-to-clipboard:
+ specifier: ^3.3.3
+ version: 3.3.3
+ dompurify:
+ specifier: ^3.3.3
+ version: 3.4.10
+ esbuild:
+ specifier: 0.20.2
+ version: 0.20.2
+ fancy-ansi:
+ specifier: ^0.1.3
+ version: 0.1.3
+ input-otp:
+ specifier: ^1.4.2
+ version: 1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ js-cookie:
+ specifier: ^3.0.5
+ version: 3.0.5
+ lucide-react:
+ specifier: ^0.469.0
+ version: 0.469.0(react@19.2.7)
+ next-themes:
+ specifier: ^0.2.1
+ version: 0.2.1(next@16.2.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ qrcode:
+ specifier: ^1.5.4
+ version: 1.5.4
+ radix-ui:
+ specifier: ^1.6.0
+ version: 1.6.0(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react-confetti-explosion:
+ specifier: 3.0.3
+ version: 3.0.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react-day-picker:
+ specifier: 10.0.1
+ version: 10.0.1(@types/react@18.3.5)(react@19.2.7)
+ react-hook-form:
+ specifier: ^7.71.2
+ version: 7.71.2(react@19.2.7)
+ react-markdown:
+ specifier: ^9.1.0
+ version: 9.1.0(@types/react@18.3.5)(react@19.2.7)
+ recharts:
+ specifier: ^3.8.0
+ version: 3.8.0(@types/react@18.3.5)(react-dom@19.2.7(react@19.2.7))(react-is@18.3.1)(react@19.2.7)(redux@5.0.1)
+ shadcn:
+ specifier: ^4.11.0
+ version: 4.11.0(typescript@5.9.3)
+ sonner:
+ specifier: ^1.7.4
+ version: 1.7.4(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ swagger-ui-react:
+ specifier: ^5.32.6
+ version: 5.32.6(@types/react@18.3.5)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ tailwind-merge:
+ specifier: ^2.6.1
+ version: 2.6.1
+ tailwindcss:
+ specifier: ^4.3.1
+ version: 4.3.1
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7(tailwindcss@4.3.1)
+ tsx:
+ specifier: ^4.22.4
+ version: 4.22.4
+ tw-animate-css:
+ specifier: ^1.4.0
+ version: 1.4.0
+ typescript:
+ specifier: ^5.8.3
+ version: 5.9.3
+ use-resize-observer:
+ specifier: 9.1.0
+ version: 9.1.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ vite:
+ specifier: ^7.1.0
+ version: 7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
+ xterm-addon-fit:
+ specifier: ^0.8.0
+ version: 0.8.0(xterm@5.3.0)
+
packages/server:
dependencies:
'@ai-sdk/anthropic':
@@ -997,6 +1364,10 @@ packages:
resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-plugin-utils@7.29.7':
+ resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-replace-supers@7.28.6':
resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==}
engines: {node: '>=6.9.0'}
@@ -1046,6 +1417,18 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-transform-react-jsx-self@7.29.7':
+ resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.29.7':
+ resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-transform-typescript@7.28.6':
resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==}
engines: {node: '>=6.9.0'}
@@ -3700,6 +4083,9 @@ packages:
react-redux:
optional: true
+ '@rolldown/pluginutils@1.0.0-rc.3':
+ resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==}
+
'@rollup/rollup-android-arm-eabi@4.59.0':
resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==}
cpu: [arm]
@@ -4026,60 +4412,117 @@ packages:
'@tailwindcss/node@4.3.1':
resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
+ '@tailwindcss/node@4.3.3':
+ resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
+
'@tailwindcss/oxide-android-arm64@4.3.1':
resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [android]
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
'@tailwindcss/oxide-darwin-arm64@4.3.1':
resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [darwin]
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
'@tailwindcss/oxide-darwin-x64@4.3.1':
resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==}
engines: {node: '>= 20'}
cpu: [x64]
os: [darwin]
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
'@tailwindcss/oxide-freebsd-x64@4.3.1':
resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==}
engines: {node: '>= 20'}
cpu: [x64]
os: [freebsd]
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
'@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==}
engines: {node: '>= 20'}
cpu: [arm]
os: [linux]
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
'@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+
'@tailwindcss/oxide-linux-arm64-musl@4.3.1':
resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+
'@tailwindcss/oxide-linux-x64-gnu@4.3.1':
resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+
'@tailwindcss/oxide-linux-x64-musl@4.3.1':
resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+
'@tailwindcss/oxide-wasm32-wasi@4.3.1':
resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==}
engines: {node: '>=14.0.0'}
@@ -4092,22 +4535,50 @@ packages:
- '@emnapi/wasi-threads'
- tslib
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
'@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [win32]
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
+
'@tailwindcss/oxide-win32-x64-msvc@4.3.1':
resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==}
engines: {node: '>= 20'}
cpu: [x64]
os: [win32]
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
'@tailwindcss/oxide@4.3.1':
resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==}
engines: {node: '>= 20'}
+ '@tailwindcss/oxide@4.3.3':
+ resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
+ engines: {node: '>= 20'}
+
'@tailwindcss/postcss@4.3.1':
resolution: {integrity: sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==}
@@ -4116,6 +4587,15 @@ packages:
peerDependencies:
tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+ '@tailwindcss/vite@4.3.3':
+ resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7 || ^8
+
+ '@tanstack/history@1.162.1':
+ resolution: {integrity: sha512-DR9t6lfLVdrjgCwpglrR9DR7Ok8/HlXjcOE+goWXF3zyuLUO/ug7vMbSFxTqrQTtbRghJfyhmIZ0S6LhPIy44w==}
+ engines: {node: '>=20.19'}
+
'@tanstack/query-core@5.90.20':
resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==}
@@ -4124,6 +4604,19 @@ packages:
peerDependencies:
react: ^18 || ^19
+ '@tanstack/react-router@1.170.25':
+ resolution: {integrity: sha512-XiWYvkLAGhcZHhV2xUvicpF/VfTVSnewP6CqviDONAjmD50tBob5x/93u2W8QZAc/JgkPd+jijCmu6t4NCzmew==}
+ engines: {node: '>=20.19'}
+ peerDependencies:
+ react: '>=18.0.0 || >=19.0.0'
+ react-dom: '>=18.0.0 || >=19.0.0'
+
+ '@tanstack/react-store@0.9.3':
+ resolution: {integrity: sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
'@tanstack/react-table@8.21.3':
resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==}
engines: {node: '>=12'}
@@ -4131,10 +4624,50 @@ packages:
react: '>=16.8'
react-dom: '>=16.8'
+ '@tanstack/router-core@1.171.21':
+ resolution: {integrity: sha512-t6xUHBO94nQDrPHPh6ag5UuKHWIkVjq9s63q2ctbxgzq3vtSoGKmAIdLD5o+NU6JUS1ppXRHgL0YGzEHvH32Ng==}
+ engines: {node: '>=20.19'}
+
+ '@tanstack/router-generator@1.167.27':
+ resolution: {integrity: sha512-bfV44Nyy7XeSCCuvQWGc3qudqXfOqAwKiWXNymAuK+hy24vs3E75Aw1zMz97ajHXMjxm4nFVVjEnwZ/cDR74ug==}
+ engines: {node: '>=20.19'}
+
+ '@tanstack/router-plugin@1.168.29':
+ resolution: {integrity: sha512-h1ZbnIvbAKIFeQ6JBRJ/xBP17tBdwjwzPBKVKUdVNYiob07SkrQLhqz+s41WtbNmHey5kQWN3HqP16Vl062bqg==}
+ engines: {node: '>=20.19'}
+ peerDependencies:
+ '@rsbuild/core': '>=1.0.2 || ^2.0.0'
+ '@tanstack/react-router': ^1.170.25
+ vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0'
+ vite-plugin-solid: ^2.11.10 || ^3.0.0-0
+ webpack: '>=5.92.0'
+ peerDependenciesMeta:
+ '@rsbuild/core':
+ optional: true
+ '@tanstack/react-router':
+ optional: true
+ vite:
+ optional: true
+ vite-plugin-solid:
+ optional: true
+ webpack:
+ optional: true
+
+ '@tanstack/router-utils@1.162.2':
+ resolution: {integrity: sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ==}
+ engines: {node: '>=20.19'}
+
+ '@tanstack/store@0.9.3':
+ resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==}
+
'@tanstack/table-core@8.21.3':
resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==}
engines: {node: '>=12'}
+ '@tanstack/virtual-file-routes@1.162.0':
+ resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==}
+ engines: {node: '>=20.19'}
+
'@tree-sitter-grammars/tree-sitter-yaml@0.7.1':
resolution: {integrity: sha512-AynBwkIoQCTgjDR33bDUp9Mqq+YTco0is3n5hRApMqG9of/6A4eQsfC1/uSEeHSUyMQSYawcAWamsexnVpIP4Q==}
peerDependencies:
@@ -4192,6 +4725,18 @@ packages:
'@types/aws-lambda@8.10.160':
resolution: {integrity: sha512-uoO4QVQNWFPJMh26pXtmtrRfGshPUSpMZGUyUQY20FhfHEElEBOPKgVmFs1z+kbpyBsRs2JnoOPT7++Z4GA9pA==}
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.27.0':
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
'@types/bcrypt@5.0.2':
resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==}
@@ -4416,6 +4961,12 @@ packages:
resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==}
engines: {node: '>= 20'}
+ '@vitejs/plugin-react@5.2.0':
+ resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+
'@vitest/expect@4.0.18':
resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==}
@@ -4574,6 +5125,10 @@ packages:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
+ ansis@4.3.1:
+ resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==}
+ engines: {node: '>=14'}
+
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
@@ -4652,6 +5207,9 @@ packages:
axios@1.18.0:
resolution: {integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==}
+ babel-dead-code-elimination@1.0.12:
+ resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==}
+
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
@@ -4922,6 +5480,10 @@ packages:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
@@ -5078,6 +5640,9 @@ packages:
cookie-es@1.2.2:
resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==}
+ cookie-es@3.1.1:
+ resolution: {integrity: sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==}
+
cookie-signature@1.2.2:
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
engines: {node: '>=6.6.0'}
@@ -5631,6 +6196,10 @@ packages:
resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
engines: {node: '>=10.13.0'}
+ enhanced-resolve@5.24.5:
+ resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
+ engines: {node: '>=10.13.0'}
+
enquirer@2.4.1:
resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
engines: {node: '>=8.6'}
@@ -6420,6 +6989,10 @@ packages:
isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ isbot@5.2.1:
+ resolution: {integrity: sha512-dJ+LpKyClQZ7NG+j3OensC/mAZkGpukE9YUrgPYvAZj2doVL0edfDgywTUh5CXa0o+nW9a1V9e5+CJTX8+SxRw==}
+ engines: {node: '>=18'}
+
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -7758,6 +8331,10 @@ packages:
redux:
optional: true
+ react-refresh@0.18.0:
+ resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
+ engines: {node: '>=0.10.0'}
+
react-remove-scroll-bar@2.3.8:
resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
engines: {node: '>=10'}
@@ -7827,6 +8404,10 @@ packages:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
+ readdirp@5.1.1:
+ resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
+ engines: {node: '>= 20.19.0'}
+
real-require@0.2.0:
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
engines: {node: '>= 12.13.0'}
@@ -8037,6 +8618,16 @@ packages:
resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==}
engines: {node: '>=10'}
+ seroval-plugins@1.6.2:
+ resolution: {integrity: sha512-TfxuUjlbBESzUOWdTkTKqvSmav0ABym+itetDXLK6mDz8SmrpdI30aF8RTXE8Bvq+tH/1yIDkvy3W0lfQb1ipQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ seroval: ^1.0
+
+ seroval@1.6.2:
+ resolution: {integrity: sha512-mPT+SD2TrlB6wvte1KkYOYUkubaTbd6pZ/6Kk3C9nxzrHmCZyhxOO7XGAeL7f+yLKZglzGtM9odUVvg/EhO+vQ==}
+ engines: {node: '>=10'}
+
serve-static@2.2.1:
resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
engines: {node: '>= 18'}
@@ -8362,6 +8953,9 @@ packages:
tailwindcss@4.3.1:
resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==}
+ tailwindcss@4.3.3:
+ resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
+
tapable@2.3.3:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
@@ -8621,6 +9215,39 @@ packages:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
+ unplugin@3.3.0:
+ resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ '@farmfe/core': '*'
+ '@rspack/core': '*'
+ bun-types-no-globals: '*'
+ esbuild: 0.20.2
+ rolldown: '*'
+ rollup: '*'
+ unloader: '*'
+ vite: '*'
+ webpack: '*'
+ peerDependenciesMeta:
+ '@farmfe/core':
+ optional: true
+ '@rspack/core':
+ optional: true
+ bun-types-no-globals:
+ optional: true
+ esbuild:
+ optional: true
+ rolldown:
+ optional: true
+ rollup:
+ optional: true
+ unloader:
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
+
unraw@3.0.0:
resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==}
@@ -8805,6 +9432,9 @@ packages:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
+ webpack-virtual-modules@0.6.2:
+ resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
+
whatwg-fetch@3.6.20:
resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
@@ -8995,6 +9625,9 @@ packages:
zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
+ zod@4.4.3:
+ resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
+
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -9307,6 +9940,8 @@ snapshots:
'@babel/helper-plugin-utils@7.28.6': {}
+ '@babel/helper-plugin-utils@7.29.7': {}
+
'@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
@@ -9356,6 +9991,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.0)':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/helper-plugin-utils': 7.29.7
+
'@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)':
dependencies:
'@babel/core': 7.29.0
@@ -9503,7 +10148,7 @@ snapshots:
'@better-auth/utils': 0.4.2
better-auth: 1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193)
better-call: 1.3.7(zod@4.3.6)
- zod: 4.3.6
+ zod: 4.4.3
'@better-auth/scim@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(better-auth@1.6.23(c1a003db19823d196c7d6468bf307df5))(better-call@1.3.7(zod@4.3.6))':
dependencies:
@@ -9511,7 +10156,7 @@ snapshots:
'@better-auth/utils': 0.4.2
better-auth: 1.6.23(c1a003db19823d196c7d6468bf307df5)
better-call: 1.3.7(zod@4.3.6)
- zod: 4.3.6
+ zod: 4.4.3
'@better-auth/sso@1.6.23(@better-auth/core@1.6.23(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.0)(better-call@1.3.7(zod@4.3.6))(jose@6.1.3)(kysely@0.29.3)(nanostores@1.1.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.6.23(1ed75fb9bf08f6ba6496d8d3414d7193))(better-call@1.3.7(zod@4.3.6))':
dependencies:
@@ -12398,6 +13043,8 @@ snapshots:
react: 19.2.7
react-redux: 9.2.0(@types/react@18.3.5)(react@19.2.7)(redux@5.0.1)
+ '@rolldown/pluginutils@1.0.0-rc.3': {}
+
'@rollup/rollup-android-arm-eabi@4.59.0':
optional: true
@@ -13001,42 +13648,88 @@ snapshots:
source-map-js: 1.2.1
tailwindcss: 4.3.1
+ '@tailwindcss/node@4.3.3':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.24.5
+ jiti: 2.7.0
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.3.3
+
'@tailwindcss/oxide-android-arm64@4.3.1':
optional: true
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-darwin-arm64@4.3.1':
optional: true
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-darwin-x64@4.3.1':
optional: true
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-freebsd-x64@4.3.1':
optional: true
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
optional: true
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
optional: true
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-linux-arm64-musl@4.3.1':
optional: true
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-linux-x64-gnu@4.3.1':
optional: true
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-linux-x64-musl@4.3.1':
optional: true
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-wasm32-wasi@4.3.1':
optional: true
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
optional: true
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ optional: true
+
'@tailwindcss/oxide-win32-x64-msvc@4.3.1':
optional: true
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ optional: true
+
'@tailwindcss/oxide@4.3.1':
optionalDependencies:
'@tailwindcss/oxide-android-arm64': 4.3.1
@@ -13052,6 +13745,21 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.3.1
'@tailwindcss/oxide-win32-x64-msvc': 4.3.1
+ '@tailwindcss/oxide@4.3.3':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-x64': 4.3.3
+ '@tailwindcss/oxide-freebsd-x64': 4.3.3
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.3
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.3
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
+
'@tailwindcss/postcss@4.3.1':
dependencies:
'@alloc/quick-lru': 5.2.0
@@ -13068,6 +13776,15 @@ snapshots:
postcss-selector-parser: 6.0.10
tailwindcss: 4.3.1
+ '@tailwindcss/vite@4.3.3(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))':
+ dependencies:
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ tailwindcss: 4.3.3
+ vite: 7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
+
+ '@tanstack/history@1.162.1': {}
+
'@tanstack/query-core@5.90.20': {}
'@tanstack/react-query@5.90.21(react@19.2.7)':
@@ -13075,14 +13792,91 @@ snapshots:
'@tanstack/query-core': 5.90.20
react: 19.2.7
+ '@tanstack/react-router@1.170.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/history': 1.162.1
+ '@tanstack/react-store': 0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@tanstack/router-core': 1.171.21
+ isbot: 5.2.1
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+
+ '@tanstack/react-store@0.9.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@tanstack/store': 0.9.3
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ use-sync-external-store: 1.6.0(react@19.2.7)
+
'@tanstack/react-table@8.21.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
'@tanstack/table-core': 8.21.3
react: 19.2.7
react-dom: 19.2.7(react@19.2.7)
+ '@tanstack/router-core@1.171.21':
+ dependencies:
+ '@tanstack/history': 1.162.1
+ cookie-es: 3.1.1
+ seroval: 1.6.2
+ seroval-plugins: 1.6.2(seroval@1.6.2)
+
+ '@tanstack/router-generator@1.167.27':
+ dependencies:
+ '@babel/types': 7.29.0
+ '@tanstack/router-core': 1.171.21
+ '@tanstack/router-utils': 1.162.2
+ '@tanstack/virtual-file-routes': 1.162.0
+ jiti: 2.7.0
+ magic-string: 0.30.21
+ prettier: 3.8.1
+ zod: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@tanstack/router-plugin@1.168.29(@tanstack/react-router@1.170.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(esbuild@0.20.2)(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/template': 7.28.6
+ '@babel/types': 7.29.0
+ '@tanstack/router-core': 1.171.21
+ '@tanstack/router-generator': 1.167.27
+ '@tanstack/router-utils': 1.162.2
+ chokidar: 5.0.0
+ unplugin: 3.3.0(esbuild@0.20.2)(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))
+ zod: 4.4.3
+ optionalDependencies:
+ '@tanstack/react-router': 1.170.25(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ vite: 7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - '@farmfe/core'
+ - '@rspack/core'
+ - bun-types-no-globals
+ - esbuild
+ - rolldown
+ - rollup
+ - supports-color
+ - unloader
+
+ '@tanstack/router-utils@1.162.2':
+ dependencies:
+ '@babel/generator': 7.29.1
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ ansis: 4.3.1
+ babel-dead-code-elimination: 1.0.12
+ diff: 8.0.4
+ pathe: 2.0.3
+ tinyglobby: 0.2.15
+ transitivePeerDependencies:
+ - supports-color
+
+ '@tanstack/store@0.9.3': {}
+
'@tanstack/table-core@8.21.3': {}
+ '@tanstack/virtual-file-routes@1.162.0': {}
+
'@tree-sitter-grammars/tree-sitter-yaml@0.7.1(tree-sitter@0.22.4)':
dependencies:
node-addon-api: 8.5.0
@@ -13134,6 +13928,27 @@ snapshots:
'@types/aws-lambda@8.10.160': {}
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
+
+ '@types/babel__generator@7.27.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.29.0
+ '@babel/types': 7.29.0
+
+ '@types/babel__traverse@7.28.0':
+ dependencies:
+ '@babel/types': 7.29.0
+
'@types/bcrypt@5.0.2':
dependencies:
'@types/node': 24.10.13
@@ -13385,6 +14200,18 @@ snapshots:
'@vercel/oidc@3.1.0': {}
+ '@vitejs/plugin-react@5.2.0(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1))':
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.0)
+ '@babel/plugin-transform-react-jsx-source': 7.29.7(@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@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
+ transitivePeerDependencies:
+ - supports-color
+
'@vitest/expect@4.0.18':
dependencies:
'@standard-schema/spec': 1.1.0
@@ -13542,6 +14369,8 @@ snapshots:
ansi-styles@6.2.3: {}
+ ansis@4.3.1: {}
+
any-promise@1.3.0: {}
anymatch@3.1.3:
@@ -13617,6 +14446,15 @@ snapshots:
- debug
- supports-color
+ babel-dead-code-elimination@1.0.12:
+ dependencies:
+ '@babel/core': 7.29.0
+ '@babel/parser': 7.29.0
+ '@babel/traverse': 7.29.0
+ '@babel/types': 7.29.0
+ transitivePeerDependencies:
+ - supports-color
+
bail@2.0.2: {}
balanced-match@1.0.2: {}
@@ -13943,6 +14781,10 @@ snapshots:
readdirp: 4.1.2
optional: true
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.1.1
+
chownr@1.1.4: {}
chownr@2.0.0: {}
@@ -14087,6 +14929,8 @@ snapshots:
cookie-es@1.2.2: {}
+ cookie-es@3.1.1: {}
+
cookie-signature@1.2.2: {}
cookie@0.7.2: {}
@@ -14442,6 +15286,11 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.3.3
+ enhanced-resolve@5.24.5:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
enquirer@2.4.1:
dependencies:
ansi-colors: 4.1.3
@@ -15303,6 +16152,8 @@ snapshots:
isarray@2.0.5: {}
+ isbot@5.2.1: {}
+
isexe@2.0.0: {}
isexe@3.1.5: {}
@@ -16774,6 +17625,8 @@ snapshots:
'@types/react': 18.3.5
redux: 5.0.1
+ react-refresh@0.18.0: {}
+
react-remove-scroll-bar@2.3.8(@types/react@18.3.5)(react@19.2.7):
dependencies:
react: 19.2.7
@@ -16849,6 +17702,8 @@ snapshots:
readdirp@4.1.2:
optional: true
+ readdirp@5.1.1: {}
+
real-require@0.2.0: {}
recast@0.23.11:
@@ -17109,6 +17964,12 @@ snapshots:
dependencies:
type-fest: 0.20.2
+ seroval-plugins@1.6.2(seroval@1.6.2):
+ dependencies:
+ seroval: 1.6.2
+
+ seroval@1.6.2: {}
+
serve-static@2.2.1:
dependencies:
encodeurl: 2.0.0
@@ -17572,6 +18433,8 @@ snapshots:
tailwindcss@4.3.1: {}
+ tailwindcss@4.3.3: {}
+
tapable@2.3.3: {}
tar-fs@2.0.1:
@@ -17838,6 +18701,16 @@ snapshots:
unpipe@1.0.0: {}
+ unplugin@3.3.0(esbuild@0.20.2)(rollup@4.59.0)(vite@7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)):
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ picomatch: 4.0.4
+ webpack-virtual-modules: 0.6.2
+ optionalDependencies:
+ esbuild: 0.20.2
+ rollup: 4.59.0
+ vite: 7.3.1(@types/node@24.10.13)(jiti@2.7.0)(lightningcss@1.32.0)(tsx@4.22.4)(yaml@2.8.1)
+
unraw@3.0.0: {}
update-browserslist-db@1.2.3(browserslist@4.28.1):
@@ -18053,6 +18926,8 @@ snapshots:
webidl-conversions@7.0.0:
optional: true
+ webpack-virtual-modules@0.6.2: {}
+
whatwg-fetch@3.6.20: {}
whatwg-url@14.2.0:
@@ -18236,4 +19111,6 @@ snapshots:
zod@4.3.6: {}
+ zod@4.4.3: {}
+
zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 4c1316ebc..5b8433d7e 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -2,6 +2,7 @@ packages:
- "apps/api"
- "apps/dokploy"
- "apps/schedules"
+ - "apps/vite"
- "packages/server"