zhouwei713/dsh-daily-kit--packages-local-memory ↗★ 0
dsh-daily-local-memory
dsh plugin: local-memory (developer preview)
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zhouwei713/dsh-daily-kit#03d93caab5b846c990da8bb201d52881756ed483&path:packages/local-memory说明文档
阅读完整 README ↗安装与配置
# 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,原因:
- 本仓库 engines 覆盖 Node ^22.19,而
node:sqlite在 Node 22.x 各小版本中可用性/实验标志状态不一致(22.12 实测无 flag 抛ERR_UNKNOWN_BUILTIN_MODULE),插件无法要求宿主运行时加启动 flag; - FTS5 的 unicode61 分词器不切分中文,自研分词(拉丁词 + CJK 二元组)对中英文混合资料开箱即用;
- 保持零 native 依赖、存储格式透明(一个 JSON 文件,可直接查看/备份)。
v2 可选方向:接入 embedding 语义检索(本地模型或远端 API),在现有关键词索引之外加一层向量召回。
已知限制
- 无语义检索:v1 只有关键词匹配,同义词/近义表达搜不到(v2 计划)。
- 以文本类文件为主:PDF/DOCX/XLSX/PPTX 等二进制办公文档不在索引范围内;如需检索这类文件,建议先用 dsh-daily-documents 提取为文本/Markdown 后再索引。
- 二进制探测是启发式:按前 8KB 是否含 NUL 字节判断,极少数无 NUL 的二进制文件可能被当文本索引(会产生乱码块,不影响其他文件)。
- 整个文件夹索引加载进内存检索:适合 GB 级以下文本资料;超大语料建议分文件夹索引并用
path参数限定搜索范围。
手动验证
本仓库的 CI 只覆盖类型检查与纯函数/集成单测(node:test + 临时目录)。接入真实 dsh 后请手动验证:
- 在 dsh 配置中启用本插件,确认启动日志出现
local-memory: loaded(索引目录 …)。 - 调用
memory_index索引一个包含 Markdown/代码的测试文件夹,确认返回新增文件数与块数。 - 调用
memory_search搜一个文件中出现过的关键词,确认命中带路径:行号与上下文片段;再调用memory_get_source按命中路径与行号取原文,确认内容一致。 - 修改/删除/新增一个文件后重新
memory_index,确认返回的 changed/removed/added 计数正确,且删除文件的内容不再被搜到。 - 在测试文件夹中放入
.git/、含 NUL 字节的假.txt、超过maxFileBytes的大文件,重新索引确认它们都被跳过。 - 调用
memory_remove,确认memory_status中该文件夹消失且原始文件完好。
许可
MIT