286 lines
16 KiB
Markdown
286 lines
16 KiB
Markdown
# remote connection
|
||
|
||
name: remoteConn
|
||
|
||
- 主要需求
|
||
iOS直连SSH+Vue3 + TypeScript + xterm.js + Capacitor + iOS 原生 SSH。
|
||
支持web、小程序、iOS。
|
||
iOS 应用(Hybrid)用于手机上快速 SSH 连接远程服务器,并提供“一键进入 Codex”能力:连接到远程开发机后自动进入指定项目目录并启动 codex,让用户在手机终端里做 AI coding(读仓库、改文件、跑命令/测试)。
|
||
xterm.js 负责终端渲染(WebView 环境),Codex 跑在远程服务器/开发机上用 Codex CLI。
|
||
|
||
- 技术栈
|
||
vue + typescript + xterm.js
|
||
|
||
## 功能需求
|
||
- skill送给codex执行式,codex如何落实?openclaw有提供使用指引吗?还是让ai自由发挥?换句话说,我把skill相关文件直接扔给codex和通过openclaw提供给codex有区别吗?
|
||
后者会做的更好吗? - 20260318
|
||
|
||
- 认证方式:密码、公钥、证书等。支持多服务器管理(增删改查)。
|
||
✅ - 20260224
|
||
|
||
- 支持最近连接任务的日志记录。
|
||
✅ - 20260224
|
||
|
||
- 兼容所有标准的SSH服务器实现,包括但不限于:
|
||
- OpenSSH (所有现代版本)
|
||
- Dropbear SSH
|
||
- Bitvise SSH Server
|
||
- Windows OpenSSH 实现
|
||
|
||
- 支持codex交互,App里做一个**“Codex 模式”**按钮:
|
||
- 连接成功后自动发送:cd <你的项目目录>, 项目支持从~(home)目录中选择。
|
||
- 再自动发送:codex
|
||
- 让用户直接在 xterm.js 里和 Codex 对话下达任务
|
||
✅ - 20260224
|
||
|
||
- 客户端支持中文输入和交互
|
||
|
||
- 参考obsidian实现,支持增加插件,插件放在~/.remoteconn。比如:用styles.css,main.js,manifest.json三个文件定义。
|
||
|
||
- 主题和界面自定义
|
||
- 字体、大小、颜色选择
|
||
- 配色选择,背景可以定制,默认自动从配色中选择与字体最高对比度颜色作为背景。
|
||
- 界面配置丰富完善,功能齐全,易于操作,液态风格。
|
||
✅ - 20260224
|
||
|
||
- 配置中心中基础和认证关联选中服务器,终端、主体和安全改为全局配置
|
||
✅ - 20260224
|
||
|
||
- iOS版本和小程序版本。
|
||
- 2026-02-27 更新:微信小程序基线工程已落地,当前状态“持续对齐中(v2.0.0)”;详情见:
|
||
- `docs/miniprogram-v2.0.0-alignment-audit-2026-02-27.md`
|
||
- `apps/miniprogram/parity.v2.0.0.json`
|
||
|
||
- 配置更多,比如连接重试次数。分组。
|
||
✅ - 20260225
|
||
|
||
- 服务器点击增加服务器,跳到服务器配置页,而不是直接生成一条。
|
||
新增配置 -- 服务器配置页。配置如无改动,不增加。如有改动,点击返回,弹出提示是否保存,不保存服务器列表中不增加。点连接自动保存。
|
||
✅ - 20260225
|
||
|
||
- 终端配置页中放一个预览方块面板,放置在最前,适配宽度,高度hug内容,内容能涵盖配置项中的内容,并按配置同步更新显示。只是预览,轻量。
|
||
✅ - 20260225
|
||
|
||
- AI按钮需要在服务器管理增加。
|
||
✅ - 20260225(已支持 `assets/icons/ai.svg`,与主题按钮色联动)
|
||
|
||
- shell中针对codex连接,增加一个textarea+发送。原因是xterm对于ai输入法会话内容管理太差,还得使用系统原生组件。
|
||
增加一个扩展折叠条带,点击展开,textarea+发送。展开后置于shell下方,收缩后,按钮浮动置于shell上方60%透明度。
|
||
💡 新思路: 使用豆包语音大模型输入,送到shell。
|
||
- 按住输入如有效,输入框"强调色"stroke
|
||
- 语音输入框挡住shell,不弹软键盘。
|
||
✅ - 20260226(`TerminalVoiceInput` 已接入,支持按住说话/取消/清空/发送)
|
||
|
||
- 右下键盘工具栏条增加一个paste,原因是xterm.js无法长按弹出paste内容。
|
||
✅ - 20260225
|
||
|
||
- 弹keyboard能增加工具条吗,比如tab键。
|
||
✅ - 20260226(终端右下工具栏已增加 `TAB` 按钮)
|
||
|
||
- shell增加夜间模式。
|
||
✅ - 20260225
|
||
|
||
- “我的服务器”卡片支持上下移动并可视化反馈(拖拽手柄 + 跟手动效)。
|
||
✅ - 20260225(`move.svg` 手柄拖拽排序,卡片凸起并跟随手指)
|
||
|
||
- 在语音输入工具条中增加闪念(idea.svg),voice、idea、send放在一起。UI行同取消和发送。闪念记录到本地数据库indexedDB中。分页显示,每页15条。
|
||
✅ - 20260227
|
||
|
||
- log页,分页显示,每页15条。
|
||
✅ - 20260227
|
||
|
||
- 小程序版本AI能力。
|
||
✅ - 20260307
|
||
|
||
- ssh relay能力。从A主机直接跳到B主机,如同在A主机操作。
|
||
✅ - 20260307
|
||
|
||
- 增加多语言支持,简体中文/繁体中文/English
|
||
网关侧的提示没有办法切换语言,能不能收到一张映射表中,如语言选择非简体中文,查映射表。 -- 但这会增加开销(本地查应该快)❓
|
||
✅
|
||
|
||
- 增加“关于“页面,包括隐私政策/反馈等。
|
||
✅ - 20260308
|
||
|
||
- 增加不同终端的同步能力,先在gateway侧,使用SQLite。
|
||
✅ - 20260309
|
||
|
||
- 闪念左滑改为四个按钮,新增两个按钮,一个“已处理”“废弃”,废弃文字中间显示删除线。四个按钮“废弃”“已处理”上下结构放在左边,“复制”“删除”上下结构放右边。四个按钮不同颜色无gap,按钮最外角圆角,比如废弃按钮的左上方圆角。
|
||
✅
|
||
|
||
- 点击链接AI,弹出窗口的设置放在全局配置“连接”-“AI连接”卡片中,这样直连AI体验会比较好。
|
||
✅
|
||
|
||
- AI回复内容的朗读功能。
|
||
⚠️ 20260313:小程序语音播报能力已接入,但当前播报文本提取与轮次稳定判定仍不够准确;长时间交互还会放大小程序客户端响应压力。现阶段先列为待优化遗留问题,暂不建议默认使用。
|
||
|
||
- 全局配置终端配置中增加“显示语音输入按钮”开关,关闭后终端页面不显示语音按钮。
|
||
⚠️ 20260313:设置页原生开关在部分场景下存在“内胶囊与外框端侧 gap 视觉不完全一致”的问题;已尝试微调与自绘方案,当前未稳定改善,先作为遗留问题记录,暂不优化。
|
||
|
||
- 适配copilot CLI和Claude Code
|
||
☑️ 已增加gh copilot cli
|
||
|
||
## 问题修复
|
||
|
||
- AI 在线状态当前不是通过官方状态接口获取,而是依赖“启动时置位 + 退出时 OSC 标记清位 + 本地会话快照续接”的前台态模型。
|
||
已确认 `Codex CLI` / `Copilot CLI` 当前没有公开的“查询当前前台在线状态”接口;OpenAI / GitHub 官方状态页只能反映服务可用性,不能反映某台远端机器上的当前 AI 会话是否仍在前台。
|
||
现状风险:如果用户在其它终端里手动启动或退出 `codex` / `copilot`,当前客户端状态可能失真。
|
||
⚠️ 20260318:先按遗留问题登记,暂不处理。
|
||
|
||
- 小程序终端在快速滑动历史区时,仍会出现毫秒级停顿,观感上会打断连续滚动;该问题与此前“快速滑动只滚动一两行”的已收口问题分开记录。
|
||
⚠️ 20260318:先按遗留问题登记,暂不处理。
|
||
|
||
- 小程序 shell 内点击激活区呼出输入法后,使用豆包输入法语音输入,长按输入过程中会中途退出语音输入状态,导致语音录入被打断。
|
||
复现路径:终端页 -> 点击 shell 激活区 -> 呼出豆包输入法长按语音输入 -> 说话过程中中断.
|
||
⚠️ 20260318:先按遗留问题登记,暂不处理。
|
||
|
||
- 小程序终端在 `Codex` 等 AI 持续输出期间,点击 shell 激活区弹出软键盘后,输入框/激活区仍可能发生跳跃,导致无法稳定连续输入。
|
||
复现路径:终端页 -> 启动 `Codex`/其它 AI 持续输出 -> 点击 shell 激活区 -> 弹出软键盘 -> 尝试连续输入。
|
||
⚠️ 20260319:先按遗留问题登记,暂不处理。
|
||
|
||
- 不给用户反馈:[gavin@kvm-douboer ~]$ if [ -n "$ZSH_VERSION" ]; then export LANG="${LANG:-zh_CN.UTF-8}"; export LC_CTYPE="${LC_CTYPE:-$LANG}"; if [ -z "$LC_ALL" ]; then export LC_ALL="$LANG"; fi; stty iutf8 2>/dev/null; setopt MULTIBYTE PRINT_EIGHT_BIT 2>/dev/null; unsetopt PROMPT_SP 2>/dev/null; PROMPT_EOL_MARK=''; fi; stty echo 2>/dev/null
|
||
✅ - 20260224
|
||
❓ 20260225 - 该问题修复了,迭代过程中又复现了。
|
||
|
||
- 点击codex连接,现在显示如下。要求:不显示连接细节(以下5行不显示)。显示两条toast提示:"codex工作目录~/workspace不存在“ 和 服务器未装codex
|
||
[gavin@kvm-douboer ~]$ cd "$HOME"/'workspace'
|
||
/home/gavin/workspace: No such file or directo
|
||
ry.
|
||
[gavin@kvm-douboer ~]$ command -v codex
|
||
[gavin@kvm-douboer ~]$ codex --sandbox workspace-write
|
||
codex: Command not found.
|
||
✅ - 20260225(预检输出已吞掉;仅在真实失败时 toast;点击连接后窗口立即关闭)
|
||
|
||
- 点连接,还会偶发出现,提示符被吃掉的情况。需要用户再enter一次,才出现。
|
||
[gavin@kvm-douboer ~]$ Activate the web console with: systemctl enable --now co
|
||
ckpit.socket
|
||
Last login: Tue Feb 24 16:35:11 2026 from 115.193.12.66
|
||
光标
|
||
☑️ 目前没有出现
|
||
|
||
- 同一个连接的历史记录,重连后丢失,已解决。又复现了。❓
|
||
✅ - 20260225
|
||
|
||
- 字体选择无效。可能是修复中文显示问题时产生的?两者有冲突吗?
|
||
✅ - 20260225
|
||
|
||
- 刷新“我的服务器”页面,已连接的会话不应该断开,除非网络断开、超时等原因。
|
||
✅ - 20260225
|
||
|
||
- 禁用所有页面的双指缩放。 - 20260225
|
||
✅ - 20260225(`viewport + gesture/touchmove/wheel` 三层拦截)
|
||
- 20260226(新增 double-tap/dblclick 防缩放补丁)
|
||
|
||
- 路由懒加载失败时自动恢复,避免用户白屏后无感知卡死。
|
||
✅ - 20260226(新增动态导入失败单次自动刷新恢复,15s 窗口限流)
|
||
|
||
- 桌面放置remoteconn书签,本地数据库数据不共享?
|
||
系统机制,不共享❌
|
||
|
||
- 键盘工具栏,点击会折叠。原来改好,又出现问题了。
|
||
原因是:语音层叠加在键盘层之上,拦截范围过大。
|
||
修改语音层拦截逻辑,参考键盘,展开态保护、折叠态不保护(折叠态仅仅保护voice.svg)
|
||
✅ - 20260227
|
||
|
||
- 小程序光标位置修复。xterm光标计算逻辑是什么?
|
||
✅ - 20260307
|
||
|
||
- 小程序codex交互卡顿和按钮点击阻塞问题。
|
||
✅ - 20260310
|
||
|
||
- vim显示异常,文字没有按主题渲染。
|
||
✅ - 20260310
|
||
|
||
- 问题:codex在交互过程中,正常情况下底部始终4行高度,3行加亮块,文字居中,例如“> Use /skills to list available skills”(内容变化,这个只是例子)。第4行一般是“ gpt-5.4 xhigh · 53% left · ~/remoteconn”。
|
||
小程序中,只看到加亮块的前两行,即”空白行+文字“,下面2行(空白行和 gpt-5.4 xhigh……)看不到。在codex内容输出更新过程中,偶尔会看到整个块,大部分情况看不到整个块,输出过程中,上下闪动。先理解问题,不动代码,避免回归问题。应该是部分codex返回的标记没有被正确处理,可以看下这几行codex送过来是什么?哪些没有被处理?
|
||
✅ - 20260311
|
||
|
||
- 小程序问题:连接后,在codex中交互后,返回服务器列表,点连接再进shell,向下滑页面上方出现空白,顶部一行有时还有类似5;2H这样的文字。
|
||
测试复现:连接codex后输入“当前项目结构”,codex输出完成后,返回服务器列表,再点连接进shell向下翻历史记录。
|
||
✅ - 20260311
|
||
|
||
## 功能优化
|
||
|
||
- 点击右上角的时延,增加曲线图。
|
||
|
||
- 点击其它区域,右下角键盘如展开可折叠。(注意键盘展开frame大小不响应区需扩大,避免误操作)
|
||
✅ - 20260224(已完成,v1.0.8)
|
||
|
||
- FIGMA重构配置,其它icon & UI(console 工具区 2248/2251 交互已完成)
|
||
✅ - 20260224(已完成,v1.0.8)
|
||
|
||
- xterm shell区域下可以增加原生textarea,主要用于发送codex内容,原因是shell被xterm接管,语音输入等体验变差。但shell中运行codex,textarea输入内容如何交互送给codex?❓
|
||
✅ - 20260226(已落地“语音输入面板 + textarea + sent 才提交到 shell”)
|
||
|
||
- 体积优化
|
||
这两份构建结果这么大,分析原因?
|
||
dist/assets/index-CYJREDsN.js 236.92 kB │ gzip: 85.49 kB
|
||
dist/assets/TerminalPanel-CwPWrWRx.js 421.71 kB │ gzip: 108.58 kB
|
||
☑️
|
||
|
||
- 扫描所有界面提示,更加友好准确,提示窗口更加美观。(比如,都叫连接错误,没有区分超时还是服务器不可用等等)
|
||
✅ - 20260224
|
||
|
||
- 所有页面的“返回”,语义保持一致。
|
||
返回的语义统一为:返回历史上一页,如没有历史页,返回按钮灰色。页面导航用右下角的显示按钮。
|
||
✅ - 20260225
|
||
|
||
- 重新规范页面按钮位置、语义。顶部,左边(左上)显示本页操作按钮,右边(右上)显示页面信息;底部,左边(左下)返回,右边(右下)导航到其它页面。
|
||
所以,全局配置的,自动优化背景、保存、日志导出按钮应在左上。
|
||
|
||
- 配置中统一时间单位,都用ms。
|
||
暂不需要 ❌
|
||
|
||
- 重构配置页UI
|
||
✅ - 20260225
|
||
|
||
- 给"请点击右上角“重连“开关或……" 增加一个圆角8px,padding(四方)4px的底框,文字颜色使用背景色,背景颜色使用文字色,opacity 80%
|
||
✅ - 20260225
|
||
|
||
- “我的服务器”列表,如果当前服务器已连接(比如连接后,返回列表,连接还在),这时按钮使用“强调色”,此时点击按钮不重新断开又重连,直接使用原来的连接。
|
||
☑️ 点另一台时,旧连接会被主动断开,不断开旧连接需要做成多会话架构。但这会增加连接开销。,换服务器重新连接更加经济。
|
||
|
||
- 20260226 性能&体验优化:
|
||
- 语音输入起始有延后大约2-3sec。
|
||
- 提高停顿的容忍度,大模式是否有参数?
|
||
- 弹出软键盘后,voice.svg上推,不回来。
|
||
- "正在初始化终端"加载速度优化。
|
||
✅ - 20260227
|
||
- 移动voice后,点激活区弹软键盘,点其它区域键盘收回,voice按钮位置会被推到顶部。
|
||
✅ - 20260227
|
||
|
||
- 检查本地缓存机制。原因是svg图标等素材的加载有些慢。
|
||
✅ - 20260227
|
||
|
||
- main.css 1700+行,冗余精简。
|
||
☑️ 减到1500+,不确定是否足够精简❓
|
||
|
||
## 未来计划
|
||
|
||
- **考虑与内容创作联动**。
|
||
|
||
- 网关高并发测试。
|
||
|
||
- codex上下文管理,通过保存response id,断开后,下次连接带上response id的方式来恢复上下文。
|
||
暂不需要 ❌
|
||
能够探测ai连接情况。
|
||
|
||
- ssh连接管理/连接池,代价太大,暂不需要。❌
|
||
|
||
- 记录用户活跃度到SQLite,作为后续统计分析使用。 -- 需要配套web统计入口,暂不实现。
|
||
|
||
- 稳定以后做并发测试,重点关注终端网关和语音网关。测试部署在macmini和云主机上的使用体验。
|
||
可以考虑:网关部署在macmini,web側部署在云主机,提高web响应速度。
|
||
|
||
- 现在总体时延不稳定。kvm服务器处理能力弱,当网络快。mac处理能力强,但链路长。如果把webserver部署在kvm上,网关在mac,会提升用户体验吗?
|
||
|
||
- 记录用户ID活跃度到SQLite,作为后续统计分析使用。 -- 需要配套web统计入口,暂不实现。
|
||
|
||
- 全部重绘制图表,练习figma钢笔。
|
||
|
||
- 连接macmini和linux server,提示分别,pid完全相同,对吗?
|
||
{"level":30,"time":202602251259051230,"pid":76942,"hostname":"gavin-mac-mini.local","ip":"127.0.0.1","disconnectActor":"client","disconnectReasonCode":"switch","disconnectReasonText":"客户端主动触发断开","msg":"收到客户端断开请求"}
|
||
{"level":30,"time":202602251259455420,"pid":76942,"hostname":"gavin-mac-mini.local","ip":"127.0.0.1","disconnectActor":"client","disconnectReasonCode":"switch","disconnectReasonText":"客户端主动触发断开","msg":"收到客户端断开请求"}
|
||
目前按浏览器,是单会话架构,多会话架构会增加开销,暂不实现。
|
||
❌
|