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 (
+
+ );
+}
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
+
+
+
+
+ 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
+
+
+
+
+ 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 (
+
+ );
+}
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 (
+
+ );
+}
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