Adding memory to Zed's agent
one server id, two install paths, and one honest gap
Zed's agent keeps its threads in its own store and starts each one without the others. And unlike the terminal agents, everything you did in them is invisible to it — including the Zed thread from last week.
What Zed already has
Threads live in one SQLite database under Zed's data directory — threads/threads.db — and each thread body is a zstd frame rather than text, which is why reading them by hand needs both sqlite3 and zstd. The thread list is a list; nothing consults it while you work.
Adding recall
Zed takes memory as a context server, and there are two ways to get one:
deja install zed
writes the server into settings.json. Or install the deja extension from Zed's extension list, which brings its own copy of the binary if you have none.
Both use the same server id — deja-context-server — and Zed keys servers by id, so whichever order you install in there is exactly one server. That was not free: with two different ids, Zed ran two servers and the agent saw every tool twice.
The extension is still in review at the time of writing; until it lands, deja install zed is the path, and it needs the binary:
brew install deja-vu
What arrives, and what does not
The deja tool with its eight modes. Zed loads Agent Skills from ~/.agents/skills, where deja already writes the shared deja-history skill, and typing / in the agent panel lists it by name — in Zed the skill is the command. Or ask the agent, and it calls the tool. What Zed cannot give you today is memory that arrives unasked: its extension API covers language servers, context servers and debuggers, and there is no lifecycle hook where recall could be injected — no session-start block, nothing before a tool call. Most harnesses in the matrix have one; Zed does not, and it is a limitation of the API rather than something we chose to skip. It becomes work the day Zed ships a hook.
In practice the agent calls recall itself when the conversation implies earlier work, because the tool description tells it to. That covers most of the gap and none of the silence.
The part that is not about this harness
The index covers every agent's transcripts on the machine — forty-one of them today, each in its own format — so a fix found in one tool answers a question asked in another, including sessions from before any of this was installed. That is the reason to index rather than to capture.
Nothing here writes memories, so there is nothing to hallucinate into your history; indexing and search are local, and credentials are stripped as the index is built (privacy). An injection is capped at 1,536 bytes per prompt and about 4 KB per tool call — what memory costs has the measured comparison.
Getting started · How Zed's store is read · The extension source
Found this useful? Star deja-vu on GitHub.