交互与命令
August 31, 2026 · View on GitHub
输入与全局快捷键
| 按键 | 行为 |
|---|---|
Enter | 空闲时发送;模型工作时把文本 steer 到当前回合的下一步边界;菜单打开时确认选项 |
Tab | 补全 / 命令或 @ 文件;模型工作且输入非空时排入当前回合之后的 follow-up |
Ctrl+Enter | 打断当前回合并立即处理输入消息 |
Shift+Enter / Ctrl+J | 在光标处插入换行;终端无法上报 Shift 修饰键时可用 Ctrl+J(LF)兜底,macOS Terminal.app 用 Option+Enter |
Shift+Tab | 在配置的会话模式间循环(默认:默认 → 计划模式 → 完全访问) |
Alt/Option+Up | 把最后一条尚未处理的消息取回输入框编辑 |
Up/Down | 菜单选择;普通输入中浏览历史或在多行文本间移动 |
Ctrl+V / Alt+V | 从系统剪贴板插入文本或文件;图片作为持久附件发送。终端拦截 Ctrl+V 时用 Alt+V |
Ctrl+G | 用外部编辑器($VISUAL → $EDITOR)编辑当前输入,保存退出后回填;:cq 或非零退出保留原稿;未设置变量时提示配置,无 vi 兜底 |
Ctrl+Shift+E | 展开全屏草稿编辑器(也可点输入行尾 ⛶):行号 + 当前行高亮 + 行/字统计,Enter 换行、Ctrl+Enter 或「发送」按钮发送、Esc 或「收起」按钮收起(草稿保留);滚轮自由滚动、点击定位/拖选/双击选词与输入框一致;可经 /settings 重映射 |
Esc | 层级:关帮助 → 关命令菜单 → 关文件菜单(仅当前 @ token)→ 输入框内有选区时仅清选区(文本不动) → 中断回合并重投 pending 消息 → 有输入时清空 → 空输入连续两次 = 时间回溯 rewind;fullscreen 下有鼠标选区时优先取消选区(不复制) |
Ctrl+C | 工作时中断;中断迟迟不收敛时再按一次强制退出;空闲且有输入时清空;空闲且输入框内有选区时复制选区到剪贴板(保留选区继续编辑);空输入时连续两次退出 |
Ctrl+D | 与 Ctrl+C 同阶梯:工作中=中断(未收敛时再按=强制退出);空闲时连续两次退出 |
Ctrl+O | 切换 transcript/verbose 详情,展开思考与完整工具参数/输出 |
Ctrl+P | 切换启动时加载的 loaded-context 面板(面板在屏时有效) |
Ctrl+T | 打开轨迹场景(等同 /trace);场景内 q/Esc 返回对话 |
Ctrl+R | 打开输入历史搜索;重复按或 Down 移到下一项 |
Ctrl+L | 强制清理并重绘物理终端 |
? | 输入框为空时打开快捷键和命令帮助 |
Help 内 ↑/↓、PgUp/PgDn、Home/End | 逐行滚动、翻页或跳到命令列表首尾;Esc 关闭 |
Shift+Up | 进入消息选择模式;方向键移动,Enter 展开单条,Esc 退出 |
动作型快捷键(粘贴、历史搜索、外部编辑器、Ctrl+O/T/P/R/L、子代理面板、显示全部、待办折叠)支持在 /settings → dsh-tui → Shortcuts 中自定义:填写 alt+v 这类组合,多个用逗号分隔,留空恢复默认,保存即生效;与固定编辑键或其它动作冲突的组合会被拒绝。cordis.yml 亦可用 shortcuts.<action> 静态指定。
/ 有两种语义:普通输入模式中打开 slash command 补全;Ctrl+O 的
transcript 模式中打开会话全文搜索。全文搜索使用 n/N 在结果间前后跳转。
插件可以经 tuiShortcuts 接缝注册额外组合键(必须带 Ctrl 或 Alt);内建绑定
永远优先,冲突的组合在注册时就会被拒绝。插件弹出的托管对话框
(select/confirm/input)打开期间独占键盘:↑/↓ 移动、Enter 确认、
Esc 取消;插件在状态行(提示框上方)也可能有纯展示的贡献文本。
输入编辑
| 按键 | 行为 |
|---|---|
Left/Right | 按字符移动光标;有选区时坍缩到选区对应边缘 |
Ctrl+Left/Right | 按单词移动 |
Home/End | 移到当前逻辑行首/行尾 |
Ctrl+A / Ctrl+E | 编辑器中移到当前逻辑行首/行尾;Ctrl+E 还会展开或折叠长会话中隐藏的旧消息 |
Ctrl+U | 删除光标前内容 |
Ctrl+K | 删除光标后内容 |
Ctrl+W | 删除前一个单词 |
Backspace / Delete | 删前一 / 后一字符;有选区时删除整个选区 |
| 打字 | 有选区时替换整个选区,光标落在插入文本之后 |
vim 编辑模式(/vim)
/vim 切换输入框的 vim 编辑模式(会话级、不持久化):开启后输入框左侧出现
INSERT 徽标,打字照常;Esc 切到 NORMAL 徽标,裸键按 vim 语义处理。
| NORMAL 键 | 行为 |
|---|---|
h / l | 左 / 右移一个字符 |
j / k | 下 / 上一行(多行输入) |
0 / ^ / $ | 行首 / 行首首个非空白 / 行尾 |
w / b | 下一个 / 上一个词首(空白分词) |
x / X | 删除光标处 / 光标前字符(行尾时 x 删最后一个字符) |
d + 第二键 | dd 删整行(含换行)· d$ 删至行尾 · d0/d^ 删至行首 · dw 删至词尾 |
u | 撤销最近一次 vim 编辑(栈上限 100) |
i / I / a / A | 光标处 / 行首首个非空白 / 光标后 / 行尾进入 INSERT |
o / O | 下方 / 上方新建一行并进入 INSERT |
/ | 插入 / 并切回 INSERT(打开命令菜单) |
Esc | 取消待决 d;其余无操作(不触发现有清空 / 双击 rewind 语义) |
Enter / Tab / 方向键 / Ctrl+* 组合 | 照常放行(发送、补全、历史、编辑快捷键等) |
| 其他裸键 | 忽略,不插入 |
注意:vim 开启时 Esc 归 vim 管——时间回溯请退出 vim 模式后双击 Esc 或
用 /rewind;回合运行中 insert 模式下按 Esc 也只是回 normal,打断回合用
Ctrl+C / Ctrl+Enter。NORMAL 下清空输入用 Ctrl+C 或 dd。
Bracketed paste(右键或终端原生粘贴)会保留普通文本与换行,不会把粘贴内容误当 成 Enter 提交。为保证输入框显示、点击与选区几何一致,终端 ANSI 控制序列会被剥离, Tab 会在进入编辑缓冲区时展开为空格。
全屏草稿编辑(Ctrl+Shift+E / ⛶)
长草稿不再挤 5 行小窗:Ctrl+Shift+E(可重映射)或输入行尾的 ⛶ 按钮把当前
草稿展开成整屏编辑器,编辑状态(光标/选区/折叠/vim 模式)与输入框完全同一份。
可在 /settings → dsh-tui 关闭(expandEditor,默认开)——关闭后 ⛶ 与快捷键
两个入口都不再出现。
- 外观:圆角边框随会话强调色/plan 色联动;左侧行号槽(宽度随行数伸缩,
光标行号提亮);光标行整行浅底色;标题行实时显示行数/字数,状态行显示
行 L · 列 C与 vim 徽标(/vim开启时)。 - 键位:
Enter换行(绝不误发送)、Ctrl+Enter或「⏎ 发送」按钮发送并 收起;Esc分层(先清选区,再收起编辑器,草稿保留);Tab插入 4 空格 缩进;其余编辑键(方向/词跳/Home/End/Ctrl+U/K/W、vim NORMAL 键位)与 输入框一致。折叠块互斥:收起态粘贴大文本照旧折叠成 chip;编辑器一旦 展开块即散开(与点击 chip 展开同语义),展开期间粘贴一律是纯文本、直接 可编辑,收起后也不会再变回块。 - 鼠标:点击定位光标、拖拽建选区、双击选词、
Ctrl+C复制选区,几何按 行号槽宽度校正;滚轮自由滚动(浏览时不强制跳回光标,任何光标移动后恢复 跟随);「发送」「收起」按钮可点击且 hover 提亮。 - 与
Ctrl+G外部编辑器互补:不依赖$VISUAL/$EDITOR,不离开终端。
@ 文件引用
在消息任意位置输入 @ 会打开文件补全菜单:继续输入过滤,Tab/
Enter 选择,目录可继续深入。普通文件名片段走模糊匹配(@ment 命中
src/utils/mentions.ts,前缀/边界命中优先、短路径优先);输入路径形态
(@src/、@./、@../、@~/、@D:\ 或含分隔符)时只读取该目录做局部
补全,不再全仓扫描。Esc 只关当前 @ token 的菜单;异步候选刷新时按候选
身份保持当前选中项。发送消息时,文本文件内容或目录列表会自动附加
到消息中;PNG、JPEG、WebP、GIF 会通过 Harness 附件库作为真正的图片块发送。
文件读取走当前 workspace 的 FS 服务,提供者管理的 workspace 同样适用。
Ctrl+V 粘贴时,文件管理器(Windows Explorer、GNOME Files、KDE Dolphin 等)复制
的普通文件会插入路径,图片文件会自动插入 @ 引用。剪贴板位图会保存到附件库,
输入框显示 [Image #N],发送时变成真正的图片块;输入文本中不含 base64。
界面语言
/lang 在简体中文与英文界面之间切换(影响所有 UI 文案),选择持久化,重启后
沿用(0.3.7+)。/settings 的 dsh-tui → 界面语言 下拉项同样可以切换
(立即生效并保存到 ~/.dsh/settings.yaml 的 dsh-tui.lang;DSH_TUI_LANG
环境变量始终优先)。
消息投递语义
模型正在工作时有三种不同路径:
| 操作 | 放置位置 |
|---|---|
Enter | steer:送入正在运行的回合,在下一步边界被 Agent 领取 |
Tab | follow-up:等待当前回合结束后再处理 |
Ctrl+Enter | interrupt:中断当前回合并立即投递 |
输入框上方会显示尚未领取的消息。Alt/Option+Up 可以取回最后一条,模型工作时
按 Esc 会中断并立即重投当前 pending 消息。
会话工作流
Resume
/resume 打开会话浏览器——一个全屏界面,而不是浮层面板。默认列出当前工作目录
下的对话,按最近活动排序;确认后切换 Agent 并回放持久化事件。
浏览器只显示对话。模型委托出去的子 agent 运行也各自持久化为会话(判据是
会话头的 origin: 'subagent'),默认折叠并在顶栏计数,ctrl+s 可展开为父会话
下的缩进行。/rewind 产生的回溯分支不受影响——它只写 parentSession 而不写
origin,是用户自己的对话。只记录了启动策略、没有任何对话内容的会话不进列表,
只在顶栏计数,ctrl+x 显式清理(作用域与当前列表一致,不跨项目)。
| 按键 | 作用 |
|---|---|
| 直接输入 | 实时搜索标题、目录、分支、模型 |
↑ ↓ / PgUp PgDn | 移动、翻页 |
Enter | 恢复选中的会话 |
Tab | 预览该会话的最后几轮往来 |
ctrl+a | 切换「仅本项目 / 全部项目」(跨项目时按目录分组) |
ctrl+b | 只看上次使用时所在分支的会话 |
ctrl+s | 展开 / 折叠子 agent 运行 |
ctrl+p | 固定 / 取消固定选中会话(固定项在当前筛选范围内置顶) |
ctrl+r / ctrl+d | 重命名 / 删除选中会话 |
ctrl+x | 清理没有对话内容的空会话 |
Esc | 先清空搜索,再退出 |
会话行点击 = 恢复该会话(同 Enter);点击 ★/☆ 或 ctrl+p 切换固定状态,
固定项原子持久化到 ~/.dsh-tui/session-pins.json。右键菜单提供打开、固定/
取消固定、重命名和删除;删除/清理的确认行点击 = 确认执行,取消保留键盘 Esc。
展开的子 agent 运行也可固定,并会在「已固定」组中独立置顶。
每行显示标题、最近活动时间、上次使用时的 git 分支、日志大小与模型。标题按证据
分级:/rename 的名字、自动生成的标题、首条提示的摘录,或(都读不到时)目录名
——最后一种会显示为灰色,表示它不是一个真正的名字。
列表只读取会话日志两端的定界窗口,并按持久层自己的变更令牌缓存结果,因此打开 速度与历史长度、单个会话大小都无关。
Windows dsh-tui.cmd --resume 使用 ~/.dsh-tui/resume.txt 中最后选择的会话 ID
(该文件同时双写到旧路径 ~/.dsh-cc/resume.txt,供只读旧路径的旧版启动器过渡)。
会话总览(Agent View)
/agentview 打开会话总览——一个全屏界面,列出本进程内的全部会话:当前会话、
从这里派发的后台会话,以及磁盘上已停止的历史会话。行按状态分组(等待输入 >
运行中 > 失败 > 已完成 > 空闲 > 已停止),每行带一行活动摘要——取自会话自身
输出,不做额外摘要模型调用。
| 按键 | 作用 |
|---|---|
| 直接输入 | 底部输入框写任务描述 |
Enter | 输入框有文字=派发新后台会话;否则切换到选中会话 |
Shift+Enter | 派发并立即切换过去 |
↑ ↓ / PgUp PgDn | 移动、翻页 |
→ | 切换到选中会话 |
Space | 打开/关闭预览面板(输入框为空时);预览内输入回复 + Enter 发送 |
Ctrl+X | 停止后台会话;两秒内再次按下删除 |
Ctrl+R | 重命名选中会话 |
Esc | 关预览 → 清空输入 → 退出 |
Ctrl+C | 清空输入;再按一次退出 |
? | 快捷键帮助 |
派发出去的会话在本进程内独立运行(回合、工具、审批照常),TUI 切换到其他会话
不打断它。后台会话的审批请求会显示为「等待输入」,审批面板直接在总览内弹出
(标注来源会话),行的摘要显示它被阻塞的问题。/bg(别名 /background)把
当前会话转入后台继续运行、终端切到新会话并打开总览;聊天输入框为空时按
← 是同一件事——当前会话转入后台并直接打开总览(输入框有文字时 ← 照常
移动光标)。经 ←//bg 打开时,总览顶部显示「当前会话已转入后台——Enter
打开它 · Esc 返回它 · Ctrl+C 两次退出」,最终 Esc 会返回被转入后台的会话。
输入框底部在有会话等待输入时显示「← N 个会话等待输入」计数(N=0 时不占行)。预览与回复对运行中会话即时生效;
已停止会话需先 Enter 切换进去。后台会话随 TUI 进程退出而停止(日志保留,
可恢复);没有 supervisor 进程。
Rewind
输入框为空时连续按两次 Esc 打开用户消息列表。选择并确认后:
- 找到该消息所属 turn 的开始事件。
- 通过 DSH session fork 创建分支会话。
- 回放该边界前的历史。
- 把原消息放回输入框供修改和重发。
- 边界取该消息所属回合开始之前;不能回退到第一条消息。
- 若模型正在工作:先取消回合并等落定(最长 30s)。
- 回退后的分支不算子 agent(只写
parentSession,无 origin 标记),继续用 当前模型路由 + 会话自己的 preset。
插件可以介入这一步(tui/rewind-prompt 决策事件):否决此次回退(给出原因),
或在确认页提供额外的回退模式——例如"回退会话 + 恢复此间修改的文件"。确认页
第一项恒为"仅回退会话";选择插件模式后,回退完成时插件会收到
tui/rewind-done 通知(带所选模式 id 与新旧会话 id)并可回执一条摘要。
鼠标:列表页点击行只选中(进入确认必须键盘 Enter);确认页的消息行 / 模式行点击 = 直接执行该回退。
侧问 /btw
/btw <问题> 发起一次不打扰主任务的快速侧问:复用当前会话上下文(system
prompt + 已有历史)做一次无工具、单轮的模型调用,答案显示在可滚动的浮层
面板里。要点:
- 不进会话历史:问答不写入 session log,也不会出现在主上下文与 token 计数里(关闭面板即消失)。
- 不打断主回合:模型正在流式输出时也可以触发,主任务继续运行。
- 面板内
↑/↓滚动,Space/Enter/Esc关闭,c复制答案;等待答案 时Esc取消。 - 再次触发
/btw会中止上一个侧问。
轨迹场景(/trace / Ctrl+T)
整屏场景(不污染 scrollback),查看会话全程的时间线:
| 按键 | 作用 |
|---|---|
←/→(或 h) | 切换 时间线 / 热点 视图 |
↑ ↓ / PgUp PgDn | 移动、翻页 |
[ / ] | 跳上 / 下一个失败点 |
{ / } | 跳上一轮 / 下一轮 |
/ | 查询行:tool: kind: turn: err: run: >10s tok>1k 前缀,多条 AND,命中列原位高亮 |
m | 循环投影模式(等分 / 墙钟 / 压缩空闲) |
g / G | 跳到顶部 / 底部 |
Enter | 展开详情;j/k 在详情内翻页 |
t(热点视图) | 循环排序(耗时 / 次数 / token) |
q / Esc | 退出;Esc 三层:收详情 → 清查询 → 关闭 |
以上全部有鼠标等价(inline 模式的整屏场景同样启用鼠标跟踪):时间线/热点
行点击跳光标、页签与右上标签点击切换/循环、查询行与页签空白区点击打开
/ 搜索、波形带(含标尺)点击列跳最近事件、滚轮移动光标。
/settings 设置编辑器
/settings 打开插件设置编辑器,按命名空间读取/编辑。编辑是暂存制:
↑/↓ 移动、Enter 展开/切换/编辑,s 保存 / d 放弃 / Esc 先丢弃
脏区再退出。鼠标:字段/组行点击 = 设焦点并执行该行 Enter 动作,悬停即
移动焦点,滚轮走焦点(焦点跟随窗口下即滚动)。dsh-tui 自身命名空间的字段写入 settings.yaml 用户层并实时生效
(lang、statusBar.* 等);未声明 TUI 区块的命名空间以只读形式列出,需
手工编辑 ~/.dsh/settings.yaml。
Model 与 preset
/model 通过在当前历史末尾 fork 会话来切换模型,因为 DSH 没有原位换模型 API。
旧会话仍保留在 /resume 中。
/preset 只允许空白会话原地切换。已经开始的会话会把选择保存为下一次 /new
或启动时的默认值。详细规则见配置参考。
工作区
/workspace resume 打开工作区选择器;/workspace rename <名称> 重命名当前工作区;
/workspace open <目标> 直接打开工作区并创建一个全新会话。/resume 和 /rename
仍分别用于当前工作区内的会话切换和当前会话重命名。
本地目标可以是绝对路径、相对当前本地工作区的路径或标准 file:// URI。其他 URI
scheme 和 /workspace 子命令可由可选插件注册,TUI 本身不认识任何具体外部协议。当前工作区属于插件时,
相对路径也由该插件在自己的路径空间内解析。
输入 /workspace 后会列出内建及插件注册的子命令;继续输入前缀并按 Tab
即可补全,例如 /workspace rem。插件别名同样参与匹配。
启动器同样接受工作区目标,例如 dsh-tui .、dsh-tui ../project 或
dsh-tui file:///path/to/project。未安装任何工作区插件时,本地路径、!command
和全部普通 TUI 会话流程保持可用。
Fullscreen 与鼠标
fullscreen: false 是默认 inline 模式,终端模拟器拥有原生 scrollback 和选区。
fullscreen: true 使用 alternate screen,并启用应用内鼠标处理:
| 操作 | 行为 |
|---|---|
| 滚轮 | 按位置路由:补全/命令菜单悬停处移动菜单选中行;最上层滚动容器(转录 / 帮助 / 子代理面板)滚它;其余位置滚动会话消息列表;浮层打开时不穿透滚动背后转录;轨迹场景移动光标(时间线一格 ±3 行、热点 ±1 行、详情展开时滚详情);设置屏移动焦点行 |
| 拖拽 | 选择文本,松开后立即复制并清除选区 |
| 双击/三击 | 选择单词/整行并复制 |
Esc | 取消正在进行的拖拽(或现有选区),不复制 |
| 单击消息行 | 纯文本行(用户/assistant)无操作——转录是阅读区,鼠标职责是选字 |
| 单击工具卡 / thinking / compact 摘要 | 展开 / 收起(hover 时标题提亮指示,行右侧空白不触发) |
| 单击子代理卡 | 打开该子代理的详情场景(hover 时状态符号提亮) |
| 单击输入框 | 定位文本光标到点击处(多行/换行/CJK 均按显示宽度对齐) |
| 输入框内拖拽 | 建立输入框选区并高亮渲染(caret 跟随拖拽末端):Backspace/Delete 删选区、打字替换选区、←/→ 坍缩到对应边缘、Esc 仅清选区;拖拽只映射可见行(暂不做边缘自动滚动);折叠块存在时选区钳制在 head 或 tail 一侧、不跨 chip 行 |
| 输入框 Shift+click | 从选区头(无选区时为光标)扩展到点击处 |
| 输入框双击 | 选词(组件内自检测,500ms / 1 格;路径与标点连串整选) |
输入框 Ctrl+C(有选区) | 复制选区到剪贴板(OSC 52 + 原生工具兜底)并保留选区继续编辑 |
全屏编辑器(Ctrl+Shift+E 展开) | 点击定位/拖选/双击选词与输入框同路径(坐标按行号槽校正);滚轮滚编辑窗口(位置路由,光标移动后恢复跟随);「发送」「收起」按钮点击执行、hover 提亮;输入行尾 ⛶ 点击展开 |
| 单击「加载更早消息」/「ctrl+e 显示前 N 条」 | 加载更早消息 / 展开全部 |
| 单击 StickyHeader / 「↓ N new messages」 | 跳回固定消息处 / 滚动到底部 |
| 单击超链接 | 打开浏览器 |
| 单击 picker / 菜单条目行 | 选中并立即应用(模型/技能/活动帧/预设/权限/plan/语言/主题/effort 档位/命令与文件补全/历史命令/会话行/thinking 显示模式/工作区目标与子菜单/工作区命令分支),与键盘 Enter 同路径;busy 或输入态中的浮层行禁点 |
| 单击 rewind 候选行 / 确认页 | 列表页点击只选中(确认保留键盘 Enter——高危操作显式触发);确认页消息行 / 模式行点击 = 直接执行(确认页本身即显式确认层) |
| 单击审批 / 问卷 / 计划评审 / 插件对话框决定行 | 直接提交该决定(agent 阻塞等待时可鼠标放行) |
| 单击轨迹场景 | 时间线/热点行点击 = 光标跳该行(热点行跳回时间线定位该组,同 Enter;hover 亮 dim ▸ 轻指示不刷背景);页签点击切视图;右上排序/投影标签点击循环;查询行与页签空白区点击打开 / 搜索;波形带(含标尺行)点击列 = 跳最近事件 |
| 单击 /settings 字段 / 组行 | 设焦点并执行该行的 Enter 动作(boolean/select 循环值、文本进编辑态、组进组页);悬停即移动焦点(lazygit 语义),编辑态整屏不响应防误触 |
| 单击会话浏览器确认行 | 删除/清理确认行点击 = 确认执行(同 Enter);取消保留键盘 Esc |
| 单击帮助菜单命令行 | 填入 /name 并关闭帮助(Tab 补全的鼠标等价) |
| 键盘扩展选区 | 有选区时 Shift+←/→/↑/↓/Home/End 扩展 / 收缩(跨行环绕) |
复制优先使用 OSC 52;本地终端可回退到 wl-copy、xclip 或 xsel,tmux 使用
load-buffer -w。设置 DSH_TUI_DISABLE_MOUSE=1 可临时关闭 fullscreen 鼠标。
ask_user_question 问卷
模型调用问卷工具时,问卷面板暂时拥有键盘:
| 按键 | 行为 |
|---|---|
Up/Down | 移动选项 |
Space | 多选题勾选或取消 |
Tab | 切换到自定义文本回答 |
Enter | 提交当前题 |
Esc(第 2 题起) | 返回上一题并保留当前草稿 |
Esc(第 1 题) | 取消整批提问,模型收到 ASK_CANCELLED |
Ctrl+C | 从任意题取消整批提问,模型收到 ASK_CANCELLED(harness 侧中止仍报 ASK_ABORTED) |
最后一行是自由输入行:直接在选项行打字 = 附加该选项标签 + 自定义文本一起
提交(不必先 Tab),Tab 直达输入行。
一批多题以及并发子代理提问会按 FIFO 逐题显示。完成后,问答摘要折叠进本地 transcript。
计划评审(plan review)
计划模式下模型调用 exit_plan_mode 时,计划全文以 markdown 渲染在评审面板中
(intent: plan-review 的专用决策布局):
| 按键 | 行为 |
|---|---|
Up/Down | 在选项与底部反馈输入行之间移动 |
| 鼠标滚轮 | 滚动计划正文;批准 / 继续规划 / 反馈行保持钉在视口内 |
1/2 | 直接提交对应选项(反馈缓冲为空时;非空则数字视为反馈字符) |
| 打字 | 进入反馈输入行 |
Enter(选项行) | 提交该选项;批准行有反馈时会报错——批准必须不带反馈,否则协议视为"继续规划" |
Enter(输入行) | 提交"继续规划"并附上反馈文本 |
Esc | 打断评审去说话(ASK_CANCELLED),模型停留在计划模式 |
批准计划或执行 /plan off 后,会话恢复进入计划前的实际沙箱与审批策略;
Shift+Tab 切走则保留用户选择的目标模式,包括运行中延迟生效的切换。
恢复已有会话时从事件历史还原进入前权限;历史不足以确定的权限保持不变,
不会因为无法匹配配置模式而自动回落到 full access。
工具审批(approval)
权限层发起 approval/request 时,审批面板显示工具名、从配对 tool call 提取的
完整命令与原因,并暂时拥有键盘(同时挂起问卷时审批优先):
| 按键 | 行为 |
|---|---|
Up/Down | 移动选项 |
1 / 2 | 允许(仅本次)/ 拒绝 |
Enter | 提交当前焦点项 |
Esc / Ctrl+C | 拒绝(fail closed) |
协议只有「允许一次 / 拒绝」两种结果,没有「总是允许」。
Slash Commands
命令菜单由本地命令与 DSH 命令注册表合并而成。输入 / 查看当前组合真正可用的
全集。命令描述随界面语言(/lang)中英切换:内置命令与已收录的注册表命令
(/plan、/goal、/feedback)显示中文翻译,其余注册表命令回退注册表原文。
| 分组 | 命令 |
|---|---|
| 会话 | /new、/resume、/agentview(会话总览)、/bg(别名 /background,会话转入后台并打开总览)、/rename、/recap(最近活动摘要 + 建议标题一键应用;设置 recapOnOpen 开启时打开会话自动出分隔线 + 回顾: 摘要行,发送新消息后消失,默认开)、`/workspace resume |
| 状态 | /context、/status、/cost、/balance(DeepSeek 官方余额:摘要行 + hover 明细,点击刷新)、/config、/doctor、/init、/agents、/jobs(后台任务面板:状态/时长/退出码,k 停止)、/settings |
| 模型与显示 | /model、/effort、/thinking、/tokens、/activity、/preset、/theme、/color(会话强调色:无参打开调色板选择器,<名> 直接设置,status/reset;输入框边框 + 右上角会话名标签,按会话保存;标签默认关闭,/settings 可开)、/lang |
| 账号与策略 | /provider、/login、/logout、/permission、/add-dir、/hooks、/mcp、/plugins(check <路径> 校验插件清单) |
| Skills | /skills 浏览 DSH 从当前 profile、用户与项目发现的技能;可直调技能以 /name 加入菜单 |
| 其他 | /update、/vim(vim 编辑模式开关,见「输入编辑」)、/terminal-setup、/connect、/help、/exit(别名 /quit、/q) |
| 注册表 | /plan、/goal,以及当前 DSH 组合注册的其他命令 |
dsh-TUI 不预装通用技能;技能内容与发现规则由 DSH 及当前组合负责。
补充语法:
/activity打开动画选择器;/activity frames <name>直接设置(帧名 30 个:random随机 +claudestar2sandtriangleboxbox2cornerspointlayerflipaesthetichamburgermoonmoon8cometbreathedotsarrowsparkbarbraillearccirclegrownoisebouncerainbowdqpbtoggle,默认moon8);/activity status查看当前选择。/preset <id>与/preset status见配置文档。/effort打开推理强度滑杆(←/→ 实时调整);/effort <id>直接设定,/effort status查看当前档位。/theme <name>与/theme status见主题文档。/permission的名册来自 DSHpermissionPresetsregistry,按声明顺序显示并参与补全;第三方预设无需 TUI 硬编码,custom只显示当前态,不是可选目标。registry 服务缺失时 TUI 使用三项 legacy 兼容名册;服务已挂载但损坏、为空或不一致时标记 unavailable 并 fail closed。若外部/permission命令未注册,输入沿用现有默认命令/model dispatch。/lang切换中英界面语言(见「界面语言」)。/compact压缩会话历史;minimal preset(仅 bash+编辑器)下不可用。/thinking扩展思考显示开关,仅本次界面状态、不持久化。- 启动后会后台检查 npm 新版本;发现更新时会提示。检测遵循 npm registry
配置(
NPM_CONFIG_REGISTRY或~/.npmrc),镜像源用户看到的就是安装源 的最新版。/update更新已安装的@deepseek-harness-tui/dsh-tui,然后自动重启并恢复当前会话;当前回合运行时需等待完成。 仅在dsh --profile <name>启动时可用(源码运行等场景会提示不可用); 已是最新版时直接提示,不会重启。 /plan [off|message]与/goal ...由 DSH 命令插件处理并写入会话事件。- Skill 命令由 host 注入对应
SKILL.md的技能正文后执行,参数原样随行; 技能内容与发现规则由 DSH 及当前组合负责。
/connect、/hooks 当前是兼容占位命令;当 DSH 组合没有
对应能力时会给出明确说明,而不是静默执行。
外部注入通道(编辑器集成)
运行中的会话会开一个本会话独占的本地注入通道,供编辑器插件(如
dsh.nvim)把上下文推进输入框。它是
OpenCode POST /tui/publish 的对应物,但走本地 socket 而非 HTTP 端口:无端口
分配、无鉴权面,端点随会话退出自动清理。
- 传输:Unix domain socket
~/.dsh-tui/inject/<sessionId>.sock(Windows 为命名管道\\.\pipe\dsh-tui-inject-<sessionId>)。 - 发现:
~/.dsh-tui/inject/servers.json列出每个存活会话 (pid、sessionId、cwd、socketPath),客户端据此按cwd匹配项目并 选择目标会话;会话退出时该记录被移除。 - 协议:换行分隔的 JSON,每行一条:
{"type":"prompt.append","text":"@src/foo.ts "}把文本追加到输入框;{"type":"command.execute","command":"prompt.submit"}提交当前输入。追加文本以 空格结尾(OpenCode 惯例)时保持不提交,便于继续编辑。 - 接线:追加复用输入框的
PromptController.append,提交走channel.submit(工作态下自动进 inbox,回合结束后处理)。实现见src/dsh-adapter/inject-channel.ts,回归门禁scripts/verify-inject-channel.mjs。