MusePi

文件系统扫描缓存架构契约

English 中文

本文档定义了共享文件系统扫描缓存的当前契约:Rust 实现位于 crates/pi-natives/src/fs_cache.rs,由暴露给 packages/coding-agent 的原生 discovery/search API 消费。

本文档定义了共享文件系统扫描缓存的当前契约:Rust 实现位于 crates/pi-natives/src/fs_cache.rs,由暴露给 packages/coding-agent 的原生 discovery/search API 消费。

此缓存是什么

缓存按扫描范围、遍历策略和请求的元数据详细程度存储完整的目录扫描条目列表(GlobMatch[])。更上层的操作(glob 过滤、fuzzyFind 评分,以及缓存的 grep 候选选择)都基于这些缓存条目执行。

主要目标:

所有权与公开表面

缓存键分区(硬契约)

每个条目按以下维度键控:

含义:

消费者必须对 hidden/gitignore/node_modules/detail 行为传入稳定语义;更改任何键控标志都会创建不同的缓存分区。

扫描集合行为

缓存填充使用 ignore::WalkBuilder,按 include_hiddenuse_gitignoreskip_node_modulesfollow_links 配置:

缓存扫描的搜索根由 fs_cache::resolve_search_path 解析:

新鲜度与淘汰策略

全局策略(可被环境覆盖):

行为:

空结果快速重检(与常规命中分开)

常规缓存命中:

空结果快速重检:

当前消费者:

消费者默认值与缓存使用

glob/fuzzyFind/grep 的缓存是可选的(cache?: boolean,默认 false)。astGrep/astEdit 文件发现始终使用缓存(无可选标志)。

原生 API 中的当前默认值:

当前调用方:

失效契约

原生失效入口点:

路径处理细节:

Coding-agent 变更流责任

Coding-agent 代码必须在成功的文件系统变更后失效。

中央辅助:

当前的变更调用点包括:

规则:如果某个流变更文件系统内容或位置且绕过这些辅助,预计会出现缓存陈旧性 bug。

安全添加新缓存消费者

在为新扫描器/搜索路径引入缓存使用时:

  1. 使用稳定的扫描策略输入
    • 首先确定 hidden/gitignore/node_modules/detail 语义
    • 一致地将它们传入 get_or_scan/force_rescan,使缓存分区是有意的
  2. 将缓存数据视为仅按遍历策略预过滤
    • 检索后应用工具特定的过滤(glob 模式、类型过滤、评分)
    • 不要假设缓存条目已反映你的上层过滤器
  3. 仅为陈旧否定风险实现空结果快速重检
    • 使用 scan.cache_age_ms >= empty_recheck_ms()
    • 使用 force_rescan(..., store=true, ...) 重试一次
    • 将此路径与常规缓存命中逻辑分开
  4. 显式尊重无缓存模式
    • 当调用方禁用缓存时,调用 force_rescan(..., store=false, ...) 或使用非缓存流式遍历器
    • 不要在无缓存请求路径中填充共享缓存
  5. 为任何新写入路径连接变更失效
    • 在成功的 write/edit/delete/rename 后,调用 coding-agent 失效辅助
    • 对于 rename/move,失效新旧两个路径
  6. 不要添加每次调用的 TTL 旋钮
    • 当前契约仅为全局策略(环境配置),没有每请求 TTL 覆盖

已知边界