16 KiB
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.mdapps/miniprogram/parity.v2.0.0.json
- 2026-02-27 更新:微信小程序基线工程已落地,当前状态“持续对齐中(v2.0.0)”;详情见:
-
配置更多,比如连接重试次数。分组。
✅ - 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":"收到客户端断开请求"}
目前按浏览器,是单会话架构,多会话架构会增加开销,暂不实现。
❌