# 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":"收到客户端断开请求"} 目前按浏览器,是单会话架构,多会话架构会增加开销,暂不实现。 ❌