Skip to content

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

RushDB Logo

RushDB — JavaScript & TypeScript SDK

The memory layer for AI agents and apps.

Push any JSON. Get graph relationships and vector search — automatically. No schema. No pipeline. No glue code.

NPM Version NPM Downloads Bundle size License Made with Node

🌐 Website • 📖 Documentation • ☁️ Cloud • 🔍 Examples


Why RushDB

Agents need memory. Apps need connected data. The standard answer involves multiple databases, schema design, and an embedding pipeline before you write a single useful line of business logic.

RushDB skips all of that:

  • Managed embeddings — mark a property for indexing once; every write is auto-embedded server-side
  • Graph auto-structured — nested JSON becomes a traversable graph; no manual edge creation
  • Semantic + graph in one query — filter by relationships, rank by meaning, compute metrics — one call (use select/groupBy)
  • Zero schema — push any shape; RushDB infers types and links records
  • 6.9KB gzipped — zero runtime dependencies
  • Isomorphic — Node.js and browser

Installation

npm install @rushdb/javascript-sdk
# yarn add @rushdb/javascript-sdk
# pnpm add @rushdb/javascript-sdk

Agent memory in 3 lines

Get an API key at app.rushdb.com. Keys come in two levels: full access (server-side only) and read-only — read-only keys can't modify data, so they're safe to ship in browser code for public demos and dashboards.

import RushDB from '@rushdb/javascript-sdk'

const db = new RushDB('RUSHDB_API_KEY')

// 1. One-time: index a property for semantic search
await db.ai.indexes.create({ label: 'MEMORY', propertyName: 'output' })

// 2. Store — no embedder needed, server handles it
await db.records.create({
  label: 'MEMORY',
  data: {
    agent_id: 'agent-42',
    session_id: 'sess-001',
    action: 'summarized',
    topic: 'Q4 results',
    output: summaryText
  }
})

// 3. Recall by meaning, scoped by graph
const memories = await db.records.vectorSearch({
  labels: ['MEMORY'],
  propertyName: 'output',
  query: 'what did we decide about Q4?',
  where: { agent_id: 'agent-42' },
  limit: 10
})

Graph traversal

// Push nested JSON — relationships created automatically
await db.records.importJson({
  label: 'COMPANY',
  data: {
    name: 'Acme Corp',
    DEPARTMENT: [
      {
        name: 'Engineering',
        EMPLOYEE: [
          {
            name: 'Alice',
            role: 'Staff Engineer'
          }
        ]
      }
    ]
  }
})

// Traverse the auto-created graph
const engineers = await db.records.find({
  labels: ['EMPLOYEE'],
  where: {
    role: { $contains: 'Engineer' },
    DEPARTMENT: { COMPANY: { name: 'Acme Corp' } }
  }
})

// Constrain by relationship type and direction
const authoredPosts = await db.records.find({
  labels: ['USER'],
  where: {
    POST: {
      $relation: { type: 'AUTHORED', direction: 'out' },
      title: { $contains: 'graph' }
    }
  },
  limit: 10
})

// Manage relationships explicitly
const company = await db.records.findUniq({
  labels: ['COMPANY'],
  where: { name: 'Acme Corp' }
})
await company.attach(engineers, { type: 'EMPLOYS' })

Query API

One JSON structure works for record queries, aggregations, and vector search:

const result = await db.records.find({
  labels: ['TRANSACTION'],
  where: {
    status: 'posted',
    amount: { $gte: 100 }
  },
  select: {
    total: { $sum: '$record.amount' }
  },
  groupBy: ['$record.category'],
  // Legacy: The aggregate clause is deprecated and should only be used for vector similarity until select supports it.
  orderBy: { amount: 'desc' },
  limit: 50
})

where is resource-local:

  • db.records.find().where filters Records.
  • db.labels.find().where and db.properties.find().where filter Records before returning matching labels/properties.
  • db.relationships.find().where filters relationship edges. Use source and target for endpoint Record predicates.
const relationships = await db.relationships.find({
  source: { labels: ['USER'], where: { status: 'active' } },
  target: { labels: ['ORDER'] },
  where: { type: 'ORDERED', confidence: { $gte: 0.8 } }
})

RushDB Cloud or a self-hosted engine

The SDK works with RushDB in one of two ways:

RushDB Cloud Self-hosted RushDB engine (direct mode)
What you run nothing: the managed service at app.rushdb.com one rushdb binary, on your own infrastructure
Connect with an API key the engine URL and the engine token

The engine is what you can self-host. RushDB Cloud runs that engine for you and adds the dashboard, managed embeddings and the AI features (natural-language search, relationship-pattern suggestions), which exist only in RushDB Cloud.

// RushDB Cloud
const db = new RushDB('RUSHDB_API_KEY')

// A self-hosted engine
const db = new RushDB('ENGINE_TOKEN', {
  direct: true,
  engineUrl: 'http://127.0.0.1:3000',
  scope: 'tenant-1' // only for an engine started with --multitenant
})

What each offers:

Feature Cloud Self-hosted engine
Records: create, read, update, set, upsert, delete, find with where, orderBy, select, groupBy ✓ ✓
Relationships: attach/detach, relationships.createMany/deleteMany/find ✓ ✓
Labels, properties, property values ✓ ✓
Import JSON and CSV, export CSV ✓ ✓
Text indexes and keyword search (records.textSearch) ✓ ✓
External vector indexes; vector and hybrid search with a queryVector you supply ✓ ✓
Raw openCypher (query.raw; the engine needs --languages cypher) ✓ ✓
Schema (ai.getSchema, ai.getSchemaMarkdown) ✓ ✓
Transactions ✓ record creates, updates, sets, deletes by id, attaches and imports are staged; other writes refuse a transaction
Managed embeddings: managed indexes, records.vectorSearch by text query ✓ —
Natural-language search (ai.search) ✓ —
Relationship-pattern suggestions (relationships.patterns.*) ✓ —
Project settings (settings.get), dashboard, projects, team access, MCP over HTTP with OAuth ✓ —

In direct mode a Cloud-only method throws CloudOnlyError (with method and reason) before sending anything, and no request ever goes to RushDB Cloud. A write the engine cannot stage into a transaction throws DirectModeError, also before sending anything. The list is available in code:

import { CLOUD_ONLY_METHODS, CloudOnlyError, isCloudOnlyMethod } from '@rushdb/javascript-sdk'

SDK configuration

import RushDB from '@rushdb/javascript-sdk'

const db = new RushDB('RUSHDB_API_KEY', {
  // A different RushDB Cloud API endpoint (default: https://api.rushdb.com/api/v1)
  url: 'https://api.rushdb.com/api/v1',
  timeout: 30000
})

Key options:

  • url — full API URL (default: https://api.rushdb.com/api/v1)
  • host, port, protocol — alternative to url
  • timeout — request timeout in ms (default: 10000)
  • httpClient — custom HTTP client for advanced use
  • options.allowForceDelete — allow deleting all records without criteria (default: false)
  • direct, engineUrl, scope — direct mode against a standalone engine (see above)

Full config reference: docs.rushdb.com/typescript-sdk/introduction#sdk-configuration-options


Documentation

docs.rushdb.com/typescript-sdk — full API reference, examples, transactions, CSV import, and more.


Contributing

See CONTRIBUTING.md. Issues and PRs welcome.

About

No description, website, or topics provided.

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages