ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

给 DeepSeek Harness 装上代码库的持久记忆:Hindsight Coding Agents 集成实战与源码解析

给 DeepSeek Harness 装上代码库的持久记忆:Hindsight Coding Agents 集成实战与源码解析 给 DeepSeek Harness 装上代码库的持久记忆Hindsight Coding Agents 集成实战与源码解析【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight本篇文章讲解如何为 DeepSeek Harnessdsh一个基于 Cordis 插件框架的编码智能体接入 Hindsight 的长期记忆能力一条命令完成原生 Cordis 插件安装让仓库的 git 历史与对话在后台自动沉淀为记忆库并在下一次会话开始时被自动召回。读完本文你将掌握安装、内存后端选择、配置分层、按仓库路由记忆库的原理以及hindsight_*工具集在 dsh 生命周期事件中的真实接线方式。为什么编码智能体最需要记忆以离散会话工作的智能体擅长专注却天然缺乏连续性——每一次新会话都要重新理解你的技术栈、重新踩一遍同样的坑、重新问一遍你已经回答过的问题。正如 hindsight-docs/blog/2026-08-14-deepseek-harness-memory.md 指出的大部分真实修复可以从代码推导出来但最后一公里往往取决于完全不在代码里的项目级决策——一个舍入规则、一份重试白名单、一条命名约定、一个平局裁决标准。这些决策存在于 git 历史和过往对话中记忆的作用就是把它们放回智能体开始工作时的面前。DeepSeek Harness 的插件优先设计everything is a plugin恰好给了解决途径既然一切皆插件那么给 Harness 补上记忆这件事也可以用一个插件完成而不是引入额外的 MCP 服务器或外部进程。本项目通过 hindsight-integrations/coding-agents 包实现这一点——一个共享的反射 注入核心为每个智能体提供极薄的接入入口。安装一条命令Harness 把一切视为插件因此集成本身也是一个插件。安装并接线dsh只需npx vectorize-io/hindsight-coding-agents install dsh该命令会在$DSH_HOME/cordis.patch.yml默认~/.dsh中注册一行 Cordis 插件记录被每个dshprofile 组合加载使用原生工具而非 MCP。安装时终端会询问记忆存放在哪里——Hindsight Cloud、你自建的服务端或本机本地守护进程——只需选择一次。脚本化安装可改用--server cloud|self-hosted|daemon参数npx vectorize-io/hindsight-coding-agents install dsh --server cloud --api-token token npx vectorize-io/hindsight-coding-agents install dsh --server self-hosted --api-url http://localhost:8888 npx vectorize-io/hindsight-coding-agents install dsh --server daemon安装器把运行时复制到~/.hindsight/coding-agents再指向各智能体的接线因此与你在哪里执行命令无关它是幂等的重复执行安全会为触碰过的文件保留.hindsight-backup备份uninstall只移除自己的条目。日常更新也无需额外操作默认开启的autoUpdate会让每次会话启动时在后台检查 npm 并重新暂存较新版本想固定版本可设autoUpdate: false。如果偏好从已发布包安装官方还提供了dsh plugin --profile web add vectorize-io/hindsight-coding-agents这条等价路线——包内自带 profile 补丁层见 cordis.patch.yml无需再手工编辑任何配置。版本前提Harness 把会话日志写为 Zstandard 帧格式的 JSONL读取它需要 Node 22.15。这也影响历史会话的导入--import-conversations——旧版 Node 会跳过导入并说明原因而不是静默导入空数据。安装后没有capture命令需要记忆。从下一个会话开始记忆是自动的。源码级原理Cordis 插件如何接线记忆生命周期集成不是通过 hook 二进制桥接而是直接绑定 dsh 的 Cordis 生命周期事件。src/dsh.ts 的注释解释了原因dsh 的 Claude Code / Codex hook 桥只是同一套类型化生命周期事件的翻译器直接绑定事件能保留 transcript、session id 与 awaited 的停止边界。四个事件的映射如下Cordis 事件对应行为代码入口agent/session-start冷检查 后台 git/代码库种子seedIfColdhooks.sessionStartagent/pre-step召回onPrompt 以带来源的消息注入记忆hooks.preStepagent/turn-stopping完成回合的写回onSessionIdlehooks.turnStoppingagent/disposed释放该 session 的实时引用hooks.disposed三个值得注意的实现细节一个 dsh 进程服务多个仓库。与 opencode/Kilo/Cline 的一进程一项目不同dsh 的 Web UI 可以在任意目录为每个会话创建工作区session.header.cwd各不相同。因此workspacesMap 按工作区根目录缓存RuntimeCorebank、client、seed而不是每进程一份记忆按仓库解析与进程无关。注入消息带显式来源。preStep在next()返回enter决策且用户确有新输入时才调用onPrompt并追加一条注入消息——source: { kind: plugin, plugin: hindsight, form: recall }。form: recall是 dsh 自己的已检索上下文词汇UI 会将其渲染为召回材料而非用户输入prepend: true让本监听器置于最外层保证记忆块排在所有其他插件的消息之后、最接近模型的回合。子代理会话被跳过。workspaceForAgent对origin subagent的会话直接返回空——为其注入会为每次委派多付一次召回为其保留则会把父会话已完整存储的片段重复归档。所有监听器都是 fail-open 的RuntimeCore从不抛出异常无法解析工作区只会让该会话不获得记忆而不会破坏智能体本身的运行。教一次项目规则如何被保留在一个正常的工作会话中告诉 Harness 这个仓库的规则即可。例如记录两条项目约定包管理用pgm而非npm、PR 标题必须遵循 Conventional CommitsHindsight 会将其保留为持久记忆这些保留内容落在作用域限定为该仓库的 Hindsight bank 中并带有产生它们的 harness 标签。可以在 Control Plane 中实时观察它们到达整个过程无需手动导出。会话写回依赖 src/core/transcript-dsh.ts 对 dsh 会话日志的规范化dsh 把会话存为追加式SessionEvent类型化日志而非聊天数组插件通过session.snapshotEvents()alpha.4 的公开访问器或旧版events属性直接读取实时日志。在约 30 种事件类型中只有三种携带对话内容user/message——人类提示词或注入的插件上下文只有source.kind user的真实人类消息会被保留assistant/message——单步回复tool/call——模型的工具调用渲染为紧凑的 action 回合。tool/result被刻意跳过其载荷是原始工具输出actionLine约定会把这类内容挡在记忆库之外。注入的召回块source.kind plugin同样会被过滤掉避免把机器脚手架当成用户的话也避免把召回的记忆再喂回下一次抽取。下一个会话它记得稍后开启全新会话询问项目约定。Harness 不再猜测而是从记忆库中召回被教过的规则包管理规则与 Conventional Commits 要求得以逐字返回因为它们被存储为已核对一致的记忆reconciled memory而不是依赖每个会话都会重置的上下文窗口。第一节课的学习成果成为第五十节课的起始上下文。从实现上看这是preStep在用户提示到达时调用onPrompt触发召回、再把getInjection生成的记忆块以带来源消息追加进消息列表的结果测试 src/dsh.test.ts 精确断言了这一行为——召回只针对人类提示why did we roll back?工具续回合只有 plugin 消息不触发第二次召回被拒绝或被中止的步骤原样通过。超越召回自愈的 Knowledge Pages集成做的远不止保留和召回单个事实。在冷仓库上它会运行一次只读调查codebase survey为架构、约定与进行中的计划in-flight initiatives播种 Knowledge Pages并在你持续工作的过程中保持它们的最新状态。Harness 在开始任务前会阅读这些页面并把新工作记录为被追踪的页面——文档因此实现了自我书写与自我修复。这些页面由服务端从 bank 的记忆中合成见 src/core/survey.ts 的注释并使用delta refresh每次刷新编辑页面而非重建。刷新时机由配置决定——默认pageTriggerCron: H * * * *每小时错峰刷新一次每个页面通过 bank id 与页面名哈希出自己的分钟槽参见 README 中 JenkinsH语法的说明pageTriggerType: auto-refresh则回到每次整合后刷新成本更高每次整合每个页面一次 LLM 合成。冷仓库调查由当前 harness 自己的 CLI 无头运行Claude 配方下可用surveyModel与surveyBudgetUsd控制模型与预算surveyRefreshCommits: 20控制架构持续变动时每隔多少提交重跑一次。共享记忆库教一个全队皆知因为记忆存放在 Hindsight bank 中而非 Harness 内部它是可移植的。同一个 bank 既被 Harness 填充也会被 Claude Code、Codex、Cursor 以及其他十余个编码智能体本项目支持的完整名单见 hindsight-integrations/coding-agents/README.md召回。教一个其余整个工具舰队都知道。这背后的机制是按仓库解析 bank。默认模板coding-agent::{gitProject}对 harness 中立——opencode、Claude Code、Codex、dsh 共享同一仓库的记忆改用{harness}-{gitProject}则按智能体拆分。解析顺序为mapPathToBank——最长匹配的绝对路径前缀映射仓库根目录即覆盖其下所有子目录覆盖任何显式bankId静态——设置了bankId或dynamicBankId: false动态——bankIdTemplate占位符展开{gitProject}是 worktree 感知的仓库名git rev-parse --git-common-dir把所有 linked worktree 解析为主 worktree 的 basename{project}是工作目录 basename{harness}是接入入口{channel}/{user}来自环境变量。gitIngest控制 git 深度message只取提交消息HEAD 移动时重 upsert 一条文档full额外按最新优先、渐进抓取逐提交 diffnone关闭 git 摄入。配置一个 JSON 文件的分层覆盖所有配置集中在一个文件~/.hindsight/coding-agent.json。分层按字段覆盖后者胜出内置默认值环境变量HINDSIGHT_API_URL、HINDSIGHT_API_TOKEN及每个标量设置对应的HINDSIGHT_FIELD_IN_CAPS用于容器/CI文件顶层harnesses.name段——按智能体覆盖banks.resolvedBankId段——按仓库覆盖bank 解析后应用因此与仓库位置无关、目录移动后依然有效。环境变量只是回退文件设置了值就以文件为准。retainTags、optInPaths等列表型设置接受逗号分隔值mapPathToBank、harnesses、banks、retainMetadata等映射型设置为文件专用。配置在进程启动时读取文件不被监听hook 型 harness 每个 hook 调用读一次下次提示即生效插件型 harness含 dsh每次加载插件时读一次重启智能体后生效。唯一例外是apiToken——服务端拒绝请求时每个 host 都会重读它因此轮换密钥无需重启。字段默认值含义apiUrlhttps://api.hindsight.vectorize.ioHindsight API 基址本地服务端设为http://localhost:8888apiToken—Bearer 令牌Cloud 模式bankIdTemplatecoding-agent::{gitProject}动态 bank id 格式mapPathToBank—绝对路径 → bank最长前缀胜出optInOnly/optInPathsfalse/ —仅白名单项目启用记忆其余完全惰性不建 bank、不保留、不播种retainTags/retainMetadata— / —给每份文档加盖来源标签/元数据支持{gitProject}等占位符observationScopesshared观测整合的作用域每个 bank 一个全局无标签作用域也可用per_source把提交说的与对话决定的分开整合autoSeed/seedLimittrue/300冷仓库从 git 历史自动播种 / 最近 N 条提交上限codebaseSurvey/surveyRefreshCommitstrue/20冷仓库结构调查 / 每积累多少提交重跑调查retainSessionstrue会话写回总开关gitIngestmessagegit 摄入深度message/full/nonemanageBankConfigtrue让插件塑造 bank 自身配置retain 策略、knowledge实体标签组、缺失时的 missions只做增量添加绝不覆盖既有内容disabledfalse硬关闭开关惰性插件/hookautoUpdatetrue每日后台检查并重暂存运行时代按仓库精细控制同样在这个文件里以解析后的 bank id 为键。例如把coding-agent::secret-client加入黑名单、把旧 bank 收敛到共享 bank、对大型 monorepo 开启完整 git 摄入都只需在banks段声明两个仓库共享一个 bank既可按 id 收敛banks映射到同一字面目标也可按路径前缀一条mapPathToBank覆盖目录下所有仓库。验证与排障集成在仓库内配有完整的验证链路单元测试src/dsh.test.ts 覆盖 pre-step 注入、写回、session-start 恰好一次播种、alpha.4 的snapshotEvents回退以及toDshParameters把 Zod 原始 schema 投影为 dsh 参数 JSON Schema仅支持字符串参数非字符串会显式报错端到端测试e2e/Dockerfile.dsh 与 e2e/dsh-stub-model.cordis.yml 用一个本地 echo 模型hindsight-stubopenai-completions协议替代 DeepSeek API使 E2E 无需真实账户即可验证完整的生命周期接线e2e/run-harness.sh负责在容器中执行安装命令并驱动会话。日常排障时注意失败永不破坏智能体——一次失败的反射、页面抓取或保留会退化为一次普通的无记忆回合并记入日志。所以没有记忆是一个日志问题检查结构化诊断文件$TMPDIR/hindsight-plugin.log可用HINDSIGHT_DIAG_FILE覆盖中session_start与deepen_started是否为该 bank 触发过reflect_failed/pages_failed表示一次无记忆的运行。hindsight_sync_status工具脚本用dist/status.js直接回答记忆就绪了吗synced: true表示播种的记忆可查询。要重置某个仓库的记忆只需删除服务端上对应的 bank——bank 是这个集成保持的唯一状态删除后下一次会话就是真正的首次打开种子与调查会从头再来。小结从一条npx命令到原生 Cordis 插件从agent/session-start的冷启动播种到agent/pre-step的按需召回再到agent/turn-stopping的会话写回DeepSeek Harness 通过 Hindsight 获得了真正跨会话的代码库记忆git 历史与对话在后台沉淀约定与决策在下一次会话被自动摆在智能体面前Knowledge Pages 让架构文档自我维护而共享 bank 让记忆在所有编码智能体之间流动。相关实现细节可继续深入 hindsight-integrations/coding-agents/README.md 与 src/dsh.ts。【免费下载链接】hindsightHindsight: Agent Memory That Learns项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表