JoeAllen
|
61d8d6fa77
|
fix(windows): 发布构建不再弹出控制台窗口
Windows 上入口默认 console 子系统,运行时自动创建控制台窗口。
按 debug_assertions 分流:release 用 windows 子系统(纯 GUI,无
控制台;eprintln/tracing 输出丢弃),debug 保留 console 子系统
(日志直接可见)。程序化验证:release 无 ConsoleWindowClass
窗口,debug 保留控制台连接。
|
2026-10-13 00:31:35 +08:00 |
|
JoeAllen
|
82f26652a4
|
chore(release): v1.1.0
|
2026-10-12 19:58:55 +08:00 |
|
JoeAllen
|
dd57077e0c
|
fix(theme): 修复注册循环被 bisect 残留覆盖——亮色预设全部失效
Solarized Light 等亮色预设不生效的根因:此前栈溢出二分时
register_bundled_themes 被改为「只注册 catppuccin 4 个」的探针版,
后续恢复只还原了 truncate 而漏掉了注册循环本体(BUNDLED_THEME_FILES
全量循环留在 0..0 死代码里)。暗色预设(Catppuccin Mocha)碰巧可用,
亮色一律回退深色。
恢复全量注册循环;39 个预设名(Linear + 38)注册验证通过;
Catppuccin Mocha / Solarized Light 双预设实机截图验证生效。
顺带移除排查期临时打点,恢复用户 settings 为 system/linear。
|
2026-10-12 19:31:07 +08:00 |
|
JoeAllen
|
ac5b6e9862
|
feat: 接入 gpui-kit 全部 38 个官方主题预设 + 按语言拆分 locales + 0.7.3 升级
主题预设("我全都要"):
- gpui-app/themes/ 内嵌官方捆绑 21 个文件 36 变体 + Default Light/Dark
- theme.rs:register_bundled_themes(bootstrap 注册)/ apply_theme_preset
(Theme::update + apply_config 整包应用)/ theme_preset_names
- settings.theme_preset 字段(serde 默认 linear);保存/启动按预设分派,
外观模式与跟随系统监听仅对 Linear 生效(预设自带明暗不被冲掉)
- 设置页「主题预设」下拉(Linear + 38 注册名),切换即时生效
语言包按语言分文件(用户要求):
- locales/ui.yml → locales/en.yml + locales/zh-CN.yml
(rust-i18n 文件名 stem 即 locale,扁平 "ns.key": "value")
- i18n.rs 测试改为双文件键集合一致性 + 占位符强制
修复:设置对话框打开即栈溢出
- gpui-kit 0.7.0→0.7.3 无法解决;根因是 Windows 主线程 8MB 栈对
Dialog 覆盖层内 Select 渲染的深调用链不足,注册多主题后越过阈值
(64MB 试验栈下不复现,证实深调用链而非无限递归)
- .cargo/config.toml:Windows 主线程栈 8MB→64MB
- 注册时机移到 bootstrap(main 的 init_themes,gpui_kit::init 后、
窗口创建前),对齐官方 story 示例的注册姿势
- 误伤修复:gpui-app/Cargo.toml 被批量编辑误删 bin.name 与
build-dependencies 段;examples/flood.rs 误删已恢复
官方 skill 同步:npx skills add 被墙,gh-proxy 镜像克隆后手动覆盖
~/.agents/skills 与 ~/.zcode/skills 的 gpui-kit + gpui-kit-design-guides。
|
2026-10-12 17:07:40 +08:00 |
|
JoeAllen
|
c2c89014d1
|
fix: 恢复误删的 examples/flood.rs(清理探针时误连目录删除)
|
2026-10-12 15:12:18 +08:00 |
|
JoeAllen
|
05b37a8997
|
refactor: 按 gpui-kit 官方指南对齐(locales 拆分/render 无突变/动作统一)
skill 安装:npx skills add 因网络不可用,改为 gh-proxy 镜像克隆仓库后
手动覆盖 ~/.agents/skills 与 ~/.zcode/skills 两处安装(与官方最新一致)。
语言包按语言分文件(用户要求):
- locales/ui.yml(合并格式)→ locales/en.yml + locales/zh-CN.yml
(rust-i18n 以文件名 stem 识别 locale,扁平 "ns.key": "value")
- i18n.rs 测试适配双文件:键集合一致性 + 占位符两侧一致强制保留
对齐 coding-guides / design-guides / auto-update:
- render 无突变:分组过滤悬空复位从 render 移到 delete_connection/
save_connection 的 action 路径(normalize_group_filter)
- 消除 UI 层 hsla 字面量:消息色条改 when_some 条件上色;色板描边
从白 60% 改主题底色(双主题下均为「与背景的缝隙」语义)
- 动作统一:标题栏菜单的资源监控/导出/导入/设置改 dispatch_action,
与快捷键共享同一 Action(菜单/快捷键单一命令策略)
- auto-update 对齐官方指南:自动检查加 24h 节流(.last-update-check
时间戳),手动检查更新不受限
保留(记录豁免理由):
- 手写 collapsible_section:官方 Accordion 非受控(内部索引状态),
替代会丢「已配置默认展开」的受控行为
- 自研 update/:官方无内置 updater,指南推荐 self_update+应用自有
状态机,现有实现(状态机/后台 worker/sha256/consent/原子替换)
已符合该精神;换 self_update 反而放弃已有代理兜底与 7z 通道
- px() 几何常量:对话框/面板宽度与色点尺寸属文档化几何豁免,
机械换算会引入视觉回归;min 约束的 px(0.) 为布局断言
42 测试全绿,实机冒烟通过。
|
2026-10-12 15:11:48 +08:00 |
|
JoeAllen
|
762ae4bddb
|
style: 修正 init_i18n 调用点缩进
|
2026-10-05 00:51:21 +08:00 |
|
JoeAllen
|
5db0972263
|
fix(i18n): 全局复查修复——多行调用点漏替换、动态 label 回归与死键清理
复查发现(audit 脚本 + 修正后的单测扫描器):
- 27 处多行 tf("中文") 调用点未被键迁移的单行替换覆盖,英文模式下
回退显示中文;正则补丁全部换为语义键
- DirFilter/DetailFormat::label() 仍返回中文常量,t() 动态查键必然
miss(英文模式方向过滤/格式按钮显示中文);label() 改返回
common.all/dir.*、common.auto/text(Hex/Base64 语言中性字面量)
- 单测扫描器与 audit 脚本的共同盲区:t(/tf( 与引号之间的空白换行
不被匹配;扫描器改为跳过空白后取字面量,多行调用纳入强制覆盖
- 6 处 UI 直写补翻:连接测试成功通知、复制连接"(copy)"后缀、
rfd 导入/导出对话框标题、设置对话框标题、订阅标识符字段标签
- store 导入/导出错误与 PayloadFormat 编码错误(均经 Notification
展示)key 化,共 14 条新词条
- 删除 10 个真死键;mqtt/tls/update 层诊断错误维持中文(技术诊断
流,不进 UI 渲染路径),边界记录于模块文档
语言包现状:354 键、en/zh-CN 双语并排、零死键、零 UI 中文直写;
42 测试全绿;英文模式实机截图复核(含回归点)通过。
|
2026-10-04 23:49:28 +08:00 |
|
JoeAllen
|
35e2b6fb60
|
refactor(i18n): 迁移到 rust-i18n 语义键体系(ns.key),废弃中文原文作 key
旧实现的问题(按用户反馈):
- 中文原文作 key:文案措辞与代码耦合,一词多义撞 key("主题" Topic/Theme)
- 巨型 match 文案表:重复键靠编译警告暴露;漏翻静默回退,无任何校验
- tf 参数到处 &n.to_string() 噪音
新体系(gpui-kit 官方方案):
- locales/ui.yml 语言包(rust-i18n v2,en/zh-CN 双语并排),key 为
语义标识符(common.save / conn.connect / status.connected…),
与自然语言彻底解耦;改措辞不动代码
- crate 根 i18n! 编译期内嵌;init_i18n() 经 extend! 并入 gpui-kit
组件内置文案(按钮/空态等随语言切换)
- t/tf 薄门面查 _rust_i18n_translate(运行时 key),模型 label()
改返回语义 key;tf 参数只需 Display
- 四个强制单测:语言包 en/zh-CN 完整、占位符 {x} 两侧一致、
全源码 t()/tf() 字面量必须存在词条、模型 label 必须有真实译文
- 语言中性文案("QoS"、"/mqtt" 等)去掉 t() 包裹
- 顺带补翻 30 条漏网文案(资源监控统计行/表单校验/阿里云说明段等)
42 测试全绿;中英双语实机截图验证零裸 key。
|
2026-10-04 12:27:55 +08:00 |
|
JoeAllen
|
b23c0039db
|
chore(release): v1.0.0
|
2026-10-01 15:55:44 +08:00 |
|
JoeAllen
|
94fdb6a507
|
feat: 国际化 / 键盘操作 / 无障碍 / 性能优化
国际化
- 新增 ui/i18n 双语文案表(中文原文为 key,英文集中映射,tf 支持占位符)
- AppSettings 增加 language(跟随系统/中文/English),启动与保存时即时生效
- 全部界面文案(标题栏/侧栏/工作区/发布/订阅/表单/设置/全部对话框/通知)入表
键盘操作
- Ctrl+W 关闭当前标签页;Ctrl+Tab / Ctrl+Shift+Tab 循环切换标签
- Ctrl+F 聚焦当前工作区消息过滤框
无障碍
- 全部纯图标按钮补 accessibility_label(屏幕阅读器 / UIA 自动化可识别)
性能
- 折叠态预览(JSON 美化/压平+截断)改为入环形缓冲时计算一次,
随 MqttRecord 缓存(Arc<str>),渲染热路径对最多数百条可见行
不再逐帧重复 serde_json 解析
|
2026-10-01 15:54:18 +08:00 |
|
JoeAllen
|
c05b258c5c
|
feat(ui): 侧栏/订阅面板/发布栏抽屉式折叠
- 连接侧栏:Ctrl+B 或把手按钮收起为 40px 窄 rail(展开把手 + 新建连接),
状态随 ui-state.json 持久化;展开时标题行带收起按钮
- 订阅面板:标题行收起按钮,收起后左侧 32px rail 拉回
- 发布面板:工具条右端把手收起为细条(34px),细条上拉回;
收起后全局 Ctrl+Enter 发送仍可用
|
2026-09-30 16:36:59 +08:00 |
|
JoeAllen
|
1dca18873c
|
chore(release): v1.1.0
|
2026-09-30 16:16:32 +08:00 |
|
JoeAllen
|
967bf9dd78
|
feat(ui): 界面体验一轮打磨(快捷键/暂停滚动/会话恢复/JSON 预览)
- 全局 Ctrl+Enter 发送;订阅框 Enter 提交、Esc 退出编辑;过滤框 Esc 清空
- 消息流新增「暂停/恢复」:暂停时画面不随新消息跳动,消息仍入环形缓冲
- JSON 负载折叠态预览按原始数据美化展示(多行缩进,超 40 行兜底截断)
- 标签页持久化(ui-state.json),重启恢复工作区;无可恢复标签时自动打开
首个自连连接的工作区,避免「已连上却演空态」
- 侧边栏 Error 连接行内红字显示失败原因;侧边栏/订阅面板补竖分隔线
- 消息订阅色条上下留隙,不再连成一整条竖线
- 发布被当前过滤条件隐藏时给出「已发送」提示
- 连接表单:主机+端口同行;TLS 证书三个路径字段加「浏览…」(rfd)
- 主题切换/系统外观变化后强制整窗重绘,修未收敛区域的旧色残影
- 设置主题文案改「跟随系统」(跟随逻辑此前已实现)
|
2026-09-30 16:15:58 +08:00 |
|
JoeAllen
|
f5cd0cdc4f
|
chore: 移除项目中所有 Gitea 痕迹,origin 仅作 git 同步远程
- settings_dialog:仓库链接 REPO_URL 与展示名改指 GitHub,
更新检查文案改「检查 GitHub Releases 上的新版本」
- update/mod.rs、check.rs 注释与 README 去除 Gitea 提法
- 删除 docs/deep-analysis-2026-09-30.md:其发布流水线章节描述的
Gitea 旧渠道已整体下线,报告失去现实参照(git 历史 5ad4536 可找回)
|
2026-09-30 14:02:38 +08:00 |
|
JoeAllen
|
f01601114c
|
fix(cross-platform): 非 Windows 分支委托给 cfg 配对的桩函数
上一提交内联 false 使非 Windows 版 set_topmost_windows 桩失去调用者,
在 -D warnings 下报 never used。恢复委托调用。
|
2026-09-30 13:17:21 +08:00 |
|
JoeAllen
|
5783a500e8
|
fix(cross-platform): cfg 掉的 Windows 路径遗留 dead_code 在 -D warnings 下报错
CI 的 setup-rust-toolchain 默认 RUSTFLAGS=-Dwarnings:非 Windows 下
sample_windows/set_topmost_windows 被 cfg 移除后,其专用字段
(Sampler.pid/last_cpu/last_percent)与常量(SWP_*)成为 dead code。
字段加 cfg_attr(not(windows) allow(dead_code)),常量加 cfg 门控。
|
2026-09-30 13:15:01 +08:00 |
|
JoeAllen
|
22e0c70b90
|
fix(cross-platform): set_topmost/sample 改属性 cfg 分派,修复非 Windows 编译
cfg!() 只是运行时常量,其分支永远参与类型检查 —— 非 Windows 下
sample_windows / set_topmost_windows 被属性 cfg 移除后调用点报
E0599 方法不存在(Linux CI Test job 第二跑暴露)。改为
#[cfg] 属性块分派,两条路径各平台上只有一个参与编译。
|
2026-09-30 13:12:36 +08:00 |
|
JoeAllen
|
7bff64e477
|
fix(build): build.rs 用 cfg 门控 embed_resource,修复 Linux 编译
embed_resource 只声明在 Windows 的 build-dependencies,Linux 编译
build script 时模块路径无法解析(CI Test job 首跑即暴露:旧 Gitea
runner 从未真正跑过流水线,此问题一直潜伏)。运行时 env 判断无效,
改用 #[cfg(target_os = "windows")] 编译期门控。
|
2026-09-30 13:09:37 +08:00 |
|
JoeAllen
|
8614c66131
|
chore(release): 弃用 Gitea 渠道,GitHub 发布历史自 v1.0.0 独立开始
- 删除 mirror-gitea job 与 scripts/publish-gitea.*(不再向 Gitea 镜像,
不管旧版本兼容)
- update/mod.rs 与 README 同步:Gitea 标记为历史渠道已弃用
|
2026-09-30 13:01:42 +08:00 |
|
JoeAllen
|
7b41e7f13d
|
feat(update): OTA 兜底发现与系统代理支持
- check_latest 加免 API 配额的兜底路径:api.github.com 被限流(60 次/
小时/IP,共享出口 IP 实测已打满)时,跟踪 github.com/releases/latest
的 302 从最终 URL 提取 tag,下载与 .sha256 按命名约定构造;notes 置空、
大小置 0(进度未知、对账跳过),sha256 校验仍强制执行
- ureq 启用 win-system-proxy:Windows 系统代理注册表设置自动生效;
HTTP(S)_PROXY 环境变量代理 ureq 默认就读取,无需配置
- 实测:github.com 直连与代理均可达(302 正常),api.github.com 直连
与代理出口 IP 的未认证配额均耗尽 —— 兜底路径为必需品而非锦上添花
|
2026-09-30 12:54:57 +08:00 |
|
JoeAllen
|
68273e8e63
|
feat(update): OTA 更新源切换到 GitHub Releases
- RELEASES_API 指向 api.github.com/repos/LiJoeAllen/mqttx/releases;
latest 端点优先,回退列表分页改 per_page=5(GitHub 参数)
- agent 显式设置 User-Agent: mqttx-ota(GitHub API 要求携带 UA)
- api.github.com 未认证配额 60 次/小时/IP:共享出口 IP 打满时检查静默
降级(错误仅记录),附件下载走 github.com CDN 不受配额限制
- 设置对话框「关于」的更新源展示改为 GitHub(UPDATE_SOURCE 常量)
- v1.0.x 老客户端 OTA 源仍是 Gitea,靠 CI mirror-gitea job 喂养
(配置 GITEA_URL/GITEA_TOKEN/GITEA_OWNER Secrets 后生效),
老客户端升级完毕后可移除镜像 job 与 publish-gitea 脚本
|
2026-09-30 12:41:11 +08:00 |
|
JoeAllen
|
6f09a5729f
|
chore(deps): 全量升级依赖,适配 gpui-kit 0.7 与 ureq 3
- gpui-kit 0.6→0.7:main.rs 改用 gpui_kit::open_window 自动挂载 Root,
移除内容视图手动挂载的 dialog/sheet/notification 层
- ureq 2→3:Agent::config_builder 配置超时(global/connect/recv_response),
响应体改用 read_json / read_to_string / into_body().into_reader()
- hmac 0.13 需显式导入 KeyInit;digest 0.11 的 Output 不再实现 LowerHex,
sha256 转 hex 改为逐字节格式化,并补已知向量测试
- windows 0.62:SetWindowPos 插入位置参数改为 Option<HWND>
- dirs 6→7、base64 0.22→0.23,其余锁内更新(tokio/sentry/rustls 等)
- TLS 栈不变(rustls + webpki-roots),无 openssl/native-tls 混入
已验证:cargo check 零警告;35 测试通过;运行应用截图核验主界面、
新建连接对话框打开与关闭均正常
|
2026-09-30 11:43:40 +08:00 |
|
JoeAllen
|
7684eedd0f
|
fix(ui): 表单校验加固与对话框生命周期
- 端口 1~65535(0 不是可连接端口);接收上限/最大报文长度/主题别名上限拒 0——MQTT 5 规范定义为 Protocol Error,broker 直接断连且值会被持久化,表现为每次连接都失败
- 遗嘱主题 trim 后入库,并拒绝包含通配符 + / #(通配符只用于订阅过滤器)
- 16 个被校验字段订阅输入变更:编辑即清空字段错误,红字不再滞后于实际输入(此前错误只在保存时登记,改好值后红字仍挂着)
- 传输切换只按「上一个方式」的默认端口覆盖端口:与全部默认端口比较会把用户手输的 8084/8883 误判为默认值,WSS:9443 → TCP → WSS 往返丢端口
- 五个对话框 open() 统一加 has_active_dialog 守卫:对话框是栈式叠加,多入口重复 open 会压入第二个模态,同 id 控件在两层间串台
- 阿里云预设对话框表单预填即选中第一项:此前 selected=None,打开即保存会 push 一条内容相同的重复预设
- OptionDelegate::position 按框架契约实现(按值反查索引):恒返回 None 会让 set_selected_value 失效、下拉显示空
- 非 Windows 不渲染置顶按钮:set_topmost 恒 false,显示必然报错的按钮只会让人困惑
- 主题键名对齐 gpui-component 的 serde rename:font.size / radius.lg 此前被静默忽略,14px 紧凑排版从未生效(实际渲染 16px)
- aliyun.rs DeviceName 空值校验;Cargo.toml 声明 Apache-2.0(与关于页一致)
|
2026-09-30 10:16:17 +08:00 |
|
JoeAllen
|
9b6df8b9eb
|
fix(app): OTA 信任链加固、引擎背压与协议正确性
OTA(update/):
- 解压前校验 7z 条目清单:sevenz-rust 0.6.1 的 decompress_file 直接 dest.join(entry.name()),不校验 ".."、绝对路径与盘符,恶意归档可越界写文件;现在要求恰好一个条目且名字与约定二进制一致(fail-closed)
- 无 .sha256 侧车时拒绝安装,不再静默跳过校验而 UI 仍宣称已校验
- 安装前重算暂存文件哈希;同意标记从仅版本号改为绑定「版本 + 哈希」
- 跨卷 rename 失败回退「复制 + fsync + 删源」(暂存在 APPDATA、exe 在安装目录,不同卷时必失败且报错误导)
- .old 回滚备份保留 7 天:原实现新版本首启即删,新版本一旦崩溃用户无任何回退路径
- 新增安装互斥锁:两实例同时安装会互删暂存包、争抢同一个 .old
- platform_triple 用 std::env::consts::ARCH:写死 x86_64 让 ARM 客户端永远挑不到产物
- pick_assets 按命名约定精确后缀匹配:非 Windows 下 ends_with("") 恒真,.tar.gz/.deb 会被当成可执行文件下载并替换自身
引擎(mqtt/):
- 事件通道改有界并分级:高频事件(消息/日志)满即丢并计数、每 1000 条提示一次;状态/订阅结果/发布回执异步补投。原无界通道在到达速率超过消费速率时内存无上界(单条最长 128KB)
- 重连改指数退避(1s→30s 封顶)+ 0~500ms 抖动,替代固定 2 秒的惊群式重试
- 测试连接的建连(读证书,阻塞 IO)移入 spawn_blocking,与 connect 一致
正确性与性能:
- session_params_changed 补齐 4 个 v5 CONNECT 属性(会话过期/接收上限/最大报文/主题别名),漏掉会让"重连后生效"提示静默失效;测试改逐字段防漏式断言
- ConnectionConfig / AliyunPreset 手写脱敏 Debug:password 与 AccessKeySecret/DeviceSecret 输出 <redacted>,杜绝一次 {:?} 把凭据送进 stderr 与 Sentry
- MqttRecord.user_properties 改 Arc<[(String,String)]>、应用日志改 Arc<LogEntry>:消息面板每帧 300 条、日志面板每帧 3000 条的深拷贝降为引用计数
- 阿里云 DeviceName 空值校验,避免拼出非法 clientId 后服务端报错难懂
|
2026-09-30 10:15:40 +08:00 |
|
JoeAllen
|
2661a734ee
|
fix(release): 修复 CI 阻断与发布链路,强制版本一致性
- sysmon 采样测试改为分平台断言:此前无条件断言 working_set > 0,非 Windows 上 cargo test 必失败,v* tag 会停在测试阶段(test job 恰好跑在 ubuntu-latest)
- CI test job 补齐 GPUI 的 Linux 系统依赖,--lib --tests 让集成测试参与编译
- meta job 校验 tag 与 gpui-app/Cargo.toml 版本一致:忘 bump 会导致新版本装完仍自报旧版,客户端反复提示同一更新
- 发布脚本:--exact-match 取 tag 并强制 semver 校验(--always 会产出 v1.0.0-4-gbc9f55c 这类客户端 release_part 截断后判定不新的版本,且该 Release 会占据 /releases/latest 遮蔽真更新);Release 创建/查询/解析失败一律 exit 1,不再让 job 变绿而 OTA 通道为空
- sysmon CPU 差分基准只在真正算出结果时前移:采样间隔过近沿用上次读数,修复手点立即刷新永远读到 0%;修正 cpu_percent 注释口径(0~100,整机占比)
- README 订正发布流程:CI 实际仅出 Linux 产物;补 Release 附件(7z/裸二进制/.sha256)这一 OTA 唯一通道与命名约定;token 需 repo 写权限
|
2026-09-30 10:14:18 +08:00 |
|
JoeAllen
|
bc9f55c889
|
refactor(ui): 拆分 app/connection_view/widgets 为子组件,对话框归拢 dialogs/
- ui/app/ 拆为门面、events(引擎事件泵)、actions(用户动作)、io(导入导出)、
theme(主题)、titlebar/sidebar/main_area(渲染分区)
- ui/connection_view/ 拆为门面、subscribe、messages、publish、vars、util(纯函数)
- ui/widgets/ 拆为 select(可搜索下拉)、kv_editor、common(字段行/状态/时间)
- 五个对话框归拢 ui/dialogs/,linear-theme.json 随 theme.rs 迁入 ui/app/
- clippy 0 警告,全部路径经门面保持稳定
|
2026-09-29 22:20:53 +08:00 |
|
JoeAllen
|
b5089f5898
|
refactor(core): 拆分 model/mqtt/update 为单一职责子模块
- model/ 按领域拆为 connection/subscription/message/publish/variable/log/settings
- mqtt/ 拆为门面(引擎与事件)、tls、v5、v4 四块
- update/ 拆为门面(版本工具与命名约定)、check(检查)、install(下载/安装/清理)
- sysmon 只保留进程资源采样,窗口置顶迁至新 platform.rs
- 对外路径经 mod.rs 再导出保持不变,测试随门面保留(33 通过)
|
2026-09-29 22:20:53 +08:00 |
|
JoeAllen
|
33d0ca10e7
|
test: 新增 flood 消息流量压测工具(examples)
向指定 broker 按速率发布指定大小的消息,用于复现/压测应用在
高频消息流下的 UI 性能。eventloop 独立任务持续 poll。
用法:cargo run --example flood -- <host> <port> <topic> <count> <per_second> [payload_bytes]
|
2026-09-29 19:39:34 +08:00 |
|
JoeAllen
|
2089bb7259
|
chore: v1.0.0 —— GPUI 原生重写首个正式版
Release / Meta (push) Canceled after 0s
Release / Test (push) Canceled after 0s
Release / Build (ubuntu-latest) (push) Canceled after 0s
Release / Publish package (push) Canceled after 0s
|
2026-09-29 19:30:36 +08:00 |
|
JoeAllen
|
8a3cc8a660
|
fix: 资源监控「关闭」按钮补上 close_dialog 事件
按钮只声明了样式没绑 on_click,点击无任何效果(右上角 × 为
对话框自带所以能关)。UIA Invoke 端到端验证:点击后对话框关闭。
|
2026-09-29 18:02:27 +08:00 |
|
JoeAllen
|
64cc4489e3
|
feat: exe 图标重绘为 UI 品牌拓扑 logo
旧图标沿用 Tauri 时代的素材,与界面上的品牌 logo 不一致。
scripts/gen-icon.py 按 logo.rs 的几何与合成顺序纯 Python 光栅化:
- 紫色(Linear primary #5e6ad2)圆角方块底,圆角比例 0.26
- 白色连线(宽 0.04)自中心 broker(实心圆 d=0.34)连向
三个环形末端节点(d=0.30、环厚 0.06),坐标与 UI 完全一致
- 4×4 超采样抗锯齿,独立渲染 256/64/48/32/24/16 六个尺寸
打包为 PNG 帧 ICO;脚本归档 scripts/ 便于日后改动复现
|
2026-09-29 17:56:15 +08:00 |
|
JoeAllen
|
9b08f36268
|
chore: bump 1.0.5
Release / Meta (push) Canceled after 0s
Release / Test (push) Canceled after 0s
Release / Build (ubuntu-latest) (push) Canceled after 0s
Release / Publish package (push) Canceled after 0s
|
2026-09-29 17:29:55 +08:00 |
|
JoeAllen
|
2e5e1b8143
|
feat: OTA 附件改用 7z 压缩包(体积 -73%),客户端纯 Rust 解压
- 发布脚本:附件打包为 <binary>.7z(-mx=9)+ .7z.sha256 上传;
同时保留裸二进制附件,v1.0.3 及更早客户端(不认识 7z)仍可升级
- update.rs:pick_assets 优先选 7z、无则回退裸二进制;
下载 → 大小对账 + sha256 校验 → sevenz-rust 解压出二进制暂存
(压缩包随即删除);暂存目录清理排除 .7z
- UpdateInfo 增加 asset_name 字段区分压缩包/裸文件
- 实测 21.3MB exe → 5.8MB(7-Zip -mx=9)
|
2026-09-29 17:29:47 +08:00 |
|
JoeAllen
|
1792c17eb2
|
chore: bump 1.0.4
Release / Meta (push) Canceled after 0s
Release / Test (push) Canceled after 0s
Release / Build (ubuntu-latest) (push) Canceled after 0s
Release / Publish package (push) Canceled after 0s
|
2026-09-29 17:03:19 +08:00 |
|
JoeAllen
|
68409b19d8
|
feat: 资源监控对话框(CPU/内存/线程/每连接预算)
- 头部:logo + 运行时长 + 自动刷新开关(默认 1.5s)+ 立即刷新按钮
- 2×2 指标卡:CPU 占用、工作集内存(对比峰值进度条)、提交内存、
线程·句柄;每卡带图标与说明副文本
- 消息与连接:总数汇总 + 每连接卡片(状态、消息数、32MB 预算
占用进度条)
- 入口:more-menu「资源监控」与全局快捷键 Ctrl+Shift+R;刷新循环
持弱引用,对话框关闭即停止
- MQTTX_OPEN_RESMON=1 启动直开(自动化 UI 验证后门)
|
2026-09-29 17:02:44 +08:00 |
|
JoeAllen
|
7de886410d
|
feat: 连接配置支持「启动时自动连接」
- ConnectionConfig 新增 auto_connect 字段(serde default,旧数据兼容)
- 连接表单「认证与心跳」区新增开关,随保存持久化
- 应用启动时对勾选的连接逐个拉起(遗嘱模板注入后 connect)
|
2026-09-29 17:02:25 +08:00 |
|
JoeAllen
|
0bfb887c01
|
feat: 标题栏钉子按钮交互
补上前一提交的按钮本体:Pin/PinOff 图标随置顶状态切换,
切换失败(句柄不可得等)弹错误通知。随 C3 的 sysmon::set_topmost 使用。
|
2026-09-29 17:02:24 +08:00 |
|
JoeAllen
|
a9c92e0974
|
feat: 任务栏图标嵌入、窗口置顶钉子与进程资源采样
- build.rs + embed-resource 嵌入 icon.ico:gpui 从 exe 资源 ID 1
加载窗口类图标,此前缺失导致任务栏显示系统默认图标
- 标题栏新增钉子按钮:sysmon::set_topmost 经 raw-window-handle
取 HWND 调 SetWindowPos(HWND_TOPMOST),Pin/PinOff 图标随状态切换
- sysmon 模块:CPU 时间差分、工作集/峰值/提交内存、线程/句柄采样
与运行时长基准(Windows 实现,其余平台返回空采样)
|
2026-09-29 17:00:59 +08:00 |
|
JoeAllen
|
4290ffdeeb
|
fix: 标题栏拖拽区吞掉顶栏按钮的鼠标点击
gpui-component 把整条 TitleBar 标记为 WindowControlArea::Drag
(WM_NCHITTEST 返回 HTCAPTION),其上的「新建连接/钉子/主题/菜单」
按钮点击全部被系统当作拖拽标题栏处理。
给右侧按钮簇加 occlude()(HitboxBehavior::BlockMouse):hit_test
收集到 BlockMouse hitbox 即截断,父级 Drag 区不再进入命中列表。
WM_NCHITTEST 探针验证按钮区由 HTCAPTION 变为 HTCLIENT。
|
2026-09-29 17:00:58 +08:00 |
|
JoeAllen
|
85a3bfcb1b
|
perf: 消息内存按字节预算,杜绝大报文流撑爆内存
- 新增 MessageRing:条数上限 + 每连接 32MB 字节预算双重驱逐
(从最旧丢弃,均摊 O(1));预分配容量按设置钳制在 512
- 单条 payload 保留上限 256KB → 128KB;MqttRecord::retained_bytes
计入文本与原始字节,供预算驱逐与资源监控展示
- 清空消息统一走 clear_messages;设置页标注字节预算兜底说明
- 新增单元测试:条数驱逐、字节预算、超预算单条保留、驱逐顺序
|
2026-09-29 17:00:34 +08:00 |
|
JoeAllen
|
878ea7cc76
|
chore: bump 1.0.3;发布脚本零配置化
Release / Meta (push) Canceled after 0s
Release / Test (push) Canceled after 0s
Release / Build (ubuntu-latest) (push) Canceled after 0s
Release / Publish package (push) Canceled after 0s
- 版本升级 1.0.2 → 1.0.3
- 脚本不再要求预置环境变量:GITEA_URL 从 git remote origin 推断,
GITEA_TOKEN 缺失时自动取 Git Credential Manager 中同一主机的凭证
(与 git 推送同源的 OAuth 凭证,无需另行创建 API token)
|
2026-09-29 13:43:30 +08:00 |
|
JoeAllen
|
2ef5133bcd
|
fix: KvEditor key 规范化与传输端口往返保留自定义值
- KvEditor 的 key 统一 trim 并去重(保留最后一条):带首尾空白的 key
永远无法被 {{key}} 模板引用,重复 key 只有首条生效
- 切换传输方式仅当当前端口仍是某个默认端口时才跟随切换:
WSS:9443 → TCP → WSS 的往返不再丢失自定义端口
|
2026-09-29 10:34:22 +08:00 |
|
JoeAllen
|
2f35bca546
|
fix: 阿里云接入点域名、一机一密签名规范与预设回填
- Token 模式(云消息队列 MQTT 版)接入点修正为 {实例ID}.mqtt.aliyuncs.com,
原先拼成物联网平台 iothub 域名,连接必失败;region 不参与该产品域名
- 一机一密模式按物联网平台官方直连规范重写:clientId 带
securemode=2,signmethod=hmacsha256,timestamp 后缀,password 为
HMAC-SHA256 拼接串签名,接入点 {ProductKey}.iot-as-mqtt.{region}.aliyuncs.com
(新增 product_key 字段与输入框)
- 对话框选中预设即回填表单:原先只做高亮,保存/连接读的是表单旧值,
会把所选预设用另一条的数据覆盖(含密钥)或用错误凭据生成连接;
「新建」同步清空表单
|
2026-09-29 10:34:22 +08:00 |
|
JoeAllen
|
7426b1fe69
|
fix: 数据文件损坏防护、写盘 fsync 与临时文件清理
- 加载失败不再静默:elog(stderr + Sentry)记录,本次会话按空数据继续
- 曾加载失败的文件在重新保存前先备份为 <name>.corrupt-<时间戳>,
杜绝「连接全部消失后被空数据覆盖」的不可恢复丢失
- 写盘 tmp+rename 前补 sync_all,掉电时 rename 提交的目标内容完整;
tmp 名拼入 pid 防并发互踩,rename 失败清理残留 tmp
|
2026-09-29 10:34:21 +08:00 |
|
JoeAllen
|
ab13f485e0
|
fix: MQTT 连接生命周期竞态与事件处理
连接句柄(mqtt.rs):
- ConnHandle 增加代数 generation,事件循环退出只在仍是自己这一代时
才移除句柄——旧循环无条件按 id 删除会把重连后的新句柄删掉,
导致连接显示在线却无法从 UI 断开、发布/订阅报连接不存在
- connect() 同步插入占位句柄(client=None),建连期间也可被取消;
建连完成后仅当句柄仍是本代才升级为可用客户端
- 重连 2 秒退避改为可取消的 select:原先 close() 的取消信号在退避
期间不可见,会对用户已关闭的连接继续真实重连
- 重连成功后清零计数(max_reconnect_times 限流的是连续失败次数);
v4 CONNACK 拒绝上报真实返回码;test_handshake 断开后再 poll 冲出
DISCONNECT 报文;建连的证书文件读取移入 spawn_blocking
消息记录与事件(model.rs / app.rs / connection_view.rs):
- 非文本负载保留原始字节(MqttRecord.raw_bytes,仅非法 UTF-8 时
占用,纯文本零开销),详情 Hex/Base64 不再展示 lossy 失真字节
- EngineEvent::Published 补齐 response_topic/correlation_data/
message_expiry;correlation_data 两侧统一「优先文本、回退 hex」
- 事件入口加连接存在性守卫:删除连接后排队的引擎事件不再复活
状态/消息(内存泄漏)或为已删连接写孤儿订阅
- SUBACK 失败时移除乐观插入的订阅行;成功事件只刷新已有订阅,
不再用默认字段复活 SUBACK 前被删除的订阅
- Connecting 期间侧栏电源按钮防抖;分组名恰为 all/ungrouped 时
chip 元素 id 改前缀避免共享交互状态
- 「清空」按钮按消息总数而非过滤命中数判断禁用;搜索匹配的
大小写快速路径限定 ASCII(U+1E9B 等小写映射非自身的字符)
- 应用发布预设后同步模板变量面板,残留行不再写回全局变量
- 日志文件套 BufWriter,高频消息流不再逐条落盘 syscall
|
2026-09-29 10:33:59 +08:00 |
|
JoeAllen
|
5dc1a8cc0b
|
fix: OTA 更新需用户同意、下载完整性与暂存区管理
- 安装同意标记:仅「下次启动安装」写入,main.rs 凭标记才自动安装,
跳过确认对话框不会再被强制升级;对话框新增「暂不更新」(删除暂存包)
- 下载完整性:API 提供大小却未下满/超量时报错(read 返回 0 无法
区分干净结束与连接截断);失败路径统一清理 tmp 文件
- 版本比较遵循 semver 预发布语义(1.0.0-beta.2 不比 1.0.0 新);
暂存文件名按尾部锚点解析,预发布后缀不再丢失导致重复下载
- 多版本暂存并存时取最新(readdir 顺序无序);下载完成后清理旧版本残留
- install_staged:spawn 失败(杀毒锁文件)自动恢复旧版本并如实报告回滚结果
- agent 加整体 10 分钟超时;cleanup_old 大小写不敏感、跳过近期 tmp
避免误删并行实例正在写入的文件
- 设置对话框:下载进度条传百分比(原 0~1 小数只显示 1%);
立即安装失败显示具体错误;Sentry release 与更新检查同源版本号
|
2026-09-29 10:33:28 +08:00 |
|
JoeAllen
|
4a04e3d5b7
|
chore: bump 1.0.2
Release / Meta (push) Canceled after 0s
Release / Test (push) Canceled after 0s
Release / Build (ubuntu-latest) (push) Canceled after 0s
Release / Publish package (push) Canceled after 0s
|
2026-09-29 01:08:06 +08:00 |
|
JoeAllen
|
96865c0588
|
perf: 深度优化消息内存占用
- 消息缓冲 Vec → VecDeque:原来溢出时 drain(0..n) 每条消息 O(n)
搬移,高频消息下产生大量拷贝;环形缓冲均摊 O(1),并按配置上限
预分配避免反复扩容
- connection_id/topic/payload 改 Arc<str>:引擎侧主题驻留
(10k 上限,超出整体重建),同主题数千条记录只存一份;
消息列表每帧克隆最多 300 条用于渲染,payload 共享后零拷贝
- 单条 payload 历史保留上限 256KB(retained_payload,UTF-8
边界安全截断),超大报文不再长期占据环形缓冲;消息行显示
「已截断」徽章;发布记录改用实际发送字节(修 Base64/Hex
历史内容与真实报文不一致的隐患)
- live 测试适配 Arc<str>;补截断边界单元测试(22 个 lib 测试 +
2 个 live 测试通过)
|
2026-09-29 01:07:32 +08:00 |
|
JoeAllen
|
88a8652d7b
|
feat: 接入自建 Sentry 错误上报
- DSN 指向 rustrak 自建 Sentry(项目 8),release 标记 mqttx@版本
- panic 路径:sentry-panic 链式钩子捕获 + 外层钩子 flush 5s,
确保 panic=abort 终止进程前事件送出
- 存储层 elog! 持久化错误同步 capture_message 上报
- 传输用 reqwest+rustls,避免 openssl 依赖
|
2026-09-29 00:30:23 +08:00 |
|