Lossless Context Manager
Shared memory infrastructure for coding agents
DAG-based summarization, SQLite-backed message persistence, promoted long-term memory, MCP retrieval tools
Runtime Model •
Installation •
MCP Tools •
Development
Lossless Context Manager replaces sliding-window forgetfulness with a persistent memory runtime for both humans and agents.
- Every message is stored in a project SQLite database.
- Older context is compacted into a DAG of summaries instead of being dropped.
- Durable decisions and findings are promoted into cross-session memory.
- Claude Code and Codex have native hook integrations, while VS Code uses connector-based workflows on the same backend today.
Humans and agents use the same backend. The integration surface differs by client, but the memory model is shared.
This repo is a fork of lossless-claude, which in turn is a fork of lossless-claw by Martian Engineering. This fork's objective is to have first class support for Codex as well, but a number of other coding agents are also supported. Improvements to cover more harnesses are always welcome. Tigther security measures are a focus as well.
The LCM model and DAG architecture originate from the Voltropy paper.
Runtime Model
flowchart LR
subgraph Clients["Clients"]
CC["Claude Code<br/>hooks + MCP"]
CX["Codex<br/>hooks + MCP"]
end
CC --> D["lcm daemon"]
CX --> D
D --> DB[("project SQLite DAG")]
D --> PM[("promoted memory FTS5")]
D --> TOOLS["MCP tools<br/>search / grep / expand / describe / store / stats / doctor"]
Capabilities by integration path
| Claude Code | Yes | Yes | Yes, via transcript/hooks | Yes | Primary hook-based integration |
| GitHub Copilot (VS Code) | No | Yes, via rules | No | No | Repo-local skill can teach Copilot to call lcm, but there is no automatic restore or turn capture yet |
| Codex | Yes | Yes | Yes, via native hooks | Yes, thresholded | lcm connectors install codex writes native Codex hooks, the Codex skill, and user-level rules for restore, prompt hints, passive learning, rolling transcript snapshots, and thresholded compaction |
LCM Model
| Persist | Raw messages are stored in SQLite per conversation |
| Summarize | Older messages are grouped into leaf summaries |
| Condense | Summaries roll up into higher-level DAG nodes |
| Promote | Durable insights are copied into cross-session memory |
| Restore | New sessions recover context from summaries and promoted memory |
| Recall | Agents query, expand, and inspect memory on demand |
Nothing is dropped. Raw messages remain in the database. Summaries point back to their sources. Promoted memory remains searchable across sessions.
flowchart TD
A["conversation / tool output"] --> B["persist raw messages"]
B --> C["compact into leaf summaries"]
C --> D["condense into deeper DAG nodes"]
C --> E["promote durable insights"]
D --> F["restore future context"]
E --> F
F --> G["search / grep / describe / expand / store"]
Installation
Prerequisites
- Node.js 22+
- For hook based automation, one of:
- Claude Code (native hooks)
- Codex CLI/VSCode integration/app (native hooks)
- VS Code with GitHub Copilot extension (connector-based)
Claude Code
Install the lcm binary first:
npm install -g @donadiosolutions/lcm
claude plugin add github:donadiosolutions/lcm
lcm install
lcm install writes config, registers hooks, installs slash commands, registers MCP, and verifies the daemon.
VS Code (GitHub Copilot)
Install the lcm binary first:
npm install -g @donadiosolutions/lcm
Then install the repo-local Copilot connector:
lcm connectors install github-copilot
lcm connectors doctor github-copilot
This creates a workspace skill under .github/skills/lcm-memory/SKILL.md so Copilot can search and store memory through the lcm CLI.
Codex
Install the lcm binary first:
npm install -g @donadiosolutions/lcm
Then install the Codex connector:
lcm connectors install codex
lcm connectors doctor codex
This installs the default Codex connector set:
- Native hooks in
~/.codex/hooks.json and Codex's current hooks feature in ~/.codex/config.toml
- The LCM skill in
~/.codex/skills/lcm-memory/SKILL.md
- User-level rules in
~/.codex/AGENTS.md
The native hooks use:
SessionStart | lcm restore --client codex | Restore project memory at startup, resume, or clear |
UserPromptSubmit | lcm user-prompt --client codex | Inject relevant memory before each prompt |
PostToolUse | lcm post-tool --client codex | Capture passive learning signals from tool use |
Stop | lcm session-snapshot --client codex | Ingest Codex transcript deltas and compact when the configured token threshold is reached |
Import older Codex sessions when needed:
lcm import --codex
lcm import --provider all
If you also want MCP inside Codex, run lcm connectors install codex --type mcp. Today that prints the TOML block you must add manually to .codex/config.toml.
See docs/vscode-codex.md for the current VS Code/Codex setup path and remaining limitations.
Hooks
Claude Code uses plugin-managed hooks. All Claude Code hooks auto-heal: each validates that all required entries remain registered and repairs missing entries before continuing. Codex uses native hooks from ~/.codex/hooks.json.
PreCompact | lcm compact --hook | Intercepts compaction and writes DAG summaries |
SessionStart | lcm restore | Restores project context, recent summaries, and promoted memory |
SessionEnd | lcm session-end | Ingests the completed Claude transcript |
UserPromptSubmit | lcm user-prompt | Searches memory and injects prompt-time hints |
flowchart LR
SS["SessionStart"] --> CONV["Conversation"]
CONV --> UP["UserPromptSubmit<br/>(each prompt)"]
UP --> CONV
CONV --> PC["PreCompact<br/>(if context fills)"]
PC --> CONV
CONV --> SE["SessionEnd"]
MCP Tools
lcm_search | Hybrid search across episodic memory (SQLite) and semantic memory |
lcm_grep | Regex or full-text search across raw messages and summaries |
lcm_expand | Decompress a summary node into its source content by traversing the DAG |
lcm_describe | Inspect metadata and lineage of a memory node (depth, token count, parent/child links) |
lcm_store | Persist durable memory manually with optional tags |
lcm_stats | Show token savings, compression ratios, and usage statistics |
lcm_doctor | Diagnose daemon, hooks, MCP registration, and summarizer setup |
CLI
lcm install
lcm uninstall
lcm doctor
lcm diagnose
lcm status
lcm -V
lcm search "query"
lcm grep "pattern"
lcm describe <nodeId>
lcm expand <nodeId>
lcm store "content"
lcm stats
lcm stats -v
lcm stats --pool
lcm compact
lcm compact --all
lcm promote
lcm promote --all
lcm import
lcm import --all
lcm import --codex
lcm import --provider all
lcm export
lcm import-knowledge <f>
lcm connectors list
lcm connectors install <a>
lcm connectors remove <a>
lcm connectors doctor
lcm sensitive add <pat>
lcm sensitive add --global
lcm sensitive list
lcm sensitive test <str>
lcm sensitive purge --yes
lcm daemon start --detach
lcm compact --hook
lcm restore
lcm session-end
lcm user-prompt
lcm post-tool
lcm mcp
Configuration
All environment variables are optional. The default summarizer mode is auto.
LCM_SUMMARY_PROVIDER | auto | auto, claude-process, codex-process, anthropic, openai, or disabled |
LCM_SUMMARY_MODEL | unset | Optional model override for the selected summarizer provider |
LCM_CONTEXT_THRESHOLD | 0.75 | Context fill ratio that triggers compaction |
LCM_FRESH_TAIL_COUNT | 32 | Most recent raw messages protected from compaction |
LCM_LEAF_MIN_FANOUT | 8 | Minimum raw messages per leaf summary |
LCM_CONDENSED_MIN_FANOUT | 4 | Minimum summaries per condensed node |
LCM_INCREMENTAL_MAX_DEPTH | 0 | Automatic condensation depth |
LCM_LEAF_CHUNK_TOKENS | 20000 | Maximum source tokens per leaf compaction pass |
LCM_LEAF_TARGET_TOKENS | 1200 | Target size for leaf summaries |
LCM_CONDENSED_TARGET_TOKENS | 2000 | Target size for condensed summaries |
LCM_MAX_EXPAND_TOKENS | 4000 | Token cap for DAG expansion via lcm_expand |
LCM_LARGE_FILE_TOKEN_THRESHOLD | 25000 | File size (tokens) above which content is extracted to disk |
LCM_AUTOCOMPACT_DISABLED | false | Set to true to disable automatic compaction after each turn |
LCM_ENABLED | true | Set to false to disable the plugin while keeping it registered |
auto resolves per caller:
lcm -> claude-process
- explicit config or
LCM_SUMMARY_PROVIDER override always takes precedence
See docs/configuration.md for tuning notes and deeper operational guidance.
Development
npm install
npm run build
npx vitest
npx tsc --noEmit
Repository layout
bin/
lcm.ts CLI entry point (binary: lcm)
src/
compaction.ts DAG compaction engine
connectors/ client integration adapters
daemon/ HTTP daemon, lifecycle, config, routes
db/ SQLite schema + promoted memory
hooks/ Claude hook handlers + auto-heal
llm/ summarizer backends
mcp/ MCP server + tool definitions
store/ conversation and summary persistence
installer/
install.ts setup wizard
uninstall.ts cleanup
test/
... Vitest suites
Privacy
All conversation data is stored locally in ~/.lcm/. On first startup after upgrading from older releases, lcm automatically migrates an existing ~/.lossless-claude/ directory to ~/.lcm/ when the new directory is absent or does not already contain LCM data. Nothing is sent to any LCM server.
If you configure an external summarizer (claude-process, anthropic, openai, etc.), messages are sent to that provider for summarization — after built-in secret redaction. lossless-claude scrubs common secret patterns (API keys, tokens, passwords) from message content before writing to SQLite and before sending to the summarizer.
Add project-specific patterns with lcm sensitive add "MY_PATTERN". See docs/privacy.md for full details.
Technical Notes
- Claude Code integration is hook-first.
- The daemon is shared; the memory backend is client-agnostic.
- The repo carries the original lossless-claw lineage; the current runtime is Claude Code oriented.
Acknowledgments
This project is a fork of lossless-claude, which itself stands on the shoulders of lossless-claw, the original implementation by Martian Engineering. This fork keeps the DAG-based compaction architecture, the LCM memory model, and the foundational design decisions.
The underlying theory comes from the LCM paper by Voltropy.
Original website
License
MIT