news 2026/9/15 12:22:14

Hindsight Cursor 集成指南:利用 Hook 与 MCP 为 Cursor 注入仿生长期记忆

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hindsight Cursor 集成指南:利用 Hook 与 MCP 为 Cursor 注入仿生长期记忆

Hindsight Cursor 集成指南:利用 Hook 与 MCP 为 Cursor 注入仿生长期记忆

【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight

本指南围绕 Hindsight 开源仓库中的 Cursor 集成插件(hindsight-cursor)展开,讲解如何通过 Cursor 的 Hook 插件架构实现"会话开始时自动召回项目记忆、任务结束后自动保留对话内容",并辅以 MCP 按需工具实现显式记忆操作。读完本文,你将掌握该插件的安装、两种互补的记忆机制、三类连接模式、完整配置项以及故障排查方法,并能结合源码理解其底层实现原理。

两种互补的记忆机制

Hindsight Cursor 插件同时提供自动机制按需机制两条互补的路径:

| | 插件 Hook(自动) | MCP 工具(按需) | |--|--------------------------|----------------------| |安装|pip install hindsight-cursor && hindsight-cursor init| 由init自动配置 | |召回(Recall)| 会话开始时,通过additionalContext注入记忆 | Agent 可在会话中途调用recall工具 | |保留(Retain)| 任务停止时自动执行 | Agent 显式调用retain工具 | |反思(Reflect)| Hook 不提供 | 以工具形式提供 | |适用场景| 零干预的环境记忆,持续伴随开发 | 定向查询与显式记忆操作 |

两条路径均由一条hindsight-cursor init命令一次性完成配置;若只想使用 Hook 而不需要 MCP,可追加--no-mcp跳过 MCP 集成。

快速开始

1. 安装插件

pip install hindsight-cursor cd /path/to/your-project

也可以使用uvx hindsight-cursor init代替pip install+hindsight-cursor init,避免在环境中永久安装该包。

2a. 连接 Hindsight Cloud(最快,无需本地服务器)

hindsight-cursor init --api-url https://api.hindsight.vectorize.io --api-token YOUR_HINDSIGHT_API_TOKEN

在 Hindsight Cloud 注册账号后,于Settings > API Keys创建 API Key 即可获得 token。

2b. 连接本地 Hindsight 服务器

hindsight-cursor init --api-url http://localhost:8888

若本地尚未运行 Hindsight,可用 Docker 一键启动(需要先导出 LLM 的 API Key,用于服务端的事实抽取):

export OPENAI_API_KEY=your-key docker run --rm -it --pull always -p 8888:8888 \ -e HINDSIGHT_API_LLM_API_KEY=$OPENAI_API_KEY \ -e HINDSIGHT_API_LLM_MODEL=gpt-4o-mini \ -v $HOME/.hindsight-docker:/home/hindsight/.pg0 \ ghcr.io/vectorize-io/hindsight:latest

3. 完全退出并重新打开 Cursor

插件在启动时加载,仅仅重新加载窗口是不够的。若 Cursor 正处于打开状态,安装后必须完全退出再重新打开。

init命令做了什么

从源码看,cli.py 中的cmd_init依次执行以下步骤:

  1. 拷贝插件文件.cursor-plugin/hindsight-memory/。源码中的_PLUGIN_FILES清单(cli.py)包含plugin.jsonhooks/hooks.jsonrules/hindsight-memory.mdcscripts/下全部lib/模块、session_start.pyretain.pysettings.json以及skills/hindsight-recall/SKILL.md;若捆绑包缺失任一文件,安装会直接报错退出,避免出现"静默无效安装"。
  2. 写入/合并项目.cursor/hooks.json,让 Cursor 注册三个 Hook(sessionStart/stop/sessionEnd)。注意:Cursor 只从.cursor/hooks.json(工作区级)或~/.cursor/hooks.json(用户级)加载 Hook,.cursor-plugin/目录下的文件本身不会被 IDE 加载。你已有的其他 Hook 会被保留,重复执行init只替换 Hindsight 自己的条目——这是通过_HOOK_MARKER = ".cursor-plugin/hindsight-memory"标记来识别的(cli.py)。
  3. 创建~/.hindsight/cursor.json,写入连接配置(若该文件已存在则跳过)。
  4. 写入.cursor/mcp.json,配置 Hindsight MCP 端点用于按需工具。
  5. --force:覆盖已有安装;--no-mcp:跳过 MCP 配置。

生成的hooks.json中三个 Hook 均设置了timeout: 15(秒),命令路径为工作区相对路径,因此不依赖CURSOR_PLUGIN_ROOT环境变量(cli.py)。

hindsight-cursor uninstall会逆向撤销全部改动:删除插件目录、从.cursor/hooks.json移除 Hindsight 条目、删除 MCP 服务器条目、删除生成的会话规则文件及其.gitignore条目(cli.py)。

工作架构

Hook 事件一览

插件注册了三个 Hook(hooks.json):

Hook 脚本事件用途
session_start.pysessionStart会话召回—— 查询记忆,以additionalContext注入
retain.pystop自动保留—— 提取对话记录,POST 到 Hindsight
retain.pysessionEnd最终冲刷—— 保留轮次窗口未覆盖的会话尾部

sessionStart:会话召回

sessionStart在每个新 Cursor 会话开始、Agent 处理第一条提示词时触发一次。其完整流程(session_start.py)为:

  1. 从 stdin 读取 Hook 输入(workspace_rootsconversation_id等);
  2. 解析 API 地址(外部 API → 已有本地服务器 → 本地守护进程 → 云端默认);
  3. 推导 bank ID(静态或基于项目上下文动态推导);
  4. 首次使用时设置 bank mission;
  5. 基于工作区上下文(项目名、工作区根目录、bank mission)构造一条宽泛的项目级查询,并截断到recallMaxQueryChars(默认 800 字符);
  6. 调用 Hindsight 的 recall API(超时 10 秒,见 client.py 中POST /v1/default/banks/{bank_id}/memories/recall);
  7. 将召回的记忆格式化为<hindsight_memories>上下文块,输出additionalContext
  8. 将本次召回状态写入状态文件。

stop+sessionEnd:自动保留与最终冲刷

retain.py同时注册在stopsessionEnd两个事件上,这是刻意设计(retain.py 与 cli.py 中的注释都解释了这个原因):

  • stop在每次 Agent 循环结束时触发,是周期性自动保留的理想粒度,但每次触发都受轮次窗口约束。在默认retainEveryNTurns = 10下,一个只有 7 轮对话的会话会触发 7 次stop,7 次都被轮次门控拒绝,最终整段会话永远不会被存储。
  • sessionEnd在会话结束时只触发一次,作为最终冲刷:它绕过轮次窗口,无论会话结束在窗口的哪个位置,尾部内容都会被保留。

两个事件在会话末尾存在重叠。插件以会话为单位记录"已保留的消息条数"水印(retained.json),若自上次保留以来没有新消息则直接 no-op,因此重叠不会导致重复存储(retain.py)。

此外,retain.py 的read_transcript支持三种在实际环境中见过的转录格式:扁平格式({role, content})、类型嵌套({type, message})以及 Cursor 3.x 的role 嵌套格式(顶层role+message.content为 typed blocks 列表,即~/.cursor/projects/<workspace>/agent-transcripts/<conv>/<conv>.jsonl的形态)。内容为块列表时,_normalize_blocks_to_text会保留 text 块并内联[tool_use:name][tool_result]标记,保证下游的Answer:/Thought:结构解析仍然可用。

保留请求通过 client.py 以async=true异步 POST 到/v1/default/banks/{bank_id}/memories。文档 ID 采用{session_id}-{毫秒时间戳}形式,保证同一会话内多次保留会累积成不同文档,而非互相覆盖(源码注释中说明,旧设计使用document_id=session_id会导致多轮会话重保留时静默丢失早期轮次)。

Cursor 3.x 的additionalContext缺陷与规则文件回退

Cursor 的sessionStartHook 原生注入通道是 stdout 上的additionalContextJSON 字段——Hook 返回记忆文本,Cursor 将其放入 Agent 的系统提示词。但该通道在 Cursor 3.x 中已损坏(Cursor 官方在 forum 帖 158452 中确认,截至 Cursor 3.6.31 仍未修复)。若additionalContext是唯一投递路径,召回的记忆永远到不了模型,Agent 会表现得像没装 Hindsight 一样。

插件通过额外将召回记忆写入<workspace>/.cursor/rules/hindsight-session.mdc(frontmatter 中带alwaysApply: true)来绕开该缺陷——工作区规则文件能被 Cursor 的规则引擎可靠注入,因此 Agent 在新会话的第一条提示词就能看到记忆。该回退路径的实现在lib/rules_file.py模块中,并由session_start.py在每次sessionStart触发时先旋转(删除旧文件)再重写,避免残留上一会话的过期记忆。

这在实践中意味着:

  • 每个新 Agent 的首条提示词都带记忆:Cursor 会阻塞提示词提交直到sessionStartHook 返回(经验验证),唯一延迟是召回本身的耗时(通常 <1s);
  • 规则文件在每个sessionStart顶部重新生成,过期记忆不会滞留;
  • 在 git 工作区中规则文件会被自动加入.gitignore,手动删除也安全(下次会自动重新生成);
  • additionalContext仍会输出到 stdout 以保持向前兼容——若 Cursor 恢复原生通道,同一插件无需改代码即可继续工作。

可以通过useRulesFileFallback: false完全关闭规则文件写入(此时依赖additionalContext,意味着在 Cursor 修复上游 bug 前记忆不会送达)。

MCP 按需工具

init同时配置 Cursor 原生 MCP 支持(.cursor/mcp.json),连接 Hindsight 的 MCP 端点。从 cli.py 可见,它使用单 bank 端点{api_url}/mcp/{bank_id}/,使recall/retain/reflect工具自动限定在配置的 bank 内,无需每次传bank_id;若配置了 API token,则会附带Authorization: Bearer <token>头。已有mcp.json中的其他服务器配置会被保留,仅合并hindsight条目。

Agent 可在会话中途需要超出会话注入范围的记忆时使用这些工具。

规则与技能

插件还额外提供:

  • 规则hindsight-memory.mdc,rules/hindsight-memory.mdc):alwaysApply: true的常驻规则,指导 Agent 使用<hindsight_memories>块中的会话记忆、了解自动保留行为、并在需要时调用 MCP 工具;同时要求"记忆与当前上下文冲突时优先当前上下文并注明差异"、"不向用户暴露原始记忆元数据"。
  • 技能hindsight-recall,skills/hindsight-recall/SKILL.md):按需记忆查询技能,定义了触发条件与工作流——先检查当前上下文的<hindsight_memories>是否已覆盖,不足时再调用 MCPrecall工具深入搜索,架构决策时可使用reflect工具。

连接模式

1. 外部 API(生产环境推荐)

连接运行中的 Hindsight 服务器(云端或自托管)。无需本地 LLM——事实抽取由服务器完成:

{ "hindsightApiUrl": "https://your-hindsight-server.com", "hindsightApiToken": "your-token" }

2. 本地守护进程(自动管理)

插件可通过uvx自动启动/停止hindsight-embed,但需要 LLM 提供商 API Key 用于本地事实抽取。注意:从源码看,该模式需要显式开启useLocalDaemon: true(对应环境变量HINDSIGHT_USE_LOCAL_DAEMON)才会在无外部配置时自动拉起守护进程(daemon.py):

{ "hindsightApiUrl": "", "useLocalDaemon": true, "apiPort": 9077 }

设置 LLM 提供商:

export OPENAI_API_KEY="sk-your-key" # 或 export ANTHROPIC_API_KEY="your-key"

模型默认由 Hindsight API 自动选择,可通过HINDSIGHT_LLM_MODEL覆盖。从 daemon.py 看,守护进程启动分三步:先通过hindsight-embed profile create cursor --merge --port <port>配置 profile(将 LLM 环境变量与daemonIdleTimeout(默认 300 秒)写入 profile),再执行daemon --profile cursor start,最后最多轮询 30 秒等待/health就绪。在 macOS 上会自动附加HINDSIGHT_API_EMBEDDINGS_LOCAL_FORCE_CPU=1HINDSIGHT_API_RERANKER_LOCAL_FORCE_CPU=1强制本地 embedding/reranker 走 CPU。

3. 已有本地服务器

如果你已经自行运行了hindsight-embed,保持hindsightApiUrl为空并设置apiPort与你的服务器端口一致即可,插件会自动探测到本地健康端口(daemon.py 会先对http://127.0.0.1:<port>/health做健康检查)。

若以上都不满足,插件最终会回退到默认云端地址https://api.hindsight.vectorize.ioconfig.py中的DEFAULT_HINDSIGHT_API_URL),遵循跨集成一致的"默认连云端"约定。

配置详解

所有设置存放在~/.hindsight/cursor.json中,每个设置都可通过环境变量覆盖。插件内置了合理的默认值(见 settings.json),你只需按需覆盖。

加载顺序(后加载者优先,实现在 lib/config.py):

  1. 内置默认值(硬编码在插件中,即lib/config.pyDEFAULTS);
  2. 插件自带settings.json(位于CURSOR_PLUGIN_ROOT/settings.json);
  3. 用户配置~/.hindsight/cursor.json(推荐在这里写覆盖项);
  4. 环境变量(优先级最高)。

连接与守护进程

配置项环境变量默认值说明
hindsightApiUrlHINDSIGHT_API_URL""(空)外部 Hindsight API 服务器地址。为空时插件按连接模式解析逻辑选择本地守护进程或云端默认。
hindsightApiTokenHINDSIGHT_API_TOKENnull外部 API 的认证 token,仅在设置了hindsightApiUrl时需要。
apiPortHINDSIGHT_API_PORT9077本地hindsight-embed守护进程的端口。
useLocalDaemonHINDSIGHT_USE_LOCAL_DAEMONfalse是否允许插件自动拉起本地守护进程(需配合 LLM API Key)。
daemonIdleTimeoutHINDSIGHT_DAEMON_IDLE_TIMEOUT300守护进程空闲自动退出秒数。
embedVersionHINDSIGHT_EMBED_VERSION"latest"通过uvx安装的hindsight-embed版本。
embedPackagePathHINDSIGHT_EMBED_PACKAGE_PATHnull本地hindsight-embed源码目录(开发用,会改用uv run --directory启动)。

LLM Provider(仅本地守护进程模式)

以下设置配置本地守护进程用于事实抽取的 LLM。连接外部 API 时会被忽略

配置项环境变量默认值说明
llmProviderHINDSIGHT_LLM_PROVIDER自动检测LLM 提供商:openaianthropicgeminigroqollama。通过检查对应 API Key 环境变量自动检测(lib/llm.py)。
llmModelHINDSIGHT_LLM_MODEL提供商默认覆盖所选提供商的默认模型。
llmApiKeyEnv提供商标准若 API Key 所在环境变量名非标准,可在此指定。

Memory Bank

bank是隔离的记忆存储,如同一个独立的"大脑"。

配置项环境变量默认值说明
bankIdHINDSIGHT_BANK_ID"cursor"dynamicBankIdfalse时使用的 bank ID。
bankMissionHINDSIGHT_BANK_MISSION通用助手提示词对 Agent 身份与用途的描述。插件默认值为面向 Cursor 编码助手的使命(见 settings.json)。
retainMissionnull为该 bank 设置的自定义 retain mission(仅首次使用时写入)。
dynamicBankIdHINDSIGHT_DYNAMIC_BANK_IDfalsetrue时,基于上下文字段推导唯一 bank ID(见dynamicBankGranularity)。
dynamicBankGranularity["agent", "project"]用于组合动态 bank ID 的字段:agentprojectsessionchanneluser。从 lib/bank.py 看,各字段依次取自agentName、工作区目录名、conversation_id、环境变量HINDSIGHT_CHANNEL_IDHINDSIGHT_USER_ID,用::连接并做 URL 编码。
bankIdPrefix""添加到所有 bank ID 前的前缀,用于命名空间隔离。
agentNameHINDSIGHT_AGENT_NAME"cursor"动态 bank ID 推导中agent字段使用的名称。

Session Recall(会话召回)

会话召回在每个会话开始时执行一次,查询 Hindsight 中的相关项目记忆,并以不可见的additionalContext注入 Agent 上下文(同时写入会话规则文件作为回退通道)。

配置项环境变量默认值说明
autoRecallHINDSIGHT_AUTO_RECALLtrue会话召回的总开关。
recallBudgetHINDSIGHT_RECALL_BUDGET"mid"搜索充分度:"low""mid""high"
recallMaxTokensHINDSIGHT_RECALL_MAX_TOKENS1024召回记忆块的最大 token 数。
recallTypes["world", "experience"]检索的记忆类型。
recallMaxQueryCharsHINDSIGHT_RECALL_MAX_QUERY_CHARS800查询字符串最大字符数。
recallPromptPreamblesettings.json附加在召回记忆前的提示文本,指导 Agent 如何取舍记忆(默认提示"优先采用最近的记忆,仅使用对继续对话直接有用的部分")。
useRulesFileFallbackHINDSIGHT_USE_RULES_FILE_FALLBACKtrue将召回记忆写入<workspace>/.cursor/rules/hindsight-session.mdc以便 Cursor 规则引擎注入,用于绕开原生additionalContext通道的缺陷。
appendToGitignoreHINDSIGHT_APPEND_TO_GITIGNOREtrue写入规则文件回退时,幂等地将该路径追加到工作区.gitignore(非 git 工作区为 no-op)。

Auto-Retain(自动保留)

自动保留在 Agent 完成任务后执行,提取对话记录并发送给 Hindsight。

配置项环境变量默认值说明
autoRetainHINDSIGHT_AUTO_RETAINtrue自动保留的总开关。
retainModeHINDSIGHT_RETAIN_MODE"full-session"保留策略:"full-session""chunked"
retainEveryNTurnsHINDSIGHT_RETAIN_EVERY_N_TURNS10每 N 轮保留一次,1表示每轮都保留。
retainOverlapTurns2分块模式下,从前一块额外包含的轮数以保证连续性。
retainContextHINDSIGHT_RETAIN_CONTEXT"cursor"保留记忆的来源标签(Hindsight 据此按来源聚类记忆)。
retainToolCallsfalse是否在保留的记录中纳入工具调用消息。
retainTags[]附加到保留文档的标签(支持{session_id}等模板变量,源码中还会展开{bank_id}{timestamp})。
retainMetadata{}附加到保留文档的额外元数据(同样支持模板变量)。

Debug(调试)

配置项环境变量默认值说明
debugHINDSIGHT_DEBUGfalse启用 verbose 日志输出到 stderr,行首以[Hindsight]前缀标记。

验证 Hook 是否生效

插件在每次Hook 调用时都会写入状态文件——即使没有召回任何记忆或保留被跳过也会写入。检查这些文件即可确认 Hook 正在触发:

# 默认位置(未设置 CURSOR_PLUGIN_DATA 时): cat ~/.hindsight/cursor-state/state/last_recall.json cat ~/.hindsight/cursor-state/state/last_retain.json

每个文件包含以下字段:

  • saved_at—— 最近一次调用的时间戳;
  • status—— 取值为successemptyskippederror之一;
  • bank_id—— 使用了哪个 bank(successempty时存在);
  • mode—— 恒为plugin
  • hook—— 召回为sessionStart
  • result_count(召回)或message_count(保留)—— 仅在success时出现。

如果你使用 Cursor 时saved_at在更新,说明 Hook 正在触发;再查看status判断发生了什么。

故障排查

插件未激活:检查插件目录下是否存在.cursor-plugin/plugin.json。在~/.hindsight/cursor.json中启用"debug": true并查看 stderr 输出。

Agent 窗口中看到 "Ran Recall in hindsight"?那是 MCP 而非插件。插件式召回是静默的——通过additionalContext注入上下文,不产生可见的工具调用。若看到显式的 Hindsight 工具调用,说明.cursor/mcp.json中配置了 MCP。两者可以共存、协同工作。

召回不到记忆:确认 Hindsight 服务器可达(curl http://localhost:9077/health)。记忆至少需要经历一次完整的 retain 周期才会被召回。

守护进程不启动:确认已设置 LLM API Key(llmProvider自动检测依赖对应环境变量)。查看守护进程日志~/.hindsight/profiles/cursor.log

会话启动高延迟sessionStart召回 Hook 有 15 秒超时。可改用recallBudget: "low"或调低recallMaxTokens

源码导读

本集成的完整实现位于仓库 hindsight-integrations/cursor 目录,各模块职责如下:

模块/文件职责
hindsight_cursor/cli.pyinit/uninstall命令:拷贝插件、合并 hooks、生成配置与 MCP 配置
hooks/hooks.json三个 Hook 的声明(随插件包分发)
scripts/session_start.pysessionStart召回流程
scripts/retain.pystop/sessionEnd保留流程(转录解析、轮次门控、最终冲刷)
scripts/lib/config.py配置默认值与环境变量覆盖表
scripts/lib/daemon.pyhindsight-embed守护进程生命周期与连接模式解析
scripts/lib/bank.pybank ID 推导与 mission 管理
scripts/lib/client.py基于 stdliburllib的 Hindsight REST API 客户端
settings.json插件默认配置
rules/hindsight-memory.mdc常驻规则
skills/hindsight-recall/SKILL.md按需召回技能
tests/覆盖配置加载、bank 推导、内容格式化与 Hook 行为的自动化测试

插件脚本仅依赖 Python 标准库(HTTP 客户端用urllib、状态持久化用fcntl文件锁),因此运行时零第三方依赖。其变更历史可参阅 Cursor 集成 Changelog。若想了解 Hindsight 记忆 API 的服务端实现(bank、recall、retain、reflect 等),可继续阅读仓库中 hindsight-api 与 hindsight-embed 的源码。

【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 12:22:02

Matlab光场调控仿真:分步傅里叶算法与应用

1. 光场调控仿真项目背景与核心价值本科大创期间完成的这篇光场调控仿真论文&#xff0c;本质上是通过Matlab数值模拟实现对光波前相位/振幅的精确操控。这类研究在光学微操纵、超分辨显微、激光加工等领域有直接应用——比如用特定相位分布的光场操控微粒运动&#xff0c;或生…

作者头像 李华
网站建设 2026/9/15 12:20:55

MCP Toolbox CLI 完全指南:toolbox 命令、参数与实战配置详解

MCP Toolbox CLI 完全指南&#xff1a;toolbox 命令、参数与实战配置详解 【免费下载链接】mcp-toolbox MCP Toolbox for Databases is an open source MCP server for databases. 项目地址: https://gitcode.com/GitHub_Trending/ge/mcp-toolbox 导读 本文是 MCP Tool…

作者头像 李华
网站建设 2026/9/15 12:18:46

Linux内核VXLAN收发包流程详解:从FDB查表到MTU调优

做Linux网络内核调试的人&#xff0c;几乎都绕不开VXLAN。K8s里Flannel的VXLAN后端、OpenStack里的overlay网络、各种容器网络方案&#xff0c;喊的都是同一个东西&#xff1a;用UDP隧道把二层帧送到远端。很多人对“VXLAN原理”聊得头头是道&#xff0c;但一落到内核里就会懵—…

作者头像 李华
网站建设 2026/9/15 12:18:26

透明变电站数字孪生建设指南:六类公司技术路线与选型避坑全解读

这两年&#xff0c;只要和电力运维沾边的项目&#xff0c;讨论到最后基本都能落到一个词上&#xff1a;透明变电站。我自己的直观感受是&#xff0c;这个词已经从概念PPT里走了出来&#xff0c;变成越来越多电网单位、工业用户、EPC总包方真正立项掏钱的方向。可我接触过不少业…

作者头像 李华