## Development Guide ### Browser Only 1. Clone repository 2. Install dependencies ```bash pnpm install ``` 3. Start development server: ```bash pnpm run dev ``` ### With Backend 1. Clone repository 2. Install dependencies ```bash pnpm install ``` 3. Configure environment ```bash cp .env.example .env # Edit .env with your Telegram API keys, DATABASE_TYPE / DATABASE_URL, PROXY_URL, etc. ``` 4. Start database container: ```bash # Docker is only used for database container in local development. docker compose up -d pgvector ``` 5. Start services: ```bash # Start backend pnpm run server:dev # Start frontend pnpm run web:dev ``` ## Architecture ```mermaid graph TB subgraph "🖥️ Frontend Layer" Frontend["Web Frontend
(Vue 3 + Pinia)"] Electron["Electron Desktop"] subgraph "Client Event Handlers" ClientAuth["Auth Handler"] ClientMessage["Message Handler"] ClientStorage["Storage Handler"] ClientEntity["Entity Handler"] ClientServer["Server Handler"] end end subgraph "🌐 Communication Layer" WS["WebSocket Event Bridge
Real-time Bidirectional
• Event Registration
• Event Forwarding
• Session Management"] end subgraph "🚀 Backend Service Layer" Server["Backend Server
(REST API)"] subgraph "Session Management" SessionMgr["Session Manager
• Client State
• CoreContext Instance
• Event Listeners"] end end subgraph "🎯 Core Event System" Context["CoreContext
🔥 Central Event Bus
(EventEmitter3)
• ToCoreEvent
• FromCoreEvent
• Event Wrappers
• Error Handling"] subgraph "Core Event Handlers" AuthHandler["🔐 Auth Handler"] MessageHandler["📝 Message Handler"] DialogHandler["💬 Dialog Handler"] StorageHandler["📦 Storage Handler"] ConfigHandler["⚙️ Config Handler"] EntityHandler["👤 Entity Handler"] GramEventsHandler["📡 Gram Events Handler"] MessageResolverHandler["🔄 Message Resolver Handler"] end end subgraph "🔧 Business Service Layer" subgraph "Services" AuthService["Authentication
Service"] MessageService["Message
Service"] DialogService["Dialog
Service"] StorageService["Storage
Service"] ConfigService["Config
Service"] EntityService["Entity
Service"] ConnectionService["Connection
Service"] TakeoutService["Takeout
Service"] end subgraph "Message Processing Pipeline" MsgResolverService["Message Resolver
Service"] subgraph "Message Resolvers" EmbeddingResolver["🤖 Embedding
Resolver
(OpenAI)"] JiebaResolver["📚 Jieba
Resolver
(Chinese Segmentation)"] LinkResolver["🔗 Link
Resolver"] MediaResolver["📸 Media
Resolver"] UserResolver["👤 User
Resolver"] end end end subgraph "🗄️ Data Layer" DB["PostgreSQL
+ pgvector"] Drizzle["Drizzle ORM"] end subgraph "📡 External APIs" TelegramAPI["Telegram API
(gram.js)"] OpenAI["OpenAI API
Vector Embeddings"] end %% WebSocket Event Flow Frontend -.->|"WsEventToServer
• auth:login
• message:query
• dialog:fetch"| WS WS -.->|"WsEventToClient
• message:data
• auth:status
• storage:progress"| Frontend Electron -.->|"WebSocket Events"| WS WS -.->|"Real-time Updates"| Electron %% Server Layer WS <--> Server Server --> SessionMgr SessionMgr --> Context %% Core Event System (Key Architecture Highlight) Context <==> AuthHandler Context <==> MessageHandler Context <==> DialogHandler Context <==> StorageHandler Context <==> ConfigHandler Context <==> EntityHandler Context <==> GramEventsHandler Context <==> MessageResolverHandler %% Event Handlers to Services AuthHandler --> AuthService MessageHandler --> MessageService DialogHandler --> DialogService StorageHandler --> StorageService ConfigHandler --> ConfigService EntityHandler --> EntityService GramEventsHandler --> ConnectionService MessageResolverHandler --> MsgResolverService %% Message Processing Pipeline MessageService --> MsgResolverService MsgResolverService --> EmbeddingResolver MsgResolverService --> JiebaResolver MsgResolverService --> LinkResolver MsgResolverService --> MediaResolver MsgResolverService --> UserResolver %% Data Layer StorageService --> Drizzle Drizzle --> DB %% External APIs AuthService --> TelegramAPI MessageService --> TelegramAPI DialogService --> TelegramAPI EntityService --> TelegramAPI EmbeddingResolver --> OpenAI %% Client Event System Frontend --> ClientAuth Frontend --> ClientMessage Frontend --> ClientStorage Frontend --> ClientEntity Frontend --> ClientServer %% Styling classDef frontend fill:#4CAF50,stroke:#2E7D32,color:#fff,stroke-width:2px classDef websocket fill:#FF9800,stroke:#E65100,color:#fff,stroke-width:3px classDef server fill:#2196F3,stroke:#1565C0,color:#fff,stroke-width:2px classDef context fill:#E91E63,stroke:#AD1457,color:#fff,stroke-width:4px classDef handler fill:#9C27B0,stroke:#6A1B9A,color:#fff,stroke-width:2px classDef service fill:#607D8B,stroke:#37474F,color:#fff,stroke-width:2px classDef resolver fill:#795548,stroke:#3E2723,color:#fff,stroke-width:2px classDef data fill:#3F51B5,stroke:#1A237E,color:#fff,stroke-width:2px classDef external fill:#F44336,stroke:#C62828,color:#fff,stroke-width:2px class Frontend,Electron,ClientAuth,ClientMessage,ClientStorage,ClientEntity,ClientServer frontend class WS websocket class Server,SessionMgr server class Context context class AuthHandler,MessageHandler,DialogHandler,StorageHandler,ConfigHandler,EntityHandler,GramEventsHandler,MessageResolverHandler handler class AuthService,MessageService,DialogService,StorageService,ConfigService,EntityService,ConnectionService,TakeoutService,MsgResolverService service class EmbeddingResolver,JiebaResolver,LinkResolver,MediaResolver,UserResolver resolver class DB,Drizzle data class TelegramAPI,OpenAI external ``` ### Event-Driven Architecture Overview #### 📦 Package Responsibilities - **`packages/core`**: The heart of the application containing: - **CoreContext**: Central event bus using EventEmitter3 - **Event Handlers**: Listen to and process events from the event bus - **Services**: Business logic implementations (Auth, Message, Storage, etc.) - **Message Resolvers**: Process messages through various resolvers (Embedding, Jieba, Link, Media, User) - **Database Models & Schemas**: Drizzle ORM models and PostgreSQL schemas - **`packages/client`**: Client-side integration layer containing: - **Adapters**: WebSocket and Core Bridge adapters for different runtime environments - **Event Handlers**: Client-side event handlers that communicate with the backend - **Stores**: Pinia stores for state management (Auth, Chat, Message, Settings, Sync) - **Composables**: Reusable Vue composition functions - **`packages/common`**: Shared utilities: - **Logger**: Centralized logging using @guiiai/logg - **Utilities**: Common helper functions - **`apps/server`**: WebSocket server: - Manages WebSocket connections - Routes events between clients and CoreContext instances - Handles session management - **`apps/web`**: Vue 3 frontend application: - User interface built with Vue 3, Pinia, and Vue Router - Integrates with packages/client for backend communication - Supports both browser-only mode (with PGlite) and server mode (with PostgreSQL) #### 🎯 Core Event System - **CoreContext - Central Event Bus**: The heart of the system using EventEmitter3 for managing all events - **ToCoreEvent**: Events sent to the core system (auth:login, message:query, etc.) - **FromCoreEvent**: Events emitted from core system (message:data, auth:status, etc.) - **Event Wrapping**: Automatic error handling and logging for all events - **Session Management**: Each client session gets its own CoreContext instance #### 🌐 Communication Layer - **WebSocket Server**: Real-time bidirectional communication - **Event Registration**: Clients register for specific events they want to receive - **Event Forwarding**: Seamlessly forwards events between frontend and CoreContext - **Session Persistence**: Maintains client state and event listeners across connections - **Client Adapters**: Support multiple runtime environments - **WebSocket Adapter**: For server mode with real-time backend connection - **Core Bridge Adapter**: For browser-only mode with in-browser database (PGlite) #### 🔄 Message Processing Pipeline Stream-based message processing through multiple resolvers: - **Embedding Resolver**: Generates vector embeddings using OpenAI/Ollama for semantic search - **Jieba Resolver**: Chinese word segmentation for better search capabilities - **Link Resolver**: Extracts and processes links from messages - **Media Resolver**: Handles media attachments (photos, videos, documents) - **User Resolver**: Processes user mentions and references #### 📡 Event Flow 1. **Frontend** → User interaction triggers an action in Vue component 2. **Client Store** → Store dispatches an event via WebSocket Adapter 3. **WebSocket** → Event is sent to backend server 4. **CoreContext** → Event bus routes to appropriate event handler 5. **Event Handler** → Processes event and calls corresponding service 6. **Service** → Executes business logic (may call Telegram API or database) 7. **Service** → Emits result event back through CoreContext 8. **WebSocket** → Forwards event to frontend client 9. **Client Event Handler** → Updates client store with new data 10. **Frontend** → Vue components reactively update UI #### 🗄️ Database Support The application supports two database modes: - **PostgreSQL + pgvector**: For production deployments with full vector search capabilities - **PGlite**: In-browser PostgreSQL for browser-only mode (experimental)