cam
English · 中文 · 日本語 · 한국어 · العربية · 🌐 Website
A local multi-turn conversational memory system purpose-built for coding agents
Code graph + memory · surgical reads · 100% local · MCP + CLI
Kernel written in Rust
Contents
- Why cam?
- Get Started
- Key Features
- How It Works
- Agent Workflow
- CLI Reference
- Memory Rules
- Configuration
- Benchmarks
- Supported Agents
- Supported Languages
- Supported Platforms
- License
Guides: Interactive Showcase (Website) · Main Agent vs Subagent · MCP Configs by IDE · 中文说明
Why cam?
When an AI coding agent explores a repository, it usually rediscovers structure the slow way — running grep, glob, and full-file Read one file at a time — and forgets everything in the next session.
cam gives the agent two local retrieval planes in a single binary:
One binary, two interfaces: The main agent calls
camover MCP (cam mcp); subagents (which rarely inherit MCP tools) call the exact same CLI (cam --json …). Both share.cam/cam.dbon disk, 100% local, zero API cost.
Get Started
Option 1: One-Sentence Agent Install (Recommended)
Paste this prompt directly into your coding agent (Cursor, Claude Code, Codex, Windsurf, GitHub Copilot, Cline, etc.) and let it install, index, and wire cam for you:
Install cam from https://github.com/HanochZhu/codeagent_memory: require a working Rust toolchain (rustup), run `cargo install --git https://github.com/HanochZhu/codeagent_memory --locked`, ensure ~/.cargo/bin (or %USERPROFILE%\.cargo\bin on Windows) is on PATH, then verify with `cam --help`. In this repo run `cam index`. For the main agent, register MCP stdio: command `cam`, args `["mcp"]` (Cursor: .cursor/mcp.json; Claude Code: .mcp.json). Subagents call `cam --json` in the shell. Do not add extra docs.
Note: cargo install places cam in ~/.cargo/bin (Windows: %USERPROFILE%\.cargo\bin). Restart your terminal or IDE if cam is not immediately found on PATH.
Option 2: Manual Setup
1. Install the CLI
Requires a Rust toolchain:
cargo install --git https://github.com/HanochZhu/codeagent_memory --locked
cam --help
From a local clone:
git clone https://github.com/HanochZhu/codeagent_memory.git
cd codeagent_memory
cargo install --path . --locked
Docker (no Rust toolchain required):
docker pull ghcr.io/hanochzhu/codeagent-memory:0.1.5
docker run -i --rm -v "$PWD:/work" -w /work ghcr.io/hanochzhu/codeagent-memory:0.1.5
Or build locally: docker build -t cam https://github.com/HanochZhu/codeagent_memory.git
2. Index & query your project
cd your-project
cam index # parse repo into .cam/cam.db
# Query the code graph
cam ls src/ # list files or symbols in a file
cam read src/main.rs/main # read a single symbol body
cam ref main --dir in # 1-hop callers (in) or callees (out)
# Query & write to the memory tree
cam recall "how does hybrid recall fuse BM25 and vectors"
cam add --summary "..." < notes.md
cam auto-initializes .cam/ on first use. Run cam watch in the background if you want live incremental graph updates as files change.
3. Connect MCP for the main agent
Add cam mcp to your host's MCP configuration (e.g. .cursor/mcp.json or .mcp.json):
{
"mcpServers": {
"cam": {
"command": "cam",
"args": ["mcp"]
}
}
}
See docs/mcp.md for host-specific config paths and docs/agents.md for main-agent / subagent prompt rules.
The first recall or add downloads the default embedding model (potion-multilingual-128M to ~/.cam/models/) and falls back to a lexical hash embedder if offline.
Key Features
How It Works
- Extract —
tree-sitterwalks the workspace and stores symbol definitions and call edges in.cam/cam.db. - Surgical Read — Agents navigate via virtual paths (
ls→find→read→ref). Reading a file returns its symbol outline; readingfile/symbolreturns only that symbol's source slice. - Hybrid Recall —
recalltakes an English query, embeds it locally, runs identifier-aware BM25 (splittingsnake_case,kebab-case,camelCase+ English stemming), prunes low-confidence tails, and fuses both lists with RRF ($k=60$) scaled by $0.9 + 0.1 \times R$. Superseded revisions are automatically expanded to their newest replacement. - Write-Back — When an agent solves a non-trivial task, it extracts atomic facts so each
addstores only one fact (English summary; body supports non-Latin characters). Related facts are connected via--link/linksinto a knowledge graph (inspected viamem show; recall does not traverse graph links yet).--parentattaches a memory to a structural topic;--supersedesreplaces an outdated memory while preserving lineage.
Architecture deep dive (Chinese): DESIGN.md.
Agent Workflow
Every coding task follows the same four-step loop:
- Recall first — Query
cam_recall/cam recallin English before grepping. Reuse a hit if it islatestand notneeds_update. - Ensure indexed — If graph tools return
not_indexed, runcam_index/cam indexonce for the project. - Walk the graph — On a memory miss, locate symbols with
findorls, read symbol bodies withread <file>/<symbol>, and trace callers/callees withref <symbol> --dir in|out. - Write back — Persist newly discovered architecture facts or fixes with
cam_add/cam addas atomic facts (one fact per memory, English summary; body supports non-Latin characters), linking related facts withlinks/--link.
Full agent rules & copy-paste system prompts: docs/agents.md.
CLI Reference
Code Graph Commands
Memory Commands
Server & Configuration Commands
Global flags & conventions:
--project <dir>(orCAM_PROJECTenv var) overrides automatic upward.cam/.gitroot detection.--jsonemits compact JSON (--prettyfor indented JSON). Errors on--jsonprint{"error":{"code":…,"message":…}}tostdoutand exit non-zero.- Ambiguous symbols: When
readorrefmatches multiple definitions,camreturnsstatus: "ambiguous"with candidate node IDs (e.g.src/main.rs:function:main:12) that can be passed directly back toreadorref. - Ignore rules & multi-repo directories: Honors
.gitignoreand.camignoreat any depth. Skips git submodules and linked worktrees; indexes nested standalone clones askind: "project"(passable to--scope).
Memory Rules
- Atomic facts & knowledge graph links: Store only one atomic fact per memory to avoid packing excessive information into a single entry. When multiple facts are related, link them with
--link/linksto form a knowledge graph (graph recall is not enabled yet). - English queries and summaries: Recall queries and memory summaries must be written in English. Memory bodies support non-Latin characters.
- Retention & reinforcement: Ebbinghaus retention $R = e^{-t / S}$ adjusts recall score via $\text{relevance} \times (0.9 + 0.1 \times R)$. Entries with $R < 0.3$ are marked
needs_update; entries older thanstale_days(default30) are markedstale. Every valid recall hit (needs_update = false) refreshes last-accessed time and multiplies stability $S$ by1.7. - Non-destructive lineage: Memories are never deleted.
--parentforms branching trees;--supersedesforms linear revision chains where only the tail is markedlatestand older revisions are folded out of default recall results.
Configuration
Global settings live in ~/.cam/config.toml:
stale_days = 30
# embedding_model = "minishlab/potion-multilingual-128M" # default (cached under ~/.cam/models/)
# embedding_model = "minishlab/potion-base-8M" # lighter Hugging Face model2vec repo
# embedding_model = "/path/to/local/model2vec" # dir with tokenizer.json, config.json, model.safetensors
# embedding_model = "hash" # zero-download lexical hash embedder
Use CAM_EMBED_MODEL to override the model for a single process, or cam config set embedding_model default to reset. When the embedding model changes, the next recall automatically re-embeds existing memories before scoring.
Benchmarks
cam evaluates its code graph and memory planes separately against the closest open-source systems on identical corpora:
General chat memory frameworks (Mem0, Zep, Letta) target conversational logs rather than these coding-agent corpora and are omitted from the tables below.
System Comparison
1. Memory — coding-agent-life-v1
15 sessions, 15 queries, $k=5$ (same scoring as agentmemory score.ts; P@5 ceiling is 0.240).
Revision chains (--lineage): Re-ingesting every turn as a --supersedes revision tests whether top-$k$ returns the newest node of each gold chain (newest R@k) and whether any superseded node falsely claims latest (stale latest).
2. Long-Term Memory — LongMemEval-S
100 non-abstention questions sampled with seed 42 from cleaned LongMemEval-S. Retrieval fuses embeddings + BM25 with RRF at $k=10$ without an LLM reader.
3. Workflow Retrieval — Agent Retrieval Bench V2 (edit2ripple)
58 anchored-change queries across 44 frozen repository snapshots (no LLM; BCY = Budgeted Context Yield under the canonical 8K-token file-packing protocol).
cam graph achieves the highest first-hit rank (MRR 0.297, query P95 7.3 ms), while lexical search provides broader multi-file coverage — motivating graph + lexical rank fusion.
4. Code Graph — LongMemCode (clap)
clap v4.6.1, 536 scenarios against SCIP gold (no LLM, P95 ≈ 5.2 ms, $/1k = 0).
5. Multi-Turn Token Savings — DeepSeek
Full context dump vs. per-turn cam retrieval (deepseek-flash, hash embedder, 2026-10-13):
Dataset paths are configured in eval/datasets.toml (coding-agent-life-v1 defaults to ../agentmemory or CAM_EVAL_CODING_LIFE).
python3 eval/coding_life/run.py --adapter grep
python3 eval/coding_life/run.py # potion; errors if the model fails
python3 eval/coding_life/run.py --hash-embed # hash embedder
python3 eval/longmemeval/run.py --sample 100 --seed 42 --workers 8 # potion
python3 eval/longmemeval/run.py --sample 100 --seed 42 --workers 8 --hash-embed
python3 eval/locomo/run.py --workers 4 # potion, evidence recall
git clone --depth 1 https://github.com/eyuansu62/agent-retrieval-bench \
eval/agent_retrieval/vendor/agent-retrieval-bench
python3 -m pip install -e eval/agent_retrieval/vendor/agent-retrieval-bench
arb download-benchmark --version v2_edit2ripple --local-dir eval/agent_retrieval/data --force
python3 eval/agent_retrieval/run.py --workers 8
python3 eval/llm_multiturn/run.py --track both # potion; requires DEEPSEEK_API_KEY
python3 eval/longmemcode/run.py --corpus clap
python3 eval/charts/generate.py
Supported Agents
Register cam mcp (stdio) for the main agent; subagents use the cam --json CLI directly with zero extra setup.
Copy-paste configs: docs/mcp.md · System prompts: docs/agents.md.
Supported Languages
Supported Platforms
cam compiles natively on macOS, Linux, and Windows via cargo install --git https://github.com/HanochZhu/codeagent_memory --locked, or runs anywhere via Docker (ghcr.io/hanochzhu/codeagent-memory:0.1.5). See Get Started.
License
MIT
Made for AI coding agents — Claude Code, Cursor, Codex, Windsurf, Copilot, and JetBrains