Skip to content
掌握度

CodeAgent CLI 项目深挖 · 单期模块。总览见 需求分析 与 整体设计方案。

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三形态)。

本站仅供个人学习使用,请勿外传