Components / Text Outputs

Streaming Text

流式文本:逐 token 输出 + 光标(流式中实心、结束后闪烁)。优先级 P0,已移植(1:1 aicss.dev)。

① 活体演示

打字机演示(上游节奏:9ms/拍、每拍 +2 字符,循环)。四态:running(assistant.delta 累积中,光标实心)/ ok(assistant.completed,光标转闪烁) / error(run 失败中断,尾注提示)/ empty(无文本输出)。

② 对比台

左:wb-ui 活体(打字机循环);右:aicss.dev 原站截图存档(2026-08-13 采集,可滚动)。

wb-ui 活体

aicss.dev 原站截图(design/reference/aicss/streaming-text/screenshot.png)
aicss.dev streaming-text 原站截图

③ 真实字段说明

字段真源:packages/contracts/workbench-events.mjs:36-77;reducer apps/web/index.html:6782(delta 累积进 state.streamedText,completed 为终稿)。演示文案为样文(fixtures 数据不同属预期偏离,契约 7.2)。

事件 type字段驱动行为
workbench.assistant.deltapayload.text增量追加(append()),running 态光标实心
workbench.assistant.completedpayload.text终稿(complete()),ok 态光标转闪烁
workbench.run.statuspayload.statusfailed/cancelled → error 态(尾注 Generation interrupted)
(无 delta/completed 文本)empty 态:组件不渲染

脱敏样本(真实解析器输出;文件:fixtures/thinking-state.ndjson 内含 assistant.completed):

{"type":"workbench.assistant.completed","text":"Done — scratch note written and edited."}

④ 用在 workbench 哪个位置

接入点:apps/web/index.html:8033 buildSkeleton(body).stream-answer.md-body 节点 + renderAssistantAnswer(:4857)——流式阶段的正文与光标换用本组件样式;markdown 终稿渲染保持现状管线(契约 3.D.3:流式文本接 assistant.delta/completed payload.text)。渲染链路:handleStreamFrame(:7053) → applyRunnerEventDelta(:6782) → patchTimeline / renderAssistantAnswer。只换渲染层 class,不动 reducer 与 R9 金标。

⑤ 复制即用代码

引入 tokens + 组件 CSS/JS。全部相对路径、零依赖。

<link rel="stylesheet" href="design/wb-ui/lib/tokens.css">
<link rel="stylesheet" href="design/wb-ui/lib/components/streaming-text.css">
<script src="design/wb-ui/lib/components/streaming-text.js"></script>
// 真实接入:delta 累积 → 终稿
var h = WbUI.streamingText.render(el);
h.append(delta.text);       // 每条 workbench.assistant.delta
h.complete(completed.text); // workbench.assistant.completed(光标转闪烁)
h.set("error");             // run failed/cancelled

// 演示打字机(上游 9ms/+2 字符节奏,循环)
WbUI.streamingText.render(el).demoType("…");
Ported from aicss.dev/components/streaming-text, fetched 2026-08-13. Internal use only(上游无 license 声明,对外使用前须确认授权——docs/86 R1)。