Skip to main content
Glama
README.md
# GraphMemory-IDE

[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
[![Python 3.11+](https://img.shields.io/badge/Python-3.11%2B-blue.svg)](https://www.python.org/downloads/)
[![CI](https://github.com/elementalcollision/GraphMemory-IDE/actions/workflows/ci.yml/badge.svg)](https://github.com/elementalcollision/GraphMemory-IDE/actions/workflows/ci.yml)

An AI-assisted, long-term memory system for IDEs, powered by [LadybugDB](https://ladybugdb.com/) — an embedded, columnar, MIT-licensed graph database. GraphMemory-IDE is an MCP (Model Context Protocol) server that provides semantic vector search, graph-based knowledge storage, and real-time analytics. It integrates with VSCode, Cursor, and Windsurf through dedicated IDE plugins.

> **Graph database:** the backend runs on **LadybugDB 0.21.2**, the actively developed successor to KuzuDB (whose open-source development halted after its acquisition by Apple). The full migration record — verified API differences, phase-by-phase execution, and the operational migration guide — lives in [`MIGRATION_PLAN_LADYBUG.md`](MIGRATION_PLAN_LADYBUG.md) and [`docs/migration/KUZU_TO_LADYBUG.md`](docs/migration/KUZU_TO_LADYBUG.md).

## Features

- **Graph-based memory storage** — LadybugDB embedded graph database (Cypher / openCypher dialect) with automatic primary-key hash indexes and zone-map pruning on all columns
- **Semantic vector search** — sentence-transformers embeddings with `array_cosine_similarity` Top-K queries over node embedding columns
- **Codon-accelerated graph algorithms** — Optional native compilation via [Codon](https://github.com/exaloop/codon) for 10-100x speedups on centrality, community detection, path analysis, and similarity computations, with automatic Python/NetworkX fallback
- **FastAPI backend** — Async API with JWT authentication (EdDSA/Ed25519), optional read-only mode, rate limiting, and security middleware
- **Real-time analytics** — WebSocket and SSE streaming for live telemetry dashboards
- **Streamlit dashboard** — Interactive visualization of graph metrics, user activity, and system health
- **Multi-IDE plugin support** — Extensions for VSCode, Cursor, and Windsurf
- **Full observability** — Prometheus metrics, Grafana dashboards, health checks, and alert correlation
- **Production-ready Docker deployment** — Multi-service Docker Compose with Nginx, PostgreSQL, Redis, and monitoring stack

## Quick Start

### Docker (recommended)

```bash
git clone https://github.com/elementalcollision/GraphMemory-IDE.git
cd GraphMemory-IDE/docker
docker compose up -d
```

Services will be available at:
- MCP Server: http://localhost:8080/docs

### Local Development

```bash
# 1. Install dependencies (Python 3.11+)
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

# 2. Initialise the graph database schema (REQUIRED before first start —
#    the app opens the database but does not create the schema itself)
LADYBUG_DB_PATH=./data/ladybug.lbdb python server/init_db.py

# 3. Start the FastAPI server
uvicorn server.main:app --host 0.0.0.0 --port 8080 --reload

# 4. (optional) Start the Streamlit dashboard (separate terminal)
cd dashboard && streamlit run streamlit_app.py
```

### Configuration

| Variable | Default | Description |
|----------|---------|-------------|
| `DB_LADYBUG_DB_PATH` | `./data/ladybug.lbdb` | Path to the LadybugDB graph database file (a single `.lbdb` file; the parent directory must exist — the app creates it) |
| `DB_LADYBUG_READ_ONLY` | `false` | Open the graph database read-only (writes rejected at the DB layer; schema init skipped) |
| `JWT_SECRET_KEY` | (auto-generated) | Secret key for JWT token signing; set explicitly in production |
| `DB_DATABASE_URL` | `postgresql://user:password@localhost:5432/graphmemory_dev` | PostgreSQL connection string (relational + telemetry storage) |
| `DB_REDIS_URL` | `redis://localhost:6379/0` | Redis connection for caching (falls back to in-memory cache when unreachable) |
| `CODON_ENABLED` | `true` | Enable Codon acceleration |
| `CODON_LIB_PATH` | `./codon/lib/` | Path to compiled Codon libraries |
| `CODON_MIN_GRAPH_SIZE` | `100` | Minimum graph size for Codon routing |

> **Note on env prefixes:** database-related settings are read by pydantic with the `DB_` prefix — e.g. the setting `LADYBUG_DB_PATH` is set via the `DB_LADYBUG_DB_PATH` environment variable. The plain `LADYBUG_DB_PATH` form is honoured by `server/init_db.py` (and `KUZU_DB_PATH` remains as a deprecated fallback there, for one release cycle).

## Architecture

GraphMemory-IDE uses a hybrid architecture where I/O-bound code (FastAPI, database clients, WebSocket) runs in CPython, while compute-heavy graph algorithms can optionally run as native-compiled Codon modules.

```
IDE Plugins (VSCode/Cursor/Windsurf)
        |
        v
  FastAPI Server (CPython)
   ├── JWT Auth (EdDSA) + Security Middleware (TrustedHost / rate limit)
   ├── MCP Protocol Handler
   ├── Telemetry Ingestion + Query (/telemetry/*)
   ├── Top-K Vector Search (/tools/topk)
   ├── Analytics Engine (/api/v1/analytics/*)
   └── Dashboard Routes + SSE (/dashboard/*)
        |
   ┌────┴─────────┐
   v              v
LadybugDB      PostgreSQL + Redis
(embedded      (relational store,
 graph DB,      sessions, cache)
 sync engine)
   |
   v
Codon Bridge (optional)
 ├── Graph Kernels (.so/.dylib)
 └── Python/NetworkX fallback
```

**Graph database layer** (`server/graph_database.py`): an embedded LadybugDB instance opened in-process — no separate DB server. It provides a thread-safe connection pool (Condition-variable based), LadybugDB's native `AsyncConnection` for async handlers (`GraphDatabaseManager.get_async_connection()`), schema management (User / Project / Memory node tables and OWNS / COLLABORATES / CONTAINS / RELATES_TO / ACCESSED_BY relationship tables), a query engine with parameterised Cypher execution and Prometheus instrumentation, and health checks (`CALL show_tables()` schema-integrity validation). A `read_only` mode opens the database for read-only workloads (e.g. analytics replicas).

See [Architecture Overview](docs/architecture/ARCHITECTURE_OVERVIEW.md) for detailed system design.

### Codon Acceleration

The `codon/` directory contains graph algorithm implementations compiled to native machine code via Codon. The bridge layer (`codon/bridge/`) automatically routes computations based on graph size and library availability:

- **Graph kernels**: betweenness/closeness/degree centrality, PageRank, label propagation, Louvain community detection, BFS/Dijkstra shortest paths
- **Data processing**: cosine similarity, batch vector operations, consistent hashing
- **Fallback**: If Codon libraries aren't compiled, all operations fall back to NetworkX/numpy transparently

Compile Codon modules with:

```bash
./scripts/build_codon.sh
```

## API Overview

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/health` | GET | System health (CPU/memory/disk checks) |
| `/api/v1/status` | GET | Application status incl. `database.ladybug_path` and `read_only` |
| `/auth/token` | POST | JWT access token (OAuth2 password flow) |
| `/telemetry/ingest` | POST | Ingest an IDE telemetry event (validated `EventType` enum, ISO-8601 timestamp, JSON-serialised data) |
| `/telemetry/list` | GET | List telemetry events (paginated) |
| `/telemetry/query` | GET | Query events by `event_type` / `user_id` / `session_id` filters |
| `/tools/topk` | POST | Top-K semantic search: sentence-transformers embedding + `array_cosine_similarity` over the requested node table |
| `/api/v1/analytics/*` | GET | Analytics engine (centrality, community, clustering, streaming, GPU status) |
| `/dashboard/*` | GET | Dashboard API + SSE real-time streams (`/dashboard/stream/analytics`) |
| `/metrics` | GET | Prometheus metrics |

Full reference: [API Guide](docs/api/API_GUIDE.md). Interactive docs at `http://localhost:8080/docs` (disabled in production).

## Project Structure

```
GraphMemory-IDE/
├── server/                # FastAPI backend
│   ├── main.py            # Application entry point
│   ├── core/              # Configuration and settings
│   ├── auth/              # SSO, MFA, onboarding
│   ├── auth_jwt.py        # JWT authentication
│   ├── analytics/         # Analytics engine
│   ├── collaboration/     # Real-time collaboration
│   ├── dashboard/         # Dashboard API routes
│   ├── monitoring/        # Health checks, metrics, alerting
│   ├── security/          # Security middleware
│   ├── streaming/         # WebSocket/SSE streaming
│   ├── backup/            # LadybugDB/PostgreSQL/Redis backup orchestration
│   ├── graph_database.py  # LadybugDB integration (pool, schema, query engine, health)
│   └── init_db.py         # Graph schema initialisation (run before first start)
├── dashboard/             # Streamlit UI
├── frontend/              # TypeScript/React frontend
├── codon/                 # Codon acceleration layer
│   ├── bridge/            # Python-Codon interop with fallback
│   ├── graph_kernels/     # Native graph algorithms (.codon)
│   └── data_processing/   # Native data operations (.codon)
├── docker/                # Docker Compose configs
│   ├── docker-compose.yml # Development environment
│   ├── docker-compose.test.yml # Test services (PostgreSQL + Redis, ephemeral)
│   └── production/        # Production multi-service setup
├── tests/                 # Test suites
│   ├── integration/       # Integration tests
│   ├── production/        # Production validation
│   ├── load_testing/      # Locust load tests
│   └── smoke/             # Smoke tests
├── docs/                  # Documentation (incl. docs/migration/)
├── ide-plugins/           # VSCode, Cursor, Windsurf extensions
├── monitoring/            # Prometheus & Grafana configs
├── scripts/               # Build, deployment, and test-DB scripts
└── kubernetes/            # Kubernetes manifests
```

## Testing

```bash
# Run all tests
PYTHONPATH=. pytest tests/ -v

# Run with coverage
PYTHONPATH=. pytest tests/ --cov=server --cov-report=html

# Run specific test categories
PYTHONPATH=. pytest tests/ -m unit
PYTHONPATH=. pytest tests/ -m integration
PYTHONPATH=. pytest tests/ -m "not slow"
```

Registered test markers: `asyncio`, `unit`, `integration`, `slow`, `real_time`, `real_services`, `performance`, `mock_data`, `load`, `external`, `database`, `authentication` (`--strict-markers` is enforced).

### Integration tests against real services

Database integration tests expect PostgreSQL and Redis backing services. The
ephemeral test profile brings them up (Docker / OrbStack), matching the fixture
defaults:

```bash
docker compose -f docker/docker-compose.test.yml up -d
python scripts/init_test_db.py          # create the app schema in the test DB
PYTHONPATH=. pytest tests/integration/test_database_integration.py -v
docker compose -f docker/docker-compose.test.yml down -v
```

Without the services, PG-dependent fixtures skip cleanly; LadybugDB-backed tests run in-process against a temporary database and need no external services.

Coverage target: 85% minimum.

## Production Deployment

For production, use the multi-service Docker Compose configuration:

```bash
cd docker/production
cp env.production.template .env  # Configure environment variables
docker compose -f docker-compose.prod.yml up -d
```

This starts 7+ services: Nginx (reverse proxy), FastAPI, Streamlit, Analytics, PostgreSQL, Redis, Prometheus, and Grafana — with isolated network subnets and resource limits. A LadybugDB `api-server` sidecar (`ghcr.io/ladybugdb/api-server`) is available for external/admin graph access; pin a version tag in production.

See the [Docker Deployment Guide](docs/deployment/DOCKER_DEPLOYMENT_GUIDE.md) for complete production setup instructions.

## Migration: Kuzu → LadybugDB

This codebase was migrated from Kuzu 0.10.0 to LadybugDB 0.21.2 (2026-10). Key facts for anyone extending the integration:

- **Python API**: `import ladybug as lb`; `Connection(db)` + `init_connection()`; snake_case result iteration (`has_next()` / `get_next()`, rows are **lists**)
- **Indexes**: PK-only hash indexes (automatic); secondary-property and FULLTEXT indexes are not supported in 0.21.2 — zone maps serve filter workloads instead
- **Vector search**: `array_cosine_similarity` (Kuzu's `list_cosine_similarity` does not exist)
- **Storage**: a single `.lbdb` file; the parent directory must exist (unlike Kuzu, LadybugDB does not create it)
- **CLI**: `lbug` (`brew install ladybug`); `EXPORT DATABASE` / `IMPORT DATABASE` supported for data migration

Full verified difference catalogue: [`MIGRATION_PLAN_LADYBUG.md`](MIGRATION_PLAN_LADYBUG.md) §3. Operational runbook for deployed instances: [`docs/migration/KUZU_TO_LADYBUG.md`](docs/migration/KUZU_TO_LADYBUG.md).

## Documentation

| Directory | Description |
|-----------|-------------|
| [MIGRATION_PLAN_LADYBUG.md](MIGRATION_PLAN_LADYBUG.md) | Kuzu → LadybugDB migration: phases, verified API differences, defect ledger |
| [docs/migration/](docs/migration/) | Operational migration guide + phase verification scripts |
| [docs/project/](docs/project/) | Project overview, PRD, contributing guidelines, security policy |
| [docs/architecture/](docs/architecture/) | System architecture, code paths, network flows |
| [docs/api/](docs/api/) | API reference and client examples |
| [docs/deployment/](docs/deployment/) | Docker, Kubernetes, and production deployment guides |
| [docs/development/](docs/development/) | Developer setup, code quality, testing procedures |
| [docs/operations/](docs/operations/) | System operations and performance tuning |
| [docs/monitoring/](docs/monitoring/) | Prometheus, Grafana, and alerting configuration |
| [docs/analytics/](docs/analytics/) | Analytics system and ML components |
| [docs/ide-plugins/](docs/ide-plugins/) | Plugin development for VSCode, Cursor, Windsurf |
| [docs/user-guides/](docs/user-guides/) | Tutorials and end-user documentation |

## Contributing

See [Contributing Guidelines](docs/project/CONTRIBUTING.md) for development workflow, commit conventions, and code review process.

## License

This project is licensed under the MIT License. See [LICENSE](LICENSE) for details.