v1.8.1 —— 缩放窗口三连修
springai-agentdemo v1.8.1
在 v1.8.0 基础上的缺陷修复版(patch)。核心交付物仍是终端编码智能体 springai-code-tui。本版集中修复终端窗口缩放引发的三类显示缺陷:拖动窗口后信息流乱成一屏残骸、中文输入法拼音「错位」、模型回复超宽被截断不显示全。无破坏性变更,无新增依赖,建议所有 v1.8.0 用户升级。
下载物仍是两个自包含运行包(解压即用,无需构建):
springai-code-tui-1.8.1-dist.tar.gz(macOS / Linux 首选)springai-code-tui-1.8.1-dist.zip(Windows 首选)
两者内容一致:启动脚本(bin/)+ 主 jar + 全部运行期依赖(lib/)+ LICENSE/NOTICE/README。运行时界面版本标识为 v1.8.1。
完整功能全景与
⚠️ 安全声明见 v1.3.0 发布说明 与 v1.0.0 发布说明;本文只列出相对 v1.8.0 的变化。
🐛 修复
缩放窗口不再打烂界面:两级 resize 修复
现象:拖动终端窗口宽度,内联界面(输入框/状态栏)被撕成新旧几个框叠在一起,对话被一截截顶出可见屏;停手之后往上翻,回滚缓冲里堆着一份份过期界面的完整残骸(横幅+输入框+状态栏+整屏空白)——每拖一次多一份。
根因:会 reflow 的终端(Terminal.app 等)在改宽度时把屏上内容重新折行——整宽的旧帧被拆高,应用只按旧记账重画、拆出来的多余行没人擦;被拆高的部分还把真实对话顶进回滚缓冲,事后从应用侧永远够不着。
修复(两级,分工明确):
- 拖拽中:每个宽度变化事件,赶在库按新宽度重画之前,从显示区顶行清到屏尾,新帧原地盖回去——擦与画在同一个事件周期里,不漏半帧脏屏。内核合并 SIGWINCH 丢事件的情况由每帧列宽比对兜底。
- 停稳后(宽度 ≈300ms 不再变化):整屏连回滚缓冲一起抹掉(与
/clear同路),从应用自己的输出留底(最近 400 行)按新宽度全量重放。拖拽期间累积的一切伤害——鬼影、被顶走的对话、回滚缓冲里的残骸——一次性归零。重放是幂等的全量重建,多触发只是多重建一次。
代价(有意的取舍):停稳重放会抹掉回滚缓冲,「往上翻」的上限从「无限但全是残骸」变成「最近 400 行且干净」;应用启动前的 shell 输出也随之消失(/clear 早已是同样语义)。
中文输入法拼音不再「错位」到输入框边框上
现象:打中文时,拼音预编辑串和候选窗浮在输入框顶边框那一行上,字上屏后才落回输入行。
根因:终端把 IME 预编辑串画在硬件光标所在位置,而上一版为了保 resize 清扫的定位不变量,把硬件光标永久钉在了显示区第 0 行(正是框顶边框)。
修复:光标停放改成状态相关——平时停在输入文本行(拼音、候选窗回到正确位置),只在「resize 进行中」(首个宽度变化 → 停稳重放完成)临时钉到第 0 行保住清扫不变量。拖窗口的时候没人打字,两头都不吃亏。
模型回复超宽不再被截断
现象:回复里较长的行(长 URL、长句、无空格的中文长段)右边直接消失,看起来「文字没显示全」;缩放窗口后更明显。
根因(两层,叠加起来):内联显示的 println 是定宽渲染、超宽截断,而助手正文、错误行、工具摘要这些打印路径从未按终端宽度折过行(此前只有用户消息块折行);resize 停稳重放时又把按旧宽度成形的行按新宽度再截一刀。
修复:新增样式感知的显示宽度折行(中文按 2 列、宽字符不切半、样式跨拆分点保留),三处接入——
- 助手正文/流式整行:渲染后折行、逐段悬挂缩进下沉;
- 输出出口兜底:错误、工具行等所有路径的超宽行一律先折再打;
- resize 重放:留底存折行前的原始行,重放按当前宽度重新折——拖窄不丢内容,拖宽还会把之前折开的行接回一行。
代价(有意的取舍):欢迎横幅这类为 ≥52 列设计的框,在更窄的终端下折行后边框会断开(此前是右侧被静默截掉)——内容保全优先,拖宽回去自动复原。
🔧 工程
- 全模块版本号 1.8.0 → 1.8.1。
- 全量测试:
springai-code-tui1383 用例通过(新增清扫器/停稳判定器结构与契约断言、光标停放的离屏渲染断言、折行的内容保全契约等回归)。 - pty 实机冒烟
resize_smoke.py全绿,断言升级为协议契约级:停稳后必发抹回滚缓冲序列(ESC[3J)、硬件光标必回输入文本行、resize 前后历史内容一字不丢(重放合法地重折行数,故断内容不断行号)、78 列长 URL 行全程完整。 - 三项修复均经 Terminal.app 实机(AppleScript 驱动真窗口拖拽 + 抓屏/抓回滚缓冲)验证:三轮拖拽后回滚缓冲仅存一份干净对话,长行拖窄折两行不丢字、拖宽重新接回。
🔐 校验(SHA-256)
0663d530eda81c237e99e3da6faa4226fa7458589a67b1cc3046009776b2996d springai-code-tui-1.8.1-dist.tar.gz
7d55ee8613401c032d4495d82812c894a4b0618e9ff0ce3f2e1e38f1fce2df0c springai-code-tui-1.8.1-dist.zip
shasum -a 256 -c <<'EOF'
0663d530eda81c237e99e3da6faa4226fa7458589a67b1cc3046009776b2996d springai-code-tui-1.8.1-dist.tar.gz
7d55ee8613401c032d4495d82812c894a4b0618e9ff0ce3f2e1e38f1fce2df0c springai-code-tui-1.8.1-dist.zip
EOF📄 许可
Apache License 2.0。发布包内随附 LICENSE 与 NOTICE(含所分发第三方库:Spring AI / Spring Boot / spring-ai-community 为 Apache 2.0,TamboUI 为 MIT)。本版未引入任何新的第三方依赖。
环境:JDK 17+,macOS / Linux / Windows。