feat(bsk): add secure, session-scoped file upload and download | 支持安全、会话级的文件上传与下载 - #123
Draft
Ljy-0827 wants to merge 7 commits into
Draft
feat(bsk): add secure, session-scoped file upload and download | 支持安全、会话级的文件上传与下载#123Ljy-0827 wants to merge 7 commits into
Ljy-0827 wants to merge 7 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
现存问题
BrowserSkill 缺少可靠的原生文件传输能力:
解决方案
本 PR 新增会话级
upload和download命令,并明确划分策略与机制边界:上传
上传文件由 CLI 读取,通过本地 daemon 的私有暂存区传递给扩展。扩展不会获得用户原始绝对路径,只能使用 daemon 为当前会话解析出的受限暂存路径。
扩展只解析一次指定网页目标,并使用同一目标完成事务准备和点击,避免页面变化导致目标或 frame 不一致。
点击前,扩展会建立一次性上传事务并拦截原生文件选择窗口。文件输入既可以通过精确的浏览器 chooser 事件定位,也可以通过绑定到目标所属 document 的独立 DOM probe 定位,因此不再依赖单一事件是否送达。确认唯一文件输入后,通过浏览器能力设置暂存文件。
事务结束后会撤销 chooser interception、DOM 监听和临时对象。若浏览器不支持所需能力,或网页使用无法自动处理的非 input picker,系统会在可确定的阶段立即返回结构化错误,并引导 Agent 降级到
request-help。暂存目录按传输随机隔离,仅保留经过校验的原始 basename。上传进入浏览器事务后,暂存生命周期归当前 session 管理,并保留到会话结束,以支持稍后才读取附件的表单。
下载
下载操作绑定到调用方指定的网页目标,并将浏览器下载意图与
chrome.downloads候选进行唯一关联。两类事件可以按任意顺序到达;只有标签页、frame、URL 和文件名均匹配的唯一候选才会被认领。BrowserSkill 不会枚举、认领或取消无关下载。出现多个匹配候选时会安全失败,而不是选择其中一个继续执行。
浏览器将文件下载到 daemon 为本次操作签发的相对目录 capability。daemon 随后验证实际路径、符号链接、文件类型和大小,确认文件没有逃逸传输边界后,再导入私有暂存并交由 CLI 写入调用方指定的目标路径。
下载默认不会覆盖已有文件。启用
--overwrite时也通过原子替换提交,不会先删除原文件。已认领下载在失败或取消时会进行补偿清理;无法确认清理结果时会明确返回未知状态。结果状态与取消
文件传输错误包含:
effect_state:区分未产生效果、已经提交和结果未知。phase:标识失败发生在准备、触发、归属、提交或清理阶段。cleanup_state:标识补偿清理是否失败。传输超时后,daemon 会主动向扩展发送取消,并在有界时间内等待事务完成补偿,而不是立即遗弃仍在运行的浏览器操作。
已确认的成功不会被晚到的取消覆盖;结果未知时不会被错误转换成普通失败,从而避免 Agent 对可能已经生效的上传或下载进行盲目重试。
安全与生命周期
所有文件传输都绑定当前 session 和 Agent Window,使用不可猜测的传输标识,并受到文件数量和大小限制。
上传文件名必须是安全的单一路径组件,拒绝绝对路径和路径穿越。暂存目录及文件使用收紧的本地权限,用户原始绝对路径不会传递给扩展或作为传输结果返回。
daemon 只会清理由其签发并完成验证的浏览器文件 capability,不会根据网页返回的任意路径删除本地文件。
会话停止、浏览器断开或 daemon 重启时会清理其管理的遗留暂存,避免文件长期保留。
验证
已在 Chrome 151 完成端到端验证;其他 Chromium 版本通过能力检测处理,不满足所需浏览器能力时返回结构化错误并引导降级。其他 Chromium 版本通过能力检测处理;缺少所需浏览器能力时,会在点击前或可确定阶段返回结构化错误并引导降级。