Releases: uclort/Bettbox
Release list
Bettbox 1.19.3+2090000156 · main@26865630fef4 · 修复 Windows 更新弹窗最新版本号展示
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000156
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000155-r20261003042515-771d22c734e9-2c8fb62cd4c6→custom-v1.19.3+2090000156-r20261003044245-9225674730f2-2c8fb62cd4c6
2026-10-03 修复 Windows 更新弹窗最新版本展示
- Windows appcast 的
title和sparkle:shortVersionString改为发布最终安装版本1.19.3+构建号,更新弹窗中最新版本和本机版本都能显示构建号,方便直接对比。 sparkle:version继续保持纯构建号,与 WinSparkle 本机比较版本一致,不重新引入同版本误报。- Windows 构建新增 appcast 完整版本展示字段的静态回归校验,防止
echo生成逻辑回退到短版本号。
2026-10-03 修复 Windows 系统代理、首次 TUN 授权与重复启动
- Windows 系统代理同时写入 WinINet 连接配置和当前用户
Internet Settings注册表;默认连接 API 在特定系统环境返回失败时,注册表写入可继续完成代理启停。 - Windows 首次开启 TUN 时,管理员授权后的 Helper 健康等待延长至最多 30 秒,并取消服务启动过渡状态下的提前失败,授权完成后会自动继续启动,无需再次点击开关。
- Windows 主窗口使用稳定的原生角色标记识别已有实例;再次双击桌面快捷方式会恢复隐藏或最小化的主窗口并置前聚焦,第二进程按成功激活已有窗口退出。
- Windows 构建增加注册表代理兜底、Helper 授权等待和主窗口重复启动激活的回归校验。
2026-10-03 修复 Windows 系统代理误判与 Helper 残留
- Windows 系统代理只以默认 WinINet 连接写入作为成功标准;RAS 连接同步和设置刷新改为尽力执行,避免代理已经写入却因附加操作失败而被误判并自动关闭。
- Helper 服务统一改为按需启动;主程序正常退出时停止核心并主动结束 Helper 服务,避免升级安装时仍提示关闭
BettboxHelperService.exe。 - 安装器不再创建或启动 Helper;升级时仅保留原鉴权配置并更新服务路径,且静默停止残留 Helper/Core,不再在安装开始前弹出 Helper 关闭提示。
- Windows 构建增加系统代理成功条件、Helper 退出链路及安装后进程与服务非运行状态的回归校验。
2026-10-03 修复 Windows 网络开关、网络面板与更新版本展示
- Windows TUN 启动改为与 macOS 一致的同步流程:先加载无 TUN 配置,再完成管理员授权、必要的 Helper/核心重启、监听启动和 TUN 配置应用;删除先标记运行、后台异步启用 TUN 的逻辑。
- TUN 授权、核心重启或配置应用失败时回滚期望状态和实际状态;系统代理仍开启时恢复无 TUN 核心,否则保持停止,避免开关显示开启但系统无法联网且面板没有请求。
- 桌面端统一用核心真实状态驱动系统代理和运行时展示;系统代理启停按顺序执行,Windows 原生插件校验 WinINet/RAS 调用并返回真实结果,不再无条件报告成功。
- Windows
--network-panel使用独立原生窗口标题并绕过主窗口单实例激活,修复点击“面板”后新进程立即退出、窗口不弹出的问题。 - WinSparkle 同时设置完整展示版本和纯构建比较版本:更新窗口显示
1.19.3+构建号,内部继续以构建号和最新版本比较。 - Windows 构建新增更新函数、面板单实例路径和系统代理真实返回值的静态回归校验。
2026-10-02 修复 Windows 安装程序临时目录拒绝访问
- Windows 自定义安装包增加单文件启动器,在
%LOCALAPPDATA%\Bettbox\InstallerTemp建立独立临时目录后再启动内嵌的 Inno Setup 安装器,避免系统%TEMP%权限异常时安装程序直接报“错误 5:拒绝访问”。 - 启动器释放内嵌安装器时改用堆分配的 1 MB 复制缓冲,避免默认 1 MB 栈空间被耗尽导致
0xC00000FD崩溃。 - Windows 构建新增临时目录回归:将
TEMP/TMP指向不存在的路径后执行静默安装并校验Bettbox.exe,安装与卸载各设置 5 分钟超时和进程诊断,避免异常时拖满 120 分钟 job 超时。 - 修复静默卸载被用户数据确认框阻塞的问题:
/VERYSILENT卸载不再弹出确认框并默认保留用户数据;交互卸载行为不变。Helper 服务停止增加短等待后的强制结束兜底,避免残留进程阻塞卸载。
2026-10-02 修复 Windows 同版本误报更新
- 排查确认 Android 通过 Release tag 比较,macOS 通过
CFBundleVersion构建号比较,均不受影响;问题仅存在于 Windows。WinSparkle 默认读取ProductVersion参与比较,但 appcast 发布的是纯构建号,导致1.19.3+构建号与构建号比较时始终被判定为旧版本。 - Windows 启动更新器前从
ProductVersion提取构建号,并通过 WinSparklewin_sparkle_set_app_build_version显式设置为内部比较版本;构建流程同步校验Bettbox.exe的ProductVersion包含本次构建号。
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Windows 自定义安装包使用单文件启动器内嵌原 Inno Setup 安装器;启动器优先在
%LOCALAPPDATA%\Bettbox\InstallerTemp创建独立临时目录并覆盖子进程的TEMP/TMP,避免系统%TEMP%权限损坏或安全策略导致“错误 5:拒绝访问”。载荷释放缓冲使用堆内存,避免 1 MB 栈缓冲触发STATUS_STACK_OVERFLOW。静默卸载跳过用户数据确认框并默认保留用户数据,交互卸载保留确认;Helper 服务按需启动,主程序退出时主动停止,首次 TUN 管理员授权后最多等待 30 秒直至 Helper 可用,安装器升级时仅更新已有服务路径并保留鉴权环境,不创建或启动 Helper,残留 Helper/Core 由安装器静默清理。Windows 主窗口使用稳定原生标记识别已有实例,重复启动会恢复并聚焦现有窗口。WinSparkle 初始化时从ProductVersion提取构建号,完整版本通过win_sparkle_set_app_details展示,纯构建号通过win_sparkle_set_app_build_version与 appcast 的sparkle:version比较;appcast 的title和sparkle:shortVersionString也发布最终安装版本1.19.3+构建号,更新弹窗两侧均可直接对比版本差异;代码位于lib/common/app_updater.dart、lib/common/system.dart、lib/controller.dart、windows/runner、windows/packaging/exe/launcher、windows/packaging/exe/package_windows.dart、windows/packaging/exe/inno_setup.iss与.github/workflows/custom-build.yml,自定义构建通过无效TEMP/TMP下的静默安装回归验证;回归安装和卸载均有 5 分钟超时、进程诊断和强制清理,并校验 WindowsProductVersion包含本次构建号、appcastecho生成字段包含完整版本以及安装后 Helper 进程与服务未运行。 - Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;Windows Runner 为面板使用独立原生窗口标题并跳过主窗口单实例激活,确保第二进程能进入 Dart 面板入口;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主...
Bettbox 1.19.3+2090000155 · main@26865630fef4 · 修复 Windows 更新弹窗最新版本号展示
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000155
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000153-r20261003033933-8df0f41d5dd6-2c8fb62cd4c6→custom-v1.19.3+2090000155-r20261003042515-771d22c734e9-2c8fb62cd4c6
2026-10-03 修复 Windows 更新弹窗最新版本展示
- Windows appcast 的
title和sparkle:shortVersionString改为发布完整1.19.3+构建号,更新弹窗中最新版本和本机版本都能显示构建号,方便直接对比。 sparkle:version继续保持纯构建号,与 WinSparkle 本机比较版本一致,不重新引入同版本误报。- Windows 构建新增 appcast 完整版本展示字段的静态回归校验,防止
echo生成逻辑回退到短版本号。
2026-10-03 修复 Windows 系统代理、首次 TUN 授权与重复启动
- Windows 系统代理同时写入 WinINet 连接配置和当前用户
Internet Settings注册表;默认连接 API 在特定系统环境返回失败时,注册表写入可继续完成代理启停。 - Windows 首次开启 TUN 时,管理员授权后的 Helper 健康等待延长至最多 30 秒,并取消服务启动过渡状态下的提前失败,授权完成后会自动继续启动,无需再次点击开关。
- Windows 主窗口使用稳定的原生角色标记识别已有实例;再次双击桌面快捷方式会恢复隐藏或最小化的主窗口并置前聚焦,第二进程按成功激活已有窗口退出。
- Windows 构建增加注册表代理兜底、Helper 授权等待和主窗口重复启动激活的回归校验。
2026-10-03 修复 Windows 系统代理误判与 Helper 残留
- Windows 系统代理只以默认 WinINet 连接写入作为成功标准;RAS 连接同步和设置刷新改为尽力执行,避免代理已经写入却因附加操作失败而被误判并自动关闭。
- Helper 服务统一改为按需启动;主程序正常退出时停止核心并主动结束 Helper 服务,避免升级安装时仍提示关闭
BettboxHelperService.exe。 - 安装器不再创建或启动 Helper;升级时仅保留原鉴权配置并更新服务路径,且静默停止残留 Helper/Core,不再在安装开始前弹出 Helper 关闭提示。
- Windows 构建增加系统代理成功条件、Helper 退出链路及安装后进程与服务非运行状态的回归校验。
2026-10-03 修复 Windows 网络开关、网络面板与更新版本展示
- Windows TUN 启动改为与 macOS 一致的同步流程:先加载无 TUN 配置,再完成管理员授权、必要的 Helper/核心重启、监听启动和 TUN 配置应用;删除先标记运行、后台异步启用 TUN 的逻辑。
- TUN 授权、核心重启或配置应用失败时回滚期望状态和实际状态;系统代理仍开启时恢复无 TUN 核心,否则保持停止,避免开关显示开启但系统无法联网且面板没有请求。
- 桌面端统一用核心真实状态驱动系统代理和运行时展示;系统代理启停按顺序执行,Windows 原生插件校验 WinINet/RAS 调用并返回真实结果,不再无条件报告成功。
- Windows
--network-panel使用独立原生窗口标题并绕过主窗口单实例激活,修复点击“面板”后新进程立即退出、窗口不弹出的问题。 - WinSparkle 同时设置完整展示版本和纯构建比较版本:更新窗口显示
1.19.3+构建号,内部继续以构建号和最新版本比较。 - Windows 构建新增更新函数、面板单实例路径和系统代理真实返回值的静态回归校验。
2026-10-02 修复 Windows 安装程序临时目录拒绝访问
- Windows 自定义安装包增加单文件启动器,在
%LOCALAPPDATA%\Bettbox\InstallerTemp建立独立临时目录后再启动内嵌的 Inno Setup 安装器,避免系统%TEMP%权限异常时安装程序直接报“错误 5:拒绝访问”。 - 启动器释放内嵌安装器时改用堆分配的 1 MB 复制缓冲,避免默认 1 MB 栈空间被耗尽导致
0xC00000FD崩溃。 - Windows 构建新增临时目录回归:将
TEMP/TMP指向不存在的路径后执行静默安装并校验Bettbox.exe,安装与卸载各设置 5 分钟超时和进程诊断,避免异常时拖满 120 分钟 job 超时。 - 修复静默卸载被用户数据确认框阻塞的问题:
/VERYSILENT卸载不再弹出确认框并默认保留用户数据;交互卸载行为不变。Helper 服务停止增加短等待后的强制结束兜底,避免残留进程阻塞卸载。
2026-10-02 修复 Windows 同版本误报更新
- 排查确认 Android 通过 Release tag 比较,macOS 通过
CFBundleVersion构建号比较,均不受影响;问题仅存在于 Windows。WinSparkle 默认读取ProductVersion参与比较,但 appcast 发布的是纯构建号,导致1.19.3+构建号与构建号比较时始终被判定为旧版本。 - Windows 启动更新器前从
ProductVersion提取构建号,并通过 WinSparklewin_sparkle_set_app_build_version显式设置为内部比较版本;构建流程同步校验Bettbox.exe的ProductVersion包含本次构建号。
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Windows 自定义安装包使用单文件启动器内嵌原 Inno Setup 安装器;启动器优先在
%LOCALAPPDATA%\Bettbox\InstallerTemp创建独立临时目录并覆盖子进程的TEMP/TMP,避免系统%TEMP%权限损坏或安全策略导致“错误 5:拒绝访问”。载荷释放缓冲使用堆内存,避免 1 MB 栈缓冲触发STATUS_STACK_OVERFLOW。静默卸载跳过用户数据确认框并默认保留用户数据,交互卸载保留确认;Helper 服务按需启动,主程序退出时主动停止,首次 TUN 管理员授权后最多等待 30 秒直至 Helper 可用,安装器升级时仅更新已有服务路径并保留鉴权环境,不创建或启动 Helper,残留 Helper/Core 由安装器静默清理。Windows 主窗口使用稳定原生标记识别已有实例,重复启动会恢复并聚焦现有窗口。WinSparkle 初始化时从ProductVersion提取构建号,完整版本通过win_sparkle_set_app_details展示,纯构建号通过win_sparkle_set_app_build_version与 appcast 的sparkle:version比较;appcast 的title和sparkle:shortVersionString也发布完整1.19.3+构建号,更新弹窗两侧均可直接对比版本差异;代码位于lib/common/app_updater.dart、lib/common/system.dart、lib/controller.dart、windows/runner、windows/packaging/exe/launcher、windows/packaging/exe/package_windows.dart、windows/packaging/exe/inno_setup.iss与.github/workflows/custom-build.yml,自定义构建通过无效TEMP/TMP下的静默安装回归验证;回归安装和卸载均有 5 分钟超时、进程诊断和强制清理,并校验 WindowsProductVersion包含本次构建号、appcastecho生成字段包含完整版本以及安装后 Helper 进程与服务未运行。 - Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;Windows Runner 为面板使用独立原生窗口标题并跳过主窗口单实例激活,确保第二进程能进入 Dart 面板入口;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断...
Bettbox 1.19.3+2090000153 · main@26865630fef4 · 修复 Windows 系统代理、首次 TUN 授权与重复启动
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000153
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000152-r20261003030202-e556d71723bf-2c8fb62cd4c6→custom-v1.19.3+2090000153-r20261003033933-8df0f41d5dd6-2c8fb62cd4c6
2026-10-03 修复 Windows 系统代理、首次 TUN 授权与重复启动
- Windows 系统代理同时写入 WinINet 连接配置和当前用户
Internet Settings注册表;默认连接 API 在特定系统环境返回失败时,注册表写入可继续完成代理启停。 - Windows 首次开启 TUN 时,管理员授权后的 Helper 健康等待延长至最多 30 秒,并取消服务启动过渡状态下的提前失败,授权完成后会自动继续启动,无需再次点击开关。
- Windows 主窗口使用稳定的原生角色标记识别已有实例;再次双击桌面快捷方式会恢复隐藏或最小化的主窗口并置前聚焦,第二进程按成功激活已有窗口退出。
- Windows 构建增加注册表代理兜底、Helper 授权等待和主窗口重复启动激活的回归校验。
2026-10-03 修复 Windows 系统代理误判与 Helper 残留
- Windows 系统代理只以默认 WinINet 连接写入作为成功标准;RAS 连接同步和设置刷新改为尽力执行,避免代理已经写入却因附加操作失败而被误判并自动关闭。
- Helper 服务统一改为按需启动;主程序正常退出时停止核心并主动结束 Helper 服务,避免升级安装时仍提示关闭
BettboxHelperService.exe。 - 安装器不再创建或启动 Helper;升级时仅保留原鉴权配置并更新服务路径,且静默停止残留 Helper/Core,不再在安装开始前弹出 Helper 关闭提示。
- Windows 构建增加系统代理成功条件、Helper 退出链路及安装后进程与服务非运行状态的回归校验。
2026-10-03 修复 Windows 网络开关、网络面板与更新版本展示
- Windows TUN 启动改为与 macOS 一致的同步流程:先加载无 TUN 配置,再完成管理员授权、必要的 Helper/核心重启、监听启动和 TUN 配置应用;删除先标记运行、后台异步启用 TUN 的逻辑。
- TUN 授权、核心重启或配置应用失败时回滚期望状态和实际状态;系统代理仍开启时恢复无 TUN 核心,否则保持停止,避免开关显示开启但系统无法联网且面板没有请求。
- 桌面端统一用核心真实状态驱动系统代理和运行时展示;系统代理启停按顺序执行,Windows 原生插件校验 WinINet/RAS 调用并返回真实结果,不再无条件报告成功。
- Windows
--network-panel使用独立原生窗口标题并绕过主窗口单实例激活,修复点击“面板”后新进程立即退出、窗口不弹出的问题。 - WinSparkle 同时设置完整展示版本和纯构建比较版本:更新窗口显示
1.19.3+构建号,内部继续以构建号和最新版本比较。 - Windows 构建新增更新函数、面板单实例路径和系统代理真实返回值的静态回归校验。
2026-10-02 修复 Windows 安装程序临时目录拒绝访问
- Windows 自定义安装包增加单文件启动器,在
%LOCALAPPDATA%\Bettbox\InstallerTemp建立独立临时目录后再启动内嵌的 Inno Setup 安装器,避免系统%TEMP%权限异常时安装程序直接报“错误 5:拒绝访问”。 - 启动器释放内嵌安装器时改用堆分配的 1 MB 复制缓冲,避免默认 1 MB 栈空间被耗尽导致
0xC00000FD崩溃。 - Windows 构建新增临时目录回归:将
TEMP/TMP指向不存在的路径后执行静默安装并校验Bettbox.exe,安装与卸载各设置 5 分钟超时和进程诊断,避免异常时拖满 120 分钟 job 超时。 - 修复静默卸载被用户数据确认框阻塞的问题:
/VERYSILENT卸载不再弹出确认框并默认保留用户数据;交互卸载行为不变。Helper 服务停止增加短等待后的强制结束兜底,避免残留进程阻塞卸载。
2026-10-02 修复 Windows 同版本误报更新
- 排查确认 Android 通过 Release tag 比较,macOS 通过
CFBundleVersion构建号比较,均不受影响;问题仅存在于 Windows。WinSparkle 默认读取ProductVersion参与比较,但 appcast 发布的是纯构建号,导致1.19.3+构建号与构建号比较时始终被判定为旧版本。 - Windows 启动更新器前从
ProductVersion提取构建号,并通过 WinSparklewin_sparkle_set_app_build_version显式设置为内部比较版本;构建流程同步校验Bettbox.exe的ProductVersion包含本次构建号。
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Windows 自定义安装包使用单文件启动器内嵌原 Inno Setup 安装器;启动器优先在
%LOCALAPPDATA%\Bettbox\InstallerTemp创建独立临时目录并覆盖子进程的TEMP/TMP,避免系统%TEMP%权限损坏或安全策略导致“错误 5:拒绝访问”。载荷释放缓冲使用堆内存,避免 1 MB 栈缓冲触发STATUS_STACK_OVERFLOW。静默卸载跳过用户数据确认框并默认保留用户数据,交互卸载保留确认;Helper 服务按需启动,主程序退出时主动停止,首次 TUN 管理员授权后最多等待 30 秒直至 Helper 可用,安装器升级时仅更新已有服务路径并保留鉴权环境,不创建或启动 Helper,残留 Helper/Core 由安装器静默清理。Windows 主窗口使用稳定原生标记识别已有实例,重复启动会恢复并聚焦现有窗口。WinSparkle 初始化时从ProductVersion提取构建号,完整版本通过win_sparkle_set_app_details展示,纯构建号通过win_sparkle_set_app_build_version与 appcast 的sparkle:version比较,既避免同版本误报,也保留1.19.3+构建号的可见差异;代码位于lib/common/app_updater.dart、lib/common/system.dart、lib/controller.dart、windows/runner、windows/packaging/exe/launcher、windows/packaging/exe/package_windows.dart与windows/packaging/exe/inno_setup.iss,自定义构建通过无效TEMP/TMP下的静默安装回归验证;回归安装和卸载均有 5 分钟超时、进程诊断和强制清理,并校验 WindowsProductVersion包含本次构建号以及安装后 Helper 进程与服务未运行。 - Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;Windows Runner 为面板使用独立原生窗口标题并跳过主窗口单实例激活,确保第二进程能进入 Dart 面板入口;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、日志和 Sub-Store 五个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规...
Bettbox 1.19.3+2090000152 · main@26865630fef4 · 修复 Windows 系统代理启用失败与 Helper 残留
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000152
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000150-r20261003022816-38b6357c9b57-2c8fb62cd4c6→custom-v1.19.3+2090000152-r20261003030202-e556d71723bf-2c8fb62cd4c6
2026-10-03 修复 Windows 系统代理误判与 Helper 残留
- Windows 系统代理只以默认 WinINet 连接写入作为成功标准;RAS 连接同步和设置刷新改为尽力执行,避免代理已经写入却因附加操作失败而被误判并自动关闭。
- Helper 服务统一改为按需启动;主程序正常退出时停止核心并主动结束 Helper 服务,避免升级安装时仍提示关闭
BettboxHelperService.exe。 - 安装器不再创建或启动 Helper;升级时仅保留原鉴权配置并更新服务路径,且静默停止残留 Helper/Core,不再在安装开始前弹出 Helper 关闭提示。
- Windows 构建增加系统代理成功条件、Helper 退出链路及安装后进程与服务非运行状态的回归校验。
2026-10-03 修复 Windows 网络开关、网络面板与更新版本展示
- Windows TUN 启动改为与 macOS 一致的同步流程:先加载无 TUN 配置,再完成管理员授权、必要的 Helper/核心重启、监听启动和 TUN 配置应用;删除先标记运行、后台异步启用 TUN 的逻辑。
- TUN 授权、核心重启或配置应用失败时回滚期望状态和实际状态;系统代理仍开启时恢复无 TUN 核心,否则保持停止,避免开关显示开启但系统无法联网且面板没有请求。
- 桌面端统一用核心真实状态驱动系统代理和运行时展示;系统代理启停按顺序执行,Windows 原生插件校验 WinINet/RAS 调用并返回真实结果,不再无条件报告成功。
- Windows
--network-panel使用独立原生窗口标题并绕过主窗口单实例激活,修复点击“面板”后新进程立即退出、窗口不弹出的问题。 - WinSparkle 同时设置完整展示版本和纯构建比较版本:更新窗口显示
1.19.3+构建号,内部继续以构建号和最新版本比较。 - Windows 构建新增更新函数、面板单实例路径和系统代理真实返回值的静态回归校验。
2026-10-02 修复 Windows 安装程序临时目录拒绝访问
- Windows 自定义安装包增加单文件启动器,在
%LOCALAPPDATA%\Bettbox\InstallerTemp建立独立临时目录后再启动内嵌的 Inno Setup 安装器,避免系统%TEMP%权限异常时安装程序直接报“错误 5:拒绝访问”。 - 启动器释放内嵌安装器时改用堆分配的 1 MB 复制缓冲,避免默认 1 MB 栈空间被耗尽导致
0xC00000FD崩溃。 - Windows 构建新增临时目录回归:将
TEMP/TMP指向不存在的路径后执行静默安装并校验Bettbox.exe,安装与卸载各设置 5 分钟超时和进程诊断,避免异常时拖满 120 分钟 job 超时。 - 修复静默卸载被用户数据确认框阻塞的问题:
/VERYSILENT卸载不再弹出确认框并默认保留用户数据;交互卸载行为不变。Helper 服务停止增加短等待后的强制结束兜底,避免残留进程阻塞卸载。
2026-10-02 修复 Windows 同版本误报更新
- 排查确认 Android 通过 Release tag 比较,macOS 通过
CFBundleVersion构建号比较,均不受影响;问题仅存在于 Windows。WinSparkle 默认读取ProductVersion参与比较,但 appcast 发布的是纯构建号,导致1.19.3+构建号与构建号比较时始终被判定为旧版本。 - Windows 启动更新器前从
ProductVersion提取构建号,并通过 WinSparklewin_sparkle_set_app_build_version显式设置为内部比较版本;构建流程同步校验Bettbox.exe的ProductVersion包含本次构建号。
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Windows 自定义安装包使用单文件启动器内嵌原 Inno Setup 安装器;启动器优先在
%LOCALAPPDATA%\Bettbox\InstallerTemp创建独立临时目录并覆盖子进程的TEMP/TMP,避免系统%TEMP%权限损坏或安全策略导致“错误 5:拒绝访问”。载荷释放缓冲使用堆内存,避免 1 MB 栈缓冲触发STATUS_STACK_OVERFLOW。静默卸载跳过用户数据确认框并默认保留用户数据,交互卸载保留确认;Helper 服务按需启动,主程序退出时主动停止,安装器升级时仅更新已有服务路径并保留鉴权环境,不创建或启动 Helper,残留 Helper/Core 由安装器静默清理。WinSparkle 初始化时从ProductVersion提取构建号,完整版本通过win_sparkle_set_app_details展示,纯构建号通过win_sparkle_set_app_build_version与 appcast 的sparkle:version比较,既避免同版本误报,也保留1.19.3+构建号的可见差异;代码位于lib/common/app_updater.dart、lib/common/system.dart、lib/controller.dart、windows/packaging/exe/launcher、windows/packaging/exe/package_windows.dart与windows/packaging/exe/inno_setup.iss,自定义构建通过无效TEMP/TMP下的静默安装回归验证;回归安装和卸载均有 5 分钟超时、进程诊断和强制清理,并校验 WindowsProductVersion包含本次构建号以及安装后 Helper 进程与服务未运行。 - Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;Windows Runner 为面板使用独立原生窗口标题并跳过主窗口单实例激活,确保第二进程能进入 Dart 面板入口;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、日志和 Sub-Store 五个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规则、当前配置追加/覆盖规则和独立详情;状态按活动快照、真实出站 socket、REJECT和链路终态区分。 - DNS 页由当前生效配置读取
default-nameserver / nameserver / fallback / proxy-server-nameserver / direct-nameserver / nameserver-policy / hosts,并合并系统 Hosts、运行缓存、Fake-IP 与出站节点 DNS;支持同时清理 DNS 缓存和 Fake-IP。 - 不再提供信息价值有限的设备与流量统计子页面;请求和连接列表仍保留单条记录的实时速率、累计上传下载和连接详情。
- 日志页按实际级别分类;Sub-Store 页支持凭据历史、固定规则读取/新增/修改/删除/拖动排序,保存前重新读取远端脚本并仅替换
BETTBOX_CUSTOM_RULES。 - 选中请求或连接后展开可拖动详情,区分客户端、目标、Fake-IP、实际出站本地/远端地址、GeoIP/ASN 和...
Bettbox 1.19.3+2090000150 · main@26865630fef4 · 修复 Windows 网络开关、网络面板与更新版本展示
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000150
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000148-r20261002170053-7205fd219a47-2c8fb62cd4c6→custom-v1.19.3+2090000150-r20261003022816-38b6357c9b57-2c8fb62cd4c6
2026-10-03 修复 Windows 网络开关、网络面板与更新版本展示
- Windows TUN 启动改为与 macOS 一致的同步流程:先加载无 TUN 配置,再完成管理员授权、必要的 Helper/核心重启、监听启动和 TUN 配置应用;删除先标记运行、后台异步启用 TUN 的逻辑。
- TUN 授权、核心重启或配置应用失败时回滚期望状态和实际状态;系统代理仍开启时恢复无 TUN 核心,否则保持停止,避免开关显示开启但系统无法联网且面板没有请求。
- 桌面端统一用核心真实状态驱动系统代理和运行时展示;系统代理启停按顺序执行,Windows 原生插件校验 WinINet/RAS 调用并返回真实结果,不再无条件报告成功。
- Windows
--network-panel使用独立原生窗口标题并绕过主窗口单实例激活,修复点击“面板”后新进程立即退出、窗口不弹出的问题。 - WinSparkle 同时设置完整展示版本和纯构建比较版本:更新窗口显示
1.19.3+构建号,内部继续以构建号和最新版本比较。 - Windows 构建新增更新函数、面板单实例路径和系统代理真实返回值的静态回归校验。
2026-10-02 修复 Windows 安装程序临时目录拒绝访问
- Windows 自定义安装包增加单文件启动器,在
%LOCALAPPDATA%\Bettbox\InstallerTemp建立独立临时目录后再启动内嵌的 Inno Setup 安装器,避免系统%TEMP%权限异常时安装程序直接报“错误 5:拒绝访问”。 - 启动器释放内嵌安装器时改用堆分配的 1 MB 复制缓冲,避免默认 1 MB 栈空间被耗尽导致
0xC00000FD崩溃。 - Windows 构建新增临时目录回归:将
TEMP/TMP指向不存在的路径后执行静默安装并校验Bettbox.exe,安装与卸载各设置 5 分钟超时和进程诊断,避免异常时拖满 120 分钟 job 超时。 - 修复静默卸载被用户数据确认框阻塞的问题:
/VERYSILENT卸载不再弹出确认框并默认保留用户数据;交互卸载行为不变。Helper 服务停止增加短等待后的强制结束兜底,避免残留进程阻塞卸载。
2026-10-02 修复 Windows 同版本误报更新
- 排查确认 Android 通过 Release tag 比较,macOS 通过
CFBundleVersion构建号比较,均不受影响;问题仅存在于 Windows。WinSparkle 默认读取ProductVersion参与比较,但 appcast 发布的是纯构建号,导致1.19.3+构建号与构建号比较时始终被判定为旧版本。 - Windows 启动更新器前从
ProductVersion提取构建号,并通过 WinSparklewin_sparkle_set_app_build_version显式设置为内部比较版本;构建流程同步校验Bettbox.exe的ProductVersion包含本次构建号。
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Windows 自定义安装包使用单文件启动器内嵌原 Inno Setup 安装器;启动器优先在
%LOCALAPPDATA%\Bettbox\InstallerTemp创建独立临时目录并覆盖子进程的TEMP/TMP,避免系统%TEMP%权限损坏或安全策略导致“错误 5:拒绝访问”。载荷释放缓冲使用堆内存,避免 1 MB 栈缓冲触发STATUS_STACK_OVERFLOW。静默卸载跳过用户数据确认框并默认保留用户数据,交互卸载保留确认;Helper 服务停止在短等待后强制结束进程,避免卸载器被残留服务阻塞。WinSparkle 初始化时从ProductVersion提取构建号,完整版本通过win_sparkle_set_app_details展示,纯构建号通过win_sparkle_set_app_build_version与 appcast 的sparkle:version比较,既避免同版本误报,也保留1.19.3+构建号的可见差异;代码位于lib/common/app_updater.dart、windows/packaging/exe/launcher、windows/packaging/exe/package_windows.dart与windows/packaging/exe/inno_setup.iss,自定义构建通过无效TEMP/TMP下的静默安装回归验证;回归安装和卸载均有 5 分钟超时、进程诊断和强制清理,并校验 WindowsProductVersion包含本次构建号。 - Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;Windows Runner 为面板使用独立原生窗口标题并跳过主窗口单实例激活,确保第二进程能进入 Dart 面板入口;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、日志和 Sub-Store 五个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规则、当前配置追加/覆盖规则和独立详情;状态按活动快照、真实出站 socket、REJECT和链路终态区分。 - DNS 页由当前生效配置读取
default-nameserver / nameserver / fallback / proxy-server-nameserver / direct-nameserver / nameserver-policy / hosts,并合并系统 Hosts、运行缓存、Fake-IP 与出站节点 DNS;支持同时清理 DNS 缓存和 Fake-IP。 - 不再提供信息价值有限的设备与流量统计子页面;请求和连接列表仍保留单条记录的实时速率、累计上传下载和连接详情。
- 日志页按实际级别分类;Sub-Store 页支持凭据历史、固定规则读取/新增/修改/删除/拖动排序,保存前重新读取远端脚本并仅替换
BETTBOX_CUSTOM_RULES。 - 选中请求或连接后展开可拖动详情,区分客户端、目标、Fake-IP、实际出站本地/远端地址、GeoIP/ASN 和完整策略链;macOS 通过
NSWorkspace读取进程图标,并发请求合并且复用历史.app路径。 - custom-mihomo 为每条连接保存 DNS 逐服务器尝试、规则匹配、策略链和真实 socket 建立事件,
TrackerInfo返回trace / outboundLocalAddress / outboundRemoteAddress;连接加入与离开均发送同 ID 通知,请求记录按 ID 原位更新。 - 代码位于
lib/views/network_monitor*.dart、lib/common/window.dart、lib/common/external_control.dart、lib/common/navigation.dart、lib/views/network_monitor_navigation.dart、lib/enum/enum.dart、lib/widgets/google_bottom_nav_bar.dart和 `lib/common/tra...
Bettbox 1.19.3+2090000148 · main@26865630fef4 · 修复 Windows 安装程序临时目录拒绝访问
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000148
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000141-r20261002152303-50852ee7e5bb-2c8fb62cd4c6→custom-v1.19.3+2090000148-r20261002170053-7205fd219a47-2c8fb62cd4c6
2026-10-02 修复 Windows 安装程序临时目录拒绝访问
- Windows 自定义安装包增加单文件启动器,在
%LOCALAPPDATA%\Bettbox\InstallerTemp建立独立临时目录后再启动内嵌的 Inno Setup 安装器,避免系统%TEMP%权限异常时安装程序直接报“错误 5:拒绝访问”。 - 启动器释放内嵌安装器时改用堆分配的 1 MB 复制缓冲,避免默认 1 MB 栈空间被耗尽导致
0xC00000FD崩溃。 - Windows 构建新增临时目录回归:将
TEMP/TMP指向不存在的路径后执行静默安装并校验Bettbox.exe,安装与卸载各设置 5 分钟超时和进程诊断,避免异常时拖满 120 分钟 job 超时。 - 修复静默卸载被用户数据确认框阻塞的问题:
/VERYSILENT卸载不再弹出确认框并默认保留用户数据;交互卸载行为不变。Helper 服务停止增加短等待后的强制结束兜底,避免残留进程阻塞卸载。
2026-10-02 修复 Windows 同版本误报更新
- 排查确认 Android 通过 Release tag 比较,macOS 通过
CFBundleVersion构建号比较,均不受影响;问题仅存在于 Windows。WinSparkle 默认读取ProductVersion参与比较,但 appcast 发布的是纯构建号,导致1.19.3+构建号与构建号比较时始终被判定为旧版本。 - Windows 启动更新器前从
ProductVersion提取构建号,并通过 WinSparklewin_sparkle_set_app_build_version显式设置为内部比较版本;构建流程同步校验Bettbox.exe的ProductVersion包含本次构建号。
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Windows 自定义安装包使用单文件启动器内嵌原 Inno Setup 安装器;启动器优先在
%LOCALAPPDATA%\Bettbox\InstallerTemp创建独立临时目录并覆盖子进程的TEMP/TMP,避免系统%TEMP%权限损坏或安全策略导致“错误 5:拒绝访问”。载荷释放缓冲使用堆内存,避免 1 MB 栈缓冲触发STATUS_STACK_OVERFLOW。静默卸载跳过用户数据确认框并默认保留用户数据,交互卸载保留确认;Helper 服务停止在短等待后强制结束进程,避免卸载器被残留服务阻塞。WinSparkle 初始化时从ProductVersion提取构建号并显式设置为内部比较版本,与 appcast 的sparkle:version对齐,避免同版本仍提示更新;代码位于lib/common/app_updater.dart、windows/packaging/exe/launcher、windows/packaging/exe/package_windows.dart与windows/packaging/exe/inno_setup.iss,自定义构建通过无效TEMP/TMP下的静默安装回归验证;回归安装和卸载均有 5 分钟超时、进程诊断和强制清理,并校验 WindowsProductVersion包含本次构建号。 - Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、日志和 Sub-Store 五个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规则、当前配置追加/覆盖规则和独立详情;状态按活动快照、真实出站 socket、REJECT和链路终态区分。 - DNS 页由当前生效配置读取
default-nameserver / nameserver / fallback / proxy-server-nameserver / direct-nameserver / nameserver-policy / hosts,并合并系统 Hosts、运行缓存、Fake-IP 与出站节点 DNS;支持同时清理 DNS 缓存和 Fake-IP。 - 不再提供信息价值有限的设备与流量统计子页面;请求和连接列表仍保留单条记录的实时速率、累计上传下载和连接详情。
- 日志页按实际级别分类;Sub-Store 页支持凭据历史、固定规则读取/新增/修改/删除/拖动排序,保存前重新读取远端脚本并仅替换
BETTBOX_CUSTOM_RULES。 - 选中请求或连接后展开可拖动详情,区分客户端、目标、Fake-IP、实际出站本地/远端地址、GeoIP/ASN 和完整策略链;macOS 通过
NSWorkspace读取进程图标,并发请求合并且复用历史.app路径。 - custom-mihomo 为每条连接保存 DNS 逐服务器尝试、规则匹配、策略链和真实 socket 建立事件,
TrackerInfo返回trace / outboundLocalAddress / outboundRemoteAddress;连接加入与离开均发送同 ID 通知,请求记录按 ID 原位更新。 - 代码位于
lib/views/network_monitor*.dart、lib/common/window.dart、lib/common/external_control.dart、lib/common/navigation.dart、lib/views/network_monitor_navigation.dart、lib/enum/enum.dart、lib/widgets/google_bottom_nav_bar.dart和lib/common/tray.dart;回归测试为test/views/network_monitor_test.dart、core/Clash.Meta/tunnel/statistic/manager_notify_test.go及私有内核constant / dns / tunnel / tunnel/statistic测试。
统一启停交互
- 桌面端系统代理或 TUN 任一开启即启动核心,两者均关闭即停止核心;设置页、快捷卡片和托盘开关都调用
updateSystemProxy/updateTun联动方法。 - 移除桌面独立启动/停止入口、启动热键和“联动开关”设置;托盘保留网络面板、系统代理、TUN、重启内核等入口。
- Android 首页保留一个悬浮总开关,并避让底部导航与页面滚动内容;启动时间卡片仅作为非独立启停的运行时长展示,不再提供桌面独立启停操作。
- 回归测试为
test/controller/macos_tun_startup_test.dart。
自定义构建与发布
uclort/Bettbox明确标记为非官方个人自定义版;GitHub 操作必须显式指定该仓库。custom-sync.yml与custom-build.yml仅支持手动触发;同步顺序为上游 Bettbox → 保留功能分支 → 私有 custom-mihomo → 自定义构建。- 构建可选择全平台、仅 macOS Apple Silicon 或仅 Andr...
Bettbox 1.19.3+2090000141 · main@26865630fef4 · 修复 Windows 安装程序临时目录拒绝访问
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000141
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000137-r20260928015706-cf857afad981-2c8fb62cd4c6→custom-v1.19.3+2090000141-r20261002152303-50852ee7e5bb-2c8fb62cd4c6
2026-10-02 修复 Windows 安装程序临时目录拒绝访问
- Windows 自定义安装包增加单文件启动器,在
%LOCALAPPDATA%\Bettbox\InstallerTemp建立独立临时目录后再启动内嵌的 Inno Setup 安装器,避免系统%TEMP%权限异常时安装程序直接报“错误 5:拒绝访问”。 - 启动器释放内嵌安装器时改用堆分配的 1 MB 复制缓冲,避免默认 1 MB 栈空间被耗尽导致
0xC00000FD崩溃。 - Windows 构建新增临时目录回归:将
TEMP/TMP指向不存在的路径后执行静默安装并校验Bettbox.exe,安装与卸载各设置 5 分钟超时和进程诊断,避免异常时拖满 120 分钟 job 超时。 - 修复静默卸载被用户数据确认框阻塞的问题:
/VERYSILENT卸载不再弹出确认框并默认保留用户数据;交互卸载行为不变。Helper 服务停止增加短等待后的强制结束兜底,避免残留进程阻塞卸载。
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Windows 自定义安装包使用单文件启动器内嵌原 Inno Setup 安装器;启动器优先在
%LOCALAPPDATA%\Bettbox\InstallerTemp创建独立临时目录并覆盖子进程的TEMP/TMP,避免系统%TEMP%权限损坏或安全策略导致“错误 5:拒绝访问”。载荷释放缓冲使用堆内存,避免 1 MB 栈缓冲触发STATUS_STACK_OVERFLOW。静默卸载跳过用户数据确认框并默认保留用户数据,交互卸载保留确认;Helper 服务停止在短等待后强制结束进程,避免卸载器被残留服务阻塞。代码位于windows/packaging/exe/launcher、windows/packaging/exe/package_windows.dart与windows/packaging/exe/inno_setup.iss,自定义构建通过无效TEMP/TMP下的静默安装回归验证;回归安装和卸载均有 5 分钟超时、进程诊断和强制清理。 - Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、日志和 Sub-Store 五个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规则、当前配置追加/覆盖规则和独立详情;状态按活动快照、真实出站 socket、REJECT和链路终态区分。 - DNS 页由当前生效配置读取
default-nameserver / nameserver / fallback / proxy-server-nameserver / direct-nameserver / nameserver-policy / hosts,并合并系统 Hosts、运行缓存、Fake-IP 与出站节点 DNS;支持同时清理 DNS 缓存和 Fake-IP。 - 不再提供信息价值有限的设备与流量统计子页面;请求和连接列表仍保留单条记录的实时速率、累计上传下载和连接详情。
- 日志页按实际级别分类;Sub-Store 页支持凭据历史、固定规则读取/新增/修改/删除/拖动排序,保存前重新读取远端脚本并仅替换
BETTBOX_CUSTOM_RULES。 - 选中请求或连接后展开可拖动详情,区分客户端、目标、Fake-IP、实际出站本地/远端地址、GeoIP/ASN 和完整策略链;macOS 通过
NSWorkspace读取进程图标,并发请求合并且复用历史.app路径。 - custom-mihomo 为每条连接保存 DNS 逐服务器尝试、规则匹配、策略链和真实 socket 建立事件,
TrackerInfo返回trace / outboundLocalAddress / outboundRemoteAddress;连接加入与离开均发送同 ID 通知,请求记录按 ID 原位更新。 - 代码位于
lib/views/network_monitor*.dart、lib/common/window.dart、lib/common/external_control.dart、lib/common/navigation.dart、lib/views/network_monitor_navigation.dart、lib/enum/enum.dart、lib/widgets/google_bottom_nav_bar.dart和lib/common/tray.dart;回归测试为test/views/network_monitor_test.dart、core/Clash.Meta/tunnel/statistic/manager_notify_test.go及私有内核constant / dns / tunnel / tunnel/statistic测试。
统一启停交互
- 桌面端系统代理或 TUN 任一开启即启动核心,两者均关闭即停止核心;设置页、快捷卡片和托盘开关都调用
updateSystemProxy/updateTun联动方法。 - 移除桌面独立启动/停止入口、启动热键和“联动开关”设置;托盘保留网络面板、系统代理、TUN、重启内核等入口。
- Android 首页保留一个悬浮总开关,并避让底部导航与页面滚动内容;启动时间卡片仅作为非独立启停的运行时长展示,不再提供桌面独立启停操作。
- 回归测试为
test/controller/macos_tun_startup_test.dart。
自定义构建与发布
uclort/Bettbox明确标记为非官方个人自定义版;GitHub 操作必须显式指定该仓库。custom-sync.yml与custom-build.yml仅支持手动触发;同步顺序为上游 Bettbox → 保留功能分支 → 私有 custom-mihomo → 自定义构建。- 构建可选择全平台、仅 macOS Apple Silicon 或仅 Android arm64-v8a;Android 构建同步静态更新源。
- 内核同步兼容新版 Mihomo 将版本号改为构建时注入的模式;源码版本为空时按 Bettbox 上游核心树继续同步,仍执行 Snell v6 补丁与 Go 回归。
- 自定义应用代码变化但未同步完整总账和发布增量时拒绝发布。
已删除的历史自定义功能
- 旧自定义节点测速并发、缓存、诊断和 Provider 生命周期改造此前已删除,继续使用 Bettbox 上游实现。
构建信息
- 上游 Bettbox main 基线:
main@26865630fef4 - 最终安装版本:
1.19.3+2090000141 - 上游源码版本:
1.19.3+2026092601 - Bettbox custom-build commit:
50852ee7e5bbcad471397a4635a8e74ced60d122
Release 仅包含本次 Action 生成的安装包,不包含私有自定义 Mihomo 源码。
Windows 与 macOS 安装包未做商业代码签名;Android 安装包使用 Bettbox 自定义版固定 Release 签名。
Bettbox 1.19.3+2090000137 · main@26865630fef4 · 精简网络面板,移除设备和流量统计页面
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000137
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000136-r20260927132417-75f71468e833-2c8fb62cd4c6→custom-v1.19.3+2090000137-r20260928015706-cf857afad981-2c8fb62cd4c6
2026-09-28 精简网络面板
- 删除网络面板中的设备和流量统计子页面,同时移除对应侧栏、移动端页面、流量轮询与统计聚合逻辑;最近请求、活动连接、DNS、日志和 Sub-Store 五个页面保持不变。
- 最近请求和活动连接仍保留单条记录的上传下载、实时速率与连接详情,不影响现有网络排查能力。
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、日志和 Sub-Store 五个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规则、当前配置追加/覆盖规则和独立详情;状态按活动快照、真实出站 socket、REJECT和链路终态区分。 - DNS 页由当前生效配置读取
default-nameserver / nameserver / fallback / proxy-server-nameserver / direct-nameserver / nameserver-policy / hosts,并合并系统 Hosts、运行缓存、Fake-IP 与出站节点 DNS;支持同时清理 DNS 缓存和 Fake-IP。 - 不再提供信息价值有限的设备与流量统计子页面;请求和连接列表仍保留单条记录的实时速率、累计上传下载和连接详情。
- 日志页按实际级别分类;Sub-Store 页支持凭据历史、固定规则读取/新增/修改/删除/拖动排序,保存前重新读取远端脚本并仅替换
BETTBOX_CUSTOM_RULES。 - 选中请求或连接后展开可拖动详情,区分客户端、目标、Fake-IP、实际出站本地/远端地址、GeoIP/ASN 和完整策略链;macOS 通过
NSWorkspace读取进程图标,并发请求合并且复用历史.app路径。 - custom-mihomo 为每条连接保存 DNS 逐服务器尝试、规则匹配、策略链和真实 socket 建立事件,
TrackerInfo返回trace / outboundLocalAddress / outboundRemoteAddress;连接加入与离开均发送同 ID 通知,请求记录按 ID 原位更新。 - 代码位于
lib/views/network_monitor*.dart、lib/common/window.dart、lib/common/external_control.dart、lib/common/navigation.dart、lib/views/network_monitor_navigation.dart、lib/enum/enum.dart、lib/widgets/google_bottom_nav_bar.dart和lib/common/tray.dart;回归测试为test/views/network_monitor_test.dart、core/Clash.Meta/tunnel/statistic/manager_notify_test.go及私有内核constant / dns / tunnel / tunnel/statistic测试。
统一启停交互
- 桌面端系统代理或 TUN 任一开启即启动核心,两者均关闭即停止核心;设置页、快捷卡片和托盘开关都调用
updateSystemProxy/updateTun联动方法。 - 移除桌面独立启动/停止入口、启动热键和“联动开关”设置;托盘保留网络面板、系统代理、TUN、重启内核等入口。
- Android 首页保留一个悬浮总开关,并避让底部导航与页面滚动内容;启动时间卡片仅作为非独立启停的运行时长展示,不再提供桌面独立启停操作。
- 回归测试为
test/controller/macos_tun_startup_test.dart。
自定义构建与发布
uclort/Bettbox明确标记为非官方个人自定义版;GitHub 操作必须显式指定该仓库。custom-sync.yml与custom-build.yml仅支持手动触发;同步顺序为上游 Bettbox → 保留功能分支 → 私有 custom-mihomo → 自定义构建。- 构建可选择全平台、仅 macOS Apple Silicon 或仅 Android arm64-v8a;Android 构建同步静态更新源。
- 内核同步兼容新版 Mihomo 将版本号改为构建时注入的模式;源码版本为空时按 Bettbox 上游核心树继续同步,仍执行 Snell v6 补丁与 Go 回归。
- 自定义应用代码变化但未同步完整总账和发布增量时拒绝发布。
已删除的历史自定义功能
- 旧自定义节点测速并发、缓存、诊断和 Provider 生命周期改造此前已删除,继续使用 Bettbox 上游实现。
构建信息
- 上游 Bettbox main 基线:
main@26865630fef4 - 最终安装版本:
1.19.3+2090000137 - 上游源码版本:
1.19.3+2026092601 - Bettbox custom-build commit:
cf857afad98151584f8f61f65bbca94ebb2f21ac
Release 仅包含本次 Action 生成的安装包,不包含私有自定义 Mihomo 源码。
Windows 与 macOS 安装包未做商业代码签名;Android 安装包使用 Bettbox 自定义版固定 Release 签名。
Bettbox 1.19.3+2090000136 · main@26865630fef4 · 统一网络面板名称并补充菜单说明
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000136
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000135-r20260927131107-75f71468e833-2c8fb62cd4c6→custom-v1.19.3+2090000136-r20260927132417-75f71468e833-2c8fb62cd4c6 - 无新的应用或内核功能变更。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规则、当前配置追加/覆盖规则和独立详情;状态按活动快照、真实出站 socket、REJECT和链路终态区分。 - DNS 页由当前生效配置读取
default-nameserver / nameserver / fallback / proxy-server-nameserver / direct-nameserver / nameserver-policy / hosts,并合并系统 Hosts、运行缓存、Fake-IP 与出站节点 DNS;支持同时清理 DNS 缓存和 Fake-IP。 - 设备页只展示内核可确认的进程、来源地址和活动/历史状态;流量页调用
getTraffic / getTotalTraffic展示实时与累计上传下载,不将有限环形历史误算为总流量。 - 日志页按实际级别分类;Sub-Store 页支持凭据历史、固定规则读取/新增/修改/删除/拖动排序,保存前重新读取远端脚本并仅替换
BETTBOX_CUSTOM_RULES。 - 选中请求或连接后展开可拖动详情,区分客户端、目标、Fake-IP、实际出站本地/远端地址、GeoIP/ASN 和完整策略链;macOS 通过
NSWorkspace读取进程图标,并发请求合并且复用历史.app路径。 - custom-mihomo 为每条连接保存 DNS 逐服务器尝试、规则匹配、策略链和真实 socket 建立事件,
TrackerInfo返回trace / outboundLocalAddress / outboundRemoteAddress;连接加入与离开均发送同 ID 通知,请求记录按 ID 原位更新。 - 代码位于
lib/views/network_monitor*.dart、lib/common/window.dart、lib/common/external_control.dart、lib/common/navigation.dart、lib/views/network_monitor_navigation.dart、lib/enum/enum.dart、lib/widgets/google_bottom_nav_bar.dart和lib/common/tray.dart;回归测试为test/views/network_monitor_test.dart、core/Clash.Meta/tunnel/statistic/manager_notify_test.go及私有内核constant / dns / tunnel / tunnel/statistic测试。
统一启停交互
- 桌面端系统代理或 TUN 任一开启即启动核心,两者均关闭即停止核心;设置页、快捷卡片和托盘开关都调用
updateSystemProxy/updateTun联动方法。 - 移除桌面独立启动/停止入口、启动热键和“联动开关”设置;托盘保留网络面板、系统代理、TUN、重启内核等入口。
- Android 首页保留一个悬浮总开关,并避让底部导航与页面滚动内容;启动时间卡片仅作为非独立启停的运行时长展示,不再提供桌面独立启停操作。
- 回归测试为
test/controller/macos_tun_startup_test.dart。
自定义构建与发布
uclort/Bettbox明确标记为非官方个人自定义版;GitHub 操作必须显式指定该仓库。custom-sync.yml与custom-build.yml仅支持手动触发;同步顺序为上游 Bettbox → 保留功能分支 → 私有 custom-mihomo → 自定义构建。- 构建可选择全平台、仅 macOS Apple Silicon 或仅 Android arm64-v8a;Android 构建同步静态更新源。
- 内核同步兼容新版 Mihomo 将版本号改为构建时注入的模式;源码版本为空时按 Bettbox 上游核心树继续同步,仍执行 Snell v6 补丁与 Go 回归。
- 自定义应用代码变化但未同步完整总账和发布增量时拒绝发布。
已删除的历史自定义功能
- 旧自定义节点测速并发、缓存、诊断和 Provider 生命周期改造此前已删除,继续使用 Bettbox 上游实现。
构建信息
- 上游 Bettbox main 基线:
main@26865630fef4 - 最终安装版本:
1.19.3+2090000136 - 上游源码版本:
1.19.3+2026092601 - Bettbox custom-build commit:
75f71468e833a5149792af06e1cc756464d8444d
Release 仅包含本次 Action 生成的安装包,不包含私有自定义 Mihomo 源码。
Windows 与 macOS 安装包未做商业代码签名;Android 安装包使用 Bettbox 自定义版固定 Release 签名。
Bettbox 1.19.3+2090000135 · main@26865630fef4 · 统一网络面板名称并补充菜单说明
基于上游 Bettbox main@26865630fef4 构建的自定义版本。
最终安装版本:1.19.3+2090000135
本次变更(相较上一自定义 Release)
- 对比范围:
custom-v1.19.3+2090000134-r20260927123526-e22f9c6ecede-2c8fb62cd4c6→custom-v1.19.3+2090000135-r20260927131107-75f71468e833-2c8fb62cd4c6
2026-09-27 恢复网络面板与统一启停
- 恢复独立网络面板进程、IPC、专属图标,以及最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个面板 tab;桌面保留“面板”tab 并点击打开独立窗口,Android“更多 → 查看”只保留一个“网络面板”二级页。
- 恢复连接加入/离开通知、连接级 DNS/规则/出站链路追踪、Sub-Store 固定规则管理和私有
uclort-desktop.js/uclort-sukka.js覆写脚本;私有 custom-mihomo 同步提交更新为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。 - 恢复统一启停交互:桌面系统代理或 TUN 任一开启即启动核心,均关闭即停止核心;移除独立启动/停止入口和启动热键,Android 首页恢复悬浮总开关并避让底部导航。
2026-09-27 修复移动端网络面板本地化
- Android 底部导航及“更多 → 查看”的列表、详情标题、搜索结果和搜索跳转统一改用
localizedName展示网络面板标签,避免显示networkMonitorView枚举名。 - 桌面端主导航的大 tab 使用简洁的“面板”;同一网络监控功能的 Android“更多 → 查看”菜单、页面标题、搜索、托盘和独立窗口统一使用“网络面板”,菜单增加“查看网络请求、连接和流量信息”副标题;首页“在线面板”属于另一项功能,保持不变。
2026-09-27 优化 macOS Dock 图标展示规则
- 移除 macOS“常驻 DOCK”开关;Dock 图标改为完全跟随窗口状态,窗口显示或最小化时出现,关闭到托盘或静默启动时隐藏。
本包改动(相较上游版本)
上游融合必检
- 同步 Bettbox、Mihomo 或 Snell 前后搜索
BETTBOX-CUSTOM,逐项确认标记代码仍然存在。 - 融合后运行相关目录的 Go/Flutter 回归测试;不得仅以编译成功代替行为验证。
- 本文件只登记当前仍保留的自定义功能;修改、迁移、删除或被上游等价能力替代时必须同步更新。
LATEST_CHANGES.md只记录相较上一自定义 Release 的增量,不能替代本文件。- 未经用户明确要求,不创建 Pull Request。
WebDAV 配置同步边界
- WebDAV 使用现有 ZIP 备份格式的
shared-config范围,只同步订阅配置、配置 YAML 与ScriptProps.scripts。 - 当前配置、当前脚本、节点选择、策略组展开状态和 Provider 派生缓存保持本机状态;App、DAV 凭据、主题、窗口、托盘、热键、代理、TUN、访问控制、界面样式、测速过滤和超时等设置不跨设备覆盖。
- 本地导入导出继续使用完整备份语义;历史完整 WebDAV 包恢复时同样只应用共享配置字段。
- 代码位于
lib/controller.dart、lib/models/config.dart与lib/views/backup_and_recovery.dart;回归测试为test/models/webdav_shared_config_test.dart。
私有覆写脚本
scripts/uclort-desktop.js与scripts/uclort-sukka.js保存在私有uclort/custom-mihomo仓库,包含私有订阅与内网信息,不提交到公开 Bettbox;当前同步提交为5a0477bb0ffb88eb8e3a30239eda1960112cadb5。uclort-desktop.js保留源节点与 Provider,过滤套餐/流量提示节点,按地区与倍率排序,重建 Global、Apple、Emby、抓包、CC 内网和 Fallback 分组;latencyTestUrl统一 Provider 健康检查和策略组测速地址。uclort-sukka.js以Uclort.conf为基准接入 Sukka 官方 Mihomodomainset / non_ip / ip规则集;Bettbox 运行端口、TUN 启停和栈模式沿用客户端当前状态,源 hosts 仅按保护条件替换节点服务器域名。- 固定自定义规则统一放在
BETTBOX_CUSTOM_RULES,支持可选说明注释;网络面板通过 Sub-Store wholeFile/file API 读取、追加、修改、删除和拖动排序,保存前重新读取远端脚本,避免覆盖其他改动。 CC-intranet-en5使用dns-follow-interface: true与allow-other-interface: true;CC 内网由ruleOptionsEnable.CC内网单一开关控制,关闭时恢复10.0.0.0/8DIRECT。- 修改后至少运行
node --check scripts/uclort-desktop.js、node --check scripts/uclort-sukka.js、node scripts/uclort-sukka.test.js,并通过 Bettbox 实际导入 URL 与远端文件逐字节校验。
Mihomo:direct proxy 跟随接口 DNS
- direct proxy 支持
dns-follow-interface;仅在配置interface-name时生效,省略默认为true。 - direct proxy 支持
allow-other-interface,省略默认为true;指定接口不存在、未运行或缺少目标协议族地址时,连接和接口 DNS 一并回退到当前默认接口。 - 显式设为
false时保持严格接口绑定;接口可用但普通连接失败时不会越权回退。 - macOS 的
dhcp://<interface>优先读取系统 Scoped Resolver,读取不到时再使用 Mihomo DHCP 广播;DNS 失败或连接重置时按需刷新并重试,其他平台保留原一小时缓存。 - 标记位于
core/Clash.Meta/adapter/outbound/direct.go、component/dialer/options.go、component/dhcp/dhcp.go和dns/dhcp.go;对应目录测试必须保留。
Snell v6 与自定义内核
- 私有
uclort/custom-mihomo以 Bettbox 当前内置 Mihomo 源码树为输入,应用patches/opensnell-v6.patch后供构建替换使用。 - Snell v6 支持
version: 6及default / unshaped / unsafe-raw模式;补丁来源与许可证记录在私有仓库的OPEN-SNELL-V6和THIRD_PARTY_NOTICES.md。 .custom-build/metadata/custom-mihomo-commit固定每次构建使用的私有内核提交;构建前校验 Bettbox 核心树、Mihomo 版本和 Snell 补丁摘要。- 同步后至少运行
go test ./transport/snell ./adapter/outbound ./component/dialer ./component/dhcp ./dns ./listener/sing_tun ./constant ./tunnel ./tunnel/statistic。
应用内更新
- “关于本机 → 查找更新”检查
uclort/Bettbox已发布的最新自定义 Release;“Github Releases”直接打开该仓库的 Releases 页面。 - macOS 使用 Sparkle、Windows 使用 WinSparkle;安装前继续执行内核、代理和系统 DNS 退出清理。
- Android 使用 arm64-v8a 固定签名 APK,校验 SHA-256 后通过独立
FileProviderURI 调用系统安装器;安装器无法打开时显示失败提示,发布前校验 Provider 与app_updates路径配置。更新检查读取custom-update-feed分支静态 JSON,避免 GitHub Releases API 匿名限流。 - 自动检查与手动检查使用同一发布源,草稿 Release 不会被识别为可用更新。
macOS TUN、DNS 与唤醒恢复
- macOS 实际 TUN 配置将
system栈映射为mixed;显式mixed或gvisor保持原值。 - 桌面切换 TUN 栈使用串行核心重启;失效 IPC socket 立即丢弃,异常退出记录退出码和 stderr。
- macOS 开启 TUN 时自动托管当前网络服务 DNS,关闭 TUN、停止或退出时恢复原 DNS;下次启动会清理残留托管状态。
- 系统唤醒、Wi-Fi 切换或默认出口租约变化后,通过网卡、网关、地址、网络服务和 DHCP 信息生成的指纹识别真实网络变化。
- 等待网络稳定后迁移托管 DNS、关闭旧连接、重建 Mihomo resolver 的 DoH/DoT 连接池、刷新 DNS/Fake-IP,并按需停止监听后重建 TUN;桌面 IPC 的
resetConnections方法名与 Dart 调用保持一致,恢复任务支持代际取消和一次重试。 - 启动 TUN 前检查其他 VPN 遗留的
1.0.0.0/8utun 路由;发现冲突时保持关闭并提示接口。 - macOS TUN 关闭竞态的
ENOTSOCK按标准关闭处理,避免旧批量读协程日志风暴和 CPU 满载;Mixed/GVisor 所需方法集继续保留,并兼容 sing-tun 新增的 DarwinBatchSize接口。 - 主要测试为
test/application/macos_network_recovery_test.dart、test/controller/macos_tun_startup_test.dart、test/models/clash_config_test.dart及core/Clash.Meta/listener/sing_tun定向测试。
macOS 菜单栏与托盘
- 菜单栏提供系统代理、虚拟网卡、重启内核、重启软件、自动启动、亮屏锁、策略组和节点选择;左右键行为可分别配置为显示窗口或显示菜单。
- Dock 图标完全跟随主窗口状态:窗口显示或最小化时显示,窗口关闭到托盘或静默启动时隐藏;不再提供“常驻 DOCK”开关,也不读取历史偏好。代码位于
plugins/window_ext/macos/Classes/WindowExtPlugin.swift、macos/Runner/AppDelegate.swift与macos/Runner/MainFlutterWindow.swift,策略映射测试位于macos/RunnerTests/RunnerTests.swift。 - 支持独立开启实时上传/下载速率;系统代理与虚拟网卡均关闭时立即归零并显示为未启用状态。
- macOS 启用时使用原生模板图标高亮;未启用时使用 60% 中性灰渲染图标,避免纯黑并比原生 disabled 外观更亮。右侧实时速率文案固定使用正常标签色,不跟随启停状态变灰。
- 托盘一级菜单提供显示窗口、网络面板、模式、策略组、系统代理、虚拟网卡和重启内核;“显示窗口 / 网络面板 / 系统代理 / 虚拟网卡 / 重启内核 / 退出”使用
⌘M / ⌘D / ⌘S / ⌘E / ⌘R / ⌘Q。 - 二级菜单父项只展开子菜单;节点测速结果使用独立右对齐列。
- 首次安装特权工具后原位刷新托盘;从后台显示窗口或从托盘重启内核后主动同步最终运行状态。
- 系统代理管理器只关闭当前 Bettbox 进程成功启用过的代理,避免误关 Surge 等其他软件的系统代理。
- 代码位于
lib/common/tray.dart、lib/providers/state.dart、plugins/tray_manager/macos/Classes/TrayIcon.swift和plugins/proxy/lib/proxy.dart;回归测试为test/common/tray_active_state_test.dart、test/plugins/tray_menu_open_state_test.dart与macos/RunnerTests/RunnerTests.swift。
隐藏策略组
- 代理页“显示隐藏项”按配置原始顺序显示隐藏策略组,托盘同步遵循该设置。
- 设置关闭时,macOS 可按住 Option 点击托盘图标临时显示隐藏策略组;Option 状态同时读取点击事件和当前键盘修饰键,避免菜单栏事件丢失修饰键。
Inline Provider 内容查看
- Inline 类型代理提供者可直接从运行配置序列化查看节点内容;HTTP 与 File 类型继续使用原文件读取方式。
- 回归测试为
core/hub_test.go。
HarmonyOS Sans 字体
- 内置 HarmonyOS Sans 补齐标准 U+0020 空格字形,避免列表、详情和输入框出现异常大的词间距。
网络面板
- macOS、Windows 和 Linux 导航保留一个“面板”tab,点击以同一可执行文件的
--network-panel参数启动独立进程;面板使用专属 Dock/任务栏图标,关闭面板不影响主窗口,主进程退出或管道断开时自动关闭面板。 - Android 不再把网络功能顺序平铺到“更多”;“更多 → 查看”分组只提供一个“网络面板”二级页,并显示“查看网络请求、连接和流量信息”副标题,进入后在面板内部切换最近请求、活动连接、DNS、设备、流量统计、日志和 Sub-Store 七个 tab;桌面端主导航的大 tab 保持简洁的“面板”,同一网络监控功能的其他入口统一使用“网络面板”,首页“在线面板”属于另一项功能并保持不变。
- 独立面板进程不初始化 Mihomo、单例锁或托盘,通过
ExternalControl本地 UDS/TCP 通道读取请求、连接和日志并执行清理/断连;请求与日志变更使用持久订阅主动通知,事件刷新限制为 250 ms。 - 请求与连接按 Mihomo
TrackerInfo的进程、来源、目标、协议、规则、出站链和状态动态分类,支持全文搜索、移动端筛选、右键生成规则、当前配置追加/覆盖规则和独立详情;状态按活动快照、真实出站 socket、REJECT和链路终态区分。 - DNS 页由当前生效配置读取
default-nameserver / nameserver / fallback / proxy-server-nameserver / direct-nameserver / nameserver-policy / hosts,并合并系统 Hosts、运行缓存、Fake-IP 与出站节点 DNS;支持同时清理 DNS 缓存和 Fake-IP。 - 设备页只展示内核可确认的进程、来源地址和活动/历史状态;流量页调用
getTraffic / getTotalTraffic展示实时与累计上传下载,不将有限环形历史误算为总流量。 - 日志页按实际级别分类;Sub-Store 页支持凭据历史、固定规则读取/新增/修改/删除/拖动排序,保存前重新读取远端脚本并仅替换
BETTBOX_CUSTOM_RULES。 - 选中请求或连接后展开可拖动详情,区分客户端、目标、Fake-IP、实际出站本地/远端地址、GeoIP/ASN 和完整策略链;macOS 通过
NSWorkspace读取进程图标,并发请求合并且复用历史.app路径。 - custom-mihomo 为每条连接保存 DNS 逐服务器尝试、规则匹配、策略链和真实 socket 建立事件,
TrackerInfo返回trace / outboundLocalAddress / outboundRemoteAddress;连接加入与离开均发送同 ID 通知,请求记录按 ID 原位更新。 - 代码位于
lib/views/network_monitor*.dart、lib/common/window.dart、lib/common/external_control.dart、lib/common/navigation.dart、lib/views/network_monitor_navigation.dart、lib/enum/enum.dart、lib/widgets/google_bottom_nav_bar.dart和lib/common/tray.dart;回归测试为test/views/network_monitor_test.dart、core/Clash.Meta/tunnel/statistic/manager_notify_test.go及私有内核constant / dns / tunnel / tunnel/statistic测试。
统一启停交互
- 桌面端系统代理或 TUN 任一开启即启动核心,两者均关闭即停止核心;设置页、快捷卡片和托盘开关都调用
updateSystemProxy/updateTun联动方法。 - 移除桌面独立启动/停止入口、启动热键和“联动开关”设置;托盘保留网络面板、系统代理、TUN、重启内核等入口。
- Android 首页保留一个悬浮总开关,并避让底部导航与页面滚动内容;启动时间卡片仅作为非独立启停的运行时长展示,不再提供桌面独立启停操作。
- 回归测试为
test/controller/macos_tun_startup_test.dart。
自定义构建与发布
uclort/Bettbox明确标记为非官方个人自定义版;GitHub 操作必须显式指定该仓库。custom-sync.yml与custom-build.yml仅支持手动触发;同步顺序为上游 Bettbox → 保留功能分支 → 私有 custom-mihomo → 自定义构建。- 构建可选择全平台、仅 macOS Apple Silicon 或仅 Android arm64-v8a;Android 构建同步静态更新源。
- 内核同步兼容新版 Mihomo 将版本号改为构建时注入的模式;源码版本为空时按 Bettbox 上游核心树继续同步,仍执行 Snell v6 补丁与 Go 回归。
- 自定义应用代码变化但未同步完整总账和发布增量时拒绝发布。
已删除的历史自定义功能
- 旧自定义节点测速并发、缓存、诊断和 Provider 生命周期改造此前已删除,继续使用 Bettbox 上游实现。
构建信息
- 上游 Bettbox main 基线:
main@26865630fef4 - 最终安装版本:
1.19.3+2090000135 - 上游源码版本:
1.19.3+2026092601 - Bettbox custom-build commit:
75f71468e833a5149792af06e1cc756464d8444d
Release 仅包含本次 Action 生成的安装包,不包含私有自定义 Mihomo 源码。
Windows 与 macOS 安装包未做商业代码签名;Android 安装包使用 Bettbox 自定义版固定 Release 签名。