# dsh-task-memory [English](README.md) | 中文 面向 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 的**任务隔离**长期记忆插件。 记忆按任务分库,保存在 `~/.dsh/storages/task-memory/`。写入某一任务的事实,对其他任务默认不可见,除非主动切换任务。 ## 为什么做这个 多数 DSH memory 插件是全局或按 workspace 共享的。本插件把 **task(任务)** 当作隔离边界: 1. 默认任务:由 session 的 `cwd` 推导 2. `memory_bind_task`:把当前 session 绑到指定任务 vault 3. 搜索 / 读取 / 提示注入:**不会**跨任务边界,提示注入按 **agent 级作用域**注册——每个会话的系统提示只注入它自己任务的记忆 ## 工具 | 工具 | 作用 | |------|------| | `memory_bind_task` | 将当前 session 绑定到某个任务 vault | | `memory_current_task` | 查看当前 session 所在 vault(绑定 or 默认) | | `memory_remember` | 按 `key` 写入或更新一条事实 | | `memory_recall` | 按精确 key 读取 | | `memory_search` | 关键词搜索(英文 + 中文 bigram) | | `memory_forget` | 删除一条 | | `memory_list_tasks` | 列出所有任务 vault | | `memory_clear_task` | 清空某个 vault(需 `confirm: true`) | ## 安装 ```bash # 从公开 GitHub 仓库安装(建议钉完整 commit SHA) dsh plugin --profile web add "github:wangyihao0001-oss/dsh-task-memory" # 开发时 link 本地 checkout dsh plugin --profile web add "$(pwd)" ``` 安装后重启 Web UI(或重启 profile),先绑定任务,再 remember / recall / search。 上架 [dsh.pub](https://dsh.pub/zh/plugins/) 后,也可通过目录页的安装说明 / `dshpub` 流程安装。 ## 本地开发(不安装) ```bash npm install npm run build npm test # node:test 单测 npm run smoke # 构建 + 冒烟 ``` 若你从 DSH 源码仓库启动: ```bash pnpm dsh web --patch /absolute/path/to/dsh-task-memory/cordis.dev.yml ``` 请把 `cordis.dev.yml` 里的绝对路径改成指向本仓库编译后的 `lib/index.js`。 ## 配置 `cordis.patch.yml` 默认值: ```yaml injectLimit: 8 # 注入到提示中的记忆条数上限 injectMaxChars: 2400 # 注入块软字符预算 injectMaxEntryChars: 400 # 单条记忆在注入块中的字符上限(超出截断) injectPrompt: true # 是否为当前任务注入置顶/近期事实 maxEntries: 500 # 每个 vault 的条目上限(>= 1);超出时淘汰最旧的非置顶条目(置顶永不被淘汰;新增超出上限会被拒绝,对已有 key 的更新不受影响) ``` 可选 `storageRoot` 覆盖默认目录 `~/.dsh/storages/task-memory`。 ## 存储与可靠性 ```text ~/.dsh/storages/task-memory/ .json ``` 每个文件形如: ```json { "taskId": "", "title": "", "updatedAt": 0, "entries": [ { "id": "m_…", "key": "<key>", "content": "…", "tags": [], "pinned": true, "createdAt": 0, "updatedAt": 0 } ] } ``` - 文件是纯 JSON,可直接手工编辑或备份 - 写入通过**临时文件 + 原子 rename**,读取永远看到一致快照 - 同一任务的写入(含 `memory_bind_task` 的标题更新、`save`、`update`)在进程内**串行化**(per-task 锁),并行 agent 并发写不会丢更新。读改写请优先用 `update`,避免 `load` → 修改 → `save` 覆盖并发写入。 - 置顶条目**永不被淘汰**;vault 满且可淘汰的只有置顶条目时,**新增** key 会被拒绝并返回明确错误(避免"刚写入就被淘汰"的静默丢失);对已有 key 的原地更新(upsert)不受容量限制,仍会尽力收缩 - 启动时自动清理崩溃残留的 `*.tmp`(只清理超过 1 小时的,避免误删其他进程的进行中写入) ## 路线图 - ✅ 按 session 精确的提示注入(agent 级 scoped context,取代进程级 bind 猜测) - 在同一套工具背后可选向量检索 - 小型 Web UI:浏览 / 置顶 / 删除 vault ## 许可证 MIT