Generated banner for LongMemory
Generated logo for LongMemory

LongMemory

Memory server

Created by CaviraOSS

Published in CaviraOSS/LongMemory. Publisher page

4,573 GitHub stars

What it is

LongMemory Hydrograph TypeScript package: library, CLI, self-hosted API server, and benchmark harness.
— the description by CaviraOSS

AutoGineer overview, from the brain’s own files

LongMemory is a cognitive memory engine designed to provide AI agents with durable, governed, and temporal recall. Unlike standard RAG pipelines that rely on simple vector similarity, LongMemory utilizes a Hydrograph substrate to manage immutable nodes, executable edges, and temporal truth. It supports complex recall modes including strict, historical, associative, and world-grounded retrieval. The system is built for local-first deployment using SQLite, offering a self-hosted API server, CLI, and native integrations for various agent frameworks, IDEs, and automation tools. It enforces governance policies across projects, users, and teams, ensuring that memory remains grounded, explainable, and context-aware.

How it works

Memory model: LLM wiki

AutoGineer overview, from the brain’s own files

LongMemory operates as a memory server that stores data in a local SQLite database. It ingests events, documents, and session data into a Hydrograph structure. When an agent needs information, the system performs recall based on specific modes—such as strict, historical, or associative—to retrieve relevant, token-bounded context. The engine supports governance by scoping memory to specific projects, tenants, or users. It provides an API for agents to interact with this memory, and includes tools for maintenance, such as decay and reinforcement, to manage the lifecycle of stored information.

Folders
FolderRoleFiles
.githubagent-config13
docsdocs34
packagessource-code7
srcsource-code340
toolsscripts5
.agentsfolder1
.dofolder1
appsfolder19
benchmarksfolder32
dashboardfolder34
integrationsfolder47

Requirements

Apps: Docker

Runtimes: Node.js >=20

Databases: SQLite

API keys (by name): AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN, AZURE_DEVOPS_TOKEN, BITBUCKET_TOKEN, GEMINI_API_KEY, GITHUB_TOKEN, GITLAB_TOKEN, GOOGLE_ACCESS_TOKEN, LINEAR_API_KEY, LONGMEMORY_API_KEY, MICROSOFT_GRAPH_TOKEN, NOTION_API_KEY, NVIDIA_API_KEY, OM_API_KEY, OM_GEMINI_API_KEY, OM_OPENAI_API_KEY, OM_SIRAY_API_TOKEN, OPENAI_API_KEY, SIRAY_API_TOKEN, SLACK_BOT_TOKEN

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)

Set it up

  1. This brain runs code automatically: 1 script. Review Makefile before opening the folder in Claude Code. No step below turns a hook on for you.

    • Makefile: corepack enable; pnpm install --frozen-lockfile
  2. Not scanned by AutoGineerThe author’s README also describes installing it with Docker Compose. Read its install section: AutoGineer did not scan that path. https://github.com/CaviraOSS/LongMemory/blob/aec98ced33a7586a2fcd198a04bc38b5590750c4/README.md#2-run-as-a-service
  3. Not scanned by AutoGineerThe author’s README also describes installing it from a clone of its repository. Read its install section: AutoGineer did not scan that path. https://github.com/CaviraOSS/LongMemory/blob/aec98ced33a7586a2fcd198a04bc38b5590750c4/README.md#2-run-as-a-service
  4. Created by CaviraOSS. Published in CaviraOSS/LongMemory. Licence: Apache License 2.0.

Usage

AutoGineer overview, from the brain’s own files

  • Install as a TypeScript library for in-memory or SQLite-backed agent memory.
  • Deploy as a self-hosted API server using Docker or Docker Compose.
  • Use the CLI to ingest data, manage project context, or perform maintenance tasks.
  • Connect to agent hosts via MCP (Model Context Protocol) for seamless integration.
  • Use the Python SDK to interact with the memory server from Python-based agents.
  • Visualize and manage memory through the provided Next.js dashboard or VS Code extension.
“What was the deployment region in January?”
The agent uses historical recall mode with a specified valid_time to retrieve the correct configuration from that period.
“Prepare the next release.”
The agent retrieves project context, including architecture notes, open tasks, and relevant code facts, to assist with release planning.

Documentation by CaviraOSS

<!-- __ __ ___ / / ____ ____ ____ _/ |/ /__ ____ ___ ____ _______ __ / / / __ \/ __ \/ __ `/ /|_/ / _ \/ __ `__ \/ __ \/ ___/ / / / / /___/ /_/ / / / / /_/ / / / / __/ / / / / / /_/ / / / /_/ / /_____/\____/_/ /_/\__, /_/ /_/\___/_/ /_/ /_/\____/_/ \__, / /____/ /____/ cavira oss (c) 2026 - nullure (c) 2026 ========================================================== file : README.md usage : introduces LongMemory, its architecture, integrations, and deployment options -->

LongMemory

Durable, temporal, governed memory for AI agents. Not just RAG. Not just a vector database. Local-first and self-hosted.

Image: npm Image: PyPI Image: VS Code Image: Container Image: License

Image: LongMemory dashboard

LongMemory is a cognitive memory engine for LLM applications and autonomous agents.

  • Durable local-first storage with SQLite

  • Immutable content, provenance, and temporal truth

  • Strict, historical, associative, grounded, and multilingual recall

  • Explainable evidence selection and token-bounded context

  • Governed project memory, Skills, Chat Memory, LLM-Wiki, and CodeGraph

  • One TypeScript engine across npm, CLI, HTTP, MCP, dashboard, and VS Code

  • Native integrations for agent hosts, automation tools, and Python frameworks

Your model stays stateless. Your application stops being amnesiac.


1. Use It in 10 Seconds

Install as a library
npm install longmemory
import { createMemory } from 'longmemory';

const memory = await createMemory();
await memory.ingest({
    user_id: 'alice',
    text: 'I prefer TypeScript for backend services',
});

const result = await memory.recall({
    text: 'What language does Alice prefer?',
    mode: 'strict',
});

console.log(result);
await memory.close();

No service or external database is required for in-memory use.

For optional evidence-grounded answers with your own model, use the exported answer_from_evidence adapter. It accepts authorized evidence, validates cited excerpts, and makes at most one model call; ordinary recall is unchanged. See docs/answering.md for policies, limits, and integration.

Persist with SQLite
const memory = await createMemory({
    store: 'sqlite',
    db_path: './longmemory.db',
    tenant_id: 'acme',
    user_id: 'alice',
});

Reopening the same database restores nodes, worlds, entities, edges, temporal history, grounding, and lifecycle state.

Install the CLI
npm install --global longmemory
longmemory init
longmemory recall "current project priorities" --mode associative
Call a self-hosted server from Python
pip install longmemory-sdk
from longmemory import LongMemory

memory = LongMemory(
    "http://127.0.0.1:7331",
    api_key="change-me",
    user_id="alice",
)

memory.ingest("I prefer TypeScript")
result = memory.recall("What language do I prefer?", mode="strict")

The Python package is a zero-dependency HTTP client. The Hydrograph engine remains in the self-hosted TypeScript service. See docs/python-sdk.md.


2. Run as a Service

From source
git clone https://github.com/CaviraOSS/LongMemory.git
cd LongMemory
corepack enable
pnpm install --frozen-lockfile
pnpm build
pnpm start

The API listens on http://127.0.0.1:7331 by default.

Docker
docker run --rm \
  -p 7331:7331 \
  -v longmemory-data:/data \
  -e LONGMEMORY_API_KEY=change-me \
  ghcr.io/caviraoss/longmemory:latest
Docker Compose
cp .env.example .env
docker compose up --build -d longmemory

Include the dashboard:

docker compose --profile ui up --build -d
  • API and MCP: http://127.0.0.1:7331

  • Dashboard: http://127.0.0.1:3000

  • Health: http://127.0.0.1:7331/health


3. Why LongMemory

Most systems called memory are retrieval pipelines:

  1. Split text into chunks.

  2. Embed the chunks.

  3. Return the nearest vectors.

That does not establish what was true at a particular time, whether a new fact superseded an old one, which source is authoritative, who may see it, or why a result belongs in context.

LongMemory models those concerns directly:

  • Temporal truth: recorded time and valid time are separate.

  • Immutable memory: content, vectors, hashes, and provenance are not rewritten by recall or decay.

  • Executable graph: typed relationships participate in recall and explanation.

  • Governance: project, tenant, user, team, role, agent, task, and framework scope are enforced.

  • Lifecycle: deterministic decay, explicit reinforcement, consolidation, compression, and reconsolidation.

  • Evidence: recall is bounded by relevance, contradictions, grounding, permissions, and token cost.

See Why.md for the design rationale.


4. Recall Modes

const strict = await memory.recall({
    text: 'What is the current deployment region?',
    mode: 'strict',
});

const historical = await memory.recall({
    text: 'What was the deployment region in January?',
    mode: 'historical',
    valid_time: Date.UTC(2026, 0, 15),
});

const associative = await memory.recall({
    text: 'Incidents related to the payment migration',
    mode: 'associative',
});

const grounded = await memory.recall({
    text: 'Which production endpoint is currently live?',
    mode: 'world_grounded',
});

Strict recall applies temporal, contradiction, contract, confidence, and grounding gates. Historical recall preserves superseded truth. Associative recall follows semantic, lexical, entity, activation, and graph signals. World-grounded recall requires current external evidence.


5. Features

  • Hydrograph memory substrate with immutable nodes, executable edges, worlds, entities, facets, and traces.

  • Temporal reasoning with point-in-time truth, event ordering, supersession, and stale-evidence controls.

  • Multilingual memory with script detection, code switching, transliteration, and cross-language embeddings.

  • Project memory for architecture, decisions, tasks, conventions, failures, handoffs, and code impact.

  • Governed assets for Chat Memory, Skills, LLM-Wiki, and CodeGraph with lifecycle and ACL policy.

  • Session porter for Claude Code, Codex, OpenCode, Gemini CLI, Copilot Chat, Cline, and raw harness logs.

  • Connectors for repositories, local files, Markdown, web content, feeds, cloud documents, and provider APIs.

  • Embeddings through OpenAI-compatible APIs, Gemini, AWS Bedrock, Ollama, Siray, and local HTTP models.

  • Operational surfaces through HTTP, MCP, dashboard, VS Code, n8n, and framework-native MCP clients.

  • Auditable benchmarks for LongMemEval, LoCoMo, BEAM, retrieval quality, temporal behavior, and latency.


6. MCP and Agent Integrations

Start local stdio MCP:

longmemory mcp --db .longmemory/project.db --project current

Expose authenticated Streamable HTTP MCP:

LONGMEMORY_API_KEY=change-me longmemory serve --mcp-http

LongMemory exposes 13 high-level governed tools plus readable resources and agent workflow prompts. Tool arguments cannot override server-bound runtime identity.

Installable integrations include:

  • Claude Code plugin

  • Codex and ChatGPT desktop plugin

  • Gemini CLI extension

  • Agent Plugins 1.0 bundle for OpenClaw and compatible hosts

  • n8n community node usable as an AI Agent tool

  • Cline, Continue, and LibreChat configuration packs

  • Dify and Flowise native MCP setup

  • CrewAI, AutoGen, LangGraph/LangChain, OpenAI Agents SDK, and PydanticAI examples

See integrations/README.md and docs/mcp.md.


7. Temporal and Project Memory

import { createProjectMemory } from 'longmemory';

const projects = await createProjectMemory({
    tenant_id: 'cavira',
    organization_id: 'CaviraOSS',
    project_id: 'longmemory',
    name: 'LongMemory',
    store: 'sqlite',
    db_path: './longmemory.db',
});

await projects.ingestProjectEvent('longmemory', {
    kind: 'decision',
    topic: 'persistence',
    text: 'Use SQLite for local-first persistence',
    source_type: 'architecture_note',
});

const context = await projects.getProjectContext('longmemory', 'prepare the next release');

Project context combines relevant architecture, current decisions, open tasks, failures, code facts, matched Skills, conflicts, and governed asset loadouts under one token budget.


8. CLI

longmemory init
longmemory tui
longmemory status --memories 20 --json
longmemory ingest "Remember the rollback procedure" --type procedure
longmemory recall "What is the rollback procedure?" --mode associative
longmemory memory list --limit 50
longmemory project context "prepare the next release"
longmemory maintenance decay --all
longmemory maintenance reinforce <memory-id>
longmemory skill match "run the release checklist" --agent reviewer
longmemory asset loadout "prepare the release" --agent reviewer --framework codex
longmemory code impact createMemory
longmemory detect
longmemory session discover --from claude-code
longmemory port --from claude-code --to longmemory --all
longmemory session wiki --from gemini-cli --all --name "Project knowledge"
longmemory serve --mcp-http

Finite commands emit stable JSON outside a TTY or when --json is supplied. The session porter reads supported coding-agent stores without modifying them. See docs/cli.md.


9. Dashboard and VS Code

The Next.js dashboard provides health, memory browsing, ingestion, search, project selection, activity, decay, settings, timelines, and memory-aware chat through a same-origin API proxy.

pnpm --dir dashboard build
pnpm --dir dashboard start

The VS Code extension provides an activity-bar browser, status bar, recall, project context, explanation, reinforcement, explicit decay, session import, and reviewed AI-change capture.

pnpm extension:package

The generated package is apps/vscode-extension/longmemory-vscode-0.2.0.vsix.


10. Architecture

graph TB
  INPUT[Events, documents, sessions] --> INGEST[Immutable ingest pipeline]
  INGEST --> GRAPH[(Hydrograph)]
  GRAPH --> STRICT[Strict and historical recall]
  GRAPH --> ASSOC[Associative recall]
  GRAPH --> GROUND[World-grounded recall]
  GRAPH --> PROJECT[Project memory and governed assets]
  GRAPH --> SQLITE[(SQLite)]
  STRICT --> CONTEXT[Explainable bounded context]
  ASSOC --> CONTEXT
  GROUND --> CONTEXT
  PROJECT --> MCP[MCP tools, resources, prompts]
  CONTEXT --> API[Library, CLI, HTTP]
  MCP --> AGENTS[Agents, IDEs, automation]
  API --> UI[Dashboard and VS Code]

Read ARCHITECTURE.md and docs/architecture.md for subsystem details.


11. Deployment Options

PlatformConfigurationWhat it deploys
DockerDockerfileAPI and Streamable HTTP MCP
Docker Composedocker-compose.ymlAPI/MCP plus optional dashboard
Herokuapp.jsonContainerized API/MCP
Railwayrailway.jsonContainerized API/MCP
Renderrender.yamlAPI/MCP with persistent disk
DigitalOcean.do/spec.yamlApp Platform API/MCP service
Vercelvercel.jsonDashboard; configure LONGMEMORY_API_URL
Windowsstart-longmemory.ps1Background local API/MCP process

For hosted API deployments, set LONGMEMORY_API_KEY, mount persistent storage at /data, and terminate TLS at the platform edge. Vercel hosts only the stateless dashboard and requires a separately deployed LongMemory API.


12. Benchmarks

pnpm bench
pnpm bench:ci
pnpm bench:full

The benchmark harness publishes explicit manifests, dataset completion, evidence metrics, answer judgments, temporal categories, latency percentiles, and N/A reasons. Official scorecards fail closed on incomplete datasets or semantic embedding fallback. See benchmarks/README.md.


13. Migration

Import supported SQLite, JSON, or JSONL memory:

longmemory migrate \
  --from ./legacy.db \
  --to ./longmemory.db \
  --report ./migration-report.json

Import coding-agent conversations as governed Chat Memory:

longmemory port --from codex --to longmemory --all

See MIGRATION.md and docs/migration.md.

Legacy package migration:

npm uninstall openmemory-js && npm install longmemory
pip uninstall openmemory-py && pip install longmemory-sdk

openmemory-js@2 and openmemory-py@2 are forwarding bridges for existing installations. New applications should use longmemory and longmemory-sdk directly. PyPI's unrelated longmemory name is owned by another project, so the official distribution is longmemory-sdk while the import remains longmemory.


14. Release and Operations

corepack enable
pnpm install --frozen-lockfile
pnpm release:check
pnpm pack
pnpm extension:package

release:check validates branding, types, integration manifests, the benchmark smoke gate, the root build, extension build, and dashboard production build.

Useful Make targets:

make install
make build
make check
make docker-up
make dashboard

15. Security

LongMemory is local-first, but network deployment still requires explicit controls:

  • Protect API and MCP routes with LONGMEMORY_API_KEY.

  • Restrict allowed origins and terminate TLS at the edge.

  • Keep connector and embedding credentials outside repository files.

  • Treat recalled content as untrusted evidence, not authorization.

  • Preserve server-bound user, project, agent, and framework identity.

Report vulnerabilities privately as described in SECURITY.md.


16. Contributing

Issues and pull requests are welcome. Read CONTRIBUTING.md, GOVERNANCE.md, and CODE_OF_CONDUCT.md before contributing.


17. License

LongMemory is licensed under the Apache License 2.0. The separately published n8n community node uses MIT as required by n8n's strict package validator.

Contributors

<!-- readme: contributors -start -->

<table> <tbody> <tr> <td align="center"> <a href="https://github.com/nullure"> <img src="https://avatars.githubusercontent.com/u/81895400?v=4" width="100;" alt="nullure"/> <br /> <sub><b>Morven</b></sub> </a> </td> <td align="center"> <a href="https://github.com/dontbanmeplz"> <img src="https://avatars.githubusercontent.com/u/59851616?v=4" width="100;" alt="dontbanmeplz"/> <br /> <sub><b>Chis</b></sub> </a> </td> <td align="center"> <a href="https://github.com/amihos"> <img src="https://avatars.githubusercontent.com/u/35190548?v=4" width="100;" alt="amihos"/> <br /> <sub><b>Hossein Amirkhalili</b></sub> </a> </td> <td align="center"> <a href="https://github.com/DKB0512"> <img src="https://avatars.githubusercontent.com/u/23116307?v=4" width="100;" alt="DKB0512"/> <br /> <sub><b>DKB</b></sub> </a> </td> <td align="center"> <a href="https://github.com/stevo1403"> <img src="https://avatars.githubusercontent.com/u/34807365?v=4" width="100;" alt="stevo1403"/> <br /> <sub><b>Stephen Adebayo</b></sub> </a> </td> <td align="center"> <a href="https://github.com/mameikagou"> <img src="https://avatars.githubusercontent.com/u/116348059?v=4" width="100;" alt="mameikagou"/> <br /> <sub><b>mrlonely</b></sub> </a> </td> </tr> <tr> <td align="center"> <a href="https://github.com/haosenwang1018"> <img src="https://avatars.githubusercontent.com/u/167664334?v=4" width="100;" alt="haosenwang1018"/> <br /> <sub><b>Sense_wang</b></sub> </a> </td> <td align="center"> <a href="https://github.com/recabasic"> <img src="https://avatars.githubusercontent.com/u/102372274?v=4" width="100;" alt="recabasic"/> <br /> <sub><b>Elvoro</b></sub> </a> </td> <td align="center"> <a href="https://github.com/zfaustk"> <img src="https://avatars.githubusercontent.com/u/4340287?v=4" width="100;" alt="zfaustk"/> <br /> <sub><b>Clio</b></sub> </a> </td> <td align="center"> <a href="https://github.com/suyua9"> <img src="https://avatars.githubusercontent.com/u/273297082?v=4" width="100;" alt="suyua9"/> <br /> <sub><b>suyua9</b></sub> </a> </td> <td align="center"> <a href="https://github.com/vincenzopalazzo"> <img src="https://avatars.githubusercontent.com/u/17150045?v=4" width="100;" alt="vincenzopalazzo"/> <br /> <sub><b>Vincenzo Palazzo</b></sub> </a> </td> <td align="center"> <a href="https://github.com/msris108"> <img src="https://avatars.githubusercontent.com/u/43115330?v=4" width="100;" alt="msris108"/> <br /> <sub><b>Sriram M</b></sub> </a> </td> </tr> <tr> <td align="center"> <a href="https://github.com/fparrav"> <img src="https://avatars.githubusercontent.com/u/9319430?v=4" width="100;" alt="fparrav"/> <br /> <sub><b>Felipe Parra</b></sub> </a> </td> <td align="center"> <a href="https://github.com/DoKoB0512"> <img src="https://avatars.githubusercontent.com/u/123281216?v=4" width="100;" alt="DoKoB0512"/> <br /> <sub><b>DoKoB0512</b></sub> </a> </td> <td align="center"> <a href="https://github.com/whiterabb17"> <img src="https://avatars.githubusercontent.com/u/90134688?v=4" width="100;" alt="whiterabb17"/> <br /> <sub><b>MistrHyde</b></sub> </a> </td> <td align="center"> <a href="https://github.com/octo-patch"> <img src="https://avatars.githubusercontent.com/u/266937838?v=4" width="100;" alt="octo-patch"/> <br /> <sub><b>Octopus</b></sub> </a> </td> <td align="center"> <a href="https://github.com/therexone"> <img src="https://avatars.githubusercontent.com/u/27387245?v=4" width="100;" alt="therexone"/> <br /> <sub><b>Ayush Singh</b></sub> </a> </td> <td align="center"> <a href="https://github.com/kishan0725"> <img src="https://avatars.githubusercontent.com/u/36665975?v=4" width="100;" alt="kishan0725"/> <br /> <sub><b>Kishan Lal</b></sub> </a> </td> </tr> <tr> <td align="center"> <a href="https://github.com/pc-quiknode"> <img src="https://avatars.githubusercontent.com/u/126496711?v=4" width="100;" alt="pc-quiknode"/> <br /> <sub><b>Peter Chung</b></sub> </a> </td> <td align="center"> <a href="https://github.com/muhammad-fiaz"> <img src="https://avatars.githubusercontent.com/u/75434191?v=4" width="100;" alt="muhammad-fiaz"/> <br /> <sub><b>Muhammad Fiaz</b></sub> </a> </td> <td align="center"> <a href="https://github.com/jasonkneen"> <img src="https://avatars.githubusercontent.com/u/502002?v=4" width="100;" alt="jasonkneen"/> <br /> <sub><b>Jason Kneen</b></sub> </a> </td> <td align="center"> <a href="https://github.com/Hchunjun"> <img src="https://avatars.githubusercontent.com/u/11238835?v=4" width="100;" alt="Hchunjun"/> <br /> <sub><b>shan</b></sub> </a> </td> <td align="center"> <a href="https://github.com/naabakkcrypto"> <img src="https://avatars.githubusercontent.com/u/258882739?v=4" width="100;" alt="naabakkcrypto"/> <br /> <sub><b>Naabakk</b></sub> </a> </td> <td align="center"> <a href="https://github.com/mikemikimike"> <img src="https://avatars.githubusercontent.com/u/186855910?v=4" width="100;" alt="mikemikimike"/> <br /> <sub><b>mikemikimike</b></sub> </a> </td> </tr> <tr> <td align="center"> <a href="https://github.com/mgajewskik"> <img src="https://avatars.githubusercontent.com/u/47600161?v=4" width="100;" alt="mgajewskik"/> <br /> <sub><b>Maciej Gajewski</b></sub> </a> </td> <td align="center"> <a href="https://github.com/ajitam"> <img src="https://avatars.githubusercontent.com/u/672661?v=4" width="100;" alt="ajitam"/> <br /> <sub><b>Matija Urh</b></sub> </a> </td> <td align="center"> <a href="https://github.com/machj8968-lab"> <img src="https://avatars.githubusercontent.com/u/274563644?v=4" width="100;" alt="machj8968-lab"/> <br /> <sub><b>machj8968-lab</b></sub> </a> </td> <td align="center"> <a href="https://github.com/buyua9"> <img src="https://avatars.githubusercontent.com/u/274236111?v=4" width="100;" alt="buyua9"/> <br /> <sub><b>buyua9</b></sub> </a> </td> <td align="center"> <a href="https://github.com/aziham"> <img src="https://avatars.githubusercontent.com/u/94932043?v=4" width="100;" alt="aziham"/> <br /> <sub><b>Hamza</b></sub> </a> </td> <td align="center"> <a href="https://github.com/GPT-AGI"> <img src="https://avatars.githubusercontent.com/u/181050363?v=4" width="100;" alt="GPT-AGI"/> <br /> <sub><b>Ting Zhang</b></sub> </a> </td> </tr> <tr> <td align="center"> <a href="https://github.com/RockinPaul"> <img src="https://avatars.githubusercontent.com/u/3741448?v=4" width="100;" alt="RockinPaul"/> <br /> <sub><b>Paul Zarudnev</b></sub> </a> </td> <td align="center"> <a href="https://github.com/oantoshchenko"> <img src="https://avatars.githubusercontent.com/u/1749531?v=4" width="100;" alt="oantoshchenko"/> <br /> <sub><b>Oleksandr Antoshchenko</b></sub> </a> </td> <td align="center"> <a href="https://github.com/lwsinclair"> <img src="https://avatars.githubusercontent.com/u/2829939?v=4" width="100;" alt="lwsinclair"/> <br /> <sub><b>Lawrence Sinclair</b></sub> </a> </td> <td align="center"> <a href="https://github.com/jungdaesuh"> <img src="https://avatars.githubusercontent.com/u/78460559?v=4" width="100;" alt="jungdaesuh"/> <br /> <sub><b>jungdaesuh</b></sub> </a> </td> <td align="center"> <a href="https://github.com/josephgoksu"> <img src="https://avatars.githubusercontent.com/u/6523823?v=4" width="100;" alt="josephgoksu"/> <br /> <sub><b>Joseph Goksu</b></sub> </a> </td> <td align="center"> <a href="https://github.com/EikoocS"> <img src="https://avatars.githubusercontent.com/u/80829508?v=4" width="100;" alt="EikoocS"/> <br /> <sub><b>EikoocS</b></sub> </a> </td> </tr> <tr> <td align="center"> <a href="https://github.com/Dhravya"> <img src="https://avatars.githubusercontent.com/u/63950637?v=4" width="100;" alt="Dhravya"/> <br /> <sub><b>Dhravya Shah</b></sub> </a> </td> <td align="center"> <a href="https://github.com/dflor003"> <img src="https://avatars.githubusercontent.com/u/103017?v=4" width="100;" alt="dflor003"/> <br /> <sub><b>Danil Flores</b></sub> </a> </td> <td align="center"> <a href="https://github.com/DAESA24"> <img src="https://avatars.githubusercontent.com/u/173488786?v=4" width="100;" alt="DAESA24"/> <br /> <sub><b>DAESA24</b></sub> </a> </td> <td align="center"> <a href="https://github.com/ammesonb"> <img src="https://avatars.githubusercontent.com/u/2522710?v=4" width="100;" alt="ammesonb"/> <br /> <sub><b>Brett Ammeson</b></sub> </a> </td> <td align="center"> <a href="https://github.com/auto-pr-bot"> <img src="https://avatars.githubusercontent.com/u/245575329?v=4" width="100;" alt="auto-pr-bot"/> <br /> <sub><b>auto-pr-bot</b></sub> </a> </td> <td align="center"> <a href="https://github.com/anush008"> <img src="https://avatars.githubusercontent.com/u/46051506?v=4" width="100;" alt="anush008"/> <br /> <sub><b>Anush</b></sub> </a> </td> </tr> <tr> <td align="center"> <a href="https://github.com/annelchavez-11594"> <img src="https://avatars.githubusercontent.com/u/271067077?v=4" width="100;" alt="annelchavez-11594"/> <br /> <sub><b>Annel Chavez</b></sub> </a> </td> <td align="center"> <a href="https://github.com/atao2004"> <img src="https://avatars.githubusercontent.com/u/148929819?v=4" width="100;" alt="atao2004"/> <br /> <sub><b>Anna Tao</b></sub> </a> </td> </tr> <tbody> </table> <!-- readme: contributors -end -->

docs/project-memory.md

<!-- __ __ ___ / / ____ ____ ____ _/ |/ /__ ____ ___ ____ _______ __ / / / __ \/ __ \/ __ `/ /|_/ / _ \/ __ `__ \/ __ \/ ___/ / / / / /___/ /_/ / / / / /_/ / / / / __/ / / / / / /_/ / / / /_/ / /_____/\____/_/ /_/\__, /_/ /_/\___/_/ /_/ /_/\____/_/ \__, / /____/ /____/ cavira oss (c) 2026 - nullure (c) 2026 ========================================================== file : docs/project-memory.md usage : documents LongMemory project memory -->

Project-wide memory

Project memory gives long-running agents a scoped Hydrograph world for goals, architecture, decisions, requirements, source files, issues, failures, conventions, deployment facts, risks, and working state.

It is not a global document index. Every project is a recursive world subtree with its own permission contract, provenance, bitemporal history, contradictions, source snapshots, and recall policies.

ProjectWorld

Hydrograph root
└── tenant
    └── organization
        └── project
            ├── repositories
            ├── documents
            ├── issues
            ├── deployments
            ├── decisions
            ├── agent sessions
            ├── architecture
            ├── tasks
            ├── conventions
            ├── failures
            ├── goals
            ├── constraints
            ├── questions
            ├── risks
            ├── references
            ├── skills
            └── assets

Each child is a real recursive Hydrograph world. Connector-created repository, document, issue, and communication worlds attach beneath the appropriate project child instead of the global root.

ProjectWorld tracks:

  • Tenant, organization, and project identity

  • Root and category world IDs

  • Linked connector summaries and current source refs

  • Active goals and constraints

  • Current architecture summary

  • Current decisions, questions, tasks, conventions, deployments, and risks

  • Project memory policy

  • Creation/update time

Project summaries are derived views over durable project nodes. On reopen, project events hydrate those views from the project world history.

Create project memory

import { createProjectMemory } from "longmemory";

const projects = await createProjectMemory({
  tenant_id: "tenant:cavira",
  organization_id: "CaviraOSS",
  project_id: "longmemory",
  name: "LongMemory",
  description: "Hydrograph memory engine",
  store: "sqlite",
  db_path: "./longmemory.db",
  max_context_tokens: 2_048,
});

One manager can host multiple projects over the same engine:

await projects.createProject({
  tenant_id: "tenant:cavira",
  organization_id: "CaviraOSS",
  project_id: "another-project",
  name: "Another Project",
});

Recall always supplies the selected project root world and project permission context. Project A candidates therefore cannot enter Project B recall unless an explicit cross-project link is added in a future policy layer.

Project contract

ProjectMemoryContract controls whether project memory is visible to project agents, users, and teams, and whether it may be used for code generation, planning, debugging, and decisions. It also controls citation and freshness requirements.

The contract maps into the underlying memory contract:

  • Project-scoped source permission

  • Reasoning/prediction policies

  • Source/citation requirements

  • Freshness expiry behavior

  • Private project visibility

Connector plans linked to a project are rewritten with the project permission. Restricted project memory cannot be recalled without project_ids: [project_id].

Ingest project events

await projects.ingestProjectEvent("longmemory", {
  kind: "architecture",
  topic: "api-framework",
  text: "The API uses Fastify",
  source_type: "github",
  external_id: "file:package.json",
  url: "https://github.com/CaviraOSS/LongMemory/blob/abc/package.json",
  repo: "CaviraOSS/LongMemory",
  branch: "main",
  commit: "abc",
  file_path: "package.json",
  checksum: "sha256:...",
});

Supported event kinds include architecture, decision, requirement, goal, constraint, task, bug, failure, preference, convention, deployment, risk, question, reference, agent state, code fact, and manual fact.

Source-backed facts become exocortex nodes. Agent guesses and working interpretations use subjective: true and become endocortex nodes. Both still pass through contracts, entity resolution, bitemporal validity, and project scoping.

Project updates are immutable revisions. Architecture, decisions, requirements, goals, tasks, conventions, deployments, agent state, and code facts supersede the prior node for the same topic. Independent assertions can set replace_current: false; conflicting claims then create executable contradicts edges instead of pretending one source is correct.

Decisions

Decision events preserve:

  • What was decided

  • Rationale

  • Rejected alternatives

  • Source and timestamp

  • Current/superseded status

  • Replacement decision ID

await projects.ingestProjectEvent("longmemory", {
  kind: "decision",
  topic: "database",
  text: "Use SQLite for local-first persistence",
  rationale: "Zero setup and transactional local storage",
  alternatives_rejected: ["Hosted Postgres"],
  source_type: "architecture_note",
  url: "file:///docs/decisions.md",
});

const decisions = await projects.getProjectDecisions("longmemory");

Superseded decisions remain available in project_historical recall.

Tasks and failures

Task memory records status, priority, owner, source URL, and update time:

await projects.ingestProjectEvent("longmemory", {
  kind: "task",
  topic: "connector-tests",
  text: "Add connector regression tests",
  status: "blocked",
  priority: "high",
  owner: "Alice Chen",
  source_type: "issue",
  url: "https://github.com/CaviraOSS/LongMemory/issues/42",
});

const tasks = await projects.getProjectTasks("longmemory");

Bug/failure events preserve failed fixes, root-cause notes, regression risks, and successful follow-up evidence. Debugging recall prioritizes failures, code facts, tasks, and agent working state so another agent does not repeat rejected approaches.

import { github_connector } from "longmemory";

const github = new github_connector({
  owner: "CaviraOSS",
  repo: "LongMemory",
  ref: "main",
});

await projects.linkSourceToProject("longmemory", {
  connector_id: "github",
  connector: github,
  label: "CaviraOSS/LongMemory",
  current_ref: "abc123",
});

const report = await projects.syncProjectSource("longmemory", "github", {
  mode: "incremental",
  current_ref: "abc123",
});

Before application, every connector plan is namespaced with the project ID. Top-level source worlds attach under the project repository, document, issue, or deployment world. Node IDs, plan keys, edge keys, permissions, provenance, and metadata are project-scoped. The same external connector can therefore be linked to multiple projects without collisions or leakage.

Connector cursors and checksums provide incremental sync. The project records linked source refs and sync reports. Use setProjectSourceRef when a repository branch/commit advances.

Code memory and freshness

Code facts may include:

  • Repository

  • Branch

  • Commit

  • File path

  • Line range

  • Checksum/version

  • Source URL

await projects.ingestProjectEvent("longmemory", {
  kind: "code_fact",
  topic: "src/core/project/project_memory.ts",
  text: "createProjectMemory is implemented here",
  source_type: "github",
  repo: "CaviraOSS/LongMemory",
  branch: "main",
  commit: "abc123",
  file_path: "src/core/project/project_memory.ts",
  line_start: 1,
  line_end: 400,
  checksum: "sha256:...",
});

project_code recall compares each fact’s commit with the linked source’s current ref. A mismatch receives a 0.2 freshness score and is ranked behind current-ref facts. Stale code facts remain historically explainable but should not be treated as current truth.

Project recall modes

const current = await projects.recallProject(
  "longmemory",
  { text: "current architecture" },
  "project_strict",
);

const old = await projects.recallProject(
  "longmemory",
  {
    text: "database architecture",
    valid_time: Date.UTC(2026, 0, 1),
  },
  "project_historical",
);

Modes:

  • project_strict: current project truth after temporal, contradiction, contract, permission, and grounding gates

  • project_historical: past valid/recorded project views and supersession chains

  • project_associative: broad project patterns, including failed attempts and superseded context

  • project_code: source/code memories with commit freshness ranking

  • project_planning: goals, architecture, decisions, requirements, constraints, tasks, risks, questions, and agent state

  • project_debugging: bugs, failures, code facts, tasks, and previous agent attempts

Every result includes project ID, memories, code facts when relevant, contradiction warnings, citations, raw core recall output, and a debug trace.

Contradictions

Independent sources that disagree create executable contradicts edges. Project recall and context packets surface warnings containing both memory IDs and available source text.

For example, a document claiming SQLite and an issue claiming Postgres remain an unresolved conflict. Strict recall will not invent certainty. A later authoritative decision can supersede the old architecture while retaining the contradiction and decision history.

Agent handoff

Agent state events remember:

  • Last active task

  • Current plan

  • Pending questions

  • Files touched

  • Proposed changes

  • Rejected approaches

  • Test results

  • Known failures

  • Next actions

await projects.ingestProjectEvent("longmemory", {
  kind: "agent_state",
  topic: "Implement project memory",
  text: "Agent is implementing project memory",
  subjective: true,
  files_touched: ["src/core/project/project_memory.ts"],
  alternatives_rejected: ["Global unscoped memory"],
  next_actions: ["Run project acceptance tests"],
  metadata: {
    current_plan: ["Implement APIs", "Validate isolation"],
    known_failures: ["Cursor overwrite regression"],
    test_results: ["Connector tests passed"],
  },
});

The next agent requests a context packet:

const handoff = await projects.getProjectContext(
  "longmemory",
  "continue implementing project memory",
  2_048,
);

The packet contains project summary, current goal, hard constraints, relevant architecture/files, active decisions, open tasks, known failures, retrieved memories, contradictions, citations, suggested next steps, and a debug trace.

It also contains the governed asset_loadout: only approved, unexpired, authorized assets selected for the user/team/role/agent/task/framework identity. Every selected item includes its injection mode and MCP-style audience, priority, and last-modified annotations; exclusions include a machine-readable reason.

Memory content is packed under the requested token budget using the same token estimator as core recall. Lower-ranked memories are omitted rather than truncating source identity or citation metadata.

Reusable Skills and agent loadouts

Skills turn proven workflows into durable project assets with a stable Skill ID, immutable versions, trigger boundaries, ordered instructions, validation rules, resource references, ownership metadata, and agent bindings.

const skill = await projects.createSkill("longmemory", {
  name: "Release check",
  description: "Validate a release before publishing.",
  triggers: ["release checklist", "publish package"],
  instructions: ["Run tests", "Build packages", "Inspect package contents"],
  validation: ["All tests pass"],
  resources: [{ path: "README.md" }],
});

await projects.bindSkill("longmemory", skill.skill_id, ["reviewer"]);
const matches = await projects.matchSkills(
  "longmemory",
  "run the release checklist",
  "reviewer",
);

Creating a Skill with an existing skill_id creates a superseding version; prior versions remain historically explainable. Archiving also creates an immutable terminal version. Project context includes matching Skills within the same token budget as memories. Skill records inherit the project permission contract; agent bindings narrow automatic loadout injection.

CodeGraph queries

Repository connectors already persist file snapshots, symbols, imports, and source provenance. Source analysis now records bounded symbol bodies and called symbols, enabling project-scoped search, callers, callees, and reverse impact paths without a second index service:

await projects.searchCodeSymbols("longmemory", "createMemory");
await projects.getCodeCallers("longmemory", "createMemory");
await projects.getCodeCallees("longmemory", "createMemory");
await projects.getCodeImpact("longmemory", "createMemory", 5);

Results retain file, line, language, commit, and backing memory IDs. The graph is syntactic and snapshot-aware; dynamic dispatch and runtime reflection remain outside its evidence boundary.

Past agent sessions

Cold-start import accepts a provider-neutral session with ordered system, user, assistant, and tool messages. It validates all messages and monotonic timestamps before writing, then stores each raw turn in the agent_sessions world with the original provider, agent, role, sequence, timestamp, tool call, and source ref.

await projects.importSession("longmemory", {
  session_id: "codex-42",
  agent_id: "builder",
  provider: "codex",
  source_ref: "history/codex-42.json",
  messages: [
    { role: "user", content: "Implement project Skills.", at: 1 },
    { role: "assistant", content: "Skills implemented.", at: 2 },
  ],
});

Required APIs

const projects = await createProjectMemory(config);

await projects.linkSourceToProject(project_id, source);
await projects.ingestProjectEvent(project_id, event);
await projects.syncProjectSource(project_id, connector_id);
await projects.recallProject(project_id, query, mode);
await projects.getProjectContext(project_id, task);
await projects.getProjectDecisions(project_id);
await projects.getProjectTasks(project_id);
await projects.createSkill(project_id, skill);
await projects.matchSkills(project_id, query, agent_id);
await projects.searchCodeSymbols(project_id, query);
await projects.getCodeImpact(project_id, symbol);
await projects.importSession(project_id, session);
await projects.listSessions(project_id);
await projects.registerAsset(project_id, asset);
await projects.governAsset(project_id, asset_id, patch);
await projects.resolveAssetLoadout(project_id, request);
await projects.buildAgentManifest(project_id, request);
await projects.explainProjectMemory(project_id, memory_id);

Equivalent exported helper functions accept the project manager as their first argument.

Project memory never becomes global by default, never writes raw chunks into vector storage, never skips provenance, and never admits stale code facts as current project truth.

512 files · 459 not served here

Advantages

  • Supports temporal truth by separating recorded time from valid time, allowing for historical accuracy. evidence: README.md
  • Provides immutable memory where content and provenance are preserved, preventing accidental overwrites. evidence: README.md
  • Enforces governance policies for projects, teams, and roles to ensure secure and scoped memory access. evidence: README.md

Limitations

  • Requires manual configuration for network deployment, including API key management and TLS termination. evidence: README.md
  • The Python SDK requires a running LongMemory server instance for persistent storage. evidence: README.md

Security

Risk level: Low risk

This brain runs

Install scripts (1)

  • Makefile (make install): corepack enable; pnpm install --frozen-lockfile

MCP servers (2)

  • integrations/claude-code-longmemory/.mcp.json (longmemory): longmemory mcp --project current
  • integrations/gemini-cli-longmemory/gemini-extension.json (longmemory): longmemory mcp --project current
  • Low risk: scripts-present (benchmarks/src/official.ts)
  • Low risk: scripts-present (src/cli/index.ts)
  • Low risk: scripts-present (tools/check-integrations.mjs)

Attribution and licence

Created by
CaviraOSS
First committed by
@nullure
Declared authors
  • CaviraOSS (declared in package.json)
Publisher
Cavira (Community)
Source
CaviraOSS/LongMemory · commit aec98ce
Licence
Apache License 2.0 (files served here)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by CaviraOSS.

Install from source

459 of its files are not served here, so there is no ZIP. CaviraOSS/LongMemory at aec98ce