hindsight/hindsight-integrations/coding-agents

20.1kStar1.4kFork140Issue54Watching

为 DeepSeek Harness 注入 Hindsight 长期项目记忆:每轮会话自动召回知识页和上下文,对话自动入库,按仓库共享记忆银行。

语言
Python
License
MIT
分支
main
agentic-aiagentsai-memorymemory

安装

$ dsh plugin --profile web add github:vectorize-io/hindsight/hindsight-integrations/coding-agents

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

给 DeepSeek Harness(DSH)注入 Hindsight 长期项目记忆:每个用户回合开始前从记忆银行召回相关上下文注入到模型输入,对话内容在结束时自动写回仓库级记忆银行,记忆按仓库隔离、跨会话共享。

核心能力

  • 在每轮用户回合(agent/pre-step)前调用记忆服务做语义检索,把命中的知识页与上下文作为 kind: 'plugin' 消息追加到模型输入
  • 监听 agent/session-start 做冷启动检查,自动后台启动 git 历史导入与代码库结构调研,无须手动命令
  • agent/turn-stopping 自动写回本轮完整会话(包括工具调用与助手回复),会话结束无须"另存"
  • 以原生 Cordis 插件方式注册 8 个 hindsight_* 工具给 DSH 模型直接调用(搜索/读取知识页、深度推理、捕获计划、摄入文档、同步状态、诊断)
  • 按工作目录解析到独立的"记忆银行"(默认命名 coding-agent::<仓库名>),多个 DSH 会话不会串数据,子代理会话不会重复落库
  • 三种部署模式可选:Hindsight Cloud(默认)、自托管服务、本机守护进程(127.0.0.1:9077

技术实现

  • 语言: TypeScript(ESM)
  • 关键依赖: @vectorize-io/hindsight-all(核心客户端)、@modelcontextprotocol/sdk(MCP 工具可选路径)、zod(参数校验);不引入 DSH 自身的包,避免对宿主版本的硬依赖
  • 架构模式: Cordis 原生插件——导出 nameinject=["agents"]apply(ctx)apply 通过 ctx.on 绑定 4 个生命周期事件(agent/session-start / agent/pre-stepprepend:true / agent/turn-stopping / agent/disposed),并通过 ctx.inject(["tools"], ...) 在宿主工具注册表注册原生工具
  • 入口文件: src/dsh.ts(Cordis 入口,DSH 直接加载),src/index.ts(opencode/Kilo 等插件宿主复用同一份核心逻辑),cordis.patch.yml(profile 装载声明)

适用场景

日常用 DSH 做跨会话项目的开发者——经常在同一个仓库里反复修改同一批文件、重新讨论已决定过的取值、或者问"上次为什么这样实现"。开启后,DSH 会话开始时自动召回相关知识页与历史决策,结束时把这一轮的问答与工具调用一并写入仓库级记忆银行;下次会话直接继承上下文,不必每次复述背景。同一仓库的不同会话共享同一份记忆,互不干扰。

前置依赖与兼容性

依赖最低版本说明
DeepSeek Harness未声明本插件以 Cordis 原生插件形式挂载到宿主层;只要 DSH 的事件名仍使用 agent/session-startagent/pre-stepagent/turn-stoppingagent/disposed,即可加载。
Node.js未声明package.json 未声明 engines;如需导入历史 dsh 会话做存量回填,Zstandard 解码需 Node 22.15+。
平台跨平台跨平台。daemon 模式下 macOS 因 litellm 无 wheel,需自备 Rust 工具链编译;Linux/Windows 直接装 wheel。
原生模块package.json 未声明原生模块依赖。daemon 模式间接依赖 hindsight-embed 自身要求。

安装方式

dsh plugin --profile web add github:vectorize-io/hindsight/hindsight-integrations/coding-agents

配置项

配置文件:~/.hindsight/coding-agent.json。环境变量(HINDSIGHT_*)作为兜底层,文件优先。

配置类型说明默认值
serverMode"cloud" | "self-hosted" | "daemon"记忆服务跑在哪里cloud
apiUrlstringHindsight API 地址(daemon 模式自动改成 http://127.0.0.1:{apiPort}https://api.hindsight.vectorize.io
apiTokenstringCloud 模式需要的 Bearer Token
bankIdstring显式指定记忆银行 id;未设置时按仓库动态解析按目录解析
bankIdTemplatestring动态银行 id 模板,可用占位符 {gitProject} {project} {harness} {channel} {user}coding-agent::{gitProject}
mapPathToBankobject绝对路径 → 银行 id 映射,最长前缀优先,可整体覆盖默认
optInOnlyboolean仅在白名单目录里启用记忆,其他目录静默不落库false
optInPathsstring[]白名单目录(前缀匹配,自动展开 ~),每个仓库仍保留独立银行[]
disabledboolean硬关闭——插件完全失活、不创建银行false
retainSessionsboolean插件宿主(opencode/Kilo)是否在每轮异步落库true
reflectTimeoutMsnumber会话开始时回忆调用的超时(毫秒)120000
pageRefreshEveryTurnsnumber每多少轮用户回合重新拉一次知识页10
autoSeedboolean冷仓库自动从 git 历史做一次种子true
seedLimitnumber自动种子最多取最近多少条 commit300
codebaseSurveyboolean冷仓库是否跑一次只读代码库结构调研true
surveyModelstring调研用模型(Claude 配方)haiku
surveyBudgetUsdnumber调研预算上限(Claude 配方)2
gitIngest"message" | "full" | "none"git 历史摄入深度:message 只取 commit 信息;full 含 diff;none 关闭message
maxParallelRetainsnumber同时并发写库请求数上限(触发 429 时调低)10
retainTagsstring[]每条写入自动附加的标签,支持上述占位符[]
retainMetadataobject每条写入自动附加的元数据,支持上述占位符{}
harnesses.<name>object按宿主名覆盖以上任意字段(如给 Claude Code 单独关掉记忆)
banks.<id>object按解析后的银行 id 覆盖任意字段;可设 bank 改名汇入其他银行
logLevel"debug" | "info" | "warn" | "error"日志级别info

模型可见的工具:hindsight_sync_status / hindsight_diagnose / hindsight_search_knowledge_pages / hindsight_list_knowledge_pages / hindsight_read_knowledge_page / hindsight_reflect / hindsight_capture_initiative / hindsight_ingest_document

常见问题

Q: 安装后还需要跑什么命令初始化记忆吗?

A: 不需要。agent/session-start 会自动做冷启动检查,后台拉取 git 历史与代码库结构,记忆在后台持续补充;无须手动命令,也没有 ingest CLI。

Q: 数据存在哪里?会上传到云端吗?

A: 默认指向 Hindsight Cloud(需在 apiToken 里给一个 Bearer Token)。也可以改为自托管服务(设 apiUrl 为你的服务端)或本机守护进程(设 serverMode: "daemon",插件按需启动 hindsight-embed 并监听 127.0.0.1:9077)。三种模式只影响服务跑在哪,HTTP 接口一致。

Q: 多个 DSH 会话(不同项目)会串数据吗?

A: 不会。DSH 的 Web 界面可在不同目录创建会话,每个会话的 session.header.cwd 决定走哪个工作区;插件按工作区根目录分别解析到独立的"记忆银行"(默认命名 coding-agent::<仓库名>)。子代理会话(origin === "subagent")会被识别并跳过,不会被重复入库。

Q: 安装在哪一层,会影响所有 DSH profile 吗?

A: 通过 cordis.patch.yml 把插件挂到宿主层,对所有 profile 生效;若只想关掉某一个 profile,把那一个 profile 自己的 cordis.patch.yml 里把这一行改成 disabled: true 即可,无须卸载。

Q: 如何停用某个仓库的记忆?

A: 在 ~/.hindsight/coding-agent.jsonbanks 节里按解析后的银行 id(例如 coding-agent::secret-client)写 { "disabled": true };或者用 optInPaths 列允许的目录并把 optInOnlytrue,列表外的项目完全静默、不落库。

Q: 检索结果会出现在哪?

A: 检索到的内容被追加为 source: { kind: 'plugin', plugin: 'hindsight', form: 'recall' } 的用户消息,DSH 会作为"召回材料"渲染而不是用户输入;模型自己也可以调用 hindsight_search_knowledge_pageshindsight_reflect 等工具主动查询。

Q: 出错了怎么排查?

A: 看 $TMPDIR/hindsight-coding-agent/plugin.log(人读,按 LEVEL [scope] message 排)或 /tmp/hindsight-plugin.log(机器读,每条 JSON 行,反映每次 recall/写库成功失败)。在配置里把 logLevel 调到 debug 可看到更细的过程。模型也可直接调 hindsight_diagnose 工具自助排查。

上手难度

入门 —— dsh plugin add 一行即可装载,配置项全部可选;不愿配就用 Hindsight Cloud + 默认银行命名,仓库里立刻能召回与落库。

已知问题与限制

  • 本机守护进程模式在 macOS 上需要自备 Rust 工具链litellm 作为 hindsight-embed 的传递依赖仅发布 Linux/Windows 的 wheel,macOS 需通过 maturin 从源码编译并维持较新的 rustc;否则启动会以缺工具链失败。
  • 进程级宿主层注册默认走启动目录的银行解析:工具注册在插件加载时完成,先按 process.cwd() 拿一个模板;每次模型调用时再用调用者所在会话的工作区重新解析银行。若启动目录恰好落在某个 banks.<id> 黑名单里,工具在该进程后续服务的所有仓库都不会暴露(即便它们的银行是开启的)。
  • DSH 没有插件面向的 toast/UI 通知通道:opencode/Kilo/Cline 这类宿主会在启动时显示"🧠 已启用记忆"横幅,DSH 上没有对应渠道,所以 DSH 启动时不会在 UI 里看到横幅提示,只能从日志确认。
  • 导入历史 DSH 会话需 Node 22.15+:老 Node 解析 $DSH_HOME/sessions 下的 Zstandard 帧化 JSONL 会失败,回填会按原因跳过、不会静默假装成功。
  • 没有仓库级配置文件:刻意没有仓库内 .hindsightrc.json 之类的本地文件,防止克隆下来的仓库偷偷开启或重定向记忆;按路径映射与按宿主覆盖都集中在用户级 ~/.hindsight/coding-agent.json