zhouwei713/dsh-daily-kit--packages-local-memory0

dsh-daily-local-memory

dsh plugin: local-memory (developer preview)

包名
dsh-daily-local-memory
版本
0.1.0
许可证
MIT
最近更新
2026年8月16日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zhouwei713/dsh-daily-kit#03d93caab5b846c990da8bb201d52881756ed483&path:packages/local-memory

安装与配置


# dsh 配置示例
- id: local-memory
  name: dsh-daily-local-memory
  config:
    enabled: true
    # indexDir: D:/data/dsh-index   # 索引存储目录,默认 ~/.dsh/local-memory
    # maxFileBytes: 1048576         # 单文件大小上限,超出跳过
    # chunkLines: 40                # 每块行数(引用按块给出行区间)
    # chunkOverlap: 5               # 相邻块重叠行数,防止跨块命中丢失
    # extraExcludes: ['family-photos']   # 追加排除的目录名
    # extraExtensions: ['.weird']        # 追加按文本索引的扩展名
    # searchMaxResults: 20
    # contextChars: 80

权限透明

本插件对宿主环境的影响面,逐条交代清楚:

  • 读写位置:读——memory_index 指定的文件夹(递归、只读);写——仅索引目录(默认 ~/.dsh/local-memory,可配)。memory_remove 只删除索引目录下的数据,源码上有物理隔离,不可能碰到原始文件。
  • 网络域名:无。本插件不发起任何网络请求。
  • 凭证:不持有任何凭证。敏感目录(.ssh/.aws/.gnupg/.kube 等)默认被排除,不会进入索引。
  • 确认点:无新增确认点;工具均为只读或只写索引目录。
  • 日志内容:仅在加载时写一行启动日志(含索引目录路径),不写文件内容。

检索方案说明

v1 采用自研倒排索引terms.ts 分词 + search.ts 打分 + store.ts JSON 持久化),未使用 Node 内置 node:sqlite FTS5,原因:

  1. 本仓库 engines 覆盖 Node ^22.19,而 node:sqlite 在 Node 22.x 各小版本中可用性/实验标志状态不一致(22.12 实测无 flag 抛 ERR_UNKNOWN_BUILTIN_MODULE),插件无法要求宿主运行时加启动 flag;
  2. FTS5 的 unicode61 分词器不切分中文,自研分词(拉丁词 + CJK 二元组)对中英文混合资料开箱即用;
  3. 保持零 native 依赖、存储格式透明(一个 JSON 文件,可直接查看/备份)。

v2 可选方向:接入 embedding 语义检索(本地模型或远端 API),在现有关键词索引之外加一层向量召回。

已知限制

  • 无语义检索:v1 只有关键词匹配,同义词/近义表达搜不到(v2 计划)。
  • 以文本类文件为主:PDF/DOCX/XLSX/PPTX 等二进制办公文档不在索引范围内;如需检索这类文件,建议先用 dsh-daily-documents 提取为文本/Markdown 后再索引。
  • 二进制探测是启发式:按前 8KB 是否含 NUL 字节判断,极少数无 NUL 的二进制文件可能被当文本索引(会产生乱码块,不影响其他文件)。
  • 整个文件夹索引加载进内存检索:适合 GB 级以下文本资料;超大语料建议分文件夹索引并用 path 参数限定搜索范围。

手动验证

本仓库的 CI 只覆盖类型检查与纯函数/集成单测(node:test + 临时目录)。接入真实 dsh 后请手动验证:

  1. 在 dsh 配置中启用本插件,确认启动日志出现 local-memory: loaded(索引目录 …)
  2. 调用 memory_index 索引一个包含 Markdown/代码的测试文件夹,确认返回新增文件数与块数。
  3. 调用 memory_search 搜一个文件中出现过的关键词,确认命中带 路径:行号 与上下文片段;再调用 memory_get_source 按命中路径与行号取原文,确认内容一致。
  4. 修改/删除/新增一个文件后重新 memory_index,确认返回的 changed/removed/added 计数正确,且删除文件的内容不再被搜到。
  5. 在测试文件夹中放入 .git/、含 NUL 字节的假 .txt、超过 maxFileBytes 的大文件,重新索引确认它们都被跳过。
  6. 调用 memory_remove,确认 memory_status 中该文件夹消失且原始文件完好。

许可

MIT