Persistent memory for pi. Learns corrections, preferences, and project patterns from sessions and injects them into future conversations.
- Automatic learning — Extracts preferences, project patterns, and corrections from conversations at session end via LLM consolidation
- Context injection — Automatically adds relevant memory into every new session's system prompt
- Corrections stick — Mistakes you correct once become permanent lessons (e.g. "use sed for daily notes, not echo >>")
- Complements session-search — session-search finds what you did, pi-memory remembers what you learned
Recommended: Install pi-total-recall to get the complete context stack — persistent memory, session history search, and local knowledge search in one package:
pi install pi-total-recallOr install pi-memory standalone:
pi install npm:@samfp/pi-memoryOr add to ~/.pi/agent/settings.json:
{
"packages": ["npm:@samfp/pi-memory"]
}Note: Make sure you use the
@samfp/scope. There is an unrelatedpi-memorypackage on npm that will install instead if you omit the scope.
| Type | Key prefix | Example |
|---|---|---|
| Preferences | pref.* |
pref.commit_style → "conventional commits" |
| Project patterns | project.* |
project.rosie.di → "Dagger dependency injection" |
| Tool preferences | tool.* |
tool.sed → "use for daily note insertion" |
| User identity | user.* |
user.timezone → "US/Pacific" |
| Lessons | (table) | "DON'T: use echo >> for vault notes, use sed" |
| Tool | Description |
|---|---|
memory_search |
Search semantic memory by keyword |
memory_remember |
Manually store a fact or lesson |
memory_forget |
Delete a fact or lesson |
memory_lessons |
List learned corrections |
memory_stats |
Show memory statistics |
| Command | Description |
|---|---|
/memory-consolidate |
Manually trigger memory extraction from current session |
session_start— Opens the SQLite store, shows memory stats briefly in the status barbefore_agent_start— Builds a<memory>context block from stored facts and lessons, appends it to the system promptagent_end— Collects conversation messages for later consolidationsession_shutdown— Runs LLM consolidation (viapi -p --print) to extract structured knowledge, then closes the store
At session end, if there were ≥3 user messages, the extension sends the conversation to an LLM and asks it to extract:
- Preferences — coding style, workflow habits, tool choices
- Project patterns — languages, frameworks, architecture decisions
- Corrections — things you corrected, mistakes to avoid
Only facts with confidence ≥ 0.8 are stored. Lessons are deduplicated using exact match and Jaccard similarity (≥ 0.7 threshold).
At session start, stored memory is organized into sections (preferences, project context scoped to cwd, tool preferences, lessons, user identity) and injected as a <memory> block in the system prompt. The block is capped at 8KB.
Selective lesson injection — By default, all lessons are injected into every session. When you have many lessons across different domains, this can waste context. Enable selective mode to filter lessons by relevance:
{
"memory": {
"lessonInjection": "selective"
}
}Add this to ~/.pi/agent/settings.json. In selective mode, lessons are filtered by:
- Prompt relevance — FTS search against the user's first message
- Project context — lessons matching the current working directory's project
- Category inference — keywords in the prompt trigger relevant categories (e.g. "pentest" pulls in
bug-bountylessons, "blog post" pulls inwritinglessons) - General lessons — always included regardless of prompt
The result is capped at 15 most relevant lessons instead of all of them.
| Mode | Behavior |
|---|---|
"all" (default) |
Every lesson injected into every session |
"selective" |
Only relevant lessons based on prompt, project, and category |
SQLite database at ~/.pi/memory/memory.db (WAL mode). Three tables:
semantic— key-value facts with confidence scoreslessons— learned corrections with dedupevents— audit log of all memory operations
MIT