From 780f85e0d6f74dd647acf154bda8ea18277a0f04 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Fri, 13 Mar 2026 13:18:09 +0000 Subject: [PATCH] feat(web): scaffold Next.js 16 dashboard with design system and auth client (#82) Co-authored-by: Jason Woltje Co-committed-by: Jason Woltje --- apps/web/next-env.d.ts | 2 +- apps/web/next.config.ts | 1 + apps/web/package.json | 7 +- apps/web/postcss.config.mjs | 8 + apps/web/src/app/(auth)/layout.tsx | 11 + apps/web/src/app/(auth)/login/page.tsx | 58 +++ apps/web/src/app/(auth)/register/page.tsx | 73 +++ apps/web/src/app/(dashboard)/chat/page.tsx | 8 + apps/web/src/app/(dashboard)/layout.tsx | 6 + apps/web/src/app/globals.css | 115 +++++ apps/web/src/app/layout.tsx | 20 +- apps/web/src/app/page.tsx | 10 +- apps/web/src/components/layout/app-shell.tsx | 19 + apps/web/src/components/layout/sidebar.tsx | 59 +++ apps/web/src/components/layout/topbar.tsx | 32 ++ apps/web/src/lib/api.ts | 47 ++ apps/web/src/lib/auth-client.ts | 7 + apps/web/src/lib/cn.ts | 7 + apps/web/tailwind.config.ts | 11 - docs/TASKS.md | 2 +- packages/design-tokens/package.json | 1 + packages/design-tokens/src/colors.ts | 91 ++++ packages/design-tokens/src/fonts.ts | 33 ++ packages/design-tokens/src/index.ts | 6 +- packages/design-tokens/src/spacing.ts | 38 ++ pnpm-lock.yaml | 481 ++++++++++++++++--- 26 files changed, 1070 insertions(+), 83 deletions(-) create mode 100644 apps/web/postcss.config.mjs create mode 100644 apps/web/src/app/(auth)/layout.tsx create mode 100644 apps/web/src/app/(auth)/login/page.tsx create mode 100644 apps/web/src/app/(auth)/register/page.tsx create mode 100644 apps/web/src/app/(dashboard)/chat/page.tsx create mode 100644 apps/web/src/app/(dashboard)/layout.tsx create mode 100644 apps/web/src/app/globals.css create mode 100644 apps/web/src/components/layout/app-shell.tsx create mode 100644 apps/web/src/components/layout/sidebar.tsx create mode 100644 apps/web/src/components/layout/topbar.tsx create mode 100644 apps/web/src/lib/api.ts create mode 100644 apps/web/src/lib/auth-client.ts create mode 100644 apps/web/src/lib/cn.ts delete mode 100644 apps/web/tailwind.config.ts create mode 100644 packages/design-tokens/src/colors.ts create mode 100644 packages/design-tokens/src/fonts.ts create mode 100644 packages/design-tokens/src/spacing.ts diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts index 1511519..9edff1c 100644 --- a/apps/web/next-env.d.ts +++ b/apps/web/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import './.next/types/routes.d.ts'; +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index 94647ad..f3820a1 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -2,6 +2,7 @@ import type { NextConfig } from 'next'; const nextConfig: NextConfig = { output: 'standalone', + transpilePackages: ['@mosaic/design-tokens'], }; export default nextConfig; diff --git a/apps/web/package.json b/apps/web/package.json index 0172264..d719b44 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,11 +11,16 @@ "start": "next start" }, "dependencies": { + "@mosaic/design-tokens": "workspace:^", + "better-auth": "^1.5.5", + "clsx": "^2.1.0", "next": "^16.0.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "tailwind-merge": "^3.5.0" }, "devDependencies": { + "@tailwindcss/postcss": "^4.0.0", "@types/node": "^22.0.0", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", diff --git a/apps/web/postcss.config.mjs b/apps/web/postcss.config.mjs new file mode 100644 index 0000000..5d6d845 --- /dev/null +++ b/apps/web/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; + +export default config; diff --git a/apps/web/src/app/(auth)/layout.tsx b/apps/web/src/app/(auth)/layout.tsx new file mode 100644 index 0000000..819fc61 --- /dev/null +++ b/apps/web/src/app/(auth)/layout.tsx @@ -0,0 +1,11 @@ +import type { ReactNode } from 'react'; + +export default function AuthLayout({ children }: { children: ReactNode }): React.ReactElement { + return ( +
+
+ {children} +
+
+ ); +} diff --git a/apps/web/src/app/(auth)/login/page.tsx b/apps/web/src/app/(auth)/login/page.tsx new file mode 100644 index 0000000..40e86e8 --- /dev/null +++ b/apps/web/src/app/(auth)/login/page.tsx @@ -0,0 +1,58 @@ +'use client'; + +import Link from 'next/link'; + +export default function LoginPage(): React.ReactElement { + return ( +
+

Sign in

+

Sign in to your Mosaic account

+ +
e.preventDefault()}> +
+ + +
+ +
+ + +
+ + +
+ +

+ Don't have an account?{' '} + + Sign up + +

+
+ ); +} diff --git a/apps/web/src/app/(auth)/register/page.tsx b/apps/web/src/app/(auth)/register/page.tsx new file mode 100644 index 0000000..12d30bd --- /dev/null +++ b/apps/web/src/app/(auth)/register/page.tsx @@ -0,0 +1,73 @@ +'use client'; + +import Link from 'next/link'; + +export default function RegisterPage(): React.ReactElement { + return ( +
+

Create account

+

Get started with Mosaic

+ +
e.preventDefault()}> +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +

+ Already have an account?{' '} + + Sign in + +

+
+ ); +} diff --git a/apps/web/src/app/(dashboard)/chat/page.tsx b/apps/web/src/app/(dashboard)/chat/page.tsx new file mode 100644 index 0000000..74a5b04 --- /dev/null +++ b/apps/web/src/app/(dashboard)/chat/page.tsx @@ -0,0 +1,8 @@ +export default function ChatPage(): React.ReactElement { + return ( +
+

Chat

+

Conversations will appear here.

+
+ ); +} diff --git a/apps/web/src/app/(dashboard)/layout.tsx b/apps/web/src/app/(dashboard)/layout.tsx new file mode 100644 index 0000000..7e70dc1 --- /dev/null +++ b/apps/web/src/app/(dashboard)/layout.tsx @@ -0,0 +1,6 @@ +import type { ReactNode } from 'react'; +import { AppShell } from '@/components/layout/app-shell'; + +export default function DashboardLayout({ children }: { children: ReactNode }): React.ReactElement { + return {children}; +} diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css new file mode 100644 index 0000000..ef0295f --- /dev/null +++ b/apps/web/src/app/globals.css @@ -0,0 +1,115 @@ +@import 'tailwindcss'; + +/* + * Mosaic Stack design tokens mapped to Tailwind v4 theme. + * Source: @mosaic/design-tokens (AD-13) + * Fonts: Outfit (sans), Fira Code (mono) + * Palette: deep blue-grays + blue/purple/teal accents + * Default: dark theme + */ + +@theme { + /* ─── Fonts ─── */ + --font-sans: 'Outfit', system-ui, -apple-system, sans-serif; + --font-mono: 'Fira Code', ui-monospace, Menlo, monospace; + + /* ─── Neutral blue-gray scale ─── */ + --color-gray-50: #f0f2f5; + --color-gray-100: #dce0e8; + --color-gray-200: #b8c0cc; + --color-gray-300: #8e99a9; + --color-gray-400: #6b7a8d; + --color-gray-500: #4e5d70; + --color-gray-600: #3b4859; + --color-gray-700: #2a3544; + --color-gray-800: #1c2433; + --color-gray-900: #111827; + --color-gray-950: #0a0f1a; + + /* ─── Primary — blue ─── */ + --color-blue-50: #eff4ff; + --color-blue-100: #dae5ff; + --color-blue-200: #bdd1ff; + --color-blue-300: #8fb4ff; + --color-blue-400: #5b8bff; + --color-blue-500: #3b6cf7; + --color-blue-600: #2551e0; + --color-blue-700: #1d40c0; + --color-blue-800: #1e369c; + --color-blue-900: #1e317b; + --color-blue-950: #162050; + + /* ─── Accent — purple ─── */ + --color-purple-50: #f3f0ff; + --color-purple-100: #e7dfff; + --color-purple-200: #d2c3ff; + --color-purple-300: #b49aff; + --color-purple-400: #9466ff; + --color-purple-500: #7c3aed; + --color-purple-600: #6d28d9; + --color-purple-700: #5b21b6; + --color-purple-800: #4c1d95; + --color-purple-900: #3b1578; + --color-purple-950: #230d4d; + + /* ─── Accent — teal ─── */ + --color-teal-50: #effcf9; + --color-teal-100: #d0f7ef; + --color-teal-200: #a4eddf; + --color-teal-300: #6fddcb; + --color-teal-400: #3ec5b2; + --color-teal-500: #25aa99; + --color-teal-600: #1c897e; + --color-teal-700: #1b6e66; + --color-teal-800: #1a5853; + --color-teal-900: #194945; + --color-teal-950: #082d2b; + + /* ─── Semantic surface tokens ─── */ + --color-surface-bg: #0a0f1a; + --color-surface-card: #111827; + --color-surface-elevated: #1c2433; + --color-surface-border: #2a3544; + + /* ─── Semantic text tokens ─── */ + --color-text-primary: #f0f2f5; + --color-text-secondary: #8e99a9; + --color-text-muted: #6b7a8d; + + /* ─── Status colors ─── */ + --color-success: #22c55e; + --color-warning: #f59e0b; + --color-error: #ef4444; + --color-info: #3b82f6; + + /* ─── Sidebar width ─── */ + --spacing-sidebar: 16rem; +} + +/* ─── Base styles ─── */ +body { + background-color: var(--color-surface-bg); + color: var(--color-text-primary); + font-family: var(--font-sans); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* ─── Scrollbar styling ─── */ +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: var(--color-gray-600); + border-radius: 3px; +} + +::-webkit-scrollbar-thumb:hover { + background: var(--color-gray-500); +} diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 0d1bcc9..4daaf30 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -1,13 +1,29 @@ import type { ReactNode } from 'react'; +import { Outfit, Fira_Code } from 'next/font/google'; +import './globals.css'; + +const outfit = Outfit({ + subsets: ['latin'], + variable: '--font-sans', + display: 'swap', + weight: ['300', '400', '500', '600', '700'], +}); + +const firaCode = Fira_Code({ + subsets: ['latin'], + variable: '--font-mono', + display: 'swap', + weight: ['400', '500', '700'], +}); export const metadata = { title: 'Mosaic', description: 'Mosaic Stack Dashboard', }; -export default function RootLayout({ children }: { children: ReactNode }): ReactNode { +export default function RootLayout({ children }: { children: ReactNode }): React.ReactElement { return ( - + {children} ); diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 2621ebd..919618a 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -1,7 +1,5 @@ -export default function HomePage(): React.ReactElement { - return ( -
-

Mosaic Stack

-
- ); +import { redirect } from 'next/navigation'; + +export default function HomePage(): never { + redirect('/chat'); } diff --git a/apps/web/src/components/layout/app-shell.tsx b/apps/web/src/components/layout/app-shell.tsx new file mode 100644 index 0000000..660ad2d --- /dev/null +++ b/apps/web/src/components/layout/app-shell.tsx @@ -0,0 +1,19 @@ +import type { ReactNode } from 'react'; +import { Sidebar } from './sidebar'; +import { Topbar } from './topbar'; + +interface AppShellProps { + children: ReactNode; +} + +export function AppShell({ children }: AppShellProps): React.ReactElement { + return ( +
+ +
+ +
{children}
+
+
+ ); +} diff --git a/apps/web/src/components/layout/sidebar.tsx b/apps/web/src/components/layout/sidebar.tsx new file mode 100644 index 0000000..afd1a51 --- /dev/null +++ b/apps/web/src/components/layout/sidebar.tsx @@ -0,0 +1,59 @@ +'use client'; + +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; +import { cn } from '@/lib/cn'; + +interface NavItem { + label: string; + href: string; + icon: string; +} + +const navItems: NavItem[] = [ + { label: 'Chat', href: '/chat', icon: '💬' }, + { label: 'Tasks', href: '/tasks', icon: '📋' }, + { label: 'Projects', href: '/projects', icon: '📁' }, + { label: 'Settings', href: '/settings', icon: '⚙️' }, +]; + +export function Sidebar(): React.ReactElement { + const pathname = usePathname(); + + return ( + + ); +} diff --git a/apps/web/src/components/layout/topbar.tsx b/apps/web/src/components/layout/topbar.tsx new file mode 100644 index 0000000..2d4bb7d --- /dev/null +++ b/apps/web/src/components/layout/topbar.tsx @@ -0,0 +1,32 @@ +'use client'; + +import { useSession, signOut } from '@/lib/auth-client'; + +export function Topbar(): React.ReactElement { + const { data: session } = useSession(); + + return ( +
+
+ +
+ {session?.user ? ( + <> + + {session.user.name ?? session.user.email} + + + + ) : ( + Not signed in + )} +
+
+ ); +} diff --git a/apps/web/src/lib/api.ts b/apps/web/src/lib/api.ts new file mode 100644 index 0000000..d6d4694 --- /dev/null +++ b/apps/web/src/lib/api.ts @@ -0,0 +1,47 @@ +const GATEWAY_URL = process.env['NEXT_PUBLIC_GATEWAY_URL'] ?? 'http://localhost:4000'; + +export interface ApiRequestInit extends Omit { + body?: unknown; +} + +export interface ApiError { + statusCode: number; + message: string; +} + +/** + * Fetch wrapper for the Mosaic gateway API. + * Sends credentials (cookies) and JSON body automatically. + */ +export async function api(path: string, init?: ApiRequestInit): Promise { + const { body, headers: customHeaders, ...rest } = init ?? {}; + + const headers: Record = { + Accept: 'application/json', + ...(customHeaders as Record), + }; + + if (body !== undefined) { + headers['Content-Type'] = 'application/json'; + } + + const res = await fetch(`${GATEWAY_URL}${path}`, { + credentials: 'include', + ...rest, + headers, + body: body !== undefined ? JSON.stringify(body) : undefined, + }); + + if (!res.ok) { + const errorBody = (await res.json().catch(() => ({ + statusCode: res.status, + message: res.statusText, + }))) as ApiError; + throw Object.assign(new Error(errorBody.message), { + statusCode: errorBody.statusCode, + }); + } + + if (res.status === 204) return undefined as T; + return (await res.json()) as T; +} diff --git a/apps/web/src/lib/auth-client.ts b/apps/web/src/lib/auth-client.ts new file mode 100644 index 0000000..ed0b13f --- /dev/null +++ b/apps/web/src/lib/auth-client.ts @@ -0,0 +1,7 @@ +import { createAuthClient } from 'better-auth/react'; + +export const authClient: ReturnType = createAuthClient({ + baseURL: process.env['NEXT_PUBLIC_GATEWAY_URL'] ?? 'http://localhost:4000', +}); + +export const { useSession, signIn, signUp, signOut } = authClient; diff --git a/apps/web/src/lib/cn.ts b/apps/web/src/lib/cn.ts new file mode 100644 index 0000000..6ade40e --- /dev/null +++ b/apps/web/src/lib/cn.ts @@ -0,0 +1,7 @@ +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +/** Merge and deduplicate Tailwind class names. */ +export function cn(...inputs: ClassValue[]): string { + return twMerge(clsx(inputs)); +} diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts deleted file mode 100644 index 375a236..0000000 --- a/apps/web/tailwind.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { Config } from 'tailwindcss'; - -const config: Config = { - content: ['./src/**/*.{ts,tsx}'], - theme: { - extend: {}, - }, - plugins: [], -}; - -export default config; diff --git a/docs/TASKS.md b/docs/TASKS.md index 72b881e..3fba3c0 100644 --- a/docs/TASKS.md +++ b/docs/TASKS.md @@ -29,7 +29,7 @@ | P2-005 | done | Phase 2 | @mosaic/coord — migrate from v0, gateway integration | #77 | #23 | | P2-006 | done | Phase 2 | Agent session management — tmux + monitoring | #78 | #24 | | P2-007 | done | Phase 2 | Verify Phase 2 — multi-provider routing works | #79 | #25 | -| P3-001 | not-started | Phase 3 | apps/web scaffold — Next.js 16 + BetterAuth + Tailwind | — | #26 | +| P3-001 | in-progress | Phase 3 | apps/web scaffold — Next.js 16 + BetterAuth + Tailwind | — | #26 | | P3-002 | not-started | Phase 3 | Auth pages — login, registration, SSO redirect | — | #27 | | P3-003 | not-started | Phase 3 | Chat UI — conversations, messages, streaming | — | #28 | | P3-004 | not-started | Phase 3 | Task management — list view + kanban board | — | #29 | diff --git a/packages/design-tokens/package.json b/packages/design-tokens/package.json index 78e85e6..e9596dc 100644 --- a/packages/design-tokens/package.json +++ b/packages/design-tokens/package.json @@ -1,6 +1,7 @@ { "name": "@mosaic/design-tokens", "version": "0.0.0", + "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", "exports": { diff --git a/packages/design-tokens/src/colors.ts b/packages/design-tokens/src/colors.ts new file mode 100644 index 0000000..8f3fc0b --- /dev/null +++ b/packages/design-tokens/src/colors.ts @@ -0,0 +1,91 @@ +/** + * Mosaic Stack color palette. + * Deep blue-grays with blue/purple/teal accents. + */ + +export const colors = { + /** Neutral blue-gray scale */ + gray: { + 50: '#f0f2f5', + 100: '#dce0e8', + 200: '#b8c0cc', + 300: '#8e99a9', + 400: '#6b7a8d', + 500: '#4e5d70', + 600: '#3b4859', + 700: '#2a3544', + 800: '#1c2433', + 900: '#111827', + 950: '#0a0f1a', + }, + + /** Primary — blue */ + blue: { + 50: '#eff4ff', + 100: '#dae5ff', + 200: '#bdd1ff', + 300: '#8fb4ff', + 400: '#5b8bff', + 500: '#3b6cf7', + 600: '#2551e0', + 700: '#1d40c0', + 800: '#1e369c', + 900: '#1e317b', + 950: '#162050', + }, + + /** Accent — purple */ + purple: { + 50: '#f3f0ff', + 100: '#e7dfff', + 200: '#d2c3ff', + 300: '#b49aff', + 400: '#9466ff', + 500: '#7c3aed', + 600: '#6d28d9', + 700: '#5b21b6', + 800: '#4c1d95', + 900: '#3b1578', + 950: '#230d4d', + }, + + /** Accent — teal */ + teal: { + 50: '#effcf9', + 100: '#d0f7ef', + 200: '#a4eddf', + 300: '#6fddcb', + 400: '#3ec5b2', + 500: '#25aa99', + 600: '#1c897e', + 700: '#1b6e66', + 800: '#1a5853', + 900: '#194945', + 950: '#082d2b', + }, + + /** Semantic */ + success: '#22c55e', + warning: '#f59e0b', + error: '#ef4444', + info: '#3b82f6', + + /** Surface — dark theme defaults */ + surface: { + background: '#0a0f1a', + card: '#111827', + elevated: '#1c2433', + overlay: 'rgba(0, 0, 0, 0.6)', + border: '#2a3544', + }, + + /** Text */ + text: { + primary: '#f0f2f5', + secondary: '#8e99a9', + muted: '#6b7a8d', + inverse: '#0a0f1a', + }, +} as const; + +export type Colors = typeof colors; diff --git a/packages/design-tokens/src/fonts.ts b/packages/design-tokens/src/fonts.ts new file mode 100644 index 0000000..f071627 --- /dev/null +++ b/packages/design-tokens/src/fonts.ts @@ -0,0 +1,33 @@ +/** + * Mosaic Stack font definitions. + * Outfit (sans) — headings and body. + * Fira Code (mono) — code and terminal. + */ + +export const fonts = { + sans: { + family: 'Outfit', + fallback: 'system-ui, -apple-system, sans-serif', + stack: "'Outfit', system-ui, -apple-system, sans-serif", + weights: { + light: 300, + regular: 400, + medium: 500, + semibold: 600, + bold: 700, + }, + }, + + mono: { + family: 'Fira Code', + fallback: 'ui-monospace, Menlo, monospace', + stack: "'Fira Code', ui-monospace, Menlo, monospace", + weights: { + regular: 400, + medium: 500, + bold: 700, + }, + }, +} as const; + +export type Fonts = typeof fonts; diff --git a/packages/design-tokens/src/index.ts b/packages/design-tokens/src/index.ts index 0c18d5d..1fe6f30 100644 --- a/packages/design-tokens/src/index.ts +++ b/packages/design-tokens/src/index.ts @@ -1 +1,5 @@ -export const VERSION = '0.0.0'; +export const VERSION = '0.0.1'; + +export { colors, type Colors } from './colors.js'; +export { fonts, type Fonts } from './fonts.js'; +export { spacing, radius, type Spacing, type Radius } from './spacing.js'; diff --git a/packages/design-tokens/src/spacing.ts b/packages/design-tokens/src/spacing.ts new file mode 100644 index 0000000..2cfab68 --- /dev/null +++ b/packages/design-tokens/src/spacing.ts @@ -0,0 +1,38 @@ +/** + * Mosaic Stack spacing scale (in rem). + * Based on a 4px grid (0.25rem increments). + */ + +export const spacing = { + px: '1px', + 0: '0', + 0.5: '0.125rem', + 1: '0.25rem', + 1.5: '0.375rem', + 2: '0.5rem', + 2.5: '0.625rem', + 3: '0.75rem', + 4: '1rem', + 5: '1.25rem', + 6: '1.5rem', + 8: '2rem', + 10: '2.5rem', + 12: '3rem', + 16: '4rem', + 20: '5rem', + 24: '6rem', + 32: '8rem', +} as const; + +export const radius = { + none: '0', + sm: '0.25rem', + md: '0.375rem', + lg: '0.5rem', + xl: '0.75rem', + '2xl': '1rem', + full: '9999px', +} as const; + +export type Spacing = typeof spacing; +export type Radius = typeof radius; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72916e1..c61fdbc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^8.0.0 - version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) + version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': specifier: ^8.0.0 - version: 8.57.0(eslint@9.39.4)(typescript@5.9.3) + version: 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: ^9.0.0 - version: 9.39.4 + version: 9.39.4(jiti@2.6.1) husky: specifier: ^9.0.0 version: 9.1.7 @@ -34,10 +34,10 @@ importers: version: 5.9.3 typescript-eslint: specifier: ^8.0.0 - version: 8.57.0(eslint@9.39.4)(typescript@5.9.3) + version: 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) apps/gateway: dependencies: @@ -103,7 +103,7 @@ importers: version: 0.34.48 better-auth: specifier: ^1.5.5 - version: 1.5.5(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8))(mongodb@7.1.0(socks@2.8.7))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@2.1.9(@types/node@22.19.15)) + version: 1.5.5(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8))(mongodb@7.1.0(socks@2.8.7))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@2.1.9(@types/node@22.19.15)(lightningcss@1.31.1)) fastify: specifier: ^5.0.0 version: 5.8.2 @@ -134,10 +134,19 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) apps/web: dependencies: + '@mosaic/design-tokens': + specifier: workspace:^ + version: link:../../packages/design-tokens + better-auth: + specifier: ^1.5.5 + version: 1.5.5(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8))(mongodb@7.1.0(socks@2.8.7))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@2.1.9(@types/node@22.19.15)(lightningcss@1.31.1)) + clsx: + specifier: ^2.1.0 + version: 2.1.1 next: specifier: ^16.0.0 version: 16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -147,7 +156,13 @@ importers: react-dom: specifier: ^19.0.0 version: 19.2.4(react@19.2.4) + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 devDependencies: + '@tailwindcss/postcss': + specifier: ^4.0.0 + version: 4.2.1 '@types/node': specifier: ^22.0.0 version: 22.19.15 @@ -165,7 +180,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/agent: dependencies: @@ -178,7 +193,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/auth: dependencies: @@ -187,7 +202,7 @@ importers: version: link:../db better-auth: specifier: ^1.5.5 - version: 1.5.5(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8))(mongodb@7.1.0(socks@2.8.7))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@2.1.9(@types/node@22.19.15)) + version: 1.5.5(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8))(mongodb@7.1.0(socks@2.8.7))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@2.1.9(@types/node@22.19.15)(lightningcss@1.31.1)) devDependencies: '@types/node': specifier: ^22.0.0 @@ -200,7 +215,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/brain: dependencies: @@ -216,7 +231,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/cli: dependencies: @@ -250,7 +265,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/coord: dependencies: @@ -266,7 +281,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/db: dependencies: @@ -291,7 +306,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/design-tokens: devDependencies: @@ -300,7 +315,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/log: devDependencies: @@ -309,7 +324,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/memory: dependencies: @@ -322,7 +337,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/mosaic: devDependencies: @@ -331,7 +346,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/prdy: devDependencies: @@ -340,7 +355,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/quality-rails: devDependencies: @@ -349,7 +364,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/queue: dependencies: @@ -365,7 +380,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages/types: dependencies: @@ -381,7 +396,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) plugins/discord: dependencies: @@ -400,7 +415,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) plugins/telegram: devDependencies: @@ -409,7 +424,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@22.19.15) + version: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) packages: @@ -417,6 +432,10 @@ packages: resolution: {integrity: sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw==} engines: {node: '>=14.13.1'} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@anthropic-ai/sdk@0.73.0': resolution: {integrity: sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw==} hasBin: true @@ -1498,9 +1517,22 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} @@ -2568,6 +2600,94 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tailwindcss/node@4.2.1': + resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} + + '@tailwindcss/oxide-android-arm64@4.2.1': + resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.1': + resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.1': + resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.1': + resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.1': + resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.1': + resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} + 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.2.1': + resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.1': + resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.1': + resolution: {integrity: sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==} + '@tokenizer/inflate@0.4.1': resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} engines: {node: '>=18'} @@ -3029,6 +3149,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -3260,6 +3384,10 @@ packages: resolution: {integrity: sha512-U2SN0w3OpjFRVlrc17E6TMDmH58Xl9rai1MblNjAdwWp07Kk+llmzX0hjDpQdrDGzwmvOtgM5yI+meYX6iZ2xA==} engines: {node: '>=10.2.0'} + enhanced-resolve@5.20.0: + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} + engines: {node: '>=10.13.0'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -3683,6 +3811,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jose@6.2.1: resolution: {integrity: sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==} @@ -3741,6 +3873,76 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lightningcss-android-arm64@1.31.1: + resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.31.1: + resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.31.1: + resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.31.1: + resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.31.1: + resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.31.1: + resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.31.1: + resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.31.1: + resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.31.1: + resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.31.1: + resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.31.1: + resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.31.1: + resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -4463,9 +4665,16 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + tailwindcss@4.2.1: resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -4815,6 +5024,8 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 4.0.0 + '@alloc/quick-lru@5.2.0': {} + '@anthropic-ai/sdk@0.73.0(zod@4.3.6)': dependencies: json-schema-to-ts: 3.1.1 @@ -5608,9 +5819,9 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': dependencies: - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -5829,8 +6040,25 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@js-sdsl/ordered-map@4.4.2': {} '@lukeed/csprng@1.1.0': {} @@ -7190,6 +7418,75 @@ snapshots: dependencies: tslib: 2.8.1 + '@tailwindcss/node@4.2.1': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.0 + jiti: 2.6.1 + lightningcss: 1.31.1 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.1 + + '@tailwindcss/oxide-android-arm64@4.2.1': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.1': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.1': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.1': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.1': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': + optional: true + + '@tailwindcss/oxide@4.2.1': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.1 + '@tailwindcss/oxide-darwin-arm64': 4.2.1 + '@tailwindcss/oxide-darwin-x64': 4.2.1 + '@tailwindcss/oxide-freebsd-x64': 4.2.1 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 + '@tailwindcss/oxide-linux-x64-musl': 4.2.1 + '@tailwindcss/oxide-wasm32-wasi': 4.2.1 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 + + '@tailwindcss/postcss@4.2.1': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.1 + '@tailwindcss/oxide': 4.2.1 + postcss: 8.5.8 + tailwindcss: 4.2.1 + '@tokenizer/inflate@0.4.1': dependencies: debug: 4.4.3 @@ -7287,15 +7584,15 @@ snapshots: '@types/node': 22.19.15 optional: true - '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/type-utils': 8.57.0(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.57.0 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -7303,14 +7600,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.57.0 '@typescript-eslint/types': 8.57.0 '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7333,13 +7630,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.57.0 '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -7362,13 +7659,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.57.0 '@typescript-eslint/types': 8.57.0 '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7385,13 +7682,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.15))': + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.15)(lightningcss@1.31.1))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@22.19.15) + vite: 5.4.21(@types/node@22.19.15)(lightningcss@1.31.1) '@vitest/pretty-format@2.1.9': dependencies: @@ -7502,7 +7799,7 @@ snapshots: basic-ftp@5.2.0: {} - better-auth@1.5.5(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8))(mongodb@7.1.0(socks@2.8.7))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@2.1.9(@types/node@22.19.15)): + better-auth@1.5.5(drizzle-kit@0.31.9)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8))(mongodb@7.1.0(socks@2.8.7))(next@16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(vitest@2.1.9(@types/node@22.19.15)(lightningcss@1.31.1)): dependencies: '@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(better-call@1.3.2(zod@4.3.6))(jose@6.2.1)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.45.1(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(kysely@0.28.11)(postgres@3.4.8)) @@ -7528,7 +7825,7 @@ snapshots: next: 16.1.6(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - vitest: 2.1.9(@types/node@22.19.15) + vitest: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -7643,6 +7940,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clsx@2.1.1: {} + cluster-key-slot@1.1.2: {} code-excerpt@4.0.0: @@ -7706,8 +8005,7 @@ snapshots: dequal@2.0.3: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} diff@8.0.3: {} @@ -7795,6 +8093,11 @@ snapshots: - supports-color - utf-8-validate + enhanced-resolve@5.20.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + environment@1.1.0: {} es-module-lexer@1.7.0: {} @@ -7942,9 +8245,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4: + eslint@9.39.4(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 @@ -7978,6 +8281,8 @@ snapshots: minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -8388,6 +8693,8 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jiti@2.6.1: {} + jose@6.2.1: {} js-tokens@4.0.0: {} @@ -8450,6 +8757,55 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.2 + lightningcss-android-arm64@1.31.1: + optional: true + + lightningcss-darwin-arm64@1.31.1: + optional: true + + lightningcss-darwin-x64@1.31.1: + optional: true + + lightningcss-freebsd-x64@1.31.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.31.1: + optional: true + + lightningcss-linux-arm64-gnu@1.31.1: + optional: true + + lightningcss-linux-arm64-musl@1.31.1: + optional: true + + lightningcss-linux-x64-gnu@1.31.1: + optional: true + + lightningcss-linux-x64-musl@1.31.1: + optional: true + + lightningcss-win32-arm64-msvc@1.31.1: + optional: true + + lightningcss-win32-x64-msvc@1.31.1: + optional: true + + lightningcss@1.31.1: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.31.1 + lightningcss-darwin-arm64: 1.31.1 + lightningcss-darwin-x64: 1.31.1 + lightningcss-freebsd-x64: 1.31.1 + lightningcss-linux-arm-gnueabihf: 1.31.1 + lightningcss-linux-arm64-gnu: 1.31.1 + lightningcss-linux-arm64-musl: 1.31.1 + lightningcss-linux-x64-gnu: 1.31.1 + lightningcss-linux-x64-musl: 1.31.1 + lightningcss-win32-arm64-msvc: 1.31.1 + lightningcss-win32-x64-msvc: 1.31.1 + lilconfig@3.1.3: {} lint-staged@15.5.2: @@ -9174,8 +9530,12 @@ snapshots: dependencies: has-flag: 4.0.0 + tailwind-merge@3.5.0: {} + tailwindcss@4.2.1: {} + tapable@2.3.0: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -9269,13 +9629,13 @@ snapshots: type-fest@4.41.0: {} - typescript-eslint@8.57.0(eslint@9.39.4)(typescript@5.9.3): + typescript-eslint@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.57.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 + '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -9304,13 +9664,13 @@ snapshots: vary@1.1.2: {} - vite-node@2.1.9(@types/node@22.19.15): + vite-node@2.1.9(@types/node@22.19.15)(lightningcss@1.31.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.21(@types/node@22.19.15) + vite: 5.4.21(@types/node@22.19.15)(lightningcss@1.31.1) transitivePeerDependencies: - '@types/node' - less @@ -9322,7 +9682,7 @@ snapshots: - supports-color - terser - vite@5.4.21(@types/node@22.19.15): + vite@5.4.21(@types/node@22.19.15)(lightningcss@1.31.1): dependencies: esbuild: 0.21.5 postcss: 8.5.8 @@ -9330,11 +9690,12 @@ snapshots: optionalDependencies: '@types/node': 22.19.15 fsevents: 2.3.3 + lightningcss: 1.31.1 - vitest@2.1.9(@types/node@22.19.15): + vitest@2.1.9(@types/node@22.19.15)(lightningcss@1.31.1): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.15)) + '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.15)(lightningcss@1.31.1)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -9350,8 +9711,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@22.19.15) - vite-node: 2.1.9(@types/node@22.19.15) + vite: 5.4.21(@types/node@22.19.15)(lightningcss@1.31.1) + vite-node: 2.1.9(@types/node@22.19.15)(lightningcss@1.31.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.15