Daemon 文件与附件边界
区分 HTTP 工作区读写、agent 主机访问、乐观锁和附件迁移。
HTTP 文件 API 和模型内置文件工具不具有相同边界。HTTP 路由保持工作区约束;agent 的文本读取遵循 CLI 权限,获准后可能读到注册工作区之外的主机文件。
HTTP 文件接口
| 接口 | 用途 |
|---|---|
| GET /file | 读取文本;完整快照返回原始字节 sha256 哈希 |
| GET /file/bytes | 有界字节窗口,以 base64 返回 |
| POST /file/write | 创建或替换文本 |
| POST /file/edit | 一次精确文本替换 |
替换和编辑需使用最近完整快照的 expectedHash。超过 256 KiB 的大文本按有限行窗口读取时没有完整 hash,不能用局部内容充当全文件并发令牌;完整窗口的 /file/bytes 也可提供相应 hash。
create 不覆盖旧文件;显式写忽略路径可以允许,但记录审计。这组文本 API 不负责二进制写入、删除、移动、mkdir 或递归创建父目录。strict mutation 路由在可信 loopback 默认有 operator 权限,其他模式按 operator 凭据门禁处理。
agent 读取和最终写入
模型直接 read_file 以及编辑、Notebook、sed 等预读走 child 本地 CLI 权限。外部路径通常要求确认,但 allow rules 和审批模式可能自动允许;不能把 HTTP 文件服务的扫描上限、符号链接拒绝和审计假设套到这些读取。
确认 diff 可能在用户批准前就发给全部附着 SSE 客户端,因此共同 bearer 的客户端应被视为同一安全主体。
write_file、edit、notebook_edit 和 Shell 模拟 sed 在通过原权限流程后,可携带内部来源信息经 daemon 最终写入主机外部绝对路径,而不再次确认。外部 host writer 有 5 MiB 编码限制、叶符号链接拒绝、规范路径锁、原子 rename、mode 保留、generation guard 与审计。
普通 HTTP、任意 ACP 写、外部注入桥接和 Shell 重定向没有这项文本工具例外。该设计也不让 Shell 成为受工作区严格隔离的进程;实际隔离仍需系统层保障。
新文件权限
文本 writer 新建文件默认 0600,不受 daemon umask 放宽影响;已有文件保留权限,包括可执行位。需要按系统 umask 创建新文件时,在启动环境配置 QWEN_SERVE_NEW_FILE_MODE=system,新文件使用 0666 & ~umask。
owner 是默认值,0600 是它的唯一八进制别名,值大小写不敏感;其他值告警并保留 0600。作用于工作区文本、同机外部 writer 和 HTTP 文本写入;POST /file/upload 的二进制新文件始终 0600。改变后重启 daemon。
会话附件存储
Web Shell 通过 POST /session/:id/attachments 上传文件和图片。默认放在运行时临时目录下,按 projectHash 与 session-
设置新根后只向新位置写,读取和删除找不到时回退默认目录;旧目录不可写导致无法删除时会报错,不假装成功。反过来删除环境配置会让已写入自定义根的附件不可达,因此同工作区应保持配置稳定。
删除会话会清理两个根中的附件目录,归档则保留。环境在启动时读取,修改后需重启。主章旧的 text-only 限制不能覆盖这条已具体描述的附件存储接口;prompt 仍受默认 10 MB JSON body 上限约束,也没有流式大附件上传保证。
内部窗口、游标与 adapter 责任见WorkspaceFileSystem和错误类型。