Blade Agent v0.5.23 测试报告

测试范围:v0.5.22 → v0.5.23 变更 | 测试日期:2026-06-25 | 测试环境:macOS 本地 Docker (render-only 渲染 + 手动启动)

BUG

BUG-1: MEDIA 文件卡片下载/预览按钮始终 disabled

关联 PR: #979 feat(chat): 支持 MEDIA 文件卡片渲染与下载

现象:

当 LLM 输出 MEDIA:/root/智能助手工作空间/{sessionId}/sine_wave.wav 时,FileCardComponent 正确渲染(显示文件图标 + "点击预览文件"),但"打开文件"和"下载文件"按钮均为 disabled 状态(opacity 0.6, cursor: not-allowed)。

根因:

collapseMediaTags() 正确将 MEDIA 行转换为 <blade-file-card data-rel-path="sine_wave.wav" data-name="sine_wave.wav">,正则和路径提取逻辑均无问题。

streamdown 没有将 data-rel-pathdata-name HTML 属性传递给 React 组件。通过 React fiber 检查确认:组件收到的 props 只有 node,而 node.properties 是空对象 {}

尽管 allowedTags 已配置 [FILE_CARD_TAG]: ["data-rel-path", "data-name"],streamdown 仍未将这些属性注入 node.properties。

影响:

所有 MEDIA 文件卡片的"打开文件"和"下载文件"功能完全不可用。用户无法预览或下载 agent 生成的媒体文件。

相关代码:
复现步骤:
  1. 在 Blade Agent 中发消息:「用 Python 生成一个 WAV 音频文件」
  2. 等待 agent 执行完毕,assistant 回复中包含 MEDIA 标记
  3. 观察底部的文件卡片 —— "点击预览文件"和下载图标均为灰色不可点击

通过的测试项

PASSfeat(tokenizer): 支持 DeepSeek V4 精确 token 计数 (#981)

配置 MODEL_ID=deepseek/deepseek-v4-flash 后,启动日志显示 tokenizer warmup finished: model_dir=deepseek-v4,tokenizer 正确识别并加载。

PASSfeat(chat): MEDIA 文件卡片渲染 (#979)(渲染部分)

MEDIA 文件卡片 UI 渲染正确:显示文件图标、"点击预览文件"文本、下载按钮。文件详情表格(文件名、大小、时长、频率等)正常展示。仅下载/预览功能不可用(见 BUG-1)。

PASSrefactor(sandbox): 沙盒端口机制重构 (#982)

软件工厂页面显示 3 个在线项目(多轴打击态势推演 :25003、住宿登记系统 :25002、民宿用户登记系统 :25001),端口分配正常。沙盒容器创建成功:日志显示 sandbox preflight passed: image=blade-sandbox:v0.0.19

PASS保留用户消息换行格式 (#962, 来自更早版本但仍需回归)

输入三行文本(Shift+Enter 换行),发送后消息气泡中换行正确保留。

未测试 / 受限的项目

SKIPfix(socketio): WebSocket 重连后恢复 running 状态 (#985)

需要在长时间运行的任务中模拟 WebSocket 断连,浏览器自动化难以可靠触发此场景。建议手动测试。

SKIPfix(api): AskUserQuestion 工具补充 multiSelect 字段 (#984)

需要 LLM 主动调用 AskUserQuestion 工具并使用 multiSelect 参数,通过自动化测试难以可靠触发。建议手动测试或通过 headless API 构造。

SKIPfeat(sandbox): 端口池耗尽智能回收 + 端口变更通知 (#986)

需要大量沙盒同时运行以耗尽端口池,测试成本高。用户已确认可跳过。

SKIPfix: 删除持久会话时保留端口池行避免端口冲突

需要创建持久会话、分配端口、删除后再创建新会话验证端口不冲突。受限于测试环境,建议手动验证。

测试环境