deja now reads Windsurf / Devin Desktop: Cascade's encrypted conversation
files are decrypted, authenticated and indexed, and deja install windsurf
adds the MCP server, a global rule, the skill and a /deja workflow. That
makes 42 harnesses. Grok Build installs the plugin from this repository's own
marketplace, and a Spec Kit extension ships with each release. The person sees
more of what deja did: the first session names an error the machine keeps
hitting, the weekly note names the session agents used, and dsh, Hermes,
OpenClaw and Gemini show deja's line where the person reads it. Kimi Code and
Qwen Code edit calls are pinned by fixtures from @beiryu.
deja delete and D in the TUI erase a session from its agent and from
deja after asking. Claude Code sessions whose transcript is gone come back as
their prompts from history.jsonl, and without zstd a compressed rollout no
longer makes every search rewrite the index.
Changed
- deja's lines for the person fit on one line each, and a session start shows the recall receipt plus at most one once-only note (the built note, what changed, the week note, the GitHub line), so a fresh install no longer opens with four lines. The receipt drops its byte count and the docs line folds into the built note. What the model receives is unchanged.
Added
DEJA_THEME=draculapaints the interactive screen in the Dracula palette, for terminals themed that way.lightanddarkwork as before, and a name deja does not know still falls back to the terminal background. From @demrom (#5106).deja delete <id>andDin the TUI erase a session from its agent and from deja's index, after asking; there is no undo.--dry-runlists the files. Claude Code, Codex, Cursor CLI, Gemini CLI, Qwen Code, Copilot CLI, Cline CLI, Kimi Code, Grok, dsh, pi, Senpi, OpenClaw and Antigravity are removed as files, opencode throughopencode session delete. Running sessions, shared stores and unchecked agents are refused.- A guide on deleting Copilot CLI session history: find the session by the id in
session.start, not the directory name, and whatcopilot --resumeloses. From @beiryu (#4965). - A guide on deleting Qwen Code chat history: the chat file, its sub-agent logs, and what
qwen -rloses. From @beiryu (#4966). - Claude Code sessions whose transcript is gone come back as their prompts.
~/.claude/history.jsonlkeeps every typed prompt and paste with its session id after the cleanup deletes the transcript, so those sessions are searchable again, filed under the directory they ran in. Only the prompts:deja showsays so, anddeja resumerefuses one. A session with its transcript on disk, or one deja kept after it was deleted, is left to the transcript.DEJA_CLAUDE_HISTORY_FILEmoves the file (#5046). - The guide on deleting old Claude Code sessions in Chinese, with the same commands and numbers: 368 of 1,320 files are older than 30 days and hold 4% of the bytes, while the ten largest hold 86%. From @beiryu (#4970).
- The Claude Code and Cursor memory guides in Chinese, with the same commands and numbers. From @Quartex246 (#5019, #5020).
- The Codex CLI history guide in Chinese: where the rollouts live, why a plain
grepstops seeing sessions older than a week, thejqandsqlite3recipes, and search and SSH sync. From @ursasi (#5085). - Five more guide pages in Chinese, with their commands and paths kept verbatim: deleting Codex sessions, deleting Cursor chats, Codex resume and its two errors, the Claude Code "No conversation found with session ID", and the full context window with its measured 77% / 0.2%. From @ursasi (#5080, #5081, #5082, #5083, #5084).
- Shell completion for
deja recall:--project,--harnesswith the harness names, and--limitin bash, zsh, fish and PowerShell, where it used to offer search flags recall refuses. zsh's command list now offers recall too. From @orshih6 (#5015). - A Spec Kit extension:
/speckit.deja-vu.recallsearches past agent sessions for the current feature's spec and plan and reports what was tried, decided or failed, citing session ids. It registers an optionalbefore_implementhook, so/speckit.implementoffers it and runs nothing unless you agree. Each release attaches it asdeja-spec-kit.zip:specify extension add deja-vu --from https://github.com/vshulcz/deja-vu/releases/latest/download/deja-spec-kit.zip. - The weekly note names the session agents used, with an id
deja showopens:agents used "fix the JWT clock skew…" (claude) — deja show e8b6eefc-fec. Used means an agent credited it this week with adéjà vu: … (deja:<id>)line; without one, the session recalled twice or more stands in.hook-context --notescan land in a group chat, so there it saysagents used a claude session — deja show <id>and quotes no title. A week with nothing used reads as before, and what the model receives is unchanged (#4615). - Windsurf / Devin Desktop Cascade conversations are read from
~/.codeium/windsurf/cascade/*.pb(DEJA_WINDSURF_ROOTmoves it): typed prompts and the planner's replies, decrypted and authenticated first. A trajectory that fails authentication is skipped and counted, anddeja doctorsays how many.deja install windsurfwrites the MCP server into~/.codeium/windsurf/mcp_config.json, deja's guidance block intomemories/global_rules.md(left out, with a note, when the file would pass Cascade's 6,000-character cap), the deja-history skill intoskills/, and a/dejaworkflow intoglobal_workflows/. Cascade hooks are not wired: none of their output reaches the model. No resume:devin-desktop --sessionsopens the Sessions window, and nothing takes a conversation id. Researched by @yearth (#308). - The first session after a build says one thing from the person's own history under the counts: the error this machine keeps hitting and which agents hit it,
this machine has hit `command not found: timeout` in 32 sessions (claude, codex), or with no such error a question asked again days apart.hook-context --notesfeeds plugin replies that can land in a group chat, so it names the error and never quotes a question. A history with neither keeps the one-line note, and what the model receives is unchanged (#4616). - In a 1:1 chat with the owner on an OpenClaw channel (Telegram, Slack, Discord and the rest), a reply answered from history gets one italic line under it:
↺ you've been here: "<topic>" · Oct 4 · deja. Same deja call per prompt, same text for the model. It goes only on the final text reply of the same run, and only when every 1:1 signal agrees and the sender is the owner; anything unknown means no line. It needs a channel that sends replies whole (channels.telegram.streaming.mode: "off"); on a streaming channel deja is not asked for it. Group chats, other people's DMs, the TUI and the Control UI get nothing, and no other deja note is sent to a channel."receipt": falsein the plugin config turns it off. In the npm plugin and the onedeja install openclaw-autowrites. - dsh web shows the person the lines deja prints for them in Claude Code: the "you have been here" receipt, and at session start what was recalled and the build and week notes. They sit in a panel above the input. The model's text is unchanged and the receipt costs no extra deja call per prompt. tui, headless and sdk profiles have no page, so there the plugin still asks deja for plain text and leaves the notes for
/dejaand the next session to show (#4982). - Hermes shows the person deja's lines too, with deja as the memory provider: the receipt and the session-start notes ride Hermes's own recall line,
🧠 deja · …, in the CLI, where it used to say only "recalled 1 memory". Same one deja call per hook, and the model's text is unchanged. Hermes 0.17 has no such line,hermes -zandhermes chat -Qprint none, the TUI and desktop do not keep it on screen and a gateway chat may be a group, so there deja is still asked for plain text and keeps its notes. - A dsh profile wired by
deja install dsh-autoshows the same panel, from the same files the npm plugin ships. With both installed there is still one panel and one recall (#4983).
Fixed
-
Without
zstd, compressed Codex rollouts and OpenClaw archives no longer make everydeja index, search anddeja lastrewrite the index. A file left unread for want ofzstdis held as waiting until it changes orzstdis installed, and a pass looks forzstdonce instead of once per file. 1,500 such rollouts beside 4,000 plain ones made each pass take 0.40 s instead of 0.09 s. From @notsubash (#5105). -
deja promoterefuses a second id instead of promoting the last one named, so a mistyped first id no longer writes a note on another session. From @WynandVStaden (#5075). -
deja lastanddeja showanswer from the index while another deja holds its lock instead of waiting it out. A session too new for that index, like the one a session-start refresh is still reading, still waits for it. From @Sora-bluesky (#5058). -
deja aider --helpanddeja goose --helpprint the tool's own help, as deja's help always said they would, instead of deja's page;deja help aiderstill shows deja's (#5060). -
The security model, architecture notes, JSON reference and guides say what the code does where they had drifted: the hook launcher's lookup order, every surface the
<deja-recall>frame covers, the injection log among the files deja writes, redaction on sync import andoriginon every sync record, the search fallback order and its six tiers,--limitdefaults, and that no installer wireshook-plan(#5060). -
deja forgetbefore the firstdeja indexno longer blames an unmounted disk and writes nothing: it tombstones the matching sessions from the stores so the first build leaves them out, and says nothing was indexed yet. doctor no longer calls aDEJA_INDEX_DIRoutside the home unmounted when a build would just create it (#5057). -
In a partial clone, the session-start digest and
deja blame file:linefetched missing blobs from origin; deja's git reads now setGIT_NO_LAZY_FETCH=1. The once-a-day release check no longer starts fromdeja mcpor a hook when the harness gives it a terminal. The query sent to an embedding endpoint is redacted like the index, anddeja recallsends it once instead of twice (#5053). -
Dates read the same on every machine. A synced decision shows the day it was rejected or replaced, in UTC, as on the machine that filed it, not the day of the session it judged in the sender's zone. aider headers are still read in your zone, and after a zone change deja reads them again, so a kept index matches a rebuild.
deja view, the "earlier attempt" line, the stats page, the plan hook and doctor print in your zone (#5053). -
A forgotten session stays forgotten after rebuilds even with
~/.config/dejagone: the copy of the forget list kept inside the index, and hook text still waiting for its session, are carried into every new index instead of being deleted with the old one. A relativeXDG_CONFIG_HOMEis now ignored for the forget list and aider's files too, not only for the wiring record (#5052). -
Compressed Codex and OpenClaw transcripts are read from memory, and deferred hooks pass the prompt through a pipe, so neither leaves plaintext in
$TMPDIR.deja install <typo>writes nothing, anddeja rules syncleaves aider alone unlessdeja install aiderset it up (#5052). -
Recalled text no longer reaches the model outside deja's untrusted-data frame. The MCP environment block sits inside it, the dsh, opencode, OpenClaw and Hermes agent tools and every skill's shell fallback run
deja --framed …, and a planted</deja-recall>,</deja-recall/>,<\/deja-recall>or fullwidth tag is defanged (#5051). -
CodeWhale no longer leaves the frame open when a long message forces deja to cut what it adds, and a handoff quote can't be closed by
--- END QUOTED SESSION ---in another case or with text after it (#5051). -
A Codex rollout deja kept after it was deleted no longer gets its prompt a second time from
history.jsonlon a rebuild (#5046). -
"what did we do in may" finds the same sessions after an incremental pass as after a rebuild. The month a record was indexed under came from the local zone on one path and UTC on the other, so near a month boundary the two disagreed; it is UTC on both now. The suite also passes outside UTC: seven command tests and three notes tests assumed it, found at UTC-3 by a LinuxPro review (#5044).
-
An install into a config with a long array of entries written on one line no longer copies the whole file once per entry it puts back: 3000 entries took 47ms and allocated 9 GB, now 13ms (#5025).
-
deja share --to out.md <id>refuses the flag before building the index, asdeja share <id> --to out.mdalready did, instead of reporting that no session matches "--to". From @mvanhorn (#5014). -
PowerShell completion offers every role after
--role, not the old three, and--yearondeja stats. From @notsubash (#5017). -
The weekly note says when an agent deleted sessions deja kept:
Claude Code deleted 37 sessions this week; deja kept them — deja resume 5a1c0de0-111 --write-back. Agents are named in one line, the id is the newest deletion, and an agent deja cannot write back to getsdeja show <id>. A quiet week still says it. The window starts at the index pass that found each transcript gone; sessions kept before this release carry no date and are not counted. -
The weekly note says how many sessions were deleted from disk that deja kept:
37 Claude Code sessions deleted this week; deja kept them — deja resume 5a1c0de0-111 --write-back. It counts sessions, not their subagent runs, names the agents when the line has room, offers the newest deletion's id, and givesdeja show <id>for an agent deja cannot write back to. A quiet week still says it. A deletion is dated by the index pass that first finds the transcript gone; whatever a store had already lost before this release, including what an older deja never marked kept, stays undated and is never counted. -
deja installfor Claude Code says when its cleanup is on:Claude Code deletes transcripts after 30 days; deja keeps a copy of each one it indexes from now on, read fromcleanupPeriodDays(managed settings first,CLAUDE_CONFIG_DIRrespected) and printed at 30 days or less. The setting is not changed. -
The Grok Build install line works: deja was never in
xai-org/plugin-marketplace, sogrok plugin install dejaafter adding it found nothing. This repository is a Grok marketplace now,grok plugin marketplace add vshulcz/deja-vuthengrok plugin install deja; the official entry is still in review (xai-org/plugin-marketplace#332). -
ZCode keeps the per-prompt recall when the "you have been here" line is due.
hook-promptignored the--strictthat ZCode's hook passes, so the reply carriedsystemMessageand ZCode discarded all of it, recall included. -
Cursor no longer uses up deja's notes for the person. It shows a hook's message only when the hook blocks, so the once-only notes (the built note, the week note) and the session-start receipt went to Cursor, were counted as shown and never seen, and Claude Code on the same index skipped them. A Cursor session start now gets only the model's text, which is unchanged, and leaves those notes for the next host that shows them; a session start under
--strictor--copilotdoes the same. A rewire after an upgrade still happens on a Cursor start, and its note is dropped there. -
In the Gemini CLI TUI, deja's lines end in
[deja]instead of the full hook command ([/Users/…/deja-hook hook-prompt]), which wrapped the receipt onto a second line. The extension is rewritten on upgrade, so nothing to re-run. -
deja uninstall dsh-autoworks: the alias was refused on the way out, and an install under it was never recorded, so the directories it made stayed behind after an uninstall (#4983). -
On dsh 0.2.0-rc.2 the per-prompt recall never ran, in the npm plugin and in the one
deja install dsh-autowrites: 0.2.0-rc.2 droppedsession.events, so the plugin found no prompt to ask about. It now reads the log witheventAt(#4981). -
The semantic sidecar survives a rewrite of the index: each vector carries its record's identity, so search keeps using it and the next
deja embedsends only new or changed records. Before, any pass that rewroterecords.bin(a torn last line, a removed file) made search refuse the sidecar and the next run embed the whole store again, about 45 minutes on 112k records. A sidecar written before this is rekeyed on the nextdeja embedwhile the index still has its layout. Proposed by @AlexanderAbramovPav (#4976). -
deja embedno longer stops on Ollama with a bare400 Bad Request: a record with no text is not sent (Ollama refuses the whole batch over one empty input), the error carries the endpoint's reason, and a run that fails keeps the vectors it embedded since the last checkpoint. Reported with a tested patch by @AlexanderAbramovPav (#4975). -
The code a Gemini CLI session changed, and that of any harness read through the generic edit reader, leaves out a tool call marked failed, an edit or a patch alike: a
replaceGemini refused showed as code the session wrote (#4974).
Changelog
Features
- feat(claude): read history.jsonl prompts for sessions whose transcript is gone (#5049)
- feat(dsh): a profile wired by deja install dsh-auto shows deja's receipt and notes in dsh web (#4985)
- feat(dsh): show deja's receipt and notes to the person, not only the model (#4984)
- feat(embed): key vectors by record identity so the sidecar survives index rewrites (#4980)
- feat(hermes): show deja's receipt and notes on the Hermes CLI recall line, not only to the model (#4990)
- feat(hook): the first session names an error this machine keeps hitting (#5006)
- feat(hook): the weekly note names the session agents used, with an id deja show opens (#5009)
- feat(hooks): deja's notes for the person fit on one line each (#4994)
- feat(install): Windsurf gets deja's rule, skill and /deja workflow (#5010)
- feat(openclaw): a reply in the owner's DM shows deja's one-line receipt (#4992)
- feat(tui): DEJA_THEME=dracula paints the screen in Dracula (#5102) (@demrom)
- feat: a Spec Kit extension recalls past sessions before implement (#5023)
- feat: deja delete erases a session from its agent and from deja, after asking (#5101)
- feat: deja reads Windsurf / Devin Desktop Cascade conversations (#5007)
- feat: every agent starts with what Claude Code learned in the project, and the TUI's Memory tab shows it (#5096)
- feat: grok installs deja from this repo's marketplace (#5012)
- feat: the weekly note says which sessions deja kept after they were deleted from disk (#5043)
Fixes
- fix(completion): PowerShell offers every --role, and stats offers --year (#5031) (@notsubash)
- fix(completion): offer recall's --project, --harness and --limit, and list recall in zsh (#5036) (@orshih6)
- fix(completion): offer restore's --span, -o, --force and --all (#5028) (@orshih6)
- fix(docker): the image builds again with the embedded changelog in the context (#4987)
- fix(embed): skip records with no text, say why the endpoint refused, keep vectors on failure (#4979)
- fix(forget): tombstone sessions from the stores when no index is built yet (#5062)
- fix(gemini): deja's notes in the Gemini CLI end in [deja], not the full hook command (#4999)
- fix(hooks): Cursor no longer uses up the notes it never shows (#5001)
- fix(index): a rollout waiting for zstd no longer rewrites the index on every pass (#5105) (#5108) (@notsubash)
- fix(index): date tokens in UTC on every path, and the suite passes outside UTC (#5045)
- fix(sources): drop the edits of tool calls the harness marked failed (#4977) (@SakarPaisen)
- fix(sources): without zstd, a compressed rollout is not read on every pass (#5092) (@Sora-bluesky)
- fix(test): DEJA_WRITE_EXTENSIONS=1 regenerates extensions/hermes again (#4997)
- fix(test): seal the Windsurf fixtures with a hashed nonce so file scanners don't read them as mailboxes (#5038)
- fix(tui): esc and help labels fit at 80 columns, This project counts this project (#5094)
- fix(zcode): a prompt with a due receipt keeps its recall (#5003)
- fix: Windows completion tests, a flaky timing test and squash-dated docs on main (#5041)
- fix: close network and zone gaps from the #5053 audit (#5056)
- fix: keep forget across index rewrites and stop writing files where they do not belong (#5054)
- fix: keep recalled text inside the frame on every model-facing path (#5055)
- fix: last and show answer from the index while another deja holds its lock (#5059) (@Sora-bluesky)
- fix: promote refuses a second id-prefix instead of promoting the last one (#5099) (@WynandVStaden)
- fix: reject leading flags in share before session lookup (#5039) (@mvanhorn)
Documentation
- docs(compare): cognee measured on 20 LongMemEval-S questions, with the drivers to re-run it (#5048)
- docs(guide): add Copilot CLI session history deletion page (#5063) (@beiryu)
- docs(guide): add Qwen Code chat history deletion page (#5064) (@beiryu)
- docs(guide): add TRAE CLI session history deletion page (#5103) (@masyarakatai)
- docs(zh): add Chinese pages for five more guides (#5091) (@ursasi)
- docs(zh): add Chinese resume-a-session guide page (#5005) (@beiryu)
- docs(zh): add Chinese translation of memory-for-codex guide (#5008) (@beiryu)
- docs(zh): add Chinese translation of the Codex history guide (#5090) (@ursasi)
- docs: Windsurf memory and delete-history guides (#5013)
- docs: add Chinese page for delete-old-claude-sessions (#5033) (@beiryu)
- docs: add Chinese pages for the Claude Code and Cursor memory guides (#5050) (@Quartex246)
- docs: add guide for deleting Kimi Code session history (#5029) (@beiryu)
- docs: bring docs in line with the code in a dozen places (#5060) (#5065) (@notsubash)
- docs: changelog for 0.22.2 (#5024)
- docs: changelog for 0.22.2 (#5111)
- docs: the site says what deja-vu is in one sentence, and the README links the guides (#5035)
- docs: the sitemap lists each page once, dated by its own text, plus two resume-error guides (#5027)
Other
- chore: pin the manifests to 0.22.1 (#4963)
- revert: hand Claude memory to other agents and the Memory tab, until the effect is measured (#5098)
- test(sources): pin Kimi Code Edit and Write calls with a fixture (#5004) (@beiryu)
- test(sources): pin Qwen Code edit calls with a fixture (#4995) (@beiryu)
Install
curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh
go install github.com/vshulcz/deja-vu/cmd/deja@v0.22.2
brew install deja-vu