Components / Thinking & Reasoning

Thinking State

思考态流光标签:agent 作答前的处理中信号。优先级 P0,已移植(1:1 aicss.dev)。

① 活体演示

真实运行的组件(非截图)。四态与真实字段对齐:running(workbench.thinking 进行中)/ ok(思考结束,同 outcome:"ok" 枚举)/ errorrun.status:"failed"outcome:"error")/ empty(该 run 无 thinking 事件)。

Thinking

② 对比台

左:wb-ui 活体(running 态);右:aicss.dev 原站截图存档(2026-08-13 采集,整页截图可滚动,演示区在页面上部)。

wb-ui 活体
Thinking
aicss.dev 原站截图(design/reference/aicss/thinking-state/screenshot.png)
aicss.dev thinking-state 原站截图

③ 真实字段说明

字段真源:packages/contracts/workbench-events.mjs:11-77;消费方 reducer:apps/web/index.html:6782 applyRunnerEventDelta(事件包裹层为 evt.data = normalized 事件,下表「字段」即其属性,契约文档记作 payload.*)。本组件只读下列字段,不臆造。

事件 type字段驱动行为
workbench.thinkingpayload.text出现即进入 running(shimmer);文本累积供展开阅读(展开形态属 thinking-reasoning 组件,轮 2)
workbench.run.statuspayload.statusfailed / cancelled → error 态;completed → ok 态
workbench.run.failedpayload.messageerror 态的补充说明(本组件不展示正文,留给宿主)
workbench.assistant.completedpayload.text回答已产出 → 思考结束,进入 ok 态
(无 thinking 事件)empty 态:组件不渲染

脱敏样本(真实解析器 createClaudeNormalizer 输出,字段结构 100% 真实;文件:fixtures/thinking-state.ndjson,生成脚本 scripts/wb-ui-fixtures.mjs):

{"type":"workbench.run.progress","state":"starting","detail":"Claude Code 2.1.7","native_session_id":"<UUID>"}
{"type":"workbench.run.progress","state":"thinking","detail":"Thinking…"}
{"type":"workbench.thinking","text":"The user wants a native timeline. I should first inspect the docs, then edit the renderer. Secret check: WORKBENCH_OPERATOR_TOKEN=<redacted> must never leak."}
{"type":"workbench.run.progress","state":"rate_limited","detail":"Approaching weekly limit"}
{"type":"workbench.assistant.completed","text":"Done — scratch note written and edited."}
{"type":"workbench.assistant.completed","text":"Done — scratch note written and edited."}
{"type":"workbench.run.progress","state":"finalizing","detail":"Wrapping up"}

④ 用在 workbench 哪个位置

接入点:apps/web/index.html:7518 thinkingFoldInner(text)——对话时间线里 details.thinking-fold<summary> 当前是静态文字「思考中… N 字」。轮 3a 在 ?ui=next 灰度下把该 summary 换成本组件:思考进行中 shimmer(running),文本齐后转 ok 并保留展开阅读;run 失败转 error。渲染入口链路:timelineParts → patchTimeline → thinkingFoldHtml(:7524) → thinkingFoldInner(:7518)。只换渲染层 class 与文案,不动 applyRunnerEventDelta 状态语义(docs/86 要素 3.D.1)。

⑤ 复制即用代码

引入两个文件(tokens + 组件),可选行为层 JS。全部相对路径、零依赖。

<link rel="stylesheet" href="design/wb-ui/lib/tokens.css">
<link rel="stylesheet" href="design/wb-ui/lib/components/thinking-state.css">
<script src="design/wb-ui/lib/components/thinking-state.js"></script>
<!-- state: running | ok | error | empty -->
<span class="wbui-thinking-state" data-state="running">Thinking</span>
// 手动切态
WbUI.thinkingState.set(el, "ok");            // running | ok | error | empty
WbUI.thinkingState.set(el, "running", "思考中"); // 可选自定义文案

// 或按真实 workbench.* 事件流推导(NDJSON 逐行 parse 后传入)
WbUI.thinkingState.fromEvents(el, events);
Ported from aicss.dev/components/thinking-state, fetched 2026-08-13. Internal use only(上游无 license 声明,对外使用前须确认授权——docs/86 R1)。