问题:
前端 JS 完全无法分清PTY才传回的字节流中的命令结构: 它无法区分哪部分是 Prompt,哪部分是命令输入,哪部分是命令输出,只能将原始字节流write到终端界面。 预期:边界标记与状态追踪的工作应该交给后端处理。
一些参考的横向:
1.Warp
Warp 是一个 AI 驱动的现代化终端。 Warp 将整个终端界面划分为一个个结构化的 Block(块),类似于 AI 对话中的一轮轮交互。取代传统终端无限滚动的线性输出方式。
每个 Block 包含三部分: Prompt(提示符)+ Input(输入)+ Output(输出)。
交互逻辑的变化: 用户的操作对象从传统的“逐条输入/输出命令”转变为对 Block 的整体管理。每个 Block 的右上角提供快捷操作按钮,如复制输入、复制输出等。
Warp 特性:
- 当前选中的 Block 会高亮显示,方便定位;用户可将 Block 收藏或置顶。
- 对于包含长文本输出的 Block,支持快速导航至其顶部或底部。
- Block 支持一键分享,也可直接嵌入博客或文档中,便于协作与记录。
2.Jupyter Notebook Bash Kernel
Jupyter Notebook 支持多语言内核,用户可根据需要无缝切换编程环境
Jupyter Notebook Bash Kernel Jupyter 本身以独立的单元格(Cell)为单位执行代码,运行结果会直接嵌入在当前 Cell 下方,形成“输入—输出”配对的结构。
将默认的 Python 内核替换为 Bash 内核后,Notebook 能够直接执行 Shell 命令。此时,每一个 Cell 便等价于一个 Shell 命令片段,其标准输出和错误输出也会被捕获并展示在对应 Cell 中。
Warp 的 Block(块) 设计思路和cell的思想有点相似。不知道 Warp 中 Block 的实现有没有参考过Jupyter 的 Cell 模型
3.VSCode Shell Integration
在旧版 VSCode 终端中,缺乏有效的机制来区分终端输出中的 Prompt(提示符)、用户输入的命令 以及 命令的实际输出。VSCode 在 v1.93 版本中引入了 Terminal Shell Integration API,为终端内容提供结构化的解析。 具体做法: VSCode Shell Integration 在启动终端时,会根据用户选择的 Shell 类型自动注入一段初始化脚本。该脚本利用不同 Shell 提供的 Hook(Prompt、PreExec、PreCmd 等),在 Prompt 显示、命令开始、命令结束等关键时机向终端输出特定的 ANSI 转义序列(OSC 633等)
ANSI 转义序列 本质上是一种嵌入在终端文本流中的带内信令(In-band Signaling):它与普通输出共享同一条 stdout 数据流,但不会被终端直接显示,而是由终端模拟器解析为控制指令。VSCode Terminal 正是通过识别这些转义序列,获知命令边界、Prompt、退出码等事件,从而实现 Shell Integration。
前端解析这些序列后,可实现:
- 明确边界条件:能够精确识别每个命令的输入区域和输出区域,清晰界定命令的起止位置。
- 追踪命令状态:获知命令何时开始执行、执行是否成功或失败,从而为扩展提供更丰富的交互反馈
总结:
warp和jupyter notebook bash kernel不开源,只参考到了他们对每轮命令的处理,属于是解决当前问题后才可参考的进一步实现。想真正实现,还要借鉴Vscode的处理,实现终端从字符流升级成结构化命令流。