Skip to content

发布 v0.5.2:证书、SSH 与 WebSocket 稳定性修复及双语操作结果校正 - #42

Merged
massif-01 merged 9 commits into
RMinte-AI:mainfrom
massif-01:fix/v0.5.2-reliability-and-prompts
Sep 28, 2026
Merged

massif-01 merged 9 commits into
RMinte-AI:mainfrom
massif-01:fix/v0.5.2-reliability-and-prompts

Conversation

@massif-01

@massif-01 massif-01 commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

修改内容

本 PR 汇总证书/HTTPS、自动化/SSH/日志、WebUI 提示语及 WebSocket 设备端采集与生命周期修复,版本升级为 0.5.2。重点修正“接口已受理却显示操作成功”“旧异步结果覆盖新状态”“保存/停止失败被忽略”等问题,并补充生产函数及浏览器回归。

  • 证书与 HTTPS:修复 PEM 长度、UTC 有效期、材料快照、错误原因、校时/安装后的启动衔接及停止失败传播;区分材料安装、有效期与真实 HTTPS 运行状态。
  • 自动化与持久化:规则版本冲突检查、读者/执行者所有权、完整参数保留、SD/NVS 提交恢复;修正手动模式/展示/自动条件语义及取消、删除和登记回收。
  • SSH 与日志:认证前主机指纹校验、总 deadline、协作取消、实例身份、远端停止确认、缓存状态读取、断网后的同实例就绪恢复及日志预览/资源释放。
  • WebUI:双语与参数修复、明确业务失败/部分失败/未知;首次导航去重、页面和订阅归属、上传目的目录/验证代次、弹窗实例/尝试编号、旧结果与 finally 防护、上传与列表刷新分离。
  • WebSocket 与停止链:按订阅/到期/容量采集、同批共享指标、单次序列化定向发送;连接和订阅代次隔离;事件节点保活与在途排空;关闭新业务、暂停遥测、生产者收尾与结果排空分阶段执行,busy/timeout/error 向上传播并可重试。
  • Reviewer R1—R5:停止失败后无新消息仍可排空;SSH 真正就绪才报告成功、接受任务前预留关键终态;角色与日志资格同步并隔离旧代次;采集前联合预留消息/描述符/字节预算,跨轮次公平调度。保留硬件保护、全局告警和 SSH 匹配规则。
  • F1/F2 后续修复:普通 SSH 输出按原消息类别逐目标结算,接受后的入队/发送/失效反馈到所属流;终态等待前序输出结算,部分失败不重播成功接收者。保护状态转换独占四个消息槽,周期/调试事件另占一个,消息、描述符和字节准入与普通日志隔离;保留原全局接收范围与硬件保护规则。
  • Shell/Exec 统一生命周期(既有基础):固定原操作上下文统一创建、编码前输出票据、逐目标投递结算、终态封口及回收;关闭准入与取票同锁排序,终态等待准备中输出与目标投递,业务执行、网页观察和资源回收分离。timer 删除后通过 daemon barrier 确认回调退出,保留停止失败后的推进及重试能力。
  • 发布流程:组织 main 合并后,固件构建与 WebUI 回归均成功才自动创建 v0.5.2;Release 绑定该次构建提交,使用仓库中详细中文说明。Fork 和 PR 不发布正式版本。

中文 Release 正文:docs/releases/v0.5.2.md。发布条件与验证:docs/releases/v0.5.2-validation.md。

最新增量:真机 ssh_poll 栈溢出修复与验收

当前提交 dc880ea。SSH 登录欢迎输出后曾发生 ssh_poll stack overflow 并重启。本次只将 poller 的 PSRAM 栈预算从4096改为8192 bytes,并以 vTaskDeleteWithCaps 配对原 xTaskCreateWithCaps;输出缓冲、优先级、operation、协议与硬件保护不变。单实例额外栈预算4096 bytes。

  • 生产 C 回归覆盖创建参数、配套删除和10次退出/引用/资源回收;提交前再次运行 ASan/UBSan adapter 回归通过。固定 ESP-IDF v5.5.2 的正式候选及增强诊断版均独立构建,App+www 完整刷写验收,现已恢复正式候选。
  • 两版各完成10轮真实 SSH;正式候选由用户通过 Safari 完成,诊断版首轮人工、余下9轮通过设备原有 WebSocket 路径自动执行安全 echo。最低观测剩余栈分别3876/3644 bytes;所测负载未复现原溢出,退出后 ssh_poll 消失。日志未检测到相应 panic/canary/heap corruption。小幅堆净差未归因,不宣称零泄漏或直接读取真机 operation 账本。
  • 最后补验使用全新 Chrome context,禁止全部外部 origin、禁用 Service Worker,直接从真实设备首次加载三个 xterm 资源;无外部请求和 pageerror,设备资源字节与源码一致。
  • 真实 voltprot --debug 通知进入活动 SSH:无假本地提示符,下一次真实键盘输入仍为 ssh_input,远端 echo 返回正确;Ctrl+\ 收到关闭终态后恢复本地输入。页面离开/重入及任务回收通过。调试按原30秒上限自动结束,未触发实际低压/关机;未在8–10秒内提前关闭的过程差异已记录。

完整修复与验收记录、提交前审查、最终真机网络证据、最终设备状态与资源校验。

以下各基础章节的“待实机验收/未操作设备”描述属于对应历史提交,当前已补验范围以上文为准。长期压力、真实低压保护、TLS/旧配置升级等未覆盖事项仍不因本次 SSH 验收通过而自动关闭。此更新未合并、未打 tag、未发布;新 HEAD CI 需单独检查。

本地化基础:Web Terminal 固定版本依赖

本地化基础提交 3a19128。xterm 5.3.0 与 xterm-addon-fit 0.8.0 从原 CDN 发行资源固定到设备 WebUI;保留两个独立 MIT LICENSE。loader 只请求同源 vendor 路径,使用现有 TS_ASSET_VERSION;无 CDN fallback 或构建下载。经用户确认,将超过现有 SPIFFS 32 字节路径限制的 addon/许可证缩短为 fit.min.js / LICENSE-fit,不改文件内容、CMake 或文件系统格式。

  • vendor 跳过项目简易 minifier,仍生成 gzip;源码、优化副本与 gzip 解压逐字节一致。运行时 raw 共 290842 字节、gzip 共 68543 字节;含许可证原文件共 293206 字节。
  • 本次固定 SDK 独立目录完整构建成功;最终 SPIFFS 重建与 www.bin 字节一致,已分配 676/768 块,剩余 92 块。flasher_args 的 0x6a0000 明确包含 www.bin。标准 idf.py flash 自动刷入,App-only 刷写或 OTA 不更新 WebUI。
  • 全新 Chrome context 禁止全部外部 origin、Service Worker 缓存,未注入 Terminal/FitAddon;源码及实际 web_optimized 双语首次加载、真实键盘、本地/SSH 输入、J1、退出、销毁重入通过,完整 URL/origin 记录无外部请求、无 pageerror。
  • 当前 Node 40 项、Chrome 原回归 38 项、vendor/loader 专项、J1 与实际 v3 双语 C→JS→C 回归重新运行通过。保持已有 SSH/WS/operation 和保护规则;真实设备浏览器、ESP 静态 HTTP/挂载/缓存升级及真实 SSH 仍待实机验收。

修复与全部命令/边界、来源与 SHA256、最终产物/容量证据、离线网络记录、提交前核对。未改版本、发布工作流;不合并或发布 Release。

J1 基础:电源告警保持终端输入归属

J1 基础提交 633bb94,在 8ad39a9 上追加。电源告警在活动 SSH、连接中、断开中或恢复中仅另起一行显示,不再伪造本地 tianshan> 提示符。只有终端存活、连接与 WebSocket 就绪且处于本地可交互状态时,才沿用原来的输入缓冲和光标恢复。告警不改变会话状态、不发送请求,不向远端发送重绘或额外输入;原告警文本、颜色、翻译和倒计时筛选保持不变。

生产修改限于 handlePowerEvent() 和既有静态资源缓存标识;未修改后端、控制层、输入路由、协议、硬件保护、版本或发布流程。

  • 当前 J1 验证:WebUI Node 40 项、既有 Chrome 38 项通过;新增双语状态/输入行为验证,以及实际 C 保护通知 → JavaScript socket → 用户下一次输入 → 原 C SSH 会话 → 正常退出与回收的跨层验证通过。中英文 Node、Chrome 和本次构建优化资源均已回放。
  • 固定 ESP-IDF v5.5.2 / ESP32-S3 独立目录构建通过;应用镜像 0x215120,分区约 31% 剩余。缓存标识、gzip、优化资源及重生成 SPIFFS 与实际 www.bin 一致性通过。
  • 提交前再次执行 J1 状态测试及真实 C/JS 跨层回归,并确认六项修改输入哈希与上述证据一致。没有将历史 v3 绿灯当作 J1 验证;本次发布准备没有重复完整浏览器套件和构建。
  • SDK/网络与 xterm 渲染使用测试替身;真实设备告警、SSH/xterm 显示、网络时序及设备缓存升级仍待实机验收。

审查材料:J1 修复与验收记录、提交前审查、完整反例与测试证据、本次 diff。

v3 基础:SSH 请求、会话与前端后续操作的端到端契约

v3 基础提交 8ad39a9,在 568b871 上追加。修复不支持信号/非法参数/可恢复控制失败被解释成 SSH 终态的问题:有效 SSH 保持输入路由,不输出本地提示符、不自动接管或重发;真正的通道故障仍通过原 operation 关闭、前序输出结算和唯一终态收尾。启动拒绝只影响对应尝试。

  • 前端同步区分请求失败、启动失败、disconnecting、最终关闭及 socket 断开;旧 socket 回调不能污染新连接。中英文提示明确输出不完整和远端结果未确认,静态资源 cache key 配套更新。
  • 实际 Shell 驱动区分暂无数据和 EOF,修复 EOF/ERROR 后 close 泄漏;部分写保留已接受字节,setup/write/resize 等待有界,关闭不无限等待远端。CLI Ctrl+\ 兑现本地退出请求,仍由原持有者释放句柄。
  • 保留 v2 原上下文、引用、编码前输出票据、逐目标结算、取消意图、两阶段终态、保护配额及公平采集;没有新增任务、第二套操作状态机或 TX 配额。

审查入口:

控制归属与取消契约(保留的基础)

Shell 输入、断开、信号、resize 统一根据实际请求连接的完整 peer,在操作锁内校验归属并取得原引用;连接关闭和清理也按原 peer 处理。Exec 取消按 exact 非零 ID 先登记原操作意图,再协作中止;意图贯穿准备、密钥读取、创建、连接、认证和执行,取消与提交资格同锁决定先后。USER/TIMEOUT/MATCH 保持分离,观察失败和服务停止不自动取消远端业务。

历史证据:V1/V2 控制契约、G1/G2 生命周期、F1/F2 投递与保护配额。这些是历史基线,v3 基础与本次 J1 的验证范围分别列明,不互相替代。

v3 本地验证(历史基线)

同一最终输入哈希已执行并保留退出码:

  • WebSocket run_host.sh、run_operation.sh、run_operation_adapter.sh、run_control.sh、run_reviewer.sh、run_f1_f2.sh:有效历史回归保持,包括停止重试、资源耗尽、身份隔离、逐目标结算与公平推进。
  • runtime、certificate、WebUI Node/Chrome、release 原回归入口通过;网络/SDK 等边界模拟,未把主机测试视为设备验收。
  • 新桥使用实际 C handler/operation/TX/项目 SSH client 与 Shell,在最终 SDK 边界截取消息字节,交给实际 JavaScript socket 分发,再将真实前端后续请求送回 C。中英文 Node、Chrome、构建后优化消费者均通过;xterm 渲染与网络是替身。
  • 真实下层组合测试覆盖 EOF、ERROR、部分写、持续 EAGAIN、部分初始化、CLI 输入回调、重复上层清理,以及停止 timeout 后保留资源、无新业务情况下重试排空。
  • 固定 ESP-IDF v5.5.2 / ESP32-S3 独立目录构建通过,应用镜像 0x215120,分区剩余约 31%。JS 语法、gzip 解压和 cache key 已检查;由核验目录重生成的 SPIFFS 与实际 www.bin 逐字节相同。
  • 提交前重新执行真实驱动、C/JS 双向回放和控制归属测试,并核对 843 项最终输入哈希一致;没有重新完整编译或重复全部 Chrome 套件,使用同一输入的实施阶段证据。产品和测试暂存差异检查通过;冻结源码和历史 patch 保留原始空格。

统一入口:IDF_PATH=/path/to/esp-idf python3 tests/ws_subscriptions/run_project_v3.py,浏览器加 --browser。反例重放 replay_project_baseline.py 返回 0 表示旧缺陷被确认,不是修复通过;缺依赖或编译失败不算反例。

目标 GCC 测得 Shell 对象 1076 → 1080 字节,WebUI Shell context 20 → 20;相同正常创建/写入/不支持信号/关闭路径的项目分配次数不增加。单函数栈帧记录不代表完整调用链峰值或设备栈水位。

兼容性、剩余风险与验收边界

  • 未操作设备、刷写、重启或执行真实 SSH;真实双核调度、慢连接/RST/LRU、TLS、旧配置升级、断电/NVS、远端部分写与 EOF、长期堆/栈/CPU 和高负载仍需实机验收。
  • Shell 帧仍无操作 ID:同一连接内跨 Shell 代次迟到控制无法完全区分。完整 peer 只解决连接实例归属。取消被接受不等于远端已终止;提交资格已认领后不能保证命令从未执行。同步密钥读取和 DNS 不能立即打断。
  • 发送成功不是浏览器 ACK。输出不完整结束网页观察,不等于后台命令已取消或确定失败。关键通知有限重试耗尽或连接失效时不能保证浏览器看到终态,不自动重放输入或命令。
  • 消息缓冲总上限仍为 1 MiB,保护通知独占 5 KiB;四个保护转换槽和一个周期/调试槽与普通日志隔离。结果容量不足时会暂拒新任务。关键 SDK 入队最多 300 次、至少间隔 100 ms;实际发送失败不重发不确定帧。
  • 更新后刷新页面并重新连接,保持 firmware/www 同一构建。旧固件 H1 帧无法让新页面安全推断真义,不承诺混合版本兼容。xterm CDN 依赖已由本次固定版本本地化替代,受控首次加载禁止公网通过;真实设备离线验收仍待执行。
  • 既有 /ws 独立认证/主题授权缺口不在本轮范围,定向发送不代表完成安全验收。升级前备份配置,不承诺配置写入后无条件降级。

当前本地门槛不代替合并批准或实机验收。新增 C/跨层套件尚未接入 CI;现有 CI 运行 WebUI 回归和固件构建,只看新 head 的结果,不沿用上一提交绿灯。

发布边界

本次追加没有改版本号、发布工作流、硬件保护、SSH 匹配规则、布局或公开协议。PR 不发布正式 Release,不自行合并。

保留既有流程:组织 main 合并后,固件构建和 WebUI 回归成功,核对版本与中文 Release 正文后自动发布 v0.5.2;同版本已存在则跳过,不覆盖正式 Release。

@massif-01 massif-01 changed the title 发布 v0.5.2:证书、自动化与 SSH 稳定性修复及双语操作结果校正 发布 v0.5.2:证书、SSH 与 WebSocket 稳定性修复及双语操作结果校正 Sep 24, 2026
@massif-01
massif-01 merged commit ac109b0 into RMinte-AI:main Sep 28, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant