WorkspaceFileSystem 的读写边界
区分 HTTP 文件访问、同机 ACP 工具例外与有限窗口读取。
This page has not been translated into English yet. The original Chinese version is shown below.
WorkspaceFileSystem 为 daemon HTTP 文件接口提供路径、信任、大小和写入策略。它不是整个 agent 的操作系统沙箱;同机 qwen serve 以同一主机、同一 UID 主体为前提。
哪些操作经过它
GET /file、/file/bytes、/list、/glob、/stat 和 POST /file/write、/file/edit 使用工作区边界,不享受 agent 外部路径例外。
生产同机 runtime 关闭 ACP 文本读委派,让 read_file 及 edit、Notebook、sed、artifact 预读走 child 的普通 CLI 文件服务。最终文本写入仍可委派:工作区目标走 WFS,严格内部工具标记可在 daemon 自建 adapter 中选择外部 host writer。
任意 ACP 请求、HTTP 和外部注入 bridge 不自动获得外部 writer 例外。Shell 命令、重定向与创建父目录等也是独立路径,不能声称都被 WFS 困在工作区内。
路径与信任
工作区路径先 canonicalize,再解析并拒绝逃逸。WFS 对目标 symlink 采取保守拒绝,不能沿用早期 inline proxy 写穿 symlink 的行为。
trust gate 只控制写:read/list/stat/glob 不因 trusted:false 本身被拒绝,但仍受路径、内容和系统权限约束。信任值由 factory 注入;runQwenServe 默认 true,直接 createServeApp 默认 false 并警告。
有界文本读取
| 路径 | 上限与返回语义 |
|---|---|
| 完整文本 snapshot | 最多 256 KiB,可提供完整字节 hash |
| 大文本显式 line/limit/maxBytes 窗口 | 最多返回 256 KiB,查找行位置最多扫描 8 MiB |
| byte cursor 续读 | 以不透明游标直接定位,避免重新从头扫描 |
| 普通文本写入 | 最多 5 MiB |
| 二进制上传 | 最多 50 MiB,永不覆盖并为重名自动编号 |
不带窗口参数的大文本读取拒绝为 file_too_large,防止调用者误以为获得全文件后回写截断内容。超过扫描预算的高行号读取也会拒绝,应改用相应字节窗口能力。
游标关联 dev、ino 和文件大小。流式窗口容忍追加,但截断或替换返回 hash_mismatch;sizeBytes 代表打开时的大小。大文件局部窗口没有完整 hash,未读到 EOF 时也不提供 originalLineCount。
非 UTF-8 snapshot 的解码文本与原字节位置不一一对应,因此即使 hasMore 也可能没有 nextCursor;不能根据字符数量自行构造游标。
Ignore 与内容检测
readText 不因 ignore 匹配拒绝读取,而是在 meta.matchedIgnore 中记录分类;list/glob 默认过滤 ignore,includeIgnored 可改变列举行为。
文本路由会拒绝二进制或不可处理的编码;内容检测取最多 4096 字节样本。文件还必须是 regular file,不能因为 pipe、device 或 procfs size 为 0 就无界读取。
写入与并发
写入在规范路径锁内完成临时文件与 rename,避免中途终止留下被截断的目标文件。create 遇到已有文件拒绝,overwrite 可替换;内部 expectedSha256 用于乐观并发校验。HTTP 请求字段仍应遵循文件 API的 expectedHash 契约,不能混用内部字段名。
已有文件保留 mode,新文件默认 0600;QWEN_SERVE_NEW_FILE_MODE=system 可改为按进程 umask 的文本新文件策略。二进制上传的权限与不覆盖规则独立,见具体 API。
路径锁只覆盖本次操作,不能替代跨请求 expected hash,也不是所有外部程序共享的文件锁。