CONTRIBUTING.md

December 22, 2025 ยท View on GitHub

Development Guide

Browser Only

  1. Clone repository

  2. Install dependencies

pnpm install
  1. Start development server:
pnpm run dev

With Backend

  1. Clone repository

  2. Install dependencies

pnpm install
  1. Configure environment
cp .env.example .env
# Edit .env with your Telegram API keys, DATABASE_TYPE / DATABASE_URL, PROXY_URL, etc.
  1. Start database container:
# Docker is only used for database container in local development.
docker compose up -d pgvector
  1. 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

  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)