Commit Graph
48 Commits
Author SHA1 Message Date
ysicing b70a621e93 chore(repo): 精简文档并统一脚本目录 2026-09-24 11:43:57 +08:00
ysicing 5273bf1cc2 fix(ai-usage): 优化额度重置进度布局 2026-09-24 11:06:51 +08:00
ysicing bfce9c6cc5 fix(ai-usage): 隐藏无额度来源的菜单栏占位 2026-09-24 10:05:26 +08:00
ysicing 23d015a000 fix(ai-usage): 统一弹窗按钮语义与顺序 2026-09-24 09:00:59 +08:00
ysicing 23e227ec19 test(ci): 消除菜单栏断言语言依赖 2026-09-24 08:38:02 +08:00
ysicing 875dfb6cac fix(ci): 拆分黄历无障碍表达式 2026-09-24 08:31:33 +08:00
ysicing a2790173e2 fix(ui): 区分 AI 与清理图标 2026-09-24 08:09:09 +08:00
ysicing 84bed521d4 fix(ai-usage): 修复额度失效与圆点排版 2026-09-24 07:59:55 +08:00
ysicing 689dc29532 fix(menubar): 提高 CPU 与 RAM 标签可读性 2026-09-24 07:38:12 +08:00
ysicing 060a028743 fix(ui): 修复顶栏与侧栏滚动穿透 2026-09-24 07:25:57 +08:00
ysicing c08c1f46f1 feat(ai-usage): 为来源显示品牌图标 2026-09-24 07:10:08 +08:00
ysicing f636af7f03 feat(ai-usage): 缓存额度并修复菜单栏预览 2026-09-24 06:59:29 +08:00
ysicing f91c2b9460 feat(ai-usage): 统一额度菜单栏与配置体验 2026-09-24 06:28:40 +08:00
ysicing d413e34fe2 feat(ai-usage): 并列显示双来源额度并整理弹窗布局 2026-09-24 00:22:50 +08:00
ysicing cb2b57eb79 feat(ai-usage): 支持 Codex 与 Claude 的 Sub2API 备用额度 2026-09-23 23:46:15 +08:00
ysicing 9a7e0cc1e0 feat(ai-usage): 优化额度与重置进度展示 2026-09-23 22:28:55 +08:00
ysicing c7e4a34e91 feat(ai-usage): 增加订阅额度与剩余进度展示 2026-09-23 20:26:35 +08:00
ysicing fa2023e630 fix(updates): 修正更新弹窗留白与摘要截断 2026-09-23 17:49:10 +08:00
ysicing 71fbb30c70 feat(legal): 添加服务条款与隐私政策并优化阅读排版 2026-09-23 17:21:51 +08:00
ysicing a491c5adeb fix(uninstaller): 优化卸载二次确认界面 2026-09-23 16:19:17 +08:00
ysicing fc29738597 refactor(ai): 恢复进程解释仅使用 Apple 智能 2026-09-23 15:11:07 +08:00
ysicing 58e5475416 fix(ui): 优化日历年份选择与智能状态提示 2026-09-23 14:03:12 +08:00
ysicing 9925b37dc9 feat(settings): 统一日历启用入口并完善设置弹窗 2026-09-23 12:51:06 +08:00
ysicing 49895b34e4 feat(settings): 统一可选模块开关并隐藏停用入口 2026-09-23 11:14:49 +08:00
ysicing f34ba88db9 fix(swift): 清理并发与废弃 API 告警 2026-09-23 10:27:14 +08:00
缘生 a4b44a64fc Codex/ai assistant (#3)
* feat(ai-assistant): 添加全局进程解释与备用服务
2026-09-23 09:44:26 +08:00
缘生 aa8228fac8 Codex/calendar (#4)
* feat(calendar): 新增菜单栏日历与黄历详情
2026-09-23 09:00:05 +08:00
ysicing a0a15a69fd fix(ai-usage): 保留窗口按当天重算,刷新排队不再被丢弃
两处来自 PR 评审的缺陷,均已用回归测试复现:

保留窗口此前作为 cutoff 存进了检查点,而检查点会被原样恢复,那个日期
因此永远停在首次扫描那天。取数时又没有再过滤,超出 365 天的事件既出不了
报告也出不了检查点。改为不在解析状态里裁剪、一律在取数时按当天重算。
测试:同一文件 300 天前的事件,400 天后复扫必须离开报告。

刷新此前遇到在途刷新就直接返回,而轮询任务把这次返回当成“首次刷新已完成”,
接着睡满整个周期(最长 60 分钟);那次在途刷新的结果又会因 generation 变化
被丢弃,于是关掉再打开统计后页面会一直空着。改为串行排队,并在 stop() 与
停止轮询时显式取消在途扫描——排队链上的任务是非结构化的,不会自动取消。
测试:在途刷新期间到来的刷新必须真正执行;stop() 必须取消在途扫描。

ClaudeLocalUsageProvider 增加可注入时钟,用于验证时间推移后的窗口行为。
2026-09-23 08:50:41 +08:00
ysicing 3575a97de5 fix(ai-usage): 修正子代理回放判定并清理配额时代残留
修复子代理与 fork 会话的 Token 全量丢失:原判定要求 task_started 带
started_at 且不早于会话创建时间才结束回放,但子代理的 started_at 是父级
回合的开始时间,天然早于子会话文件,新版 Codex 更是完全不发该字段。改为
首个 task_started 无条件结束回放——实测 661 个真实 rollout 中没有任何一个
的 token_count 出现在它之前。本机语料 A/B:Token 13.60G → 14.53G(+6.8%),
用量记录 68997 → 73566。

其他修复:
- 两个 Provider 钉到专用串行执行器,冷扫描不再占用协作线程池。把池限制
  成一条线程实测,修复前并行的每秒采样在 43 秒扫描期间一次都没能推进。
- 按日期与模型聚合并定序输出,行数 701 → 272 且 id 唯一;顺带修掉冷扫描
  与检查点恢复顺序不一致导致每次刷新都产生"不相等"报告的问题。
- 缓存行加剪枝,覆盖归档搬走的 rollout、删除的项目目录与旧解析命名空间;
  检查点仅在末行未完时存第二份状态,Claude 事件按保留窗口裁剪。
- 复用 ISO8601 解析器,不再逐行创建。
- 数字与日期改跟随应用语言,弹窗与菜单栏共用同一套 Token 缩写。
- 窄弹窗热力图按设计尺寸铺开后横向滚动,此前被钉在面板宽度上永不溢出。
- 打开菜单栏项一并开启扫描,并为无数据状态补上悬停文案。
- 删除未被应用构造的配额 Provider、凭据读取与响应映射(约 330 行)及其
  全链路管线,并清掉 37 条孤立译文 × 8 个语言文件。
2026-09-23 08:50:41 +08:00
ysicing 6ba59fe150 feat(ai-usage): 添加本机模型统计与年度活动视图 2026-09-23 08:50:41 +08:00
ysicing e44de0bf35 feat(ai-usage): 集成 Codex 只读配额监控 2026-09-23 08:50:41 +08:00
ysicing 6f7c898cc6 fix(updates): 避免检查更新触发钥匙串授权 2026-09-22 17:26:44 +08:00
ysicing 57004c87dd feat(cleaner): 支持开发工具缓存清理 2026-09-22 16:39:29 +08:00
ysicing cab90673d5 fix(settings): 隐藏签名团队信息 2026-09-22 14:39:13 +08:00
ysicing ff5681fe45 test(network): 放宽超时测试调度余量 2026-09-22 11:22:54 +08:00
ysicing f6eceb9b08 fix(network): 处理进程采样输出读取异常 2026-09-22 11:18:42 +08:00
ysicing f09861f6ec feat(release): 安装包迁移对象存储,版本号回归 semver
发布链路:安装包不再 scp 到 VPS,改用 mc 上传到对象存储
c.ysicing.net/oss/apps/macOS/XStats,上传后从 CDN 回读比对 sha256;
GitHub Release 挂 dmg 作为手动下载入口,应用内“手动下载”在未取到清单时
跳到 releases/latest。版本清单仍由自建 API 返回,publish_api.py 与
server/api 不变,且始终最后提交——安装包校验通过后客户端才看到新版本。
发布前只读校验 HEAD 与 origin/main 一致,脚本不代为 commit 或 push。

版本号:公开版本号从“年.月.日.索引”回归标准 semver,真源收敛到
CHANGELOG.md 顶部的 “## X.Y.Z · YYYY-MM-DD”;version.sh 收敛为
show/build/release 三个子命令,build 只推进构建号,删除 next 与 tag。
内部构建号改为单调递增整数(0109 规范化为 109)。日期校验回读比对,
因为 BSD date 会把 2026-02-29 规整成 2026-03-01 而非报错。

CI 不再参与发版:删除 tag 触发与 Set version from tag 步骤。

其他:appcast 的 changelog 指向本仓库而非上游站点;arm64_release_test
改用 fixture CHANGELOG,与仓库版本历史解耦;丢弃上游 0.2.0–0.6.1 的
历史条目;sync_changelog 不再改写 web/index.html(上游历史站点),
连带删除仅服务于它的 Website 段落。
2026-09-22 08:25:45 +08:00
ysicing e0c89af076 fix(battery): 优化多电池设备布局 2026-09-21 23:25:27 +08:00
ysicing 0a99244763 fix(battery): 显示已配对蓝牙配件 2026-09-21 22:48:13 +08:00
ysicing ff049336f2 fix(battery): 补全蓝牙设备电量显示 2026-09-21 22:20:13 +08:00
ysicing b462420046 fix(network): 优化进程流量实时采样 2026-09-21 21:48:30 +08:00
ysicing 4457d6201a test(update): 移除本地化错误文本依赖 2026-09-21 19:10:20 +08:00
ysicing e3e3febdbb feat(update): 支持双区域更新与固定 UA 2026-09-21 19:04:13 +08:00
ysicing ea67453b32 feat(release): 完善版本服务与镜像发布 2026-09-21 13:06:22 +08:00
缘生 6a7aeffb83 fix(security): 修复辅助工具鉴权、升级路径与卸载误删 (#1)
* fix(security): 修复辅助工具鉴权降级与五处正确性缺陷

代码审查(安全/质量/性能/架构四维度)发现的问题,逐条修复。

辅助工具鉴权(High)
  ad-hoc 构建下 clientRequirement 退化为只校验 bundle identifier,不含
  anchor 约束,任何进程 codesign -s - 伪造同名即可连上 root 辅助工具,
  驱动 DNS、睡眠、本地快照与风扇。project.yml 默认就是 ad-hoc 签名,
  而 make build 是文档化的安装路径,开发机上属常态。
  改为无团队签名时返回 nil 并拒绝连接,与在线升级在 ad-hoc 下直接禁用
  的策略一致;此时 App 走一次性管理员授权回退,功能不丢。

卸载器批量误删
  validate 只拒绝 com.apple. 前缀,包名为 "com" 的应用可通过;随后
  hasPrefix("com.") 把 leftovers 扫描的十余个目录(Preferences、Caches、
  Containers、Saved Application State 等)下所有 com.* 条目当成残留列出
  并默认勾选,一次点击即整体移入废纸篓。前缀匹配改为要求至少三段反向
  域名,精确匹配不受影响。

退出时静默跳过恢复睡眠
  restoreDefaultsSynchronously 的 guard 在循环体内用 return 而非 continue,
  第一步取代理失败就连带跳过第二步,Mac 保持禁止睡眠。同时把两步各等 1 秒
  改为总预算 1.5 秒,避免主线程退出卡顿。

公网 IP 查询重入保护失效
  isLookingUpPublic 同时承担重入锁与转圈开关两个相反职责,有缓存且非强制
  刷新时恒为 false,guard 形同虚设,两个 Task 可各发三次请求并发写缓存,
  失败结果可能覆盖好结果。拆出独立的 isFetchingPublic,并用 defer 确保
  所有退出路径复位。

诊断导出的崩溃报告未脱敏
  日志与清理记录都走了 redact,但 .ips 崩溃报告原样入包,其中可能夹带
  进程内存中的 WebDAV 目录、用户名、公网 IP 与主机名,与界面“不含 IP、
  序列号与硬件地址”的声明不符。改为同样脱敏后写入。

PowerSampler
  channels(in:) 的 unsafeBitCast 改为 Unmanaged.fromOpaque.takeUnretainedValue。
  未加 deinit 释放 IOReport 订阅:IOReport 是私有框架,无公开释放入口且
  无法验证其是否为 CF 对象,而全进程只有一个 PowerSampler、订阅各只创建
  一次且随进程存在,不是增长型泄漏——已就此写明注释。

补回归测试:clientRequirement 的 ad-hoc 分支与 anchor 约束、
matchesIdentifier 的过宽前缀与派生名匹配。

make test 141 项通过(新增 4 项),Release 完整构建通过。

* fix(security): 完善辅助工具升级与卸载边界校验

* fix(ui): 拆分评分条视图以解决 CI 类型检查超时

* fix(webdav): 规范化目录路径以兼容 macOS 15
2026-09-21 09:34:01 +08:00
ysicing ef0bd2f5ee feat(i18n): 支持九种语言与可搜索语言选择 2026-09-20 23:50:54 +08:00
ysicing 7db2c8ad7a chore(license): 采用 AGPL 并完善版权与贡献规则 2026-09-20 23:22:58 +08:00
ysicing 4212961565 feat: 初始化 XStats 并支持 WebDAV 设置同步 2026-09-20 23:02:44 +08:00