TUI 全屏模式

niuma_code 的默认界面是基于 prompt_toolkit 的全屏终端 UI,专为长时间编码会话优化。输入框固定在底部——LLM 流式输出期间可随时追加新消息。


布局

┌──────────────────────────────────────────────┐
│              输出区(可滚动)                  │
│                                              │
│  [对话消息 + Thinking 内容]                   │
│                                              │
├──────────────────────────────────────────────┤
│ [1/3] "当前消息"                             │  ← 队列条
│──────────────────────────────────────────────│
│ > 在此输入消息...                             │  ← 输入框
│──────────────────────────────────────────────│
│ [|] model · high ~1234 out / ~5678 in        │  ← 状态栏
└──────────────────────────────────────────────┘

布局层次(从上到下):

  1. 输出区 — 自动滚动的对话显示区,支持 ANSI 彩色渲染
  2. 队列条 — 排队时显示 [N/M] "当前消息",空闲时显示 ── 分隔线
  3. 输入框 — 单行输入,支持自动补全,长文本自动折行(最多 10 行)
  4. 分隔线 — 动态宽度分割线
  5. 状态栏 — 实时流式状态(spinner、token 计数、模型、推理级别)

9 个模态浮层

通过快捷键或命令访问:

快捷键 浮层 访问方式 用途
/model 模型设置 仅命令 切换 Provider/模型/推理级别
Ctrl+Q 消息队列 键盘 查看和调整待处理消息顺序
/context 上下文切换 命令 多上下文管理
/messages 对话管理 命令 查看、编辑、合并、收藏对话轮次
/ide IDE 草稿 命令 浏览和选择 Python 编排草稿
/tag 标签管理 命令 管理自定义 #标签
/lang 语言选择 命令 切换界面语言
自动 权限确认 自动触发 批准或拒绝工具执行
/ide new 编辑器 命令 退出 TUI → 外部编辑器 → 返回

注意: Ctrl+M 不能打开模型设置。在 prompt_toolkit 中,Ctrl+M == Enter(都发送 0x0d)。模型弹框只能通过 /model 命令打开。

模型设置 (/model)

三列导航:Provider → Model → Effort。

按键 操作
↑/↓ 在列之间移动焦点
←/→ 在当前列内切换值
Enter 应用选择
Esc 取消(恢复快照)

消息队列 (Ctrl+Q)

按键 操作
↑/↓ 选择消息
Shift+↑/↓ 调整消息顺序
Delete 删除选中消息
Esc 关闭面板

上下文切换 (/context)

按键 操作
↑/↓ 导航上下文
Enter 切换到选中的上下文
Delete 淘汰选中的上下文
Esc 关闭面板

对话管理 (/messages)

完整的对话编辑功能,支持多选操作。

按键 操作
↑/↓ 导航单元
Ctrl+↑/↓ 扩展选区
Alt+↑/↓ 移动单元位置
Deleted 删除选中
m 合并选中(LLM 生成摘要)
c 清空所有 recall 注入
Enter 收藏/取消收藏轮次
Ctrl+S 保存更改到磁盘
Esc 撤销更改 / 关闭

IDE 草稿 (/ide)

按键 操作
↑/↓ 导航草稿
Enter 在编辑器中打开选中的草稿
Deleted 删除草稿
Esc 关闭面板

权限确认(自动)

当工具需要审批时,居中弹出确认框,提供 4 个选项:

按键 选项
1↑/↓ + Enter 允许(仅本次)
2 始终允许(本会话)
3 始终允许(该工具类型)
4 拒绝

快捷键

全局

快捷键 操作
Enter 提交消息
Tab 触发/接受自动补全
Ctrl+Enter 插入换行(不提交)
Esc 取消当前生成
Ctrl+C 复制选中文本(无选中时取消操作)
Ctrl+D 退出程序
Ctrl+R 切换记忆召回开关
Ctrl+P 复制最近 LLM 回复到剪贴板
Ctrl+I 打开 IDE 模式 (/ide)
Ctrl+G 打开系统编辑器编辑输入
Ctrl+S 保存对话(/messages 面板内)
PageUp/PageDown 输出区滚动 10 行

历史导航

按键 操作
上一条输入(无浮层打开时)
下一条输入(无浮层打开时)

输入框前缀

输入框根据状态显示不同前缀:


自动补全系统

输入特定前缀触发上下文感知补全:

前缀 触发 示例
@ 文件选择器(模糊搜索) @app/main.py
/ 命令补全 /model/loop
# 自定义标签文本扩展 #plan_mode#skip_mode 或用户自定义标签

输入时自动出现补全列表。按 TabEnter 接受,继续输入可过滤。


鼠标支持

操作 行为
滚轮 浏览对话历史
Ctrl+滚轮 调整字体大小(Windows)
左键拖拽 在输出区选择文本
左键释放 自动复制选中文本到剪贴板
右键单击 从剪贴板粘贴(或复制选中文本)

输出区支持文本选择和滚动。选中的文本以醒目背景色高亮显示。


状态栏

状态栏在 LLM 生成期间实时渲染:

[|] model · high ~1234 out / ~5678 in

7 种状态

状态 显示 触发时机
Idle 最终统计或空 生成间隙
Thinking [spinner] 思考中... | model · effort 等待首个 token
Generating [spinner] ~N out / ~M in | model · effort 流式生成内容
ToolExecuting [spinner] tool_name (phase) 执行工具调用
Compressing [spinner] [==== ] 40% 压缩中 上下文压缩
WaitingForCompression [spinner] 等待压缩完成 异步压缩等待
Error Error: message(5 秒后自动清除) API/网络错误

活跃状态时 spinner 以 100ms 间隔循环 [|] [/] [-] [\]


输入功能

命令

在输入框输入 / 查看可用命令:

/model         打开模型选择弹框
/context       多上下文切换(新建/重命名/淘汰)
/clear         清空对话历史
/compact       手动压缩上下文
/recall        开关记忆召回 [Ctrl+R]
/loop          标准工程化完成任务(规划→执行→验证→自纠)
/copy          复制回复到剪贴板 [Ctrl+P]
/ls            列出文件(支持模糊搜索)
/cat           读取文件内容
/edit          打开系统编辑器 [Ctrl+G]
/refactor      重构代码
/ide           Python 编排运行模式 [Ctrl+I]
/new           开启新话题
/messages      对话管理
/star          收藏/取消收藏对话轮次
/tag           自定义 #标签管理
/brainstorming Brainstorming 设计技能
/planning      Planning-with-files 规划技能
/help          显示帮助
/restart       重启服务
/quit /exit    退出程序 [Ctrl+D]

模型切换

使用 /model 命令打开 TUI 浮层或 CLI 列表进行模型选择:

/model    → 打开模型选择浮层(TUI)或列出所有供应商(CLI)

输入 # 加标签名可触发文本扩展(非模型路由):

#plan_mode    → 扩展 plan_mode 标签
#skip_mode    → 扩展 skip_mode 标签

输出渲染管线

LLM 流 → _raw_buffer → Rich Console → StringIO → ANSI 解析 → FormattedText → 输出区

无障碍