Hapus fitur materi seluruhnya dari GMW monorepo: Backend: - Hapus module materi/ (index.ts, materi.repository.ts, materi.schema.ts, materi.service.ts, ragClient.ts) - Hapus materiRouter dari orpc/router.ts (imports, const, appRouter entry) - Hapus pgMateriDocumentsTable + types dari shared/database/schema.ts Frontend: - Hapus route pages app/(dashboard)/materi/ (page, [id], chat, new) - Hapus lib/api/materi.ts (oRPC client wrappers) - Hapus lib/types/materi.ts + export dari index.ts - Hapus nav item "Materi" dari lib/navigation.ts + unused BookOpen import Scripts: - Hapus scripts/add-materi-documents.sql - Tambah scripts/drop-materi-documents.sql (ops DB cleanup) Verification: - Backend: npx tsc --noEmit — clean (exit 0) - Frontend: npx tsc --noEmit — clean (exit 0) - Grep: zero materi code references remaining (hanya di drop-materi-documents.sql) RAG dependencies (messages/embed.ts, messages/qdrant.ts) tetap karena juga dipakai oleh messages.service.ts.
Bete Frontend
Next.js 16 (React 19) dashboard untuk Discord Moderation Watcher.
Stack: Next.js 16 (App Router, static export), React 19, TypeScript strict, Tailwind v4, shadcn/ui, base-ui, lucide-react.
Dev
bun run dev # next dev — port 3000 (lokal; prod via nginx 4009)
bun run build # next build — static export ke out/
bun run lint # Biome check
Architecture
src/
├── app/ # Pages
│ ├── page.tsx # Redirect ke /dashboard
│ └── dashboard/ # Dashboard layout + tabs
│ ├── layout.tsx # Sidebar, header, WS provider, chatbot
│ └── page.tsx # Tab routing (messages/live/dashboard)
├── features/
│ ├── messages/ # Message feed, search, review, detail modal
│ ├── live/ # Voice connection, music player, recordings
│ ├── dashboard/ # Stats, users, channels overview
│ └── chatbot/ # AI chatbot
├── lib/
│ ├── api/ # Fetch-based API client (all BE endpoints)
│ ├── ws/ # WebSocket client + React context
│ └── hooks/ # Shared hooks (config, auth)
└── components/
└── layout/ # Sidebar, header, mobile tab bar
API
Backend berjalan di port 4001. Frontend mengakses API via window.location (same-origin atau proxy).
WebSocket terhubung otomatis ke /ws di host yang sama.