Case 004 / Wear OS companion

Codex 宠物手表

一个面向 OPPO Watch X2 的 Wear OS 应用。它把 Windows 端 Codex 用量桥接到手表上,用一个圆形仪表盘同时呈现 5 小时额度、周额度、Token 统计、同步新鲜度和宠物状态。

Role: Product prototype Platform: Wear OS / Android Mode: Watch companion
Codex 宠物手表主屏截图,展示 5 小时额度、周额度、Token 统计和宠物状态。

Summary

把“还剩多少额度”变成抬腕就能读到的状态。

这个项目由两部分组成:Windows 端 Codex Watch Server 复用 CodexBar Safe 的本地读取器,将额度和 Token 统计标准化成 /usage 数据;手表端原生 Android 应用再按公网隧道、局域网、USB 回退地址依次同步。手表每 5 分钟刷新一次,重新打开应用和点击表盘都会立即刷新。

01

腕上主答案

主屏优先回答当前 5 小时额度还剩多少,再用半圆弧线显示已用比例,避免小屏幕里信息抢夺视线。

02

同步链路兜底

手表按公网、局域网、USB 回退顺序尝试数据入口;服务端支持密钥保护,并用 `STALE` 标记过期样本。

03

宠物表达状态

额度安全、工作中、需要注意、额度过低分别映射到不同宠物动作,让数字状态多一层直觉反馈。

Process

先打通同步链路,再把信息压进圆形小屏。

这个项目同时处理两件事:桌面端要把 Codex 用量变成稳定接口,手表端要在很小的屏幕里读出状态。设计过程围绕“抬腕一眼看懂”展开,而不是把桌面面板缩小复制到手表上。

01 / Bridge

复用桌面端读取能力

Windows 端服务把 CodexBar Safe 的本地读取器标准化成 `/usage` 数据,让手表端只关心同步和呈现。

02 / Fallback

给手表网络环境留退路

公网隧道、局域网和 USB 回退地址按顺序尝试;同步失败时保留上一份数据,并明确标记离线或过期。

03 / Watch UI

把信息拆成三页,而不是一屏塞满

Usage 负责读额度,Play 负责宠物互动,Settings 负责配置;这样每个页面都有明确任务,小屏幕不需要承受长列表。

Design decisions

设计判断

为圆形屏幕重排信息

V3 去掉了复杂圆形网格,只保留上半区主额度、中央宠物和底部 2x2 指标网格,避免线条穿过文字。

三页而不是长列表

手表端用横滑切换 Usage、Play、Settings 三个面:看状态、玩宠物、调宠物/模型/推理强度,各自只做一件事。

离线不清空上下文

同步失败时优先保留上一份可用数据,并把状态切到离线/失败,不让用户误以为数据仍然新鲜。

System / usage sync

不是把数字发到手表,
而是把一条不稳定的路变得可预期。

Windows 服务从 Codex CLI 本地日志整理出统一的 /usage 响应;手表拿到的不是裸日志,而是可以直接渲染的额度、Token、新鲜度和宠物状态。连接失败不会立刻把界面清空,而是沿着三条入口继续尝试。

一次完整的 /usage 同步
GET · JSON · token protected
01 / source Codex CLI logs

本地读取器扫描 session 日志,归一化 5 小时额度、周额度和 Token 统计。

Windows · local only
02 / bridge Codex Watch Server GET /usage
  • session.remaining_percent
  • weekly.remaining_percent
  • tokens.today_label
  • sync.fresh · pet.state
01
公开网络离开电脑所在网络也能读取
Preferred
02
局域网同一 Wi-Fi 下直接访问电脑
Fallback
03
USBADB reverse 映射到 127.0.0.1
Last resort
04 / wrist First healthy response wins

连接 3 秒、读取 5 秒超时。第一个可用响应立即进入腕上界面。

00:00 打开应用立即同步 Tap 点击表盘重新同步 05:00 前台每 5 分钟轮询 Fail 当前会话保留 last good

Freshness model

“能连上”与“数据是新的”,是两件不同的事。

接口连接正常不代表 Codex 源数据仍然新鲜。页面把 transport 与 freshness 分开表达,避免一份旧额度因为网络正常而看起来仍然可信。

在线 · 新鲜源数据 ≤ 5 min

显示最新额度、Token 与重置倒计时;宠物继续映射当前用量状态。

RESET 1h52m
在线 · 已过期源数据 > 5 min

数值仍可参考,但同步标记转红,倒计时让位给样本年龄,明确提醒它不再新鲜。

STALE 6m
离线 · 有缓存当前会话曾成功同步

保留本次运行中的最后一份成功数据,宠物进入 failed,不用一断网就失去上下文。

OFFLINE
离线 · 冷启动还没有 last good

用占位符代替虚构数据;鉴权或服务异常则显示具体 HTTP 状态,方便判断问题在哪。

SERVER 401 / --

Next / ambient system

下一版不该只是更多页面,
而是更少地要求用户打开应用。

产品化方向是把同一套状态模型拆到不同的腕上入口:表盘负责一眼确认,Tile 负责快速展开,诊断页负责解释失败。主应用则保留完整数据和宠物互动。

01 / Complication

把“5 小时剩余”放进每天已经会看的表盘。

短文本显示 89%,弧形值表达消耗进度,角标只负责新鲜度。点击后直接进入 Usage 页,而不是先经过首页。

  • 一项主数字,不把周额度和 Token 一起塞入
  • 过期时优先显示 STALE,而不是继续伪装实时
CODEX · 5H 89% LIVE
02 / Tile

向左一划,读完一组可信的摘要。

Tile 同时容纳 5 小时、周额度、最近同步时间和宠物状态;点击任一指标再进入应用对应页面。

03 / Diagnostics

让“同步失败”变成可定位的问题。

诊断页记录最近成功时间、源数据年龄、每条入口的耗时与错误;密钥只显示是否配置,不回显内容。

  1. Publictimeout · 3.0s
  2. LANunreachable · 3.0s
  3. USB200 · 184ms
Ambient:停掉宠物动画,只留单色数字与状态点 Battery:让系统更新预算决定后台频率,不维持常驻轮询 Privacy:诊断信息可复制,但 token 与私人地址默认遮盖

Current build

核心路径已经跑通,下一阶段是把它变成真正的 glanceable system。

现在的三页结构已经覆盖用量、宠物和设置;同步层也能在公网、局域网与 USB 之间回退。Complication、Tile 与诊断页会把这套原型补成更完整的腕上产品。

Codex 宠物手表主屏截图,展示用量与同步状态。 Codex 宠物手表宠物互动页截图。 Codex 宠物手表设置页截图。