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 采集,可滚动)。

③ 真实字段说明
字段真源:packages/contracts/workbench-events.mjs:36-77;reducer apps/web/index.html:6782(delta 累积进 state.streamedText,completed 为终稿)。演示文案为样文(fixtures 数据不同属预期偏离,契约 7.2)。
| 事件 type | 字段 | 驱动行为 |
|---|---|---|
workbench.assistant.delta | payload.text | 增量追加(append()),running 态光标实心 |
workbench.assistant.completed | payload.text | 终稿(complete()),ok 态光标转闪烁 |
workbench.run.status | payload.status | failed/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("…");