Sequence Diagram

TUI 交互时序(含排队输入)

用户 → Update → 运行中提交入队 queuedMessage → 首轮 agent.Run 返回 → drain → 自动发起下一轮

序列图 (Sequence Diagram) — 行为性图形·交互图。聚焦「运行中排队输入」在两次 agent.Run 之间的编排。

用户 Model.Update Bubble Tea queuedMessage 单槽 string runAgent tea.Cmd 协程 agent.Run turn loop Enter → prompt#1 handleSubmit [!pending] → beginRun runAgent(runID#1) tea.Cmd agent.Run(prompt#1) par [运行中 · pending=true] Enter → prompt#2(运行中) queueMessage → 存 + 清输入框 单槽:再排一条覆盖前一条 · 上方显示 [queued] 预览 回调经 program.Send 刷新 UI Result#1 agentResponseMsg(pending=false) launchQueuedMessageIfReady 取出 prompt#2 并清空(无模态时) runAgent(runID#2) tea.Cmd agent.Run(prompt#2) Result#2 渲染帧 · 队列已空 · 等待输入 TURN 1 QUEUE DRAIN TURN 2 IDLE drain 前置条件:!pending && !exiting && 无权限/askUser/specReview 模态 Esc(运行中):先清 queuedMessage,再按才取消当前运行 LEGEND 内部调用 排队相关 agent.Run 调用 返回 队列驻留期

TURN 1

首轮启动

  • • 回车 → handleSubmit!pending)→ beginRun
  • runAgenttea.Cmd 协程后台发起 agent.Run(prompt#1)
  • • 回调经 program.Send 持续刷新 UI
  • • 输入框全程保持可编辑

QUEUE

运行中入队

  • • 运行中回车 → handleSubmitpending)→ queueMessage
  • • 存入 queuedMessage(单槽 string)+ 清输入框
  • • 再排一条会覆盖前一条,不累积
  • • 输入框上方显示 [queued] 预览

DRAIN

回合结束出队

  • agentResponseMsg 先置 pending=false
  • launchQueuedMessageIfReady 取出并清空
  • • 无论上轮成功/出错都 drain
  • • 前置:无权限/askUser/specReview 模态且未退出

EDGE

边界与取消

  • • 编排发生在两次 agent.Run 之间,循环本身无感
  • • Esc(运行中):先清队列,再按才取消运行
  • • 退出中(Ctrl+C 延迟退出)不入队
  • • 测试:internal/tui/queued_message_test.go