-
Clone repository
-
Install dependencies
pnpm install- Start development server:
pnpm run dev-
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:devgraph 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
-
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)
- 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
-
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)
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
- 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
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)