React 外壳 + Pixi 场景 + xterm 终端 + Monaco/CodeMirror 编辑器
App.tsx 组织主界面与 provider service hooks;OfficeFloor 用 Pixi 场景对象渲染 avatar、座位、信封与工具气泡;terminalPool 将 xterm 实例与 React 视图解耦。
优先使用 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/自动协调,而不是等待人类。
Composer 不直接写 PTY;它先进入可恢复队列
用户可在 Agent 忙碌时继续发消息。Zustand messageQueues 持久化队列;useHive 在 idle、PTY quiet、无 draft、无 picker、未暂停、boot grace 结束后才提交,并要求文本与 Enter 两次 write 都成功才删除队列项。
Prompt 与终端输出往返
src/renderer/src/components/MessageQueueComposer.tsxL30-L180queueItenqueueMessageComposer 产生人类可读 queue item,并记录 composer telemetry。
src/renderer/src/hooks/useHive.tsL778-L888dispatchdeliverWithAcknowledgementsubmitToPty投递具有状态、静默时间、控制面、prompt ownership 与重试门槛。
src/renderer/src/components/terminalPool.tsL332-L396term.onDatalineBufinputDirtyxterm keystroke 同步写 PTY,并维护 user-owned prompt buffer。
状态进入 UI 前要标明:快照、事件、乐观值还是派生值
同一组件可能同时显示 Main snapshot、hook event 和本地交互。若没有来源标签与 reconciliation,旧 event 或乐观值会覆盖更权威的新事实。
UI 像仪表盘:读数来自传感器,按钮发出意图,但仪表盘不应偷偷改写发动机事实。