Build out apps/web with Tailwind CSS v4, BetterAuth client, and the Mosaic
design system. Populate @mosaic/design-tokens with actual color palette
(deep blue-grays, blue/purple/teal accents), font definitions (Outfit/Fira Code),
and spacing scale per AD-13.
- Tailwind v4 CSS-first config with @theme tokens in globals.css
- next/font for self-hosted Outfit + Fira Code (no Google CDN)
- App shell with sidebar nav, topbar, and content area
- Route groups: (dashboard) with AppShell, (auth) with centered card
- Placeholder pages: /chat, /login, /register
- BetterAuth React client (useSession, signIn, signUp, signOut)
- Gateway API fetch wrapper with credentials
- cn() utility with clsx + tailwind-merge
- Dark theme default, WCAG-friendly contrast
Refs #26
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add @Inject() to all gateway constructor params (required without emitDecoratorMetadata)
- AgentService: ProviderService, CoordService
- RoutingService: ProviderService
- ProvidersController: ProviderService, RoutingService
- SessionsController: AgentService
- Fix coord controller ALLOWED_ROOTS to walk up to monorepo root (pnpm-workspace.yaml)
- Gateway now boots and serves all routes correctly
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pi SDK is ESM-only. tsx (esbuild) doesn't emit decorator metadata,
so NestJS constructor injection fails without explicit @Inject().
- Set "type": "module" in gateway package.json
- Switch tsconfig to NodeNext module resolution
- Add @Inject(AgentService) to ChatController and ChatGateway
Tested end-to-end: REST /api/chat → Pi SDK → Anthropic → response OK.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>