Transcript 渲染与工具预览
按语义类型展示工具、子智能体、取消结果和前向兼容诊断。
共享 transcript 定义内容含义,具体布局由宿主决定。优先使用类型、selector 和 render helper,避免每个客户端各自猜测工具名称或解析错误文案。
渲染输出
| helper | 适用输出 |
|---|---|
| daemonBlockToMarkdown | Markdown 内容,可配置 sanitizeUrls、maxFieldLength、locale |
| daemonBlockToHtml | 保守 HTML 输出,进行转义,不提供完整 Markdown 解析 |
| daemonBlockToPlainText | 复制、日志或纯文本展示 |
| daemonToolPreviewToMarkdown | 未自定义工具卡片时的预览回退 |
若通过 Markdown 解析器生成富 HTML,官方示例使用先解析再净化的两步流程。内置 HTML helper 的转义与完整 Markdown 渲染是不同路径,不应混淆。
工具预览类型
| 类别 | preview.kind |
|---|---|
| 文件和外部内容 | file_diff、file_read、web_fetch、mcp_invocation |
| 结构化内容 | code_block、search、tabular、image_generation、subagent_delegation |
| 交互控制 | ask_user_question、command |
| 通用回退 | key_value、generic |
tabular 预览最多保留 50 行并标记裁剪。宿主可以对文件差异、图像或表格提供专用组件,其余类型回退 Markdown,不需要为了接入而实现全部卡片。
工具图标优先依据 provenance:builtin、mcp、subagent、unknown;MCP 还可带 serverId。SDK 对 mcp__
取消与子智能体
assistant.done.reason 为 cancelled 时,reducer 会将所有进行中的工具块转为 cancelled,避免 daemon 未逐一发出工具终态时界面持续转圈。这个传播包括子智能体工具,不只处理当前指针指向的一项。
子工具携带 parentToolCallId、subagentType;父块已存在时还解析 parentBlockId,父块后到时可补齐。父块被 maxBlocks 裁剪后,仍保留 parentToolCallId,但不会保留无法解析的父块引用。
selectSubagentChildBlocks(state, parentToolCallId) 只返回直接子项。树形视图需要递归,并在沿父引用遍历时防止异常循环;平铺界面可以继续忽略这些新增字段。
错误与未知事件
errorKind 可区分 missing_binary、blocked_egress、auth_env_error、init_timeout、restore_timeout、protocol_error、missing_file、parse_error、budget_exhausted。只有 daemon 提供可识别类型时才有该值;未知值回退普通错误显示,不通过英文文本正则伪造分类。
归一化后的 debugReason 区分 unrecognized_event、unrecognized_session_update 与 malformed_payload。前两者进入有界 unrecognizedDiagnostics 旁路,使用 selectUnrecognizedDiagnostics 读取,不占 blocks 或 maxBlocks,也不结束正在流式累积的消息。
malformed_payload 属于已知事件结构损坏,仍可形成 transcript 状态块。普通 status 和宿主主动发出的 debug 没有同样的 reason;不要为了隐藏未知事件噪声而把它们一起删除。
未知 preview 回退 generic,未知工具状态保留已有当前指针,缺少服务器时间回退客户端时间。这些兼容行为使新旧客户端可以渐进升级,不代表缺失能力已经在 daemon 端实现。