CONTRIBUTING.md
December 22, 2025 ยท View on GitHub
Development Guide
Browser Only
-
Clone repository
-
Install dependencies
pnpm install
- Start development server:
pnpm run dev
With Backend
-
Clone repository
-
Install dependencies
pnpm install
- Configure environment
cp .env.example .env
# Edit .env with your Telegram API keys, DATABASE_TYPE / DATABASE_URL, PROXY_URL, etc.
- Start database container:
# Docker is only used for database container in local development.
docker compose up -d pgvector
- Start services:
# Start backend
pnpm run server:dev
# Start frontend
pnpm run web:dev
Architecture
graph TB
subgraph "๐ฅ๏ธ Frontend Layer"
Frontend["Web Frontend<br/>(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<br/>Real-time Bidirectional<br/>โข Event Registration<br/>โข Event Forwarding<br/>โข Session Management"]
end
subgraph "๐ Backend Service Layer"
Server["Backend Server<br/>(REST API)"]
subgraph "Session Management"
SessionMgr["Session Manager<br/>โข Client State<br/>โข CoreContext Instance<br/>โข Event Listeners"]
end
end
subgraph "๐ฏ Core Event System"
Context["CoreContext<br/>๐ฅ Central Event Bus<br/>(EventEmitter3)<br/>โข ToCoreEvent<br/>โข FromCoreEvent<br/>โข Event Wrappers<br/>โข 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<br/>Service"]
MessageService["Message<br/>Service"]
DialogService["Dialog<br/>Service"]
StorageService["Storage<br/>Service"]
ConfigService["Config<br/>Service"]
EntityService["Entity<br/>Service"]
ConnectionService["Connection<br/>Service"]
TakeoutService["Takeout<br/>Service"]
end
subgraph "Message Processing Pipeline"
MsgResolverService["Message Resolver<br/>Service"]
subgraph "Message Resolvers"
EmbeddingResolver["๐ค Embedding<br/>Resolver<br/>(OpenAI)"]
JiebaResolver["๐ Jieba<br/>Resolver<br/>(Chinese Segmentation)"]
LinkResolver["๐ Link<br/>Resolver"]
MediaResolver["๐ธ Media<br/>Resolver"]
UserResolver["๐ค User<br/>Resolver"]
end
end
end
subgraph "๐๏ธ Data Layer"
DB["PostgreSQL<br/>+ pgvector"]
Drizzle["Drizzle ORM"]
end
subgraph "๐ก External APIs"
TelegramAPI["Telegram API<br/>(gram.js)"]
OpenAI["OpenAI API<br/>Vector Embeddings"]
end
%% WebSocket Event Flow
Frontend -.->|"WsEventToServer<br/>โข auth:login<br/>โข message:query<br/>โข dialog:fetch"| WS
WS -.->|"WsEventToClient<br/>โข message:data<br/>โข auth:status<br/>โข 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
- Frontend โ User interaction triggers an action in Vue component
- Client Store โ Store dispatches an event via WebSocket Adapter
- WebSocket โ Event is sent to backend server
- CoreContext โ Event bus routes to appropriate event handler
- Event Handler โ Processes event and calls corresponding service
- Service โ Executes business logic (may call Telegram API or database)
- Service โ Emits result event back through CoreContext
- WebSocket โ Forwards event to frontend client
- Client Event Handler โ Updates client store with new data
- 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)