Agent memory that reconciles contradictions. An in-process library:
npm i ramfarm, one SQLite file, no daemon.
| Method | LLM needed? |
|---|---|
remember({subject, text, source?, context?, fast?}) | yes |
recall({subject, query?}) | no |
forget(filter) | no |
reflect(subject, {dryRun}) | yes |
get(id) / stats(subject?) | no |
exportLines() / importLines() | no |
The asymmetry is the design: recall, stats, export and import need no key and no network. Only writing and reflecting call an LLM. The hot, frequent operation is free.
npx -y @ramfarm/mcp resolves to a 404 -- verified,
not assumed. It is shown because it is the shape the package will ship with, and because a page
that says "not published" in the footer while handing out an install command in the body is
worse than one that says so at the point of use.{
"ramfarm": {
"command": "npx",
"args": ["-y", "@ramfarm/mcp"],
"env": { "RAMFARM_DB": "~/.ramfarm/waremoto.db" }
}
}
Five tools: remember, recall, forget, reflect,
memory_stats.
import { open } from "ramfarm";
const farm = await open("./memory.db", { strict: true });
await farm.remember({ subject: "user:julio", text: "prefers pnpm for this repo" });
const hits = await farm.recall({ subject: "user:julio", query: "package manager" });
strict: true is not optional in anything real.
Without it open() silently falls back to HashEmbedProvider, which is
deterministic but not semantic — and that breaks contradiction detection entirely.type · scope · basis (stated |
inferred) · validFrom / validTo · supersedes[].
A non-null validTo means history, not garbage — superseded facts are
kept with their lineage.