MUNDERDIFFLIN / LEARN
CHAPTER 18
07 · VISUALIZATION10 分钟阅读进阶

Office 世界如何映射真实运行状态

React 组织 UI,Zustand 聚合前端状态,Pixi 绘制 office world,xterm 显示真实 PTY。Renderer 能观察和请求,但不能直接创建进程或访问文件系统。

本课核心问题UI 显示的‘状态’来自终端猜测,还是结构化事实?
学完你能
  • 追踪 hook/IPC 事实进入 Zustand 与组件的路径。
  • 识别乐观 UI、持久 cache 与主进程事实。
01
界面栈

React 外壳 + Pixi 场景 + xterm 终端 + Monaco/CodeMirror 编辑器

App.tsx 组织主界面与 provider service hooks;OfficeFloor 用 Pixi 场景对象渲染 avatar、座位、信封与工具气泡;terminalPool 将 xterm 实例与 React 视图解耦。

02
状态映射

优先使用 hooks,终端解析作为可见输出补充

HookServer 把 lifecycle event 推成 hive:hookEvent;useHive 更新 agent state、context、breaker 与队列。usePtyParser 同时解析 xterm 文本中的 tool 行、spinner 与 approval 提示,驱动 station/carrying/blocked/waiting。

  • 01working:真实 hook/tool event 或 TUI 的 tool/spinner 信号。
  • 02idle:Stop/agent_end 或 4 秒无新工具输出的 drift。
  • 03blocked:只有 god 真正等待人类输入时使用。
  • 04waiting:worker 停在 prompt,等待 god/自动协调,而不是等待人类。
03
用户操作到真实进程

Composer 不直接写 PTY;它先进入可恢复队列

用户可在 Agent 忙碌时继续发消息。Zustand messageQueues 持久化队列;useHive 在 idle、PTY quiet、无 draft、无 picker、未暂停、boot grace 结束后才提交,并要求文本与 Enter 两次 write 都成功才删除队列项。

交互图解

Prompt 与终端输出往返

消息队列prompt 等待
安全投递门idle · quiet · no picker
pty:write × 2文本 → 140ms → Enter
CLI Agent模型 / tool loop
pty:data:idowner window
xterm + parser显示 + 状态
输入需要等待安全窗口;输出按 PTY owner 回送,并同时进入 xterm 与状态解析。
04
投影闭环

状态进入 UI 前要标明:快照、事件、乐观值还是派生值

同一组件可能同时显示 Main snapshot、hook event 和本地交互。若没有来源标签与 reconciliation,旧 event 或乐观值会覆盖更权威的新事实。

UI 像仪表盘:读数来自传感器,按钮发出意图,但仪表盘不应偷偷改写发动机事实。

LESSON CHECKPOINT

能用自己的话回答核心问题了吗?

Renderer 应投影事实并管理交互,不应悄悄成为业务权威。