Skip to content

theseus-sputik/sputik

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sputik

和warp终端功能上看似相似,但我们将杜绝saas式的终端模拟器,并将根据目前的linux资深用户的特点设计图形界面和配置系统,以及shell扩展 保持尽量低的内存占用和高可扩展、复用 对于llm的输出,将使用可靠的日志记录数据库(sqlite),通过数据库进行内容生成,且具备至少一个联网模型,进行实时搜索 nasm 用于硬件抽象、syscall、FFI hook注入控制 c用于通信处理、字符串解析 rust用于图形渲染和复杂的优化、事件处理等

结构参考(st):

st Terminal
.-----------------------------.
|         main()              |
|                             |
|    Initializes terminal     |
|    Calls xinit() & run()    |
'-------------.---------------'
              |
              v
.-----------------------------.
|         xinit()             |
|                             |
| Initializes X11 display,    |
| window, fonts, and colors   |
|                             |
| Calls:                      |
|   - xloadfonts()           |
|   - xloadcols()            |
|   - XCreateWindow()        |
|   - xhints()               |
'-------------.---------------'
              |
              v
.-----------------------------.
|         run()               |
|                             |
| Main event loop            |
| Handles X11 and TTY events |
|                             |
| Calls:                     |
|   - ttynew()              |
|   - ttyread()             |
|   - draw()                |
|   - handler[ev.type]()    |
'-------------.---------------'
              |
              v
.-----------------------------.
|         draw()              |
|                             |
| Renders terminal content   |
| Calls xdrawline() for each |
| line                       |
|                             |
| Calls:                     |
|   - xstartdraw()          |
|   - xdrawline()           |
|   - xfinishdraw()         |
'-------------.---------------'
              |
              v
.-----------------------------.
|       xdrawline()           |
|                             |
| Draws a single line        |
| Handles glyph rendering    |
|                             |
| Calls:                     |
|   - xmakeglyphfontspecs() |
|   - xdrawglyphfontspecs() |
'-------------.---------------'
              |
              v
.-----------------------------.
|       Input Handling        |
|                             |
| Processes keyboard/mouse   |
|                             |
| Key Functions:             |
|   - kpress()              |
|   - bpress()              |
|   - brelease()            |
|   - bmotion()             |
|                             |
| Uses:                      |
|   - kmap() (key mappings) |
|   - shortcuts[] (hotkeys) |
|   - mshortcuts[] (mouse)  |
'-----------------------------'
              |
              v
.-----------------------------.
|       TTY Handling          |
|                             |
| Manages terminal I/O       |
|                             |
| Key Functions:             |
|   - ttynew()              |
|   - ttyread()             |
|   - ttywrite()            |
|   - ttyresize()           |
'-----------------------------'
              |
              v
.-----------------------------.
|       Selection Handling    |
|                             |
| Manages copy/paste         |
|                             |
| Key Functions:             |
|   - selinit()             |
|   - selpaste()            |
|   - clipcopy()            |
|   - clippaste()           |
|   - xsetsel()             |
'-----------------------------'

逻辑表述:

#### 1. **程序初始化**
- **功能**:启动终端,配置初始环境,准备运行。
- **逻辑流程**:
  1. 解析命令行参数,获取用户指定的选项(如字体、窗口大小、执行命令等)。
  2. 初始化终端数据结构,设置默认行列数(80列,24行)。
  3. 设置 X11 显示环境,创建窗口,加载字体和颜色配置。
  4. 初始化终端的输入输出通道(TTY),确定默认 shell(如 `/bin/sh`)。
  5. 设置选择(剪贴板)机制,准备处理文本复制粘贴。
  6. 进入主事件循环,等待用户输入或系统事件。

#### 2. **窗口与显示初始化**
- **功能**:创建并配置终端的图形界面。
- **逻辑流程**:
  1. 连接到 X11 显示服务器,创建终端窗口。
  2. 加载用户指定的字体(如 Liberation Mono,大小 12),支持常规、粗体、斜体等变体。
  3. 配置颜色表(16种基本颜色 + 256色扩展),设置前景、背景、游标颜色。
  4. 设置窗口属性(如大小、边框、最小尺寸),支持嵌入其他窗口(如通过 `-w` 参数)。
  5. 初始化输入法支持,允许处理复杂字符输入(如中文)。
  6. 设置鼠标游标样式和颜色,初始化绘图上下文。

#### 3. **主事件循环**
- **功能**:持续处理用户输入和系统事件,保持终端运行。
- **逻辑流程**:
  1. 监听 X11 事件(键盘、鼠标、窗口调整等)和 TTY 输入。
  2. 如果有新事件(如按键、鼠标点击),调用对应的事件处理函数。
  3. 如果有 TTY 数据输入(来自 shell 或命令),读取并更新终端内容。
  4. 根据事件或输入,触发屏幕重绘以更新显示。
  5. 使用延迟机制(2ms 至 33ms)优化渲染,减少闪烁,确保流畅显示。
  6. 处理闪烁属性(如光标或文本闪烁),根据超时时间切换显示状态。

#### 4. **终端内容渲染**
- **功能**:将终端的文本内容绘制到窗口。
- **逻辑流程**:
  1. 检查是否需要绘制(窗口是否可见)。
  2. 遍历终端的每一行文本,逐字符生成绘图指令(glyph 规格)。
  3. 对于每个字符:
     - 确定字体(常规、粗体、斜体),根据字符属性选择。
     - 如果字体不支持该字符,使用备用字体(通过字体缓存或动态查找)。
     - 计算字符位置(基于行列和像素坐标)。
     - 应用颜色(前景、背景,支持反显、闪烁等属性)。
     - 处理特殊样式(如下划线、删除线)。
  4. 绘制光标(支持块状、下划线、竖线或自定义形状,如雪人)。
  5. 清理边框区域,确保无残留像素。
  6. 将绘制内容从缓冲区复制到窗口,完成渲染。

#### 5. **输入处理**
- **功能**:处理键盘和鼠标输入,转换为终端命令或操作。
- **逻辑流程**:
  1. **键盘输入**:
     - 捕获按键事件,识别按键符号(如字母、功能键、方向键)。
     - 检查修饰键(如 Shift、Control、Alt),匹配预定义快捷键。
     - 如果是快捷键(例如 Ctrl+Shift+C 复制),执行对应功能。
     - 如果是普通按键,转换为字符序列,发送到 TTY。
     - 支持输入法,处理复杂字符(如多字节字符)。
  2. **鼠标输入**:
     - 捕获鼠标按下、释放、移动事件。
     - 如果启用鼠标模式,发送鼠标事件到应用程序(如 vim)。
     - 否则,处理选择操作(拖动选择文本)或触发快捷键(如中键粘贴)。
  3. 支持特殊键序列(如方向键、F1-F12),根据终端模式(应用键模式、游标模式)生成不同输出。

#### 6. **TTY 输入输出管理**
- **功能**:管理终端与 shell 或命令的交互。
- **逻辑流程**:
  1. 创建 TTY 通道,启动默认 shell 或用户指定的命令。
  2. 读取 shell 输出,更新终端的文本缓冲区。
  3. 将用户输入(键盘或粘贴内容)写入 TTY,传递给 shell。
  4. 调整 TTY 大小以匹配窗口尺寸变化,确保显示一致。
  5. 支持特殊 TTY 设置(如无回显、原始模式)以优化交互。

#### 7. **选择与剪贴板管理**
- **功能**:支持文本选择、复制和粘贴。
- **逻辑流程**:
  1. 初始化选择状态,跟踪用户选择的文本区域。
  2. 当用户拖动鼠标或使用快捷键选择文本:
     - 记录选择的行列范围。
     - 支持矩形选择(按 Alt 键)。
  3. 复制操作:将选中文本存储到主剪贴板(Primary)或系统剪贴板(Clipboard)。
  4. 粘贴操作:从剪贴板读取文本,发送到 TTY 或插入到终端。
  5. 处理 X11 剪贴板事件,确保与其他应用程序的兼容性。
  6. 清除选择状态(例如,窗口失去焦点时)。

#### 8. **窗口与状态管理**
- **功能**:管理窗口状态和终端属性。
- **逻辑流程**:
  1. 处理窗口事件(如调整大小、获得/失去焦点、关闭)。
  2. 调整窗口大小时,重新计算行列数,更新 TTY 和显示缓冲区。
  3. 设置窗口标题(基于命令或用户指定)。
  4. 处理紧急通知(如终端未聚焦时的铃声提醒)。
  5. 支持屏幕保护状态查询和模式切换(如反显、闪烁)。

---

0.0.1版功能清单:

以llm注入支持为核心,下列参考st的理念大概结构

1. 程序初始化

  • 功能:启动终端,配置初始环境,准备 Wayland 连接和 LLM 接口。

  • 逻辑流程

    1. 解析命令行参数,获取选项(如字体、窗口大小、初始命令、LLM 接口端口)。
    2. 初始化终端数据结构,设置默认行列数(80列,24行)和缓冲区。
    3. 连接 Wayland 显示服务器,创建表面(surface)和窗口,绑定必要的协议(如 wl_compositor、xdg_shell)。
    4. 加载字体(使用 fcft 或类似库,支持基本变体如粗体、斜体)和颜色配置(16色 + 256色扩展)。
    5. 初始化 TTY 输入输出通道,启动默认 shell(如 /bin/sh)。
    6. 设置 LLM 操控接口:创建一个监听套接字或管道,允许 LLM 发送 JSON 格式命令(如 {"action": "execute", "command": "ls"})。
    7. 进入主事件循环,等待 Wayland 事件、TTY 输入或 LLM 指令。

asm实现终端数据结构、简单参数配置、调用、设置llm输出的socket等核心功能, c实现套接字的创建和通信功能、接入wayland

2. Wayland 集成与窗口管理

  • 功能:处理 Wayland 协议,实现窗口创建和事件通信。

  • 逻辑流程

    1. 使用 Wayland 客户端库连接 compositor,创建表面并附加缓冲区。
    2. 支持最小化配置:绑定 xdg_wm_base 协议处理窗口状态(最大化、最小化、关闭)。
    3. 处理表面缩放(fractional scaling),动态调整像素缓冲区大小。
    4. 在服务器模式下,支持多窗口共享资源(如字体缓存),通过 Wayland 套接字通信。
    5. 设置窗口属性(如标题、图标),响应 compositor 事件(如配置变化)。
    6. 如果 LLM 发送“resize”指令,调整窗口大小并通知 compositor。

nasm负责调用绑定处理wayland事件,c依然负责协议通信

3. 主事件循环

  • 功能:处理 Wayland 事件、TTY 输入和 LLM 指令,确保高效响应。

  • 逻辑流程

    1. 监听 Wayland 事件(键盘、鼠标、触摸、窗口调整)和 TTY 输出。
    2. 如果有新事件,调用对应处理函数;同时检查 LLM 接口是否有新指令。
    3. 对于 TTY 数据:读取 shell 输出,更新终端缓冲区。
    4. 对于 LLM 指令:解析 JSON(如执行命令、注入输入、查询状态),并发送到 TTY 或直接操作缓冲区。
    5. 使用延迟优化渲染(例如 2-33ms 闲置检测),减少不必要重绘。
    6. 处理闪烁(如光标),根据超时切换状态;如果 LLM 请求“monitor”,实时发送输出到 LLM。

nasm功能照旧,c提供系统调用

4. 终端内容渲染

  • 功能:高效绘制文本内容到 Wayland 表面。

  • 逻辑流程

    1. 检查窗口是否可见或需要更新。
    2. 遍历终端行,逐字符生成渲染规格(glyph)。
    3. 对于每个字符:
      • 选择字体变体(基于属性如粗体、斜体)。
      • 如果字体不支持,使用备用字体缓存或动态加载。
      • 计算位置(行列转像素),应用颜色(前景、背景,支持反显、闪烁)。
      • 处理特殊样式(如下划线、删除线、盒子绘制)。
    4. 绘制光标(块状、下划线或竖线)。
    5. 使用共享内存缓冲区(shm)附加到 Wayland 表面,提交渲染。
    6. 如果 LLM 发送“render”指令,强制重绘或注入自定义文本。

nasm优化高频计算,c做字体和wayland渲染

5. 输入处理

  • 功能:处理键盘、鼠标和 LLM 注入输入。

  • 逻辑流程

    :(cpp风格冒号(bushi

    1. 键盘/鼠标输入

      • 捕获 Wayland 事件,识别键码或鼠标动作。
      • 检查修饰键,匹配快捷键(如 Ctrl+Shift+C 复制)。
      • 转换为字符序列,发送到 TTY。
      • 支持 IME(输入法编辑器)处理复杂字符。
      • 鼠标事件:选择文本、滚动或调整字体大小。
    2. LLM 注入

      • 如果 LLM 发送“input”指令(如模拟按键),直接注入到输入队列。
      • 支持自动化:LLM 可以“watch”输出并响应(如解析错误,自动重试命令)。

6. TTY 输入输出管理

  • 功能:管理终端与 shell 的交互,支持 LLM 监控。

  • 逻辑流程

    1. 创建 TTY 通道,启动 shell 或命令。
    2. 异步读取 shell 输出,更新缓冲区并触发渲染。
    3. 将用户或 LLM 输入写入 TTY。
    4. 调整 TTY 大小以匹配窗口变化。
    5. 支持 OSC 序列(操作系统命令)如设置标题、报告 CWD。
    6. LLM 操控:如果指令为“execute”,将命令发送到 TTY;“query”则返回当前输出快照。

7. 选择与剪贴板管理

  • 功能:支持文本选择和粘贴,LLM 可访问。

  • 逻辑流程

    1. 跟踪选择区域(鼠标拖动或快捷键)。
    2. 支持矩形选择。
    3. 复制:存储选中文本到 Wayland 剪贴板(wl_data_device_manager)。
    4. 粘贴:从剪贴板读取,注入到 TTY。
    5. LLM 操控:指令如“copy”提取文本发送给 LLM;“paste”从 LLM 接收文本插入。

8. LLM 操控接口(扩展模块)

  • 功能:允许 LLM 底层控制终端,实现智能自动化。

  • 逻辑流程

    1. 初始化接口(套接字监听),接受 JSON 指令。
    2. 支持指令类型:
      • 执行命令:注入到 TTY。
      • 监控输出:实时或批量发送终端缓冲区内容给 LLM。
      • 自动化响应:LLM 解析输出,发送后续指令(如错误修复)。
      • 查询状态:返回窗口大小、当前 shell 等。
    3. 确保安全:限制指令范围,避免无限循环。
    4. 集成到事件循环:与 Wayland/TTY 事件并行处理。

About

emulated terminal(developing....)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published