自 v0.14.0 以来,dsh-TUI 有了自己的启动入口,带来重做的模型选择器、终端原生光标动画、任务完成通知、侧问面板改版和跨内核会话预加载。本版同时扩展插件查询命令、发布第一版冻结的插件契约,并补齐启动页图片输入、侧栏拖拽、樱花粉主题、权限记忆与上游断链重试。
升级与行为变化
- 插件命令改名:
/plugins改为/plugin,本版已移除旧命令,没有保留弃用别名。手动命令、快捷调用和自动化请改用/plugin,例如/plugins check …改为/plugin check …。(#1504 by @Lucas2011wastaken) - TUI 设置迁移:
/settings的dsh-tui分区改存~/.dsh-tui/settings.json,DSH、Claude、Codex 共用。首次启动自动导入 profile 补丁和旧~/.dsh/settings.yaml中的可编辑字段;!!js表达式不导入。旧 profile 中残留的字段仍可能在 DSH 内核下提供部署默认值,建议迁移后清理重复配置。(#1441 by @MomentDerek;#1483 by @ccch1mneyyy) - 启动与恢复更严格:默认从本包入口启动;
DSH_TUI_HOST_ENTRY=0可恢复原启动方式,DSH 宿主模块不可用时自动回退并说明原因。裸--resume、-c、--continue的恢复目标必须属于最终所选后端;没有可恢复会话或后端身份不匹配时明确报错并非零退出。安全模式的“重试正常启动”仍保留告警后冷启动的退路。(#1441 by @MomentDerek;#1449 by @Lucas2011wastaken) - 默认选择优先沿用上次使用:DSH 的模型、preset 和推理强度持久化选择现在优先于静态部署配置;恢复会话继续采用自身记录的模型路由。
DSH_TUI_PRESET仍可指定本次启动的 preset,/settings的显式effortDefault仍优先于上次推理档位。(#1430 by @ccch1mneyyy) - 官方请求元数据恢复默认:TUI profile 继承 DSH 官方的插件包清单、增量会话日志与反馈遥测配置。前两项随
deepseek-official请求发送到配置的baseURL,包括第三方网关;反馈 OTel 只在明确反馈后上传。需要关闭请求元数据时,在 profile 中分别设置plugin-package-inventory-deepseek.enabled: false和session-log-deepseek.enabled: false;DSH_TELEMETRY_MODE=DISABLED只控制 OTel,不控制这两项请求元数据。(#1375 by @ccch1mneyyy)
新功能与体验
启动、模型与会话
- 界面先出现,后端随后加载:
dsh-tui先挂载可交互界面,再在同一进程加载 DSH;Claude/Codex 组合本包与 profile 声明的第三方插件,不加载完整dsh-base。加载期间就能输入草稿、使用可用的本地命令,主题和面板等插件贡献随后加入。(#1441 by @MomentDerek) - 三个内核共用本地设置:切换内核后,语言、布局和其他 TUI 设置使用同一份
settings.json。切换到另一 profile 时,其部署配置补充在用户显式设置之下;设置文件损坏会在/settings显示提示,覆盖前保留原文件副本。(#1441 by @MomentDerek;#1483 by @ccch1mneyyy) - 内核直达命令:新增
/dsh、/claude、/codex,记住选择并重启进入目标内核的新会话。选择当前内核保留本会话,回合运行中拒绝切换;未安装 Claude 时可进入安装向导,Codex 缺失或版本过旧时给出对应提示。(#1497 by @CikeSeven) - 模型与推理等级同页选择:
/model重做为提供商标签、模型列表和推理档位三个区域。DSH 的“最近使用”排在首位,当前模型去重置顶,Tab/Shift+Tab切提供商;Claude/Codex 直接展示自身模型目录。↑/↓选模型,←/→调推理等级,Enter应用、Esc取消;点击推理档位会直接应用当前模型和强度。短终端优先保留聚焦模型与确认入口。(#1436、#1466 by @CikeSeven) - DSH 真正的同会话模型切换:
/model直接切换后续请求的路由,保留会话 ID、历史、权限和草稿,避免复制历史产生同名会话链。停放后重新挂载仍保留选择,下一次请求记录实际模型及变化提示;DSH 低于0.1.2-alpha.3时明确提示升级。(#1275 by @xuzijian2019) - 三个内核的会话列表都支持首屏快照:DSH、Claude、Codex 重开后先显示上次完整读取的会话列表,快照按后端与存储目录隔离,后台继续核对变化。(#1458 by @ccch1mneyyy)
- 当前工作区优先加载与启动预热:启动时预加载历史,打开
/resume复用在途读取并接收已有结果。三个后端先显示当前工作区,再补其他目录;Codex 复用已启动连接,数据库快读与常规首批查询并行,新会话和标题增量显示。后台更新保持用户已手动选择的行。(#1464、#1494 by @CikeSeven) - 会话管理默认选中最近会话:打开
/resume后可直接Enter恢复当前工作区最近使用的会话;切栏或鼠标移入列表保留选择,换工作区时选中该目录最新会话,没有历史时才选“新建会话”。(#1423、#1468 by @CikeSeven) - 启动页可关闭:
/settings新增launchpad开关,默认开启;关闭后普通启动直接进入聊天页,重启生效。指定恢复会话或首句的启动继续直达对话。(#1476 by @ccch1mneyyy) - 启动页支持图片附件:剪贴板图片和粘贴的图片路径可暂存为
[Image #N],随首条消息发送;图片标记支持整体移动与删除。命令不接受图片时保留草稿及附件,后端加载完成后也保留文字、光标位置和图片。加载期间提前按Enter不自动排队发送,就绪后再次确认即可。(#1460、#1492 by @CikeSeven)
终端交互、侧栏与外观
- 原生光标动画与拖尾:输入框继承终端配置的光标形状、颜色、闪烁、动画和拖尾,inline 与 fullscreen 均支持。模型选择器和会话管理界面导航时,原生光标跟随聚焦标签、模型、档位、工作区或会话行,停稳 0.5 秒后隐藏;文本输入光标持续可见。动画与拖尾由终端自身设置开启。(#1428、#1443、#1468 by @CikeSeven)
- 复制后保留选区,拖选时光标跟随:全屏拖选自动复制后继续显示选区,
Esc取消或重新拖选替换;高亮跳过行尾填充和空白行,保留代码缩进。拖选时原生光标跟随实际文字边缘,松手后回到输入框。浮层优先处理Esc,取消正文选区的那次按键不会打断生成。(#1440 by @CikeSeven) - 侧栏分隔线可拖拽:全屏分栏时左右拖拽分隔线即可实时调宽,聊天列至少 64 列、侧栏至少 28 列;调宽保留焦点和未发送草稿,比例作用于当前会话。(#1391 by @CikeSeven)
- 面板标签显示实际图标:未选中面板改用各自注册的图标,内置和插件面板都适用;悬停显示名称,未读状态通过颜色、加粗和计数呈现。(#1393 by @CikeSeven)
/btw侧问面板改版:聚焦侧栏后默认进入阅读层,←/→切面板、↑/↓和翻页键滚动;Enter、Tab或点击输入框进入编辑层。新增带边框与焦点高亮的输入框、线程状态徽章、轮次分隔线和空态说明;空线程隐藏多余头部,全屏侧问场景仍默认进入编辑。中文 IME 的预编辑位置也跟随侧问输入框。(#1417、#1431 by @ccch1mneyyy)- 樱花粉主题家族:新增深色
pink-night、浅色pink-day和 16 色回退pink-ansi,通过/theme显式选择。主题选择器适配短终端,焦点行保持可见;品牌主题按实际色板明暗选择对应版本。(#1294 by @xiaoxiaohaigui) - 用户消息配色随内核区分:雾蓝主题下使用陶土红用户标签,Claude 使用雾蓝,Codex 使用金色,浅色版同步调整;用户行的排版和加粗保持原有行为。(#1420 by @ccch1mneyyy)
- 上下文条显示更准确的内容构成:接入 DSH
contextBreakdown,按后端占用量分配系统、提示、回复、思考和工具的分段及悬停明细;没有分类时显示实测已用量。分类仍是估算,不能当作分项账单。(#1351 by @xiaoxiaohaigui) - 长目标可读全文:fullscreen/分栏下悬停被截断的目标正文可看全文;裸
/goal把目标、状态、阶段、轮次或预算及可用命令打印到转录中,inline 也可阅读。超长单行继续使用转录既有的折叠与展开机制。(#1223 by @xuzijian2019)
通知、权限、工具与插件
- 任务完成通知:DSH、Claude、Codex 的实时主任务成功结束,且没有排队输入或活动目标时提醒。默认仅在终端失焦时通知;
/settings的taskNotifications可选unfocused、always、off,notificationMethod可选auto、osc9、bel。通知带本地化标题和最新回复的单行纯文本摘要;自动适配 Ghostty/WezTerm、Kitty、iTerm2/Warp,其他终端响铃。tmux 需要开启focus-events与allow-passthrough;不支持焦点报告时可选always。回放、取消和失败不通知。(#1517 by @CikeSeven) - DSH 权限选择跨会话记忆:
/permission、Shift+Tab 静态模式和官方命令完成的持久切换写入~/.dsh-tui/permission.json,新会话经官方路径应用上次选择;临时计划模式不记入,显式DSH_PERMISSION_MODE优先,已不在名册中的权限身份跳过。(#1415 by @ccch1mneyyy) - DSH 上游断链自动重试:默认给当前实际使用且没有显式
retryPolicy的llm-pi-ai渠道补充重试策略,覆盖STREAM_CLOSED等暂时性失败,首次请求后最多再重试 5 次。已有策略保持有效,闲置渠道不写入;upstreamRetry: false可关闭策略播种。(#1415 by @ccch1mneyyy) - Windows 全功能
winbash:随包提供可手动挂到 profile host 层的 Git Bash 工具,对任意 Agent preset 生效。支持run_in_background、job_output/job_kill,前台超时可转后台继续运行;缺少 job registry 时降级为前台执行。它需要按配置文档挂载,并与梁神模式内置的同名bash工具择一启用。(#1376 by @ccch1mneyyy) - 插件列表、详情和安装源查询:DSH 下新增
/plugin list,简洁显示 profile 额外安装的插件;/plugin info <名字或 spec>查询已装条目或待装包,/plugin registries查看安装源,/plugin check <路径>校验清单。子命令与含@scope/的已装包名支持补全,无参保留完整诊断报告;本版这些命令用于查询与校验,安装、卸载和启停动作尚未接入。(#1504 by @Lucas2011wastaken)
插件与后端开发
- 后端注册与安装配方声明:内置后端通过
manifest.ts与生成索引进入运行时注册表,模型、内核目录及资源清理按声明接入;安装向导按后端声明的包名、版本和执行器定位目标。关闭向导会取消在途安装,确认面板显示实际安装包。(#1380、#1408 by @Lucas2011wastaken) - 新增
Backend贡献族与准入链:提供BackendSpec、validateBackendSpec、backendAdmission等公开声明与校验面,能力和权限声明进入准入判定,Backend坐标接入 registry 与 host descriptor。Claude、Codex 已使用公开接缝;第三方后端安装后自动出现在 kernel picker 的完整装配链路仍未交付。(#1449、#1471、#1480、#1500 by @Lucas2011wastaken) - 第一版插件 API 形态冻结:
tui.dsh/v1alpha1明确冻结公开面,设置区块、全屏场景、托管对话框、状态行、快捷键和条目渲染器纳入承诺:已发布形状只增不删、语义保持,破坏性变化使用新坐标,并先经过一个已发布次版本的弃用窗口。Backend验收进入构建门禁;toast 与侧栏 Panel 继续处于实验阶段。(#1477、#1502 by @Lucas2011wastaken)
修复与稳定性
- 启动草稿与命令补全:自动接入后端时保留草稿与附件;启动页
Tab补全、Enter执行后清空,与聊天页一致。窄卡片中的补全面板不再溢出或产生幽灵空行;启动页的/resume、/home、/jobs正确打开整屏视图。(#1492、#1425、#1413 by @CikeSeven;#1344 by @xiaoxiaohaigui) - 剪贴板位图与 HiDPI 图片:BMP/DIB 先通过现有纯 JS 解码器转 PNG 再进入附件管线,修复合法剪贴板位图被拒绝;Kitty 立绘按预留格子的物理像素缩放,在 HiDPI 终端中尺寸正确,并受单图与整帧预算约束。(#1490 by @ccch1mneyyy;#1498 by @CikeSeven)
- 内核切换后的图片探测:交接前停止旧进程预读 stdin,新进程能收到图片协议应答,立绘无需额外按键或鼠标事件即可恢复;退出和交接后停止迟到的迁移提示,避免旧进程崩溃。(#1509、#1438 by @CikeSeven)
- 流式阅读与换行:流式更新保留消息行的实测高度,向上阅读时保持手动滚动锚点;正文、任务卡、todo、宠物气泡、表格和行内公式恰好满行时不再多出续行分隔空格,复制保留原文分隔。(#1296 by @xiaoxiaohaigui;#1279、#1290 by @xuzijian2019)
- 空会话不再污染历史:DSH JSONL 下,启动或
/new的权限初始化事件先留在内存,后续真实会话活动才保存完整日志;只有初始化的会话不会因 flush 落盘,dsh web侧栏不再积累“未命名”空行。(#1395 by @CikeSeven;#1407 by @baobaolaodie) - 前台 Shell 不再留下重复任务卡:前台 Bash 调用完成并由内核移除 job 后,转录不会残留同命令、同输出的后台任务卡,也不会误报“后台任务完成”。(#1430 by @ccch1mneyyy)
- Codex 评审、队列与侧问:
/review完成或 Esc 取消后释放输入队列,清理命令预览,排队消息可用Alt+↑取回;新 thread 上的/btw临时只读 fork 正常工作。(#1507 by @CikeSeven;#1421 by @ccch1mneyyy) - Codex provider 凭据桥接:未在 shell 导出的
env_key可从活动 DSH home 的凭据库读取,并回退默认~/.dsh;仍找不到时启动提示原因和变量名,由 Codex 在实际请求时处理认证。(#1421、#1433 by @ccch1mneyyy) - Claude CLI 探测与内核可用性:识别 PATH 之外的
~/.local/bin原生安装目录,并跟随 npm shim 找到真实脚本;SDK 缺失时显示发现的 CLI。已安装内核不再因检测不到凭据而被置灰,凭据也可来自 CLI 设置、helper 或渠道档案。(#1512 by @baobaolaodie;#1400 by @ccch1mneyyy) - 中文 Markdown 与子代理标题:
**标签:**正文等紧邻中文标点的粗体正确闭合;并发派发和迟到启动的子代理卡片标题正确匹配任务身份。(#1385 by @ccch1mneyyy;#1389 by @MomentDerek) - 计划开关与启动排版:
/plan on、/plan off只切换计划状态,不再把on/off作为提示词发送;收紧 ANSI Shadow 字距,并按品牌与节日标题预算启动页,保住窄屏输入区域。(#1372 by @Lucas2011wastaken;#1411 by @ccch1mneyyy)
安装与更新
npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui@0.15.0已安装用户可使用 /update 或 dsh-tui update。Release 资产提供一键安装整合包、Linux/macOS/Windows 便携包及 SHA256SUMS。
What's Changed
- chore(release): prepare v0.14.1 by @CikeSeven in #1367
- revert(release): withdraw v0.14.1 by @CikeSeven in #1368
- fix(plan): treat the catalog's on/off tokens as the plan switches by @Lucas2011wastaken in #1372
- feat(presets): add winbash, the Windows bash tool with background jobs by @ccch1mneyyy in #1376
- docs(contributing): add contribution discipline and PR review principles by @ccch1mneyyy in #1382
- docs(release): credit maintainers in hand-written release notes by @ccch1mneyyy in #1383
- fix(markdown): close CJK-adjacent strong emphasis by @ccch1mneyyy in #1385
- refactor(backend): move the backend set to a runtime registry driven by manifests by @Lucas2011wastaken in #1380
- feat(side-panel): resize the sidebar by dragging its divider by @CikeSeven in #1391
- fix(session): defer unused DSH session persistence(修复空会话污染) by @CikeSeven in #1395
- fix(side-panel): render registered icons in the header by @CikeSeven in #1393
- fix(test): disambiguate auto-recap panel assertions by @CikeSeven in #1397
- fix(subagents): 修复并发与迟到启动时的标题错配 by @MomentDerek in #1389
- feat(permission,retry): persist the DSH permission pick and auto-retry upstream drops by @ccch1mneyyy in #1415
- fix(splash): tighten ANSI Shadow letter spacing by @ccch1mneyyy in #1411
- fix(side-panel): route launchpad commands to full-screen views by @CikeSeven in #1413
- feat(btw): rework panel focus model and input box by @ccch1mneyyy in #1417
- feat(theme): rotate the user prompt tint across kernel brands by @ccch1mneyyy in #1420
- fix(codex): pass stored provider keys and fork side queries on fresh threads by @ccch1mneyyy in #1421
- fix(resume): focus latest workspace session / 默认聚焦工作区最近会话 by @CikeSeven in #1423
- fix(launchpad): align command completion and clearing(启动页补全与清空对齐聊天页) by @CikeSeven in #1425
- fix(jobs): drop the phantom card of foreground shell calls by @ccch1mneyyy in #1430
- fix(btw): anchor the IME cursor in the panel composer by @ccch1mneyyy in #1431
- fix(codex): resolve provider env keys from the default store and report the reason by @ccch1mneyyy in #1433
- feat(tui): support native cursor animation and trails by @CikeSeven in #1428
- fix(tui): improve text selection UX(优化文本选择与光标跟随) by @CikeSeven in #1440
- fix(tui): stop migration hints after shutdown handoff by @CikeSeven in #1438
- refactor(backend): resolve install surfaces from a declared recipe, not a backend id by @Lucas2011wastaken in #1408
- feat(model): redesign model picker and reasoning controls / 模型与推理选择页改版 by @CikeSeven in #1436
- feat(model): reveal the native cursor during picker movement / 模型选择器移动光标与停驻隐藏 by @CikeSeven in #1443
- feat(sessions): share the first-paint listing snapshot across backends by @ccch1mneyyy in #1458
- feat(backend): add the Backend contribution family and fail closed on unresumable resume targets by @Lucas2011wastaken in #1449
- fix(launchpad): support image paste in the startup draft by @CikeSeven in #1460
- fix(model-picker): confirm model on effort click(点击推理档位即确认) by @CikeSeven in #1466
- perf(sessions): prioritize workspace session listing / 优先加载当前工作区会话 by @CikeSeven in #1464
- fix(sessions): preserve selection and follow focus with the native cursor / 保持会话选择并让光标跟随焦点 by @CikeSeven in #1468
- feat(settings): launchpad on-boot toggle — off boots straight into chat / 启动页开关:关闭后直达聊天页 by @ccch1mneyyy in #1476
- fix(kernel): stop dimming installed kernels on undetected credentials by @ccch1mneyyy in #1400
- feat(host): own the entry and composition root, load DSH in process by @MomentDerek in #1441
- fix(host): settings-document robustness and the startup-adoption tail / 设置文件与接管尾段的两处修复 by @ccch1mneyyy in #1483
- refactor(backend): rewrite the Claude backend against the public surface by @Lucas2011wastaken in #1471
- test(backend): give the Backend conformance a CI body and write down the public surface by @Lucas2011wastaken in #1477
- fix(images): decode clipboard bitmap pastes instead of refusing them by @ccch1mneyyy in #1490
- fix(startup): preserve drafts when the backend becomes ready / 后端就绪时保留启动草稿 by @CikeSeven in #1492
- refactor(codex): move the codex backend onto the public surface and zero the boundary debt by @Lucas2011wastaken in #1480
- feat(kernel): add direct kernel switch commands / 新增内核直达命令 by @CikeSeven in #1497
- perf(sessions): preload workspace history and reduce resume latency / 预加载工作区会话并降低恢复延迟 by @CikeSeven in #1494
- fix(images): fit HiDPI portraits within the frame budget / 修复标题女仆图尺寸与整帧预算 by @CikeSeven in #1498
- feat(profile): wire the Backend contribution family into the registry and descriptor chain by @Lucas2011wastaken in #1500
- feat(profile): close the protocol and freeze the first published apiVersion by @Lucas2011wastaken in #1502
- feat(theme): add the Sakura Pink palette family as built-in presets by @xiaoxiaohaigui in #1294
- fix(codex): restore review cancellation and queued input / 修复评审取消与消息队列 by @CikeSeven in #1507
- fix(scroll): retain streaming row heights to preserve manual anchors(流式更新保留行高,保持上翻位置) by @xiaoxiaohaigui in #1296
- fix(terminal): prevent image probe stalls after kernel switches / 修复内核切换后图片探测卡住 by @CikeSeven in #1509
- fix(launchpad): keep the command palette inside the card(面板吃卡片宽、行内容吃预算,幽灵空行与截断边角一并修) by @xiaoxiaohaigui in #1344
- feat(statusline): weight the context bar's fills with the meter's contextBreakdown by @xiaoxiaohaigui in #1351
- fix(profile): restore upstream reporting defaults(恢复官方上报默认) by @ccch1mneyyy in #1375
- fix(session): keep unused sessions out of JSONL(未使用会话不落盘) by @baobaolaodie in #1407
- docs(settings): clarify splash art precedence by brand(按品牌说明开屏艺术优先级) by @baobaolaodie in #1369
- fix(ink): drop leading separator space on exact-fill soft wrap by @xuzijian2019 in #1279
- fix(wrap): remove exact-fill separator gaps in components by @xuzijian2019 in #1290
- fix(model): preserve session identity when switching routes by @xuzijian2019 in #1275
- fix(claude): reach the native CLI under ~/.local/bin and follow npm shims / 补探原生安装目录 + 跟随 npm shim + SDK 缺失时报出本机 CLI by @baobaolaodie in #1512
- test(composer): cover in-session model-switch drafts / 同会话换模型草稿回归 by @baobaolaodie in #1488
- fix(goal): read long goals by hover and the bare /goal block by @xuzijian2019 in #1223
- feat(plugin): open the /plugin command surface with a short list and subcommand completion by @Lucas2011wastaken in #1504
- feat(notifications): notify on task completion / 任务完成终端通知 by @CikeSeven in #1517
Full Changelog: v0.14.0...v0.15.0