# DSH OMC TUI · 工作记录与变更日志 (Worklog & Changelog) 本文档记录了 `dsh-omc-tui` 的重要问题排查、架构决策、性能优化及视觉体验迭代历史。 --- ## v0.2.15 · 待发布 - **命令与附件**:修复 `/plan`、`/goal` 的图片附件契约;图片会以官方 `image` 形状交给 Harness,命令失败时回填待发送图片。 - **转写与交互**:修复 `/btw`、`/compact` 本地输出在备用屏幕中的投影,工具结果可下钻读取嵌套文本与结构化文件/差异元数据;Esc 优先关闭浮层;输入文本非空时,行首 Backspace 可逐张移除待发送图片。 - **性能与视觉**:折叠活动卡片延迟构建明细,durable 事件突发合并到下一帧重投影;Context 状态条使用单一 `░` 字形并以主题色区分已用与剩余容量。 - **输入与终端**:输入路由器改为按完整 ECMA-48 语法消费 CSI(含 `?`/`>` 私有参数与 `$` 中间字节)、OSC 与 DCS 回执,终端在焦点切换、窗口 resize、休眠唤醒或外部编辑器返回时发来的设备属性、DEC 私有模式回执与颜色查询响应不再作为乱码写入输入框;提前超时的独立 Escape 会重新绑定紧随其后的焦点/DEC 回执,`Alt+]`、`Alt+P` 等真实按键保持不变。 - **Tasks 与状态展示**:`/tasks` 和状态栏直接投影 Harness 的 `todo/write` durable 快照,创建、进行中与完成状态会实时刷新,并能在恢复会话时正确重建。 - **转写可读性**:展开工具调用后的 diff 输出保持在所属工具下方缩进,窄终端同步收窄避免溢出;Markdown 围栏代码块改为语言标签与缩进正文,不再显示裸的围栏标记。 - **主题与对比度**:Context 进度条使用更清晰的主题色;未显式选主题时,会根据终端背景自动选择浅色主题。 --- ## 🏷️ 版本记录 (Version History) | 版本 | 日期 | 说明 | | :--- | :--- | :--- | | **v0.2.15** | 2026-09-11 | **任务状态与终端呈现可靠性修复**。Harness `todo/write` 快照实时驱动 `/tasks` 与状态栏;完整消费异步终端回执,避免控制序列污染输入框;工具 diff 输出维持层级缩进,Markdown 代码块移除裸围栏;Context 色彩与浅色终端主题检测优化。 | | **v0.2.14** | 2026-09-10 | **DSH v0.1.5-rc.1 兼容与压缩链路升级**。19 个 Harness peer 依赖与 Cordis 对齐新版预发布范围,Profile system prompt 迁移至 `personaPrefix` 并移除失效 patch;支持默认 DeepSeek-V41-Flash(`deepseek-flash`)及视觉旁路候选。接入 Harness 官方 `compaction-basic` 的 80% 阈值压缩与 durable 生命周期投影,兼容 V3 tool result 的 `message.source.callId`。`/status` 使用紧凑宽字符安全面板;修复 CR-only 粘贴及残缺 CSI 超时后吞掉普通输入的问题,并补齐回归测试。 | | **v0.2.13** | 2026-09-08 | **Tasks 与状态展示发布加固**。补齐 `/tasks` 注册与 Plan 默认入口,`/jobs` 保持后台任务兼容入口;修复 compact 耗时重复单位。`/status` 改为结构化内容区,标题、分组和空行不再被通用项目符号打散;详细状态栏会按终端高度自动收起 Plan,避免矮窗口尾部截断。计划 durable 投影按会话末尾事件缓存,Token/耗时进位边界统一显示为 `1m` / `1m 00s`。 | | **v0.2.12** | 2026-09-06 | **后台恢复与终端状态清理加固**。增加轻量终端健康检查,在长时间置于后台、系统休眠或终端恢复后自动修复 Raw Mode、输入流、鼠标追踪与括号粘贴状态;窗口尺寸变化和 `SIGCONT` 时立即重建终端投影。补齐 `SIGINT`、`SIGTERM`、`SIGHUP` 与进程退出清理,避免异常中断后鼠标坐标控制序列泄漏到 Shell;外部编辑器返回时同步恢复交互模式。健康检查仅在状态异常时调用 Raw Mode 接口,终端控制码降为每 30 秒低频兜底重申。 | | **v0.2.11** | 2026-09-05 | **终端输入与工具活动投影可靠性修复**。运行期间保持输入框结构稳定并移除易误解的固定提示,过滤 `stripTypeScriptTypes` Node 实验警告且在外部 stderr 后强制刷新缓存;兼容 VS Code 空闲后拆分送达的 SGR 鼠标滚轮报告,避免控制序列泄漏成乱码;`Jump to bottom` 居中显示,生成期间按 Esc 先滚动到底部、再次按下才中断;修正跨空消息到达的工具结果被投影为 `0 tools`,为 `run_code` 显示语言、代码行数、错误状态并在展开时呈现完整执行代码;裸 `@` 文件匹配触发符现在一次 Backspace 即可删除并关闭面板。 | | **v0.2.10** | 2026-09-03 | **DSH rc.1 PTY 发布门禁闭环**。适配 `userQuestions` 从旧 provider 注册迁移至 Agent-scoped `user-questions/request` waterfall,同时保留旧 API 后备;修正 rc.1 上下文注入中的文件和图片内容块识别。隔离 rc.1 mock Profile 的六项 PTY(流式工具、功能、文件、图片、交互、resume)全部通过。 | | **v0.2.9** | 2026-09-03 | **DSH v0.1.2-rc.1 兼容适配与交互可靠性升级**。统一使用 rc.1 `snapshotEvents()` 会话快照与 `permissionPresets.current(session)` 权限契约,并保留集中式旧契约回退;补挂 preset 所需的 subagent model-selection Host 服务,移除失效 patch,19 个 DSH peer 对齐 rc.1;真实隔离 Profile 启动、`/status` 与权限轮换通过。同时加入安全会话导出、TUI 版本状态、未知 slash prompt 修复、视觉模型选项标识,以及 Jobs/Shell 输出、取消、竞态和小窗口布局加固。完整上游报告见 `DSH_V0.1.2_RC1_ADAPTATION.md`。 | | **v0.2.8** | 2026-08-29 | **Reasoning effort 默认选择持久化**。通过 Harness `agentDefaultModel.saveSelection()` 保存完整 provider、model 与 effort,确保新会话恢复已选等级;直接 `/effort ` 会按模型能力校验,拒绝持久化无效值;设置写入失败时保持当前模型和 effort 不变。文档同步明确官方 npm 包 [`@deepseek-ai/dsh`](https://www.npmjs.com/package/@deepseek-ai/dsh) 截至 2026-08-29 的 `latest` / `next` 均为 `0.1.1-rc.2`。 | | **v0.2.7** | 2026-08-29 | **Reasoning effort 能力投影与第三方中转配置增强**。移除能力查询失败时生成的猜测档位,仅接受具体模型通过 Harness `reasoning.efforts` 声明的值;区分“模型未声明能力”与“能力查询失败”,状态栏以 `PROVIDER` 表示沿用模型或网关默认行为;切换模型时过滤不受支持的旧 effort;补充第三方中转和本地反向代理通过 `models[].reasoningEfforts` 自定义映射的文档及 Gemini `low/medium/high` 示例,并增加对应回归测试。 | | **v0.2.6** | 2026-08-28 | **DSH rc.2 适配、双模态视觉直通与终端输入可靠性升级**。将 18 个 Harness peer 依赖统一提升至 `^0.1.1-rc.2`,复核附件保存、Agent 创建与 durable `session/event` 契约;新增 `resolveModelVisionSupport` 双模态分流引擎,原生视觉模型直传 image content block,纯文本模型保持 `analyze_image` Sidecar 路由;新增 `downscaleImageBuffer` 跨平台高分屏缩放引擎及 2048px 安全基准线,保持 MIME、尺寸、base64 与落盘引用一致;纯文本消息不再为模型目录检索阻塞;输入路由完整消费 SGR/X10/URXVT 鼠标报告,避免空闲后协议字节泄漏为乱码;多行粘贴折叠为不可分割占位符,提交时逐字符恢复原文并保护 `$&` 等替换字面量;`Ctrl+L` 仅刷新屏幕并保留上下文,`/clear` 使用 Harness 官方 API 创建新会话并重置上下文;补齐视觉、鼠标、粘贴和会话生命周期回归测试。 | | **v0.2.5** | 2026-08-26 | **会话历史回顾(/recap)、15分钟空闲自动总结与全景架构文档上线**。新增 `/recap` 内置斜杠命令与 `buildSessionRecapSummary` 历史摘要算法;支持 15 分钟空闲自动生成 `※ recap: ...` 呼吸总结并联动 `/settings` 中 `autoRecap` 开关;会话恢复(-c / /resume)时初始化稳定持久回顾;引入独立 `localId/localKey` 体系与 `appendLocalLogEntry` 限制 200 条上限,彻底杜绝跨整数序号冲突与内存膨胀;完善文件展开异常、取消提交、图片失败、网络异常全生命周期计时器恢复;统一普通模式与备用屏幕的 ANSI.rule 边框样式;新增全景架构设计与全功能实现文档 `ARCHITECTURE.md`,清理过期的临时渲染分析报告。 | | **v0.2.4** | 2026-08-26 | **模型检索、生命周期加固、Windows 防护与分层转写投影全量闭环**。Model Picker 交互式搜索过滤(简单连续子串匹配、命中高亮、空态与计数提示);分层转写投影优化(`base + live` 状态感知抑制中间冗余 Turn Header,彻底消除多步思考与工具循环中的标题闪现与重复,仅在回合顶部保留唯一标题);Windows PowerShell / CMD 危险命令拦截加固(`Remove-Item` / `rm` / `del` / `rd` 等参数缩写、布尔修饰、`\\?\UNC\` 扩展 UNC 共享根与驱动器根目录删除拦截);Provider 配置事务化写入与数据保真(成功编辑与失败回滚均无损保留 Provider 级扩展属性与模型自定义字段,缺失旧配置时安全中止);会话生命周期加固(stop 幂等、并发单次释放、ignoreJobErrors 保护与任务失败后重试退出);followup 失败回滚并保留 Bash 上下文;ScreenRenderer 行尾 SGR reset 防止样式外溢;`/status` 准确识别 `recentInput = 0`。 | | **v0.2.3** | 2026-08-26 | **模型检索、生命周期加固与 Windows 防护基线**。Model Picker 交互式搜索过滤;Windows PowerShell / CMD 危险命令拦截基线;会话生命周期加固;shell rc 严格 `export` 解析;`/compact` 用量即时刷新、`/clear` alt-screen 感知清屏、`/btw` 旁路代理禁用工具调用;预览用量兜底消除 Context 误报。 | | **v0.2.2** | 2026-08-26 | **npm 安装方式上线**。发布至 npm registry,README 安装指引改为 npm 包名直装优先(`dsh plugin --profile tui add dsh-omc-tui`),GitHub 源码安装作为备选;无需 pnpm 对 Git 依赖的构建授权步骤。 | | **v0.2.1** | 2026-08-26 | **危险命令守卫(Danger Guard)上线与加固**。新增 `src/core/danger-guard.js` 原生 watchdog,挂载 Harness `tools/pre-execute` 拦截点与 `ctx.tools.guard()`:结构化 AST/Tokenizer 识别 `rm -rf /`、`chmod -R 777 /`、`git push -f`、`mkfs`/`dd` 直写磁盘、fork 炸弹、`find -delete` 等破坏性命令;支持子 shell 注释感知提取、`sh -c` 引号/粘连载荷、包装命令带值选项解析、ANSI-C 全转义解码与路径规范化逃逸拦截;`.dsh/danger-rules.json` 自定义 block/allow 全段锚定;递归深度与命令长度 fail-closed 保守拦截;会话生命周期全程接管与释放。 | | **v0.2.0** | 2026-08-26 | **视口投影渲染架构升级与性能优化**。Document + Viewport 纯投影渲染管线(`projectTranscript` → 视口差分重绘与语义锚点);流式活动状态投影进视口 + 单 spinner 活动 HUD(耗时 / tokens / tok/s / effort 标注);base 转写缓存 + live 尾流分层合并,流式阶段不再全量重投影;Alt/Meta 导航键回归修复;拖拽选区边缘自动滚动;`autocomplete` 路径穿越防护;会话切换/恢复失败回滚加固;live reasoning 列宽自适应与折叠交互。 | | **v0.1.1** | 2026-08-25 | **功能与稳定性增强**。新增自主决策 Vision 旁路视觉 Subagent 路由 (`/vision`);深度集成 Git 与扩展状态的 4 行 Statusline HUD;新增交互式 `/provider` 管理与配置向导;托管专用浏览器生命周期;Shell 模式系统历史与常用命令智能补全;终端 Resize 回放与权限预设多项健壮性修复;文档与快捷启动别名完善。 | | **v0.1.0** | 2026-08-17 | **首个正式版本标签**。完成从 0 到 1 的开发:Claude Code 级 Markdown 渲染引擎、流式打字机原子单次写入(0 闪烁 / 0 垂直跳跃)、树遍历状态机(Thinking / 工具组自动编排折叠)、行内安全审批、`/btw` 旁路问答、`/compact` 压缩、Bash 直通与后台 Jobs、四款护眼主题 + 四行全景 Statusline、会话恢复极速直出(< 50ms),以及 README / CHANGELOG / Issue 模板文档完善。 | | v0.1.0-baseline | — | 早期开发基线(初版骨架)。 | --- ## 📝 日常开发记录(2026-08-15 → 08-24) 以下按日期汇总日常开发记录,涉及架构、渲染、交互、视觉、上游适配与文档等方面。每个专题的详细记录见下文各节。 ### 📅 2026-08-15 · 初建与集成(3 commits) - 建立 DeepSeek Harness 原生终端 TUI 骨架(`ef33deb`); - Harness 集成打通与工程路线图记录(`2cfe511`、`d86fdf7`)。 ### 📅 2026-08-16 · 渲染架构与命令体系(26 commits) - **流式渲染架构**:实时 Markdown 打字机流 + Scrollback 历史固化流水线(`e261c3b`)、逐行搭积木式增量上屏与 Thinking 动态指示流(`fbf4e14`)、打字机 Footer 滚动优化(`5905cdd`); - **命令体系**:`/status` 全局概览(`8780323`)、`/steer` 实时干预与排队消息提升(`847fb59`)、`/compact` 对齐 Claude Code(`93a3de1`)、`/ask` 侧边零污染问答(`21f7fa4`)、内置 `/grill-me` 架构深度拷问技能并升级为 Matt Pocock 决策树法则(`1a9e0c2`、`8771fd6`); - **视觉体系**:Claude 暖色调体系统一(`570b9d7`)、柔和浅灰消除刺眼白光(`b537934`)、⚛ 思考图标与 ✻ 完成图标对齐 Claude Code(`795f8a8`、`dfeaf24`)、用户气泡右移与上下文注入独立呈现(`35fef17`); - **交互细节**:两步式模型选择器(`ff6338c`)、statusline 密度模式配置(`0284632`)、预设切换确认面板(`d3da36b`)、SS3 方向键支持(`befa17e`)。 ### 📅 2026-08-17 · 功能完善与性能优化(95 commits) - **架构与性能**:单体 TUI 模块化重构为子系统(`4e2a301`)、Cordis 注入解耦与后台 MCP 异步初始化(`f64bc02`、`3adb49d`)、启动延迟与分块回放优化(`b69fc72`、`b784ec9`)、会话恢复原子直出 < 50ms(详见第 9 节); - **品牌与发布**:重命名 `dsh-omc-tui`(Oh-My-Claude)(`4ff5009`)、MIT 开源与 npm 发布元数据(`a1768de`); - **Markdown 渲染引擎**:代码围栏、Unicode 表格网格与标题排版(`8535770`、`afe9db7`、`b09c73d`),以及流式缓冲多行表格 / 代码块单遍无缝渲染(`f755f65`); - **Bash 模式**:`!` 前缀与琥珀金主题(`eeb0e60`、`3fbd4b1`、`5664b0a`)、Bash 命令输出自动注入下一轮上下文(`363ca9f`)、Bash 完成自动触发模型(`130ae31`)、Bash 模式专用状态行指示(`36e6216`); - **审批与 Diff**:审批卡片 4 角闭合框 + Tab 切换(`10f06af`、`dd0646a`)、问题面板 Submit 升级与未答警告(`3b5ec6b`)、Write 工具磁盘对比 Diff(`b822cf5`)、Diff 行底色增强可读性(`dcfb060`); - **工具链编排**:树遍历状态机模型(详见第 6 节)、连续混合工具自动聚合与工具组自动收起(`41ec6bc`、`d261455`、`759df6d`); - **流式渲染稳定性**:文字重复与标题重复刷屏修复(详见第 7 节)、Scrollback 提交原子单次写入 0 闪烁(`d78c1f6`、`293c54f`)、回合结束高度差精确锚定(`0c00abf`、`e43a9e4`)、4 行活动抽屉锁定整轮(`103fe52`、`66a649d`); - **文档与规范**:README 重做 + 产品宣传白皮书(`007d27e`、`9edd4da`)、AGENTS.md / CLAUDE.md 项目规范(`ca6a6cc`)、CHANGELOG 体系建立(`2d55c19`)、文档事实校正与 GitHub Issue 模板(详见第 10 节)。 ### 📅 2026-08-20 → 08-24 · 上游适配、Provider 生态、Vision 路由与生命周期管理(9 commits) - **Provider 管理与交互向导**:新增 `/provider` 命令及交互式 Provider 管理面板,支持自定义端点、鉴权与模型列表配置(`44dffcc`); - **渲染与会话健壮性**:CJK 与 ANSI 宽字符截断强化、`/btw` 独立会话流程稳固、自动化 PTY 端到端测试套件(`95780a1`); - **Statusline 深度上下文 HUD**:集成实时 Git 分支、工作区变更及 ahead/behind 监控(`src/core/git.js`),支持活跃 Jobs、MCP、Hooks、Skills 多维度指标可视化(`2643d3b`); - **Harness rc.1 契约适配**:全面对齐 `@deepseek-ai/dsh@0.1.1-rc.1`,适配模型 Reasoning Effort 级联与预设重组(`f94d400`); - **Vision 旁路视觉路由**:新增 `src/vision-router.js` 与 `/vision` 命令,实现主模型无视觉时自主调度旁路 Agent 识别图片(`45dd5c8`); - **渲染与交互微调**:高对比度 Markdown 代码块与表格边框渲染优化、Context 消耗预警与 Skills 开关修复(`4d0cecc`); - **托管 Browser 租约与生命周期**:新增 `src/browser-lease.js` 托管专用浏览器生命周期,退出时保留专用 Chrome(供用户完成登录与安全重连),多选/自定义问卷交互提升(`7f276fd`); - **输入控制与 Jobs 交互增强**:输入历史去重与导航增强、Jobs 面板支持流式输出读取与任务取消、退出确认面板(`src/panels/exit-confirm.js`)及退出时后台 Jobs 安全终止(`b328df5`)。 --- ## 📅 2026-08-17 · 终端排版引擎、时序对齐与极速直出优化 ### 🎯 核心问题与优化记录清单 --- ### 1. 启动异常与未定义方法修复 (Fix Runtime Errors) * **问题现象**: * 终端启动时偶发报错 `ReferenceError: truncateAnsi is not defined` 导致无法进入主界面。 * 轮次结束 `turn/end` 时抛出 `TypeError: this.refresh is not a function` 导致进程退出(Exit code 130)。 * **根因分析**: * `src/index.js` 顶部引入 renderer 模块时遗漏了 `truncateAnsi` 的解构导出。 * 早期重构遗留了旧代码 `this.refresh(false)`,实际状态更新与 Footer 渲染由 `onTurnEnd` 和 `scheduleRender` 负责。 * **解决方案**: * 在 `src/index.js` 补全 `truncateAnsi` 导入。 * 移除 `turn/end` 阶段的冗余调用,统一收敛至标准事件调度生命周期。 --- ### 2. `workspace-write` 权限预设持久化修复 (Permission Preset Persistence) * **问题现象**: * 在交互式授权弹窗中选择 `2. Yes, allow workspace-write during this session (shift+tab)` 后,后续工具执行仍然反复弹出审批弹窗。 * **根因分析**: * 审批响应分支错误调用了不存在的 `permissionPresets.select()` 方法,导致设置静默失败。 * **解决方案**: * 修正为官方 Harness 接口 `this.ctx.permissionPresets.set(this.agent.session, 'workspace-write')`,触发 durable event 落盘,实现会话级权限真正生效。 --- ### 3. 用户输入气泡框样式与 CJK 安全对齐 (User Message Bubble & CJK Alignment) * **演进历程**: * **初代**:简易粗体文本,缺乏层次感。 * **尝试**:背景色胶囊方案(`ANSI.userBg`),但在暗色/透明终端下稍显突兀。 * **定版**:完整恢复经典圆角气泡卡片(`YOU · HH:MM` + `╭──────╮` / `│ 内容 │` / `╰──────╯`),气泡宽度自适应终端列数,使用 `widthOf()` / `visibleOf()` 严格保证中英文字符在终端中绝对对齐不破框。 --- ### 4. 本地日志与会话历史的时序倒置修复 (Chronological Log Ordering) * **问题现象**: * 用户在输入新消息前执行 `Shift+Tab` 切换权限、或者输入 `/status` 查看状态,但在终端重绘(Resize)或会话恢复后,这些本地日志竟然跳到了新消息的下方。 * **根因分析**: * `repaint()` 逻辑先遍历并格式化了所有的 `agent.session.events`,最后才把 `this.localLog` 追加到最尾部。 * **解决方案**: * 在 [src/index.js](src/index.js) 中将 `session.events` 与 `localLog` 统一按绝对时间戳 `time` 进行**全局归并排序**,并在 [src/renderer/transcript.js](src/renderer/transcript.js) 增加 `case 'local/log'` 处理,确保操作时序绝对准确。 --- ### 5. 流式思考抽屉动态效果与终端安全 (Live Thinking Drawer & Safe Truncation) * **优化内容**: * 将底部思考动态抽屉扩展为 **3 行实时思考流预览**,末尾带有脉冲提示光标 `▋`。 * 消除抽屉高度动态剧烈跳动导致的视口闪烁,渲染使用 `${truncateAnsi(line, columns - 1)}\x1b[K` 代替右侧空格填充,彻底解决 macOS / iTerm2 / VS Code 下因为终端自动换行导致的“幽灵空行”与布局错位。 --- ### 6. 树遍历状态机模型与工具链自动收起 (Tree Traversal & Node Transitions) * **问题现象**: * 模型执行多步排查(如 `Read` -> `Edit` -> `Bash`)时,每次工具前都有 1 行过渡碎碎念,几轮下来终端被中间过渡和工具日志堆满,正式回答被推至屏幕外。 * **架构设计(Tree Traversal State Machine)**: * 将 Agent 交互流形式化为树遍历状态机: * **Thinking 节点**:思考结束退出 ➔ 原地收起为 ` ⚛ Thought for Ns (ctrl+o to expand)` ➔ 插入空行。 * **Lead-in 过渡节点**:前置说明文字以淡灰紧凑行显示 ➔ 插入空行。 * **Tools 工具组节点**:叶子工具在底部抽屉执行,全部工具执行完毕回归根节点时 ➔ 自动合并收纳为 ` ⚙ TOOLS · N · ... (ctrl+o to expand)` ➔ 插入空行。 * **Response 回答节点**:模型的**正式回答(Final Answer)100% 完整舒展展开**,不折叠。 --- ### 7. 流式输出文字重复与 DSH 标题重复刷屏修复 (Deduplicate Streaming Text) * **问题现象**: * 流式生成中,模型输出的文字每隔几秒就会被重复打印两遍,且伴随重复出现 `DSH deepseek-v4-flash · 22:56` 标题行。 * **根因分析**: * `flushStreamBuffer` 已经将流式文本逐行写入了 stdout;随后 `tool/result` 触发 `commitUnprintedEvents` 时,又把包含同一段文字的 `assistant/message` 再次传进 `formatEvents` 渲染,造成二次重复输出。 * **解决方案**: * 在 [src/index.js](src/index.js) 中明确职责:流式阶段的文字由 `flushStreamBuffer` 独占流式提交;`commitUnprintedEvents` 仅过滤并提交真正的工具事件(`tool/call`、`tool/result`、`approval`),彻底消除重复内容与重复 Header。 --- ### 8. 连续混合工具自动聚合 (Unified Tool Grouping) * **优化内容**: * 在 [src/renderer/transcript.js](src/renderer/transcript.js) 引入 Lookahead 前瞻判定,连续执行的 `Read`、`Edit`、`Write`、`Bash`、`grep` 等混合工具链,即使中间夹杂微小状态流,也统一聚合成单个卡片(如 ` ⚙ TOOLS · 7 · edit ×4 · read · bash ×2 (ctrl+o to expand)`),不再出现单条与多条平级碎裂割裂。 --- ### 9. 会话恢复(`-c`)极速原子直出 (Instant Render for Session Resume) * **问题现象**: * 执行 `dsh-omc-tui -c` 恢复会话时,内容像搭积木一样一条条缓慢刷屏,且整屏历史被重复打印两次。 * **根因分析**: * 会话恢复时调用了 `for (const event of session.events) this.onSessionEvent(...)`,强行把历史事件当成实时流重新发射了一遍;随后又全量分块输出了一次。 * **解决方案**: * 移除事件模拟流,直接在内存中完成状态与 `reasoningBlocks` 索引(耗时 < 1ms)。 * 通过 `this.formatEvents(session.events, columns)` 完成一次性排版,并执行**单次原子系统调用写入**(`process.stdout.write(pastRows.join('\n') + '\n')`)。 * **性能实测**: * 800 个事件(2,200 行终端对话历史)全量排版与输出耗时 **仅 36.7ms**,常规会话进入耗时 **< 3ms**,实现秒开直出。 --- ### 10. 官方文档事实与规范校正 (Documentation Accuracy & TOC Fixes) * **校正内容**: 1. `README.md` L213:修正 `!` Bash 模式颜色描述为“输入区与提示符变琥珀金”(原文档误写为“边框变绿”)。 2. `README.md` L203:修正 `Ctrl+K` 快捷键描述为“删除光标至当前行行尾”(符合 Emacs 规范,原误写为“删除当前行”)。 3. `README.md` L35 / L303:修正 TOC 锚点为 `#反馈与贡献-feedback-contributing`(与 GitHub slugger 规则 100% 对齐)。 4. 新增 Roadmap(规划中)、反馈与贡献指引、以及标准 GitHub Issue 模板(Bug 反馈与 Feature Request)。 --- ### 11. 动态生成抽屉扩展为 4 行并锁定整轮状态 * **优化内容**: * 将底部实时预览抽屉升级为**恒定 4 行**(1 行状态指标 + 3 行丰富实时推理流,带脉冲光标 `▋`)。 * 状态绑定为轮次主生命周期,整个生成过程中高度 100% 恒定,输入框位置稳固。 --- ### 12. 流式原子双缓冲写入与轮次结束位置精确锚定 * **问题现象**: * 文本流式输出过程中,终端伴随高频闪烁; * 回答完全输出结束(`turn/end`)瞬间,输入框和状态栏整体往上跳动了数行。 * **根因分析**: * **闪烁根因**:流式提交新行时分为 `clearFooter` -> `write` -> `render` 三次独立系统调用,在清屏与重绘之间向终端暴露了空白帧,高频并发下产生明显闪烁。 * **跳跃根因**:生成期间 4 行抽屉展开使 Footer 高达 11 行;结束时抽屉关闭,Footer 降为 7 行,高度差导致 7 行 Footer 被绘制在原先抽屉所在的高位。 * **解决方案**: * **原子单次写入**:将 `erase`、`content`、`footerText` 与 `cursorMove` 合并为单个 ANSI 缓冲区,通过单次 `process.stdout.write(buffer)` 原子输出,彻底根除任何中间空白帧,**流式输出 0 闪烁**。 * **差值精确滚动推进**:在 `turn/end` 抽屉关闭的瞬间,计算新旧高度差(`heightDiff`),将完成行指标(`✻ finished in 15.7s · 3 tools`)与差值空行原子压入滚动区,正好抵消 4 行高度差,**输入框与 Statusline 绝对保持在原位,0 垂直跳跃**。 --- ### 13. 交互式模型 Provider 管理与自定义 Provider 向导 (`/provider`) * **架构演进**: * 新增 [src/panels/provider-panel.js](src/panels/provider-panel.js),提供全交互式 Provider 管理入口。 * 支持查看当前 Provider 状态、切换默认 Provider,并提供步进式向导添加兼容 OpenAI/Anthropic/DeepSeek 接口规范的自定义端点与模型。 * 自动持久化配置至 Harness 官方模型配置服务,保持无缝生态兼容。 --- ### 14. 旁路 Vision 视觉路由体系 (`/vision`) * **核心设计**: * 引入 [src/vision-router.js](src/vision-router.js),解决主会话模型不支持多模态视觉时的图片识别诉求。 * 机制:当向主模型发送图片且当前模型仅支持纯文本时,TUI 自主调度已配置的独立视觉 Agent(通过 `/vision /` 设置)提取图片描述与 OCR 关键信息,将结果作为旁路工具输出无缝注入主会话上下文,既保证主模型无需切换,又赋予强大的多模态感知。 --- ### 15. 状态栏 Git 深度状态与动态上下文 HUD * **增强内容**: * 在 [src/core/git.js](src/core/git.js) 实现轻量级非阻塞 Git 状态探测引擎,精准采集当前分支、未提交变更统计(`staged`/`modified`/`untracked`)以及远程分支 `ahead/behind` 指标。 * Statusline 在 `detailed` 与 `compact` 模式下集成动态上下文 HUD:直观展示已挂载 MCP 工具服务、活跃 Hook、后台 Jobs 计数及 Skills 启停状态,并具备 Context 消耗水位预警。 --- ### 16. 托管 Browser 租约生命周期与优雅退出保护 * **健壮性保障**: * 引入 [src/browser-lease.js](src/browser-lease.js),管理 Playwright / Browser 工具会话的租约状态与生命周期。专用 Chrome 实例在退出后保留,通过 PID、端口、用户目录与受管标记在下次启动时安全重连,保障用户登录态不中断。 * 新增 [src/panels/exit-confirm.js](src/panels/exit-confirm.js) 退出确认面板,防止后台长任务或活跃连接误退出;在退出时可靠终止活跃本地与远程后台 Jobs。 * 升级 Jobs 管理面板([src/panels/jobs-panel.js](src/panels/jobs-panel.js)),支持实时流式阅读任务输出与一键取消。 --- ### 📊 性能基准测试数据 (Benchmarks) | 场景 | 指标 / 数据 | | :--- | :--- | | **ESM 模块加载** | **0.43 ms**(零外部 UI 依赖) | | **800 事件格式化 (2,200 行)** | **36.74 ms**(纯内存 CPU 字符串计算) | | **会话恢复 (-c) 直出时间** | **< 50 ms**(单次 `process.stdout.write` 系统调用) | | **CJK 宽度计算吞吐** | **> 1,000,000 字符 / 秒** |