525 lines
18 KiB
Markdown
525 lines
18 KiB
Markdown
# GRIMLOCK - COMPLETE SYSTEM OVERVIEW
|
|
|
|
## ARCHITECTURE
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ GRIMLOCK │
|
|
│ AI-Native Company Operating System │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
|
|
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
|
|
│ │ │ │ │ │
|
|
│ FRONTEND │ ◄────► │ BACKEND │ ◄────► │ ANTHROPIC │
|
|
│ (Next.js) │ │ (FastAPI) │ │ Claude API │
|
|
│ │ │ │ │ │
|
|
└──────────────────┘ └──────────────────┘ └──────────────────┘
|
|
│ │
|
|
│ │
|
|
▼ ▼
|
|
┌──────────────────┐ ┌──────────────────┐
|
|
│ WebSocket │ │ PostgreSQL │
|
|
│ (Socket.IO) │ │ + Redis │
|
|
└──────────────────┘ └──────────────────┘
|
|
```
|
|
|
|
## USER FLOW
|
|
|
|
```
|
|
1. REGISTRATION/LOGIN
|
|
┌─────────┐
|
|
│ Browser │
|
|
└────┬────┘
|
|
│
|
|
├──► Register (email, name, password, role)
|
|
│ ├─► Backend validates
|
|
│ ├─► Creates user in DB
|
|
│ └─► Returns JWT token
|
|
│
|
|
├──► Login (email, password)
|
|
│ ├─► Backend verifies
|
|
│ └─► Returns JWT token
|
|
│
|
|
└──► Token stored in localStorage
|
|
Frontend redirects to /
|
|
|
|
|
|
2. MAIN APPLICATION
|
|
┌──────────────────────────────────────────────┐
|
|
│ Sidebar │ Main Content │
|
|
│ │ │
|
|
│ 📁 Channels │ ┌────────────────────┐ │
|
|
│ • general │ │ # general │ │
|
|
│ • engineering │ │ ──────────────────│ │
|
|
│ • + New │ │ │ │
|
|
│ │ │ Messages: │ │
|
|
│ 💬 DMs │ │ User: Hi team! │ │
|
|
│ • Alice (2) │ │ AI: Hello! │ │
|
|
│ • Bob │ │ User: @grimlock │ │
|
|
│ │ │ help with code │ │
|
|
│ 👤 Profile │ │ AI: Sure! ... │ │
|
|
│ Your Name │ │ │ │
|
|
│ engineer │ │ [Type message...] │ │
|
|
│ 🔓 Logout │ └────────────────────┘ │
|
|
│ │ │
|
|
└──────────────────────────────────────────────┘
|
|
|
|
|
|
3. REAL-TIME MESSAGING
|
|
┌────────────┐ ┌────────────┐
|
|
│ User A │ │ User B │
|
|
└─────┬──────┘ └─────┬──────┘
|
|
│ │
|
|
│ Types "Hello" │
|
|
│ ─────────────► │
|
|
│ WebSocket │
|
|
│ Backend │
|
|
│ ├──────────────►│
|
|
│ │ "Hello" │
|
|
│ │ (instant) │
|
|
│ │
|
|
│ Sees typing indicator │
|
|
│ ◄────────────────────────────────┤
|
|
│ │
|
|
│ @grimlock query │
|
|
│ ─────────────► │
|
|
│ AI processes │
|
|
│ in background │
|
|
│ ◄─────────── │
|
|
│ AI response │
|
|
└──────────────────────────────────►
|
|
(Both see AI response)
|
|
|
|
|
|
4. CHANNEL MANAGEMENT
|
|
┌──────────────────────────────────────┐
|
|
│ Create Channel │
|
|
│ ──────────────────────────────── │
|
|
│ Name: engineering │
|
|
│ Description: Dev team chat │
|
|
│ Private: ☑ │
|
|
│ [Create] │
|
|
│ │
|
|
│ ↓ │
|
|
│ Channel appears in sidebar │
|
|
│ User auto-joins as creator │
|
|
│ Can invite others │
|
|
│ Can leave later │
|
|
└──────────────────────────────────────┘
|
|
|
|
|
|
5. DIRECT MESSAGES
|
|
┌──────────────────────────────────────┐
|
|
│ 💬 Alice │
|
|
│ ──────────────────────────────── │
|
|
│ 🟢 Online · engineer │
|
|
│ │
|
|
│ You: Hey Alice │
|
|
│ Alice: Hi! What's up? │
|
|
│ You: @grimlock summarize Q3 report │
|
|
│ AI: Based on the Q3 report... │
|
|
│ │
|
|
│ [Type message...] │
|
|
└──────────────────────────────────────┘
|
|
```
|
|
|
|
## DATA FLOW
|
|
|
|
```
|
|
MESSAGE SENDING
|
|
──────────────
|
|
|
|
User Types → Frontend validates
|
|
↓
|
|
WebSocket.emit('send')
|
|
↓
|
|
Backend receives
|
|
↓
|
|
┌────────┴────────┐
|
|
│ │
|
|
↓ ↓
|
|
Save to DB Check for @grimlock
|
|
│ │
|
|
↓ ↓
|
|
Return msg Trigger AI
|
|
│ (background)
|
|
↓ │
|
|
WebSocket Process with
|
|
.broadcast Claude API
|
|
│ │
|
|
↓ ↓
|
|
All users AI response saved
|
|
receive to DB
|
|
instantly │
|
|
↓
|
|
WebSocket.broadcast
|
|
│
|
|
↓
|
|
All users receive
|
|
AI response
|
|
```
|
|
|
|
## STATE MANAGEMENT
|
|
|
|
```
|
|
ZUSTAND STORES
|
|
──────────────
|
|
|
|
useAuthStore
|
|
├─ user: User | null
|
|
├─ isAuthenticated: boolean
|
|
├─ login(email, password)
|
|
├─ register(data)
|
|
├─ logout()
|
|
└─ loadUser() (on app start)
|
|
|
|
useChannelStore
|
|
├─ channels: Channel[]
|
|
├─ loadChannels()
|
|
├─ createChannel(data)
|
|
├─ joinChannel(id)
|
|
└─ leaveChannel(id)
|
|
|
|
useMessageStore
|
|
├─ messagesByChannel: Record<id, Message[]>
|
|
├─ dmsByUser: Record<userId, DirectMessage[]>
|
|
├─ conversations: Conversation[]
|
|
├─ typingUsers: Record<channelId, Set<userId>>
|
|
├─ loadMessages(channelId)
|
|
├─ loadDirectMessages(userId)
|
|
├─ addMessage(channelId, message)
|
|
├─ setUserTyping(channelId, userId)
|
|
└─ setUserStoppedTyping(channelId, userId)
|
|
```
|
|
|
|
## COMPONENT HIERARCHY
|
|
|
|
```
|
|
App
|
|
└─ RootLayout
|
|
├─ HomePage (/) → redirects
|
|
├─ LoginPage (/login)
|
|
├─ RegisterPage (/register)
|
|
└─ MainLayout (/(main))
|
|
├─ Sidebar
|
|
│ ├─ Channel List
|
|
│ │ └─ Channel Items
|
|
│ ├─ DM List
|
|
│ │ └─ Conversation Items
|
|
│ └─ User Profile
|
|
│
|
|
├─ ChannelPage (/channels/[id])
|
|
│ ├─ Channel Header
|
|
│ ├─ MessageList
|
|
│ │ └─ Message Items
|
|
│ └─ MessageInput
|
|
│
|
|
└─ DMPage (/dms/[userId])
|
|
├─ DM Header
|
|
├─ MessageList
|
|
│ └─ Message Items
|
|
└─ MessageInput
|
|
```
|
|
|
|
## API ENDPOINTS (ALL IMPLEMENTED)
|
|
|
|
```
|
|
AUTHENTICATION
|
|
──────────────
|
|
POST /api/auth/register Create account
|
|
POST /api/auth/login Get JWT token
|
|
GET /api/auth/me Current user info
|
|
POST /api/auth/logout Logout
|
|
|
|
CHANNELS
|
|
────────
|
|
GET /api/channels List all channels
|
|
POST /api/channels Create channel
|
|
GET /api/channels/:id Channel details
|
|
POST /api/channels/:id/join Join channel
|
|
POST /api/channels/:id/leave Leave channel
|
|
|
|
MESSAGES
|
|
────────
|
|
GET /api/channels/:id/messages Get messages
|
|
POST /api/channels/:id/messages Send message
|
|
|
|
DIRECT MESSAGES
|
|
───────────────
|
|
GET /api/dms/conversations List conversations
|
|
GET /api/dms/:userId/messages Get DM history
|
|
POST /api/dms Send DM
|
|
|
|
FILES
|
|
─────
|
|
POST /api/files/upload Upload file
|
|
GET /api/files/:id/download Download file
|
|
GET /api/files List files
|
|
DELETE /api/files/:id Delete file
|
|
|
|
WEBSOCKET
|
|
─────────
|
|
connect Join with JWT
|
|
join_channel Join channel room
|
|
leave_channel Leave channel room
|
|
typing_start Start typing
|
|
typing_stop Stop typing
|
|
→ new_message Receive message
|
|
→ new_dm Receive DM
|
|
→ user_typing User is typing
|
|
→ user_stopped_typing User stopped
|
|
```
|
|
|
|
## DEPLOYMENT ARCHITECTURE
|
|
|
|
```
|
|
DEVELOPMENT
|
|
───────────
|
|
┌──────────────┐ localhost:3000 ┌──────────────┐
|
|
│ Frontend │ ◄────────────────►│ Browser │
|
|
│ Next.js │ │ │
|
|
│ │ └──────────────┘
|
|
│ npm run dev │
|
|
└──────┬───────┘
|
|
│ API calls
|
|
│ localhost:8000
|
|
▼
|
|
┌──────────────┐
|
|
│ Backend │
|
|
│ FastAPI │
|
|
│ │
|
|
│ docker- │
|
|
│ compose up │
|
|
└──────┬───────┘
|
|
│
|
|
▼
|
|
┌──────────────┐
|
|
│ PostgreSQL │
|
|
│ + Redis │
|
|
└──────────────┘
|
|
|
|
|
|
PRODUCTION (Future)
|
|
───────────────────
|
|
┌──────────────┐ HTTPS ┌──────────────┐
|
|
│ Frontend │ ────────►│ Nginx │
|
|
│ Next.js │ │ Reverse │
|
|
│ (build) │ │ Proxy │
|
|
└──────────────┘ └──────┬───────┘
|
|
│
|
|
▼
|
|
┌──────────────┐
|
|
│ Backend │
|
|
│ FastAPI │
|
|
└──────┬───────┘
|
|
│
|
|
▼
|
|
┌──────────────┐
|
|
│ PostgreSQL │
|
|
│ (managed) │
|
|
└──────────────┘
|
|
```
|
|
|
|
## SECURITY
|
|
|
|
```
|
|
AUTHENTICATION FLOW
|
|
───────────────────
|
|
|
|
1. User logs in
|
|
↓
|
|
2. Backend verifies credentials
|
|
↓
|
|
3. Backend generates JWT token
|
|
↓
|
|
4. Frontend stores in localStorage
|
|
↓
|
|
5. Every API request includes:
|
|
Authorization: Bearer <token>
|
|
↓
|
|
6. Backend validates token
|
|
↓
|
|
7. If valid → allow request
|
|
If invalid → 401 response
|
|
↓
|
|
8. Frontend intercepts 401 → redirect to login
|
|
|
|
|
|
WEBSOCKET AUTHENTICATION
|
|
─────────────────────────
|
|
|
|
1. Client connects with:
|
|
auth: { token: JWT }
|
|
↓
|
|
2. Server validates token
|
|
↓
|
|
3. If valid → establish connection
|
|
If invalid → reject connection
|
|
↓
|
|
4. All WebSocket messages
|
|
associated with user_id
|
|
from token
|
|
```
|
|
|
|
## REAL-TIME FEATURES
|
|
|
|
```
|
|
TYPING INDICATORS
|
|
─────────────────
|
|
|
|
User types → Start timeout
|
|
↓
|
|
Emit typing_start
|
|
↓
|
|
Backend broadcasts to channel
|
|
↓
|
|
Other users see "User is typing..."
|
|
↓
|
|
After 2 seconds of no typing
|
|
↓
|
|
Emit typing_stop
|
|
↓
|
|
Indicator disappears
|
|
|
|
|
|
ONLINE STATUS
|
|
─────────────
|
|
|
|
User connects → WebSocket established
|
|
↓
|
|
User marked online
|
|
↓
|
|
Broadcast user_online
|
|
↓
|
|
User disconnects/closes tab
|
|
↓
|
|
User marked offline
|
|
↓
|
|
Broadcast user_offline
|
|
```
|
|
|
|
## AI INTEGRATION (@grimlock)
|
|
|
|
```
|
|
USER MENTIONS AI
|
|
────────────────
|
|
|
|
User types: "@grimlock what is UTILEN?"
|
|
↓
|
|
Message saved to DB
|
|
↓
|
|
Broadcast to users (instant)
|
|
↓
|
|
Backend detects @grimlock
|
|
↓
|
|
Background task started
|
|
↓
|
|
┌───────────────────────────┐
|
|
│ 1. Load conversation │
|
|
│ history from DB │
|
|
│ │
|
|
│ 2. Load company context │
|
|
│ from files │
|
|
│ │
|
|
│ 3. Call Claude API │
|
|
│ with context │
|
|
│ │
|
|
│ 4. Get AI response │
|
|
│ │
|
|
│ 5. Save to DB with │
|
|
│ is_ai_response=true │
|
|
│ │
|
|
│ 6. Broadcast via │
|
|
│ WebSocket │
|
|
└───────────────────────────┘
|
|
↓
|
|
All users see AI response
|
|
with purple indicator
|
|
```
|
|
|
|
## WHAT MAKES THIS SPECIAL
|
|
|
|
1. **AI-Native**
|
|
- AI is not bolted on
|
|
- AI participates in every conversation
|
|
- Context-aware responses
|
|
- Company knowledge integrated
|
|
|
|
2. **Real-Time First**
|
|
- WebSocket for everything
|
|
- No polling, no delays
|
|
- Typing indicators
|
|
- Instant presence
|
|
|
|
3. **Production-Ready**
|
|
- TypeScript throughout
|
|
- Error handling
|
|
- Loading states
|
|
- Optimistic updates
|
|
- Docker deployment
|
|
|
|
4. **Developer-Friendly**
|
|
- Clear separation of concerns
|
|
- Zustand for state
|
|
- Axios for HTTP
|
|
- Socket.IO for WS
|
|
- Tailwind for styling
|
|
|
|
5. **Scalable Architecture**
|
|
- Stateless backend
|
|
- JWT auth (horizontal scaling)
|
|
- Room-based WebSocket
|
|
- Efficient DB queries
|
|
|
|
## TOKEN EFFICIENCY
|
|
|
|
```
|
|
Session 1-2: Backend Development
|
|
─────────────────────────────────
|
|
Planning + Architecture: 20k tokens
|
|
Auth System: 12k tokens
|
|
Channels: 10k tokens
|
|
Messages + @grimlock: 15k tokens
|
|
WebSocket: 25k tokens
|
|
DMs: 15k tokens
|
|
Files: 12k tokens
|
|
Testing + Docs: 31k tokens
|
|
────────────
|
|
Total Backend: 140k tokens
|
|
|
|
Session 3: Frontend Development
|
|
────────────────────────────────
|
|
Context Loading: 15k tokens
|
|
Auth Pages: 8k tokens
|
|
Main Layout: 6k tokens
|
|
Sidebar: 5k tokens
|
|
Channel Page: 8k tokens
|
|
DM Page: 7k tokens
|
|
Message Components: 6k tokens
|
|
Stores: 8k tokens
|
|
Build + Debug: 3k tokens
|
|
Documentation: 4k tokens
|
|
────────────
|
|
Total Frontend: 70k tokens
|
|
|
|
GRAND TOTAL: 210k tokens
|
|
Per Session Average: 70k tokens
|
|
|
|
Features per 10k tokens:
|
|
• 1 complete auth system
|
|
• 2 major features
|
|
• 3-4 components
|
|
• Full integration
|
|
```
|
|
|
|
---
|
|
|
|
**This is what 3 sessions of focused development looks like:**
|
|
- Complete backend platform
|
|
- Complete frontend application
|
|
- Real-time communication
|
|
- AI integration throughout
|
|
- Production-ready software
|
|
|
|
**From idea to deployed product in <210k tokens.**
|