文件错误、审计与 ACP 传递
按 errorKind 区分路径、权限、并发、内容和系统 I/O 故障。
WFS 的 FsError 把文件访问失败规范成类型与 HTTP 状态。客户端应按类型选择恢复动作,而不是用英文 message 文案匹配业务逻辑。
错误类别
| errorKind | HTTP | 判断方向 |
|---|---|---|
| path_outside_workspace / symlink_escape | 400 | 路径越界或目标 symlink |
| path_not_found | 404 | 文件不存在 |
| binary_file | 422 | 文本路由不能处理该内容或编码 |
| file_too_large | 413 | 完整读取、扫描窗口或写入超过边界 |
| hash_mismatch | 409 | 并发校验失败,或稳定读期间发生不允许的变化 |
| file_already_exists | 409 | create 不覆盖已有文件 |
| text_not_found / ambiguous_text_match | 422 | 精确编辑没有命中或多处命中 |
| untrusted_workspace | 403 | 未受信工作区写入 |
| permission_denied | 403 | OS EACCES/EPERM |
| io_error | 503 | ENOSPC、EIO、EBUSY、EMFILE 等系统 I/O 问题 |
| internal_error | 500 | 非 errno 的内部程序异常 |
| parse_error | 400 或 422 | 请求解析或服务内部约束失败 |
磁盘满属于 io_error,不能与 permission_denied 合并成“权限不足”。hash_mismatch 后应重新读取和核对修改,不能直接换成无条件覆盖。
ACP 保留结构化信息
ACP 默认错误序列化可能只留下 message 和 -32603。BridgeClient 因此识别 Error.name 为 FsError 且具有字符串 kind 的错误,再包装成 RequestError。
JSON-RPC code 仍为 -32603,但 data 中保留 errorKind 及可选 hint、status。消费者应读取 data.errorKind,而不是看到 -32603 就把所有失败视为未知服务崩溃。
该识别使用结构检查,避免 acp-bridge 反向依赖 CLI 中的 FsError class。不是所有错误都因此被转换;普通非 FsError 原样继续传播。
Adapter 的责任
一旦注入 BridgeFileSystem,原 inline 文件代理路径就被绕过。自定义 adapter 仍需拒绝非 regular file,并保持有界读取;只调用 fs.readFile 全量读取后截出十行,不能满足大文件有限成本要求。
默认 inline fallback 的缓冲上限为 100 MiB;生产 WFS 的完整 snapshot 上限更小,为 256 KiB,大文件需要流式窗口。两种实现不能宣称具有同一边界。
审计记录
成功和拒绝分别产生 fs.access、fs.denied,携带请求 context、path、intent、outcome,以及可选 errorKind、bytesRead/bytesWritten、sha256。
记录进入与审批共用的 512-entry PermissionAuditRing。它是有限 FIFO,不能作为永久审计归档;外部监控 sink 在该章节中仍属后续方向,不应被描述为自动已接入。