Skip to content

feat(files): 支持机器人单聊收文件及原会话回传文件和图片 - #26

Merged
haofeng0705 merged 2 commits into
mainfrom
codex/fix-18-file-transfer
Oct 9, 2026
Merged

haofeng0705 merged 2 commits into
mainfrom
codex/fix-18-file-transfer

Conversation

@haofeng0705

@haofeng0705 haofeng0705 commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

用户影响

机器人单聊收到文件时,过去会提示不支持;现在会下载到当前会话工作区,并将文件名称、大小和可读取的本地路径交给模型。模型可以通过会话专属 send_file / send_image 工具,将生成或修改的文件、图片回传原单聊或群聊。

Fixes #18

实现

  • Stream 支持对象和 JSON 字符串形式的 file 消息,保留去重和授权检查;只接受平台支持的机器人单聊文件。授权通过后才下载,缺失下载码不会伪造附件。
  • 使用 robot/messageFiles/download 获取临时链接,下载不携带应用 Token 或额外 Content-Type;按响应头和实际流限制 20 MB,下载码、签名链接和原始接口错误不进入新增日志。
  • 在 /cd 选定的会话工作区下按账号、会话和随机接收目录隔离附件。规范化文件名、拒绝 inbox 符号链接、独占创建文件,保留同名附件而不覆盖。
  • 发送工具通过当前 Agent 绑定账号、目标会话和 cwd,模型只传路径。兼容工作区所选路径与规范路径别名,拒绝跨 Agent、工作区外路径、越界符号链接、非普通文件、超限和不支持格式;卸载取消并排空回传。
  • 文件上传后使用 sampleFile;图片使用官方 sampleImageMsg 的 photoURL 参数。单聊走 robot/oToMessages/batchSend,群聊走 robot/groupMessages/send,不引入工作通知或 AgentId。
  • 返回 accepted 和 processQueryKey 表示接口接受请求,不宣称客户端送达;业务错误或超时不自动重发。凭据请求也接受取消信号。
  • 文件不会被问答/审批处理器当成空白答案吞掉;排队选择“并入”时保留文件任务,可用 /stop 打断前一任务。
  • 补充 README 使用边界、Unreleased 变更和真实 DSH 工具注册 smoke;数字员工文件通道不在本次范围。

验证

基线:ada4d0ffcf6b7b94ce86805af59522de1f5d8c33。最终提交:7ae8216b43ec7c7939499ab30d4ee91707e486ab。本地 macOS,Node 26.4.0 / pnpm 11.7.0。

检查 结果
干净 main + 新文件消息/回传入口回归 FAIL(预期):6/6;单聊文件未进入连接器,Outbound 缺少媒体发送能力
corepack pnpm install --frozen-lockfile PASS
最终 TMPDIR=<受控短路径> corepack pnpm run ci PASS:318/318,0 失败、0 跳过;敏感信息扫描、Prettier、类型检查、构建和 NPM tarball 校验全部通过
公共 Stream / apply / Agent 工具行为 PASS:对象与 JSON 文件消息、去重、未授权不下载、/cd 后落盘、模型引用、原会话回传、失败提示、排队与问答保护
文件与传输边界 PASS:20 MB 响应头/实际流限流、账号/会话隔离、中文/危险文件名、同名不覆盖、越界/符号链接、官方模板与原目标、接口业务错误、未知结果不重试和取消排空
DSH_SMOKE_NODE_MODULES=<隔离安装树>/node_modules node scripts/smoke-agent-setup.mjs PASS:真实 DSH 0.2.0-rc.2,创建、恢复、已加载补装、重复安装、setup 回滚重试;包含新增文件工具
DSH_SMOKE_NODE_MODULES=<隔离安装树>/node_modules node scripts/smoke-workspace.mjs PASS:真实 DSH 工作区归属检查
git diff --check PASS
GitHub CI PASS:最终提交 7ae8216b43ec7c7939499ab30d4ee91707e486ab 的 CI #37903828237 全部 8 项成功,含 Linux/macOS/Windows 完整套件及 3 个 DSH 安装/宿主检查
真实钉钉文件下载、媒体上传、客户端送达与模型文档处理端到端 NOT RUN;自动化使用合成文件和 mock 网络,宿主 smoke 不启动 Channel、不调用模型

本地首次完整套件使用工作区内较长的 TMPDIR,出现 29 项失败。相同环境下干净 main 为 274/303、同样 29 项失败,失败集合完全一致:包括 Unix socket 路径过长和临时 CLI fixture 继承 type: module。改用预先创建的受控短路径、显式 CommonJS fixture 根目录后,首次为 314/315,既有“多个 waiter 回收死进程锁”用例失败;未修改该文件锁实现或用例,后续完整套件 315/315 通过。补齐取消/问答保护后最终套件 318/318 通过。早期失败保留,不计作通过。

首轮 GitHub CI 的 macOS 套件为 316/318:两个新增断言未对 /var 与 /private/var 做规范路径比较,附件实际已正确落盘。已修正断言,同时让发送工具接受当前工作区的所选绝对路径及规范路径,并增加目录别名/junction 回归;最终提交本地完整套件 318/318 和真实宿主 smoke 均通过。首轮云端失败记录保留,最终云端结果以上表为准。

平台限制与风险

  • 收文件仅支持人与机器人的单聊;官方当前不支持群内 @ 机器人接收文件、语音、视频。语音/视频原样落盘或转写属于后续能力。
  • 回传文件按官方模板限制为 xlsx/pdf/zip/rar/doc/docx;图片为 jpg/jpeg/png/gif/bmp,均不超过 20 MB;需要企业内机器人发送消息权限及目标会话可用性。
  • 模型仍需宿主的合适文件解析工具;文件下载成功不等于模型原生理解 PDF/Office。附件保留在本地,不自动执行、解压或清理。
  • 主要风险在应用权限、平台模板实际可用性和跨平台文件系统行为;GitHub CI 会继续核验 Linux/macOS/Windows。合并前仍建议完成一次真实单聊“收文件 → 处理 → 回传”以及群内回传验收。
  • 回滚:回退本 PR 即恢复原文本/图片接收行为;无配置迁移、无 SDK 拆包、无发版流程变更。已接收文件保留,可按需要手动清理。

官方依据:接收文件下载、机器人消息类型、上传媒体文件。

@haofeng0705
haofeng0705 merged commit 5ddf0ff into main Oct 9, 2026
8 checks passed
@haofeng0705
haofeng0705 deleted the codex/fix-18-file-transfer branch October 9, 2026 08:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: 支持文件的收发(file 消息类型 + 回发文件)

1 participant