跳到主内容

deepseek-harness-local/integrations/deepseek-harness-local

6Star0Fork0Issue0Watching

把 DeepSeek Harness 的每条人机回合接入纯本地 TMCRA 记忆服务,先召回相关证据再注入,再把问题和回答按角色落库,写入失败自动队列重试。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
Python
License
Apache-2.0
分支
main
agent-memoryai-agentsclaude-codecodex-plugincross-session-memorydeepseek-harnessdsh-pluginlocal-first

安装

命令web profile
$ dsh plugin --profile web add github:reshuibuduo/tmcra-memory#path:integrations/deepseek-harness-local

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

对话式安装

帮我安装 DeepSeek Harness 插件 reshuibuduo/tmcra-memory/integrations/deepseek-harness-local:先查看仓库 https://github.com/reshuibuduo/tmcra-memory 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

把 DeepSeek Harness 里每一次被宿主接受的人机回合,接到你这台电脑上已经跑起来的 TMCRA 纯本地记忆服务——先在模型思考前从本地证据库召回相关内容注入,再把问题与回答按角色分别落库,写入失败时自动排队重试。

核心能力

  • 在 agent/pre-step 钩子最前端({ prepend: true })把 recall 证据塞进消息列表,作为带 trust="untrusted" 标记的插件数据消息传入,避免被当成指令
  • 每回合开始时自动重试上一回合堆积的 outbox 写入,把 ~/.tmcra/integrations/outbox/*.json 里失败的任务清掉
  • 在 session/event 钩子里捕获回合结束,按 agentPreset / subagent / agent 三级身份单独写库,区分 primary 与 subagent
  • 写入失败时把 payload 原子写到本地 outbox 文件,下回合自动重试;不向宿主抛出阻塞错误,默认让 Harness 继续
  • 项目身份解析:优先读 .tmcra/project.json marker,否则 fallback 到 git remote → git root → cwd 路径 hash,保证和 Codex、Claude 等本地接入写入同一项目桶
  • 强制 loopback:baseUrl 必须是 127.0.0.1 / localhost / ::1 且不能带路径 / query / userinfo,任何公网地址会被 schema 拒绝

技术实现

  • 语言: TypeScript(type: module,产物 dist/index.mjs)
  • 关键依赖: @deepseek-ai/cordis(宿主服务容器)、@deepseek-ai/dsh-agent(agent/pre-step / PreStepDecision 类型)、@deepseek-ai/dsh-llm(createUserMessage 注入 recall)、@deepseek-ai/schemastery(配置 schema 校验)
  • 架构模式: Cordis function plugin,name = "tmcra-local-memory"、inject = ["agents"];通过 ctx.on("agent/pre-step", ..., { prepend: true }) 抢在所有下游 pre-step handler 前把 recall 内容加到 messages 末尾;通过 ctx.on("session/event") 监听 turn/end 事件写回;ctx.effect() 包装最后清空所有 in-flight 写入。共用 integrations/local-agent-hooks/lib/local_memory.mjs 里的 loadConfig / rememberMessage / flushOutbox / resolveProject,保证和 Codex、Claude 等本地 TMCRA 接入的项目身份、token 校验、loopback 校验完全一致
  • 入口文件: integrations/deepseek-harness-local/src/index.ts(仅一个文件;副作用逻辑也都在 apply(ctx, config) 里)

适用场景

当你已经在本地跑了一份 TMCRA 纯本地记忆(不连公网、不需要 TMCRA 账号或订阅),但 DeepSeek Harness 这边的 Agent 默认没有接通这份记忆时使用。本插件接管 Harness 的 pre-step 与 turn/end 生命周期,让模型在每次回答前都能看到你过去在 Codex、Claude 或其他 TMCRA 接入下积累的相关证据,并把这一次的问答按角色归档。典型用法是个人长期项目记忆——你切换多个 AI 编程工具时,它们都把同一份本地证据注入、把同一份回答写回,最后看到的是一份连续的、跨工具的项目历史,而不是每开一个新会话就从零开始。

前置依赖与兼容性

依赖最低版本说明
TMCRA 纯本地运行时任意能产生 ~/.tmcra/config/runtime/local-runtime.json 的版本由 scripts/install-local.ps1 / .sh 部署;本插件不打包运行时,缺它会直接抛 "TMCRA local integration is not configured"
共享接入配置生成器integrations/local-agent-hooks/scripts/configure.mjs --runtime-config …由本仓库同 monorepo 的 local-agent-hooks 子包提供,部署 Harness 插件前必须先跑过一次
DeepSeek Harness 宿主0.1.0-rc.5+(peerDependencies 锁定 <0.2)peerDependencies 列了 @deepseek-ai/cordis ^4.0.0 <5、@deepseek-ai/dsh-agent / dsh-llm / dsh-session ^0.1.0-rc.5 <0.2;测试与文档均针对 0.1.0-rc.6
Node.js`^22.19.0
平台—跨平台;local-agent-hooks/lib/local_memory.mjs 里用 process.platform === "win32" 区分 Windows ACL 与 POSIX 0600/0700 权限
原生模块—无;只用 Node 内建 node:crypto / node:fs/promises / node:http

安装方式

dsh plugin --profile web add github:reshuibuduo/tmcra-memory#path:integrations/deepseek-harness-local

配置项

配置类型说明默认值
configPath字符串TMCRA 纯本地接入配置文件的绝对路径;不填则读 ~/.tmcra/local-integration.json(也可通过环境变量 TMCRA_LOCAL_INTEGRATION_CONFIG 临时覆盖)~/.tmcra/local-integration.json
projectId字符串强制把项目身份固定成一个字符串;不填则按当前 cwd / git / marker 解析按 cwd 或 git 自动解析
recallFailureMode"raise" | "continue"recall 阶段报错时是直接抛错让 Harness 中止,还是只打 warn 后继续(写入照常)continue
recallTimeoutMs数字(毫秒)单次 recall 请求允许的最大耗时;实际会被强制 clamp 到 1000–180000ms 之间120000
ingestTimeoutMs数字(毫秒)单次 recall/写入请求的最大耗时;同样 clamp 到 1000–180000ms120000

常见问题

Q: 启用后模型回答变慢怎么办?

A: recall 是阻塞发生在模型第一次推理之前的。慢的常见原因有两个:TMCRA 本地服务响应慢,或者 recall 命中内容过大被截到 24000 字符。可以先下调 ~/.tmcra/local-integration.json 里的 topK(默认 8,最小 1,最大 32),再考虑把 recallTimeoutMs 调小,让 Harness 走"超时放弃 recall"的快速路径。

Q: 我不想给某个项目让模型看到历史证据,怎么关?

A: 在该仓库根目录放一个空的 .tmcra/project.json 是不行的;正路是给该项目单独建一个 dsh profile,在 cordis.patch.yml 里把 recallFailureMode 设为 raise 并把 configPath 指向一份故意读不到的配置文件——这样 Harness 在 pre-step 里就会直接报错中断,避免任何内容被注入。

Q: 怎么卸载?怎么完全清掉本地记忆?

A: 卸载走 dsh plugin --profile web remove <name>;本插件不内置任何持久化数据。所有数据都是写到外部 TMCRA 服务、outbox、token 文件里的,删 ~/.tmcra/(注意会一并清掉 Codex、Claude 等其他本地 TMCRA 接入的证据)。

Q: 安装目录里有空格或中文,npm pack 后 Harness 报路径错怎么办?

A: 这是 Harness 预览版的已知 bug。scripts/install-deepseek-harness-local.sh 里的 case "$PACKAGE_DIRECTORY" in *[! -~]*|*' '*) 会主动检测并报错;解决办法是把 TMCRA_DSH_PACKAGE_DIRECTORY 改成纯 ASCII 且无空格的短路径(如 D:\tmcra-packages 或 ~/.tmcra/packages)。

Q: 报错 "TMCRA local hooks refuse non-loopback API URLs" 是为什么?

A: 因为 validateLoopbackBaseUrl 强制要求 baseUrl 必须是 127.0.0.1 / localhost / ::1,且协议必须是 http: / https:,且不能带路径 / query / userinfo。这是为了防止 token 文件意外被发到非本机服务。如果想局域网内连另一台机器的 TMCRA,那一份 TMCRA 服务也得自己改成 loopback 限定才能配合本插件。

Q: 主 agent 召回出来的证据能不能被 subagent 看到?

A: 这份实现不直接处理跨 subagent 的 recall 隔离。每条 recall 都是 agent/pre-step 各自的回合触发的,subagent 触发时 session.header.origin === "subagent"、parent_session_id 会被单独记录,因此写入侧可以区分 primary/subagent;但 recall 的可见域当前取决于 TMCRA 服务端按 project_id 返回的内容,不在客户端做二次过滤。

Q: 没有 TMCRA 运行时但插件已经 add 进了 profile,会怎样?

A: 每次被 Harness 接受的人机回合,pre-step 钩子在 await loadConfig 阶段就会抛 TMCRA local integration is not configured: /home/.../.tmcra/local-integration.json;因为默认 recallFailureMode === "continue",错误会被 warn(ctx, "prepare", error) 吞掉、写入被跳过、Harness 继续。这一回合既没有 recall 注入、也没有任何消息被写库,需要先把本地 TMCRA 跑起来再开新会话才能补回历史。

上手难度

进阶 — 必须先有一份外部 TMCRA 纯本地运行时、跑过一次共享配置生成、能区分 pre-step / turn/end 两个生命周期钩子的语义,并对 ~/.tmcra/local-integration.json 里的 schema 与 outbox 路径有基本认识。

已知问题与限制

  • Harness 预览版无法正确处理 tarball 路径中带空格或非 ASCII 的字符,安装脚本会主动拒绝并给出错误提示(README.md:26 / scripts/install-deepseek-harness-local.sh:13-19)
  • baseUrl schema 硬性限制为 loopback + 无路径 + 无 query + 无 userinfo;任何 LAN IP 或公网地址直接抛错(lib/local_memory.mjs:104-117)
  • recallFailureMode 默认 "continue",TMCRA 服务长期不可用时只在日志里 warn,宿主继续工作但当前回合既不召回也不写入(src/index.ts:228 / src/index.ts:237-239)
  • flushOutbox 单次最多重试 8 条(MAX_OUTBOX_BATCH = 8),且对 outbox 文件遍历使用"任一文件失败就 break 跳出"策略;当 TMCRA 服务持续不可用时本回合新写入的 payload 全部留在 outbox 等下一回合(lib/local_memory.mjs:12 / lib/local_memory.mjs:321-336)
  • recallTimeoutMs 与 ingestTimeoutMs schema 强制 clamp 到 1000–180000ms,超出范围会抛 timeout must be between 1000 and 180000 ms(src/index.ts:102-108)
  • 部署的 TMCRA 接入配置 schemaVersion 必须是 1,否则抛 unsupported schema(lib/local_memory.mjs:137-139)
  • 写入的 recall 证据虽然在源码里声明"与当前请求冲突时优先当前请求",但没有任何运行时机制阻止模型把它当成指令,schema 仅起提示作用

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/reshuibuduo/tmcra-memory/integrations/deepseek-harness-local)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录