zero 交互式 TUI 流程

tui.Run → Bubble Tea 事件循环(Model/Update/View)→ 异步 agent.Run 经消息回灌 → 权限/斜杠命令交互

渲染帧 → 等待下一个 tea.Msg 回车提交 → tea.Cmd(协程) 回调 → tea.Msg program.Send(msg) 回灌事件循环 请求 决定 (chan) runInteractiveTUIWithSetup(装配完成) Registry · Provider · Sandbox · Session · MCP → tui.Options → deps.runTUI tui.Run (internal/tui/run.go) TTY 检查:非终端 → 提示改用 zero exec 并退出 NO_COLOR · 鼠标过滤 · AltScreen newModel + tea.NewProgram 加载 usercommands · 装配 model 状态 runtimeMessageSink = program.Send Model.Init 首帧命令 · 光标闪烁 · 欢迎/setup 向导 Bubble Tea 事件循环(单 goroutine) 用户输入 键盘 · 鼠标 → tea.Msg Model.Update(msg) 按消息类型分发:按键 / 斜杠命令 / 运行时消息 shift+tab 切权限模式 · /model /image /spec · Esc 取消 reduceTranscript 更新记录 → 返回 (model, cmd) Model.View 渲染 transcript 输入框 · 状态行 FILES 侧栏 submitPrompt → beginRun 建会话 · 记录 user 事件 · 视觉门(丢弃不支持图片)· 新 runID runAgentWithOptions(tea.Cmd 协程) 组装 agent.Options:Registry/权限/模型/上下文窗口/自纠错(LSP) agent.Run(后台运行) 循环:分区工具 → 压缩 → provider 流式 → 执行工具 PermissionModeAsk(默认):写/bash 等经权限门 回调:OnText / OnToolCallStart / OnToolCall OnToolResult / OnUsage / OnPermissionRequest RequireCompletionSignal 关闭(TUI 允许无工具调用回合) 自纠错默认仅跑变更文件 LSP 诊断 runtimeMessageSink → program.Send 把回调事件封成 tea.Msg 送回事件循环(跨 goroutine 安全) 权限提示 UI sendPermissionRequest 阻塞在 decision chan 用户 允许/拒绝/总是 notify.AwaitingInput ctx 取消 → 拒绝 会话持久化 appendSessionEvent · SessionStore message / toolCall / result / usage 可 /resume 续接 回合结束 agentDoneMsg → 清 pending notify.Completion · 状态行归位 回到输入等待下一轮 中断 / 退出 Esc 取消当前运行(ctx cancel) Ctrl+C / /quit → program 退出 返回退出码 0 图例 TUI/事件循环 运行/agent 消息回灌 权限交互 会话持久化 循环回边

启动与事件循环

  • tui.Run:TTY 检查(非终端引导去 exec)
  • tea.NewProgram + newModel(sink=program.Send)
  • Init → Update → View 单 goroutine 循环
  • • shift+tab 切权限 · /model /image /spec · Esc 取消

异步 agent 运行

  • • 回车 → submitPrompt → beginRun → runAgent
  • agent.Runtea.Cmd 协程后台跑
  • • 默认 PermissionModeAsk,写/bash 经权限门
  • RequireCompletionSignal 关闭(区别于 exec)

回调回灌与交互

  • • 回调 → runtimeMessageSinkprogram.Send
  • • 事件以 tea.Msg 回到 Update 刷新 transcript
  • • 权限请求阻塞在 decision channel 等 UI 决定
  • • 会话事件落 SessionStore,支持 /resume