Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 15 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,22 @@

一只住在 macOS 菜单栏里的 Codex 额度糯米猫。

它默认显示五小时窗口的**剩余额度**,点击可查看五小时和每周额度、重置时间与刷新状态。额度越紧张,猫的动作越快;读取失败时不会编造数字,而会保留并标记上次的可用结果。
它在菜单栏显示周额度中更紧张的**剩余额度**,点击可在紧凑的 `348 × 404` 弹窗中查看会员、主周窗口、储备重置卡、今日 Mac 原始 Token、最近速度与刷新状态。额度消耗越快,冒出的猫粮越密集;高速时带火花,最高档会猫粮与火花直溅。读取失败时不会编造数字,而会保留并标记上次的可用结果。

> A tiny animated macOS menu bar companion for Codex quota. It shows honest five-hour and weekly remaining usage, reset times, and clear stale/error states using your existing local Codex login.
> A tiny animated macOS menu bar companion for Codex quota. Its compact popover shows membership, the primary weekly window, reset credits, today's raw Tokens and recent local speed, plus clear stale/error states using your existing Codex login.

灵感来自 [RunCat](https://apps.apple.com/app/runcat/id1429033973) 的环境式状态反馈,以及 [Quota Float](https://github.com/change-42-yhmm/quota-float) 的本地优先额度读取边界。本项目使用独立实现与原创的糯米猫界面。

## 功能

- 菜单栏实时剩余百分比
- 会眨眼、跳动并随额度紧张而加速的糯米猫
- 五小时和每周额度卡片及重置倒计时
- 可点击互动、会轮换爱心/星星/害羞等表情的糯米猫
- 8 套可持久保存的柔色主题:薄荷、晴空、薰衣草、樱花、蜜桃、奶油、燕麦、雾蓝
- Plus / Pro 会员徽章;Pro 5x 与 Pro 20x 可点击徽章手动指定并保存在本机
- 主周额度卡片、重置倒计时与储备重置卡数量
- 从本机 Codex 会话日志统计今日输入、缓存输入、输出与总 Token
- 最近 15 分钟 Token 速度,以及从“偶尔冒粮”逐级升级到“火花直溅”的爆猫粮动效
- 无多余留白的 `348 × 404` 紧凑弹窗,以及清晰带框的刷新/退出按钮
- 60 秒自动刷新、手动刷新与诚实的异常状态
- 原生 Swift / AppKit / SwiftUI,无第三方运行时依赖
- 本地优先、无遥测、不持久化 Codex 凭据
Expand All @@ -28,7 +33,7 @@
open dist/CodexMochi.app
```

构建完成后也可以把 `dist/CodexMochi.app` 拖入“应用程序”文件夹。它是菜单栏应用,不会显示 Dock 图标;左键打开额度卡片,右键可立即刷新或退出。
构建完成后也可以把 `dist/CodexMochi.app` 拖入“应用程序”文件夹。它是菜单栏应用,不会显示 Dock 图标;点击菜单栏图标打开额度卡片,再使用底部按钮刷新或退出。

首次打开若被 macOS 拦截,在 Finder 中右键应用并选择“打开”。当前版本使用本机临时签名,未做 Apple 公证。

Expand All @@ -47,13 +52,17 @@ swift build -c release

- 优先读取 `$CODEX_HOME/auth.json`,否则读取 `~/.codex/auth.json`。
- 现有访问令牌只发送给 `https://chatgpt.com/backend-api/wham/usage`。
- 重置卡只读取接口随额度返回的数量,不会兑换、消费或修改重置卡。
- Token 统计只解析 `~/.codex/sessions` 中已有的 `token_count` 事件,不上传或修改会话日志。
- 不保存令牌、账户 ID、原始响应、提示词或聊天历史。
- 会员倍数的手动选择只保存在本机偏好中,不参与额度或 Token 计算。
- 不包含遥测、统计、自动更新,也不会兑换重置额度或修改账户。
- 每 60 秒刷新一次;网络异常时显示明确状态。
- 今日 Token 仅覆盖这台 Mac 可见且已持久化的 Codex 会话;它是原始 Token,不等于官方额度 Token。

## 第一版边界

目前只支持 Codex,不包含多账户、历史曲线、通知、自启动和主题商店。视觉与功能都刻意保持小而明确,后续可在实际使用后继续调整。
目前只支持 Codex,不包含多账户、历史曲线、通知、自启动和主题商店。额度接口可自动区分 Plus 与 Pro,但 Pro 账户可能不提供 5x / 20x 子类型,因此应用不会猜测倍数,而是允许本机手动选择。

## License

Expand Down
14 changes: 8 additions & 6 deletions Sources/CodexMochiApp/MochiIconRenderer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import AppKit
enum MochiIconRenderer {
static func image(
remainingPercent: Double?,
burnUrgency: Int,
phase: Int,
hasError: Bool,
isLoading: Bool
Expand All @@ -12,13 +13,14 @@ enum MochiIconRenderer {
let context = NSGraphicsContext.current?.cgContext
context?.setShouldAntialias(true)

let urgency: Int
if hasError { urgency = 0 }
else if let remainingPercent, remainingPercent < 20 { urgency = 3 }
else if let remainingPercent, remainingPercent < 50 { urgency = 2 }
else { urgency = 1 }
let quotaUrgency: Int
if hasError { quotaUrgency = 0 }
else if let remainingPercent, remainingPercent < 20 { quotaUrgency = 3 }
else if let remainingPercent, remainingPercent < 50 { quotaUrgency = 2 }
else { quotaUrgency = 1 }
let urgency = min(4, max(quotaUrgency, burnUrgency))

let step = urgency == 3 ? phase : (urgency == 2 ? phase / 2 : phase / 4)
let step = urgency >= 3 ? phase : (urgency == 2 ? phase / 2 : phase / 4)
let bob = step.isMultiple(of: 2) ? CGFloat(0) : CGFloat(1)
let blink = !hasError && !isLoading && phase % 17 == 0
let originY = 2 + bob
Expand Down
Loading
Loading