主题
JLine 升级解决的是「CLI 的输入体验」——终端里做到流式输出不打断输入行、按键即时响应、跨终端环境不翻车。它是 TUI三形态 里 inline 形态的地基。
启动与终端探测
TuiBootstrap 用 JLine 的 TerminalBuilder.system(true).dumb(true) 创建 Terminal——dumb 兜底保证程序在 IDE 控制台、CI、重定向管道这类非交互环境里起得来但不假装能交互;shouldUseTui 探测终端能力后决定走 inline TUI、Lanterna 全屏还是 plain 渲染(可用 -D 属性或环境变量强制 Lanterna),无法交互时降级 plain 并提示「请在 macOS Terminal / iTerm2 等真实终端中运行」。
交互升级点
LineReader.printAbove:流式输出从输入行上方打印——模型边吐字,用户正在输入的行不被冲掉,这是「边流式输出边可输入」的关键;- raw mode 按键处理:HITL 审批框直接读
y / a / n / s / m单键决策,不用回车; - 底部 Status dock + 可折叠工具块 + 代码块折叠状态机:长输出收纳成可展开的块,终端不滚屏失控(详见 TUI三形态)。
dumb terminal 是什么?为什么重要?
JLine 在无法访问真实终端(IDEA 运行窗口、CI、输出重定向)时会退化成 dumb terminal——没有按键处理和光标控制能力。显式 dumb(true) 让程序「能启动、能输出、不谎报交互能力」,再由 shouldUseTui 判定降级到 plain 渲染。没有这层兜底,Agent 在 IDE 里直接崩溃。
为什么要 printAbove?
Agent 的回答是流式的,用户很可能正在输入下一个问题。JLine 的 printAbove 把输出块插入到输入行上方刷新,输入缓冲原样保留——解决了「流式输出和用户输入抢同一行」的冲突。
三形态怎么选?
RendererFactory 按「终端能力探测 + 是否 Lanterna 属性」选择:inline(默认,JLine 驱动)、Lanterna 全屏三栏(显式开启)、plain(dumb / 重定向兜底)。三形态共享同一个 Agent 内核与工具集,只换渲染层(见 TUI三形态)。