开源编程智能体内存方案发布,通过 SSH 同步

来源:Hacker News 热门(buzzing.cc 中文翻译) 2026年7月15日 06:49 AIHOT 评分:76 精选
摘要:一个面向编程 AI 智能体的开源内存项目在 GitHub 发布,支持通过 SSH 同步记忆数据。该项目允许智能体跨会话保留上下文,无需依赖特定云服务,用户可自托管。代码已开源,便于开发者集成与定制。
# 开源编程智能体内存方案发布,通过 SSH 同步 - 来源:Hacker News 热门(buzzing.cc 中文翻译) - 作者:vshulcz - 发布时间:2026-07-16 06:49 - AIHOT 分数:76 - AIHOT 标记:精选 - AIHOT 链接:https://aihot.virxact.com/items/cmrmotlpp07iubiuloujszkts - 原文链接:https://github.com/vshulcz/deja-vu ## 精选理由 给Claude Code、Cursor这些编程代理加了个可同步的持久内存,通过SSH就能跨机器共享上下文,做多机协作开发的可以试试。 ## AI 摘要 一个面向编程 AI 智能体的开源内存项目在 GitHub 发布,支持通过 SSH 同步记忆数据。该项目允许智能体跨会话保留上下文,无需依赖特定云服务,用户可自托管。代码已开源,便于开发者集成与定制。 ## 正文 你的智能体已经解决了这个问题。deja 能找到它。在约 12 毫秒内搜索 3.3 GB 的智能体历史记录——一个零依赖的二进制文件,完全本地运行。 Claude Code、Codex、opencode、aider、Gemini CLI、Cursor、Antigravity、Grok Build 和 Qwen Code 会将每一次对话写入本地文件——这些文件包含数 GB 的已调试问题和设计决策,但你无法搜索它们。deja 是一个零依赖的二进制文件,能将那些历史记录转化为一个记忆层: 功能 它的作用 搜索 deja "连接池耗尽"——数 GB 数据上约 12 毫秒,可追溯:在你安装它之前数月内的日志 智能体回忆 MCP 回忆工具——智能体回答"我们三周前修复过这个问题",而不是重新调试,跨工具框架生效 自动回忆 install --auto 会添加一个 SessionStart 钩子:在你提问之前,相关记忆就已进入上下文;Claude Code 还会在压缩前捕获当前对话记录 脱敏 API 密钥、JWT、私钥在索引时被剥离——缓存可以安全保留 统计 deja stats——你的智能体工作汇总:工具框架、主要项目、活动走势图 deja share ——将一次会话的脱敏摘要交给同事,密钥已被清除 同步 deja sync export/import——在机器之间迁移记忆,仅追加,幂等 记住 deja remember "文本" 或 MCP remember——保留持久的决策和结论 追责 deja blame <路径>——哪些会话触及了这个文件,当时做了什么决定以及原因 语义 可选:将 deja embed 指向本地 Ollama/LM Studio,改写后的查询仍能命中 隐私 deja forget 会从重建的索引中移除匹配的会话,并记录确切的会话墓碑标记,以便后续的 deja index 无法从源历史中恢复它们。墓碑标记存储在 ~/.config/deja/tombstones(或 $XDG_CONFIG_HOME/deja/tombstones);可使用 --dry-run、--list 或 --unforget。摄取排除规则在 ~/.config/deja/exclude(支持 XDG)中每行一个不区分大小写的项目模式,或在 DEJA_EXCLUDE_PROJECTS 中以逗号分隔。deja stats --redaction 按工具框架和规则报告脱敏情况,以及墓碑标记和语义侧车的事实信息。 单个二进制文件。无需下载模型,无需运行任何服务,除非你主动同步或分享,否则没有任何数据离开你的机器。(opencode 和 Cursor IDE 的索引功能会调用 sqlite3 CLI,该工具预装在 macOS 和大多数 Linux 发行版中;Cursor CLI 的转录文件不需要它。) 安装 curl -fsSL https://raw.githubusercontent.com/vshulcz/deja-vu/main/install.sh | sh 或者: go install github.com/vshulcz/deja-vu/cmd/deja@latest # Go npx @vshulcz/deja-vu "query" # npm, no install brew install vshulcz/tap/deja-vu # Homebrew 将其接入你使用的智能体(会编辑配置文件,并保留一份 .bak 备份): deja install --all # MCP recall for every agent it finds on this machine deja install --auto # same, plus session-start auto-recall where supported 安装程序还会为它检测到的工具框架写入用户级别的指引文件:Claude Code、Codex、Gemini CLI、Qwen、Copilot 和 OpenCode 会使用它们对应的指引文件(或已配置的 XDG_CONFIG_HOME)。重新运行安装程序会重写 deja 的技能或标记块,但不会修改周围的用户内容。使用 `deja install --all --no-guidance` 可选择退出;Cursor 和 Grok 没有文档记录的用户级别指引文件位置,因此会被跳过。 安装程序会报告是否找到了本地历史记录,并在存在历史记录时立即构建初始索引。 就是这样。下一次会话时,直接问你的智能体: 我们之前处理过 JWT 刷新轮换的问题吗?查一下你的记忆 ——或者配合 `--auto` 参数,无需提问:智能体在每次会话开始时就已经知道你在那个项目中解决过什么问题。 命令行界面 $ deja "jwt refresh token" [claude] api · Jul 8 · 8f31c0a9 — 2 matches login started failing after refresh token rotation; jwt kid mismatch in tests fixed by reloading jwks cache after rotateKey and adding a clock-skew test [codex] web · Jul 1 · b77d91e2 — 1 match refresh token cookie needed SameSite=Lax in local callback flow 命令 功能说明 deja <查询词> 搜索所有历史记录。多词之间为 AND 逻辑,常见的英文填充词会被忽略,支持子串匹配(例如搜索 code 能找到 opencode),双引号括起来的短语要求连续文本匹配;零结果查询会先尝试词形变化,再尝试近似拼写。支持 `--re`、`--harness`、`--project`、`--since 30d`、`--role`、`--json` 参数。 deja ctx <查询词> 输出最佳匹配结果的紧凑 Markdown 摘要——可直接通过管道传入提示词。 deja blame <路径> 查找讨论过某个文件的会话,按最新且最相关的顺序排列。支持 `--json`、`--all` 及常规过滤参数。 deja share 为同事生成经过脱敏处理的会话摘要:敏感信息已被遮盖,工具噪声已被去除。 deja stats 显示关键统计数据:总数、各工具框架的分布、热门项目、月度趋势图。也支持 `--json` 参数。 deja doctor [--json] 自我诊断:检查存储解析状态、sqlite3 是否存在、每个智能体的 MCP 连接配置、索引健康状况、版本信息;`--json` 参数会以 JSON 格式输出相同的检查结果,便于脚本处理。 deja sync export <目录> [--full] / import <目录> / ssh <主机> [--pull] 在不同机器之间迁移记忆——通过共享文件夹或一条 SSH 命令即可完成。支持水印、仅追加、幂等操作。 deja show / deja last [n] 读取一个会话 / 列出最近的会话。 deja resume [--exec] 在原生运行环境中重新打开找到的会话(claude --resume、codex resume、opencode -s、grok --resume)。 deja sources 已发现的存储库、大小、消息数和编辑次数。 deja mcp stdio MCP 服务器(deja install 所连接的对象)。 deja remember "文本" [--project 项目名] 在笔记源中存储一条显式事实。 deja warmup 在不进行搜索的情况下构建/刷新索引——适用于 cron 任务或 shell 启动时。 deja index [--rebuild] 与 warmup 相同;--rebuild 强制完全重建。冷构建会逐一报告每个运行环境的进度。 deja update 下载最新的 GitHub 发布版本,校验其校验和,并替换当前二进制文件。 deja statusline 状态栏的一行信息:今日已为智能体提供的召回次数。deja install statusline 会将其接入 Claude Code(不会修改已有的状态栏)。 词干化 JSON 搜索需设置 "stemmed": true,并包含所使用的目录变体。 搜索结果带有精确、近似或语义置信度等级;近似结果包含匹配的变体,语义结果包含余弦相似度。 分享你的统计数据 运行 deja stats --card 可生成一个自包含的 deja-stats.svg 文件,用于 README 或个人简介。该命令会打印一段嵌入代码;如需在个人简介或仓库中展示,请提交该 SVG 文件。 运行 deja stats --html 可生成一个自包含、可浏览的 deja-stats.html 时间线。HTML 导出仅嵌入元数据:日期、运行环境、项目、消息数以及已编辑的首条用户标题;绝不包含消息文本内容。 deja update 适用于独立安装。Homebrew 和 npm 安装则通过包管理器进行更新。 诊断 JSON deja doctor --json 会报告每项检查的明确状态,即使发现问题也以退出码 0 结束。存储状态包括:正常、缺失、为空、不可读或解析为零;最后一种状态表示会话文件存在,但最新文件未产生任何会话。 { "stores": [{"name": "claude", "state": "ok", "paths": ["/home/me/.claude/projects"], "files": 42}], "index": {"state": "stale", "path": "/home/me/.cache/deja/index.db"}, "mcp": [{"name": "claude-code", "state": "wired", "path": "/home/me/.claude.json"}], "sqlite3": {"state": "ok"}, "version": {"state": "ok", "current": "1.2.3", "latest": "1.2.3"} } 索引状态包括:正常、缺失或过期;MCP 状态包括:已连接、未连接或配置缺失。sqlite3 状态为正常或缺失。版本状态包括:正常、有可用更新、超前、开发版或未知。 无需 MCP 的上下文管道: claude "Prior context: $(deja ctx 'database migration')" 在修改文件之前,先检查其历史记录: deja blame cmd/deja/main.go 语义召回(可选) 语义搜索是针对本地 Ollama、LM Studio 或兼容 OpenAI 的嵌入端点的可选层。设置 `DEJA_EMBED_URL` 以及可选的 `DEJA_EMBED_MODEL`,然后运行 `deja embed`。Ollama 默认使用 `nomic-embed-text`;如果没有配置且可访问的运行环境,普通的词汇搜索和 MCP 召回将继续保持不变。使用 `--no-embed` 或 `DEJA_EMBED=off` 可禁用单次调用的重排序。如果没有嵌入端点,则不存在语义搜索零结果的回退机制。 向量侧车(vector sidecar)以 `.vectors.bin` 形式存储在索引旁边,而非 `index.db` 中。对于一个 1,024 维度的模型,Float32 向量每 1k 条消息大约占用 4 KB,外加一个小的记录键。嵌入过程在本地进行,会消耗 CPU、内存和模型服务器时间;它从不发送原始源文件,仅发送经过脱敏处理、截断至约 2k 字符的索引文本。 机器间同步 将两台机器指向同一个共享文件夹(Syncthing、iCloud、git 仓库——任何能传输文件的方式): deja sync export ~/Sync/deja # machine A: appends new batches since last export deja sync import ~/Sync/deja # machine B: picks up what it hasn't seen 或者,当另一台机器可通过 SSH 访问时,跳过共享文件夹: deja sync ssh mini # push new records to mini and import them there deja sync ssh mini --pull # fetch mini's new records into this machine SSH 模式使用你系统的 ssh/scp 以及远程机器上的 deja 二进制文件(在 PATH 中查找,若未找到则回退到 `~/.local/bin/deja`)。 批次是纯 JSONL 格式,在导出时已脱敏。导入是幂等的,因此你可以将该文件夹保留为仅追加的日志,并随心所欲地从 cron 运行这两个命令。记录永远不会回传到其来源。`--full` 会忽略水印重新导出所有内容——在旧批次已消失后添加新机器时非常有用。同步的会话会在搜索、召回以及会话启动自动召回中显示在 `imported:` 下。 教会你的智能体进行记忆 `deja install --all` 会配置 MCP 召回(Claude Code、Codex、opencode、Cursor、Gemini CLI、Antigravity、Grok Build、Qwen Code——aider 没有 MCP 客户端,请改用 `pipe deja ctx`);`deja install --auto` 执行相同操作,并在工具链支持的情况下添加会话启动自动召回(Claude Code 钩子、Codex 的 hooks.json、opencode 插件——Cursor、Gemini CLI、Antigravity、Grok Build 和 Qwen Code 没有可注入上下文的钩子,因此 MCP 是它们的完整安装方式)。要让智能体自主访问记忆,请将以下内容添加到你的 `CLAUDE.md` / `AGENTS.md` 中: Before debugging or re-implementing something, run `deja ""` (or the MCP recall tool) — past agent sessions across Claude Code, Codex, opencode, aider, Gemini CLI, Cursor, Antigravity, Grok Build and Qwen Code are indexed locally. Cite what you reuse. MCP 工具 工具 参数 返回 recall query, harness?, limit? 密集匹配片段,≤4KB——上下文成本低廉。 recall_context query, harness? 最佳匹配会话的 Markdown 摘要。 blame path, harness?, project?, since?, limit? 讨论过某个文件的会话,包含标题和匹配的上下文。 remember text, project? 存储一个持久的决策或结论,供日后回忆使用。 使用 --auto 时,SessionStart 钩子还会自动注入当前项目的近期记忆——只读,上限为 2KB,且绝不会延迟或中断智能体启动。由于 SessionStart 在每次上下文压缩后也会触发,因此在 Claude Code 压缩后,同样的记忆会被重新注入;而 PreCompact 钩子会在此之前将对话记录捕获到索引中。 安全 子智能体的对话记录默认被跳过(它们大多与父会话重复);设置 DEJA_INCLUDE_SUBAGENTS=1 可将其纳入索引。写入中途被捕获的文件也能安全处理——被截断的末尾行会在下一次扫描时被拾取。 凭据在索引时会被脱敏处理:AWS 密钥、通用的 api_key=/token= 赋值、Bearer 令牌和原始 JWT、PEM 私钥块、提供商令牌(ghp_、sk-、npm_、xox.、AIza)以及 scheme://user:pass@host 格式的 URL。值会被替换为 [redacted:];周围的文本仍可搜索。deja sources 命令会显示各存储的计数。可通过 DEJA_NO_REDACT=1(不安全)选择退出。deja share 和 deja sync 导出时会在输出端重新应用脱敏。 安全模型文档描述了数据流、脱敏限制、信任假设和发布验证。 支持的框架 框架 存储 状态 Claude Code ~/.claude/projects/**/*.jsonl ✅ Codex CLI ~/.codex/sessions/** + history.jsonl ✅ opencode ~/.local/share/opencode/opencode.db ✅ aider .aider.chat.history.md ✅ Gemini CLI ~/.gemini/tmp/*/chats/** ✅ Cursor state.vscdb + ~/.cursor/projects/**/agent-transcripts/*.jsonl ✅ Antigravity ~/.gemini/antigravity*/brain/*/.system_generated/logs/transcript.jsonl ✅ Grok Build ~/.grok/sessions/**/updates.jsonl ✅ Qwen Code ~/.qwen/projects/**/chats/*.jsonl ✅ 通过 `DEJA_CLAUDE_ROOT`、`DEJA_CODEX_ROOT`、`DEJA_OPENCODE_DB`、`DEJA_AIDER_ROOTS`、`DEJA_GEMINI_ROOT`、`DEJA_CURSOR_ROOT`、`DEJA_CURSOR_CLI_ROOT`、`DEJA_ANTIGRAVITY_ROOT`、`DEJA_GROK_ROOT`、`DEJA_QWEN_ROOT`、`DEJA_INDEX_DIR` 自定义路径。每个智能体自身的重定位变量也会被尊重:`CLAUDE_CONFIG_DIR`、`CODEX_HOME`、`GEMINI_CLI_HOME`、`CURSOR_CONFIG_DIR`、`GROK_HOME`、`AIDER_CHAT_HISTORY_FILE`,以及 Linux 上 opencode 使用的 `XDG_DATA_HOME`。 `DEJA_RECALL=safe` 是默认设置:SessionStart 召回限定在当前项目内,过滤弱匹配或重复结果,优先最近 90 天的内容,且最多注入 2KB。`DEJA_RECALL=aggressive` 会跨项目搜索,并将注入上限提升至 4KB。`DEJA_RECALL=off` 则禁用 SessionStart 召回输出。 会话格式注册表 会话格式注册表记录了每个受支持框架的已观测存储路径、记录模式、角色映射、时间戳及兼容性说明。合成测试夹具确保这些描述与解析器保持同步验证。 性能 基于真实语料库测量——包含三个框架的 1250 多个会话,总计约 3.3GB: 测量项 结果 热搜索 典型约 12 毫秒,最差约 25 毫秒 冷索引(一次性) 约 10 秒 索引大小 约占语料库的 2.4% 索引是增量式的:当某个会话文件增长时,仅重新读取该文件。 基准测试 使用以下命令运行可复现的召回基准测试: deja bench recall deja bench recall --json 当前合成数据集已被词法搜索饱和(recall@5 达到 1.00,中位数耗时约 0.7 毫秒),因此它更多是作为排序变化的回归底线,而非炫耀性数字;如果召回率下降,CI 会失败。语料生成器和相关性标签是经过常规审查的 Go 代码——在相信任何数据(包括我们自己的)之前,请先审计“相关”的定义。如果配置了本地嵌入向量端点,同一命令还会报告混合列的结果。 工作原理 本地倒排索引位于 `~/.cache/deja`:解析 JSONL/SQLite 存储 → 脱敏处理凭证 → 生成 `records.bin` + token 桶 → `manifest.json` 跟踪每个文件的状态,因此重复运行时仅处理已变更的内容。MCP 服务器、统计、共享和同步功能均读取同一索引。详情请参阅 `docs/ARCHITECTURE.md`。 隐私:索引和搜索均在本地进行。网络仅由 `deja update`、`deja sync ssh` 以及 `deja doctor` 版本检查使用。本地文件输入,本地缓存输出。 常见问题解答 数据会离开我的机器吗?索引和搜索都在本地进行。`deja update` 从 GitHub 下载发布版本,而用户调用的 `deja sync ssh` 则通过系统 SSH 客户端传输经过编辑的批次数据。目录导出和共享仅发送到你选择的目标位置。完整的数据流向请参阅安全模型。 这与 cass 有何不同?cass 是会话搜索领域的"大杂烩"方案:支持 22 个数据源、使用 Rust 语言、可选语义嵌入向量、提供 TUI 界面。deja 则反其道而行之——一个轻量级 Go 二进制文件、纯词法搜索、八个适配器、零配置启动,外加围绕记忆层的配套功能:自动召回、编辑、共享、同步。 那与 MemPalace / Mem0 / Letta 相比呢?那些是记忆平台:嵌入向量、向量存储、捕获钩子或用于记录未来数据的 API。deja 完全没有捕获步骤——它索引的是你的智能体已经写入磁盘的内容,包括你安装它之前数月的历史记录。它们可以共存。 日志中已有的机密信息怎么办?它们会保留在原始适配器文件中(那是你智能体的数据),但不会进入 deja 的索引、摘要、共享或同步导出内容。 Windows 支持如何?已有构建版本,CI 在 Windows 上运行测试套件;macOS/Linux 是经过实战检验的路径。欢迎提交现场报告:#9。 我可以排除某个项目吗?目前还不支持——计划通过 `--exclude` 实现(#8)。目前你可以将 `DEJA_*_ROOT` 指向一个过滤后的副本。 如何清除所有数据? deja uninstall --all rm -rf ~/.cache/deja 贡献指南 `make build test lint`——详见 CONTRIBUTING.md。添加适配器需从解析器注册表入手。当前优先级和非目标事项见 ROADMAP.md。适合新手的议题已标注标签。