|
|
618eecf676
|
Merge pull request '_tmp_update' (#11) from _tmp_update into dev
|
2026-10-10 02:39:06 +08:00 |
|
|
|
8207285b23
|
update 1.7.22 final2
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
|
2026-10-10 02:39:01 +08:00 |
|
|
|
82bd04597d
|
Merge pull request '_tmp_update' (#3) from _tmp_update into dev
|
2026-10-10 02:00:16 +08:00 |
|
|
|
5850fc452c
|
update 1.7.22 final
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
|
2026-10-10 02:00:15 +08:00 |
|
|
|
c6a75f8fce
|
Merge pull request '_tmp_update' (#2) from _tmp_update into dev
|
2026-10-10 01:47:32 +08:00 |
|
|
|
a384309689
|
update 1.7.22
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
|
2026-10-10 01:47:31 +08:00 |
|
|
|
8692014340
|
Merge pull request 'chore(update): publish 1.7.21 manifest' (#1) from _tmp_update into dev
Release / build (push) Waiting to run
|
2026-10-10 00:25:54 +08:00 |
|
|
|
15c6bc24c4
|
chore(update): 发布 1.7.21 更新清单
CI / Unit Tests & Lint (pull_request) Waiting to run
CI / Debug APK (pull_request) Blocked by required conditions
CI / Release APK (debug-signed) (pull_request) Blocked by required conditions
|
2026-10-10 00:25:12 +08:00 |
|
|
|
460bed7279
|
chore(update): 发布 1.7.20 更新清单
Release / build (push) Waiting to run
|
2026-10-09 23:16:10 +08:00 |
|
|
|
ecbc86fdf2
|
chore(update): 发布 1.7.19 更新清单
Release / build (push) Waiting to run
|
2026-10-09 22:43:53 +08:00 |
|
|
|
05b5107f46
|
chore(update): 发布 1.7.18 更新清单
Release / build (push) Waiting to run
|
2026-10-09 22:32:24 +08:00 |
|
|
|
bccd7bad83
|
chore(update): 发布 1.7.17 更新清单
Release / build (push) Waiting to run
|
2026-10-09 22:14:31 +08:00 |
|
|
|
c5120c5952
|
chore(update): 发布 1.7.16 更新清单
Release / build (push) Waiting to run
|
2026-10-09 18:39:17 +08:00 |
|
|
|
2c5a3b2055
|
chore(update): 发布 1.7.15 更新清单
Release / build (push) Waiting to run
|
2026-10-09 18:02:12 +08:00 |
|
|
|
c76193e892
|
chore(update): 发布 1.7.14 更新清单
Release / build (push) Waiting to run
|
2026-10-09 17:22:54 +08:00 |
|
|
|
6edd68f80e
|
chore(update): 发布 1.7.13 更新清单
Release / build (push) Waiting to run
|
2026-10-09 17:12:43 +08:00 |
|
|
|
750b9d9f90
|
chore(update): 发布 1.7.12 更新清单
Release / build (push) Waiting to run
|
2026-10-09 16:42:53 +08:00 |
|
|
|
0f4d68033e
|
chore(update): 发布 1.7.11 更新清单
Release / build (push) Waiting to run
|
2026-10-09 16:33:50 +08:00 |
|
|
|
7c7a23f097
|
chore(update): 发布 1.7.10 更新清单
Release / build (push) Waiting to run
|
2026-10-09 15:36:25 +08:00 |
|
|
|
7c3809e879
|
chore(update): 发布 1.7.9 更新清单
Release / build (push) Waiting to run
|
2026-10-09 15:29:08 +08:00 |
|
|
|
7ad49e994d
|
chore(update): 发布 1.7.8 更新清单
Release / build (push) Waiting to run
|
2026-10-09 12:27:18 +08:00 |
|
|
|
8f40360b9f
|
chore(update): 发布 1.7.7 更新清单
Release / build (push) Waiting to run
|
2026-10-09 11:51:52 +08:00 |
|
|
|
08a3b42a82
|
chore(update): 发布 1.7.6 更新清单
|
2026-10-09 11:23:01 +08:00 |
|
|
|
aab50bbe78
|
chore(update): 发布 1.7.5 更新清单
|
2026-10-09 11:04:35 +08:00 |
|
|
|
faf7f40524
|
chore(update): 发布 1.7.4 更新清单
|
2026-10-09 10:47:27 +08:00 |
|
|
|
342788056b
|
chore(update): 发布 1.7.3 更新清单
|
2026-10-09 10:29:48 +08:00 |
|
|
|
b479cb2a7a
|
chore(update): 发布 1.7.2 更新清单
|
2026-10-09 10:22:57 +08:00 |
|
|
|
6e0d67afb7
|
chore(update): 发布 1.7.1 更新清单
|
2026-10-09 10:13:03 +08:00 |
|
|
|
8d68c3b280
|
chore(update): 发布 1.7.0 更新清单
|
2026-10-09 10:03:32 +08:00 |
|
|
|
71f3f8d554
|
chore(update): 发布 1.6.9 更新清单
|
2026-10-09 09:47:13 +08:00 |
|
|
|
dfd91a5355
|
chore(update): 发布 1.6.8 更新清单
|
2026-10-09 09:40:01 +08:00 |
|
|
|
149fc5f125
|
chore(update): 发布 1.6.7 更新清单
|
2026-10-09 09:31:01 +08:00 |
|
|
|
95cde916ca
|
chore(update): 发布 1.6.6 更新清单
|
2026-10-09 09:18:15 +08:00 |
|
|
|
79f99f5dee
|
fix(credential): 多账号会话凭据按请求账号精确匹配;UI微调
- CredentialRepository 快照新增 requestedAccountId,暂存凭据严格按请求账号匹配,
避免 A 账号刷新期间把暂存凭据误交给默认账号/其他账号
- Dashboard 首页提示与自动签到开关改为卡片样式,开关配色对齐雨晴粉主题
- 默认账号徽标加 maxLines/softWrap 防窄屏换行
|
2026-10-08 22:16:06 +08:00 |
|
|
|
2509ab8a85
|
feat(update): 设置页新增检测更新/下载APK/自动安装;接入Gitea update.json清单
|
2026-10-08 21:42:45 +08:00 |
|
|
|
ceb5e6a268
|
feat(checkin): 签到记录含日期/状态/id/数量,失败可当天重试;同步本地主题与组件改动
|
2026-10-08 21:08:22 +08:00 |
|
|
|
ffc06a38ca
|
feat(account): 多账号体系、Sub2API token 自动刷新与面板按账号隔离
- Trae/WorkBuddy/Sub2API 支持多账号:每账号一张首页卡片、可设默认账号
(小组件/每日自动签到仅作用于默认账号),新增账号管理页
- 每日自动签到按账号执行,签到结果弹窗汇报(含积分变动)
- 移除独立的 UsageStat 页,用量并入服务详情
- Sub2API 面板 token 过期自动用邮箱+密码重登并回写该账号,
自动重登失败才引导手动网页登录;并发 401 按账号互斥去重
- Sub2API 面板管理(Key/分组/兑换码)按当前账号隔离
- 首页恢复每账号一张普通卡片(回退叠放卡组样式)并保留历史排序兼容
- WebView 登录自动识别成功、去掉手动确认弹窗;登录后立即刷新余额
- 修复积分占位符泄漏(%1$s /%2$s 积分)
|
2026-09-15 23:32:51 +08:00 |
|
|
|
1791fa6436
|
fix: 登录后余额不刷新 + 明细中英文本地化
- WebViewLogin 登录成功后 popBackStack 到 SERVICE_DETAIL,让详情页
ON_RESUME 自动刷新余额;back stack 无 SERVICE_DETAIL 时 fallback
到 guardedPop() 避免卡住
- GenericExtrasCard 重写:11 个已知技术 key 映射为三语本地化标签,
布尔值格式化为是/否,consumption_ratio 格式化为百分比
- 三语 strings.xml 新增 13 个 extra_label_* / extra_value_* 字符串
- 移除 WebViewLoginViewModel/Screen 中的调试 Log
|
2026-09-13 16:37:22 +08:00 |
|
|
|
0bed6d626a
|
feat(login): Trae+WorkBuddy 软件内登录
- WebViewLoginViewModel: 新增 Trae OAuth 回调解析(onTraeCallback)
和 WorkBuddy 设备授权流(bindWorkBuddy+pollWorkBuddyToken)
- WebViewLoginScreen: 添加 shouldOverrideUrlLoading 拦截 Trae 回调
(http://127.0.0.1:18080/authorize), loginUrl 为空时显示加载指示器
- CredentialEditScreen: TraeCredentialForm 和 WorkBuddyCredentialForm
顶部添加'软件内登录'按钮(OutlinedButton)
- strings.xml(三语): 新增 action_login_in_app 和 error_login_timeout
- 修复: WorkBuddy 网络请求包裹 withContext(Dispatchers.IO) 防止
NetworkOnMainThreadException
|
2026-09-13 14:57:33 +08:00 |
|
|
|
085a4d722f
|
feat(checkin): 签到语义化结果 + 多语言 + 轮换/并发安全
- Repository 改为返回语义化 CheckinOutcome(不再直出硬编码中文),
UI 经 UiText 按 Locale 解析;补齐三语言文案(含连签/需配置凭据/已签禁用态)
- WorkBuddy authedPost 改 sealed 结果:失败也回传轮换出的新 token,
多候选路径共享轮换状态,避免旧 refreshToken 单次消费后卡死(永久 401)
- 签到的凭据写入改走 RefreshBalanceUseCase.withCredentialSession,
按快照校验提交,避免并发改凭据被旧快照覆盖(lost update)
- Trae 仅在实际被服务端接受时才标记 lastVerifiedAt(400 业务失败不标记)
- DEVICE_BLOCKED 改用 Notice 态:不置灰按钮,与「今日已签到」语义区分
- 新增 TraeRepositoryTest(10) / WorkBuddyRepositoryTest(5),纯 JVM 解析用例
|
2026-09-13 14:01:27 +08:00 |
|
|
|
3b4cd103d0
|
fix(sub2api): tab改纯文字样式;去掉多余「按模型」标题;今天明细按小时
1. 「按模型 / 按 Key」tab 从 FilterChip 按钮改为纯 Text + clickable,
去掉按钮背景和圆角,更像文字标签而非按钮。
2. MODEL tab 下方原来有一行「按模型」小标题(sub2_models_header),
和 tab 本身重复,去掉。
3. 「今天」窗口的每日用量明细从隐藏改为按小时倒序列出,
每行显示 HH:00 + 请求/tokens/费用。
|
2026-09-13 13:14:49 +08:00 |
|
|
|
78f93588f8
|
fix(sub2api): 修复柱状图不显示——接入按小时趋势
详情页「今天」窗口柱状图只有一根按天柱子看不出分布,
原因是 hourlyTrend / onLoadHourlyTrend 参数从未从 Screen 传入 Card。
修复:
- VM 新增 hourlyTrend StateFlow + loadHourlyTrend(date) loader
- Screen 传入 hourlyTrend + onLoadHourlyTrend 回调
- Card 的 onLoadHourlyTrend 改为 (LocalDate) -> Unit,今天窗口时拉取小时趋势
- detailTab 状态去掉 remember(detail) 依赖,避免后台刷新余额时重置 tab 选中
|
2026-09-13 12:18:11 +08:00 |
|
|
|
dc3027417e
|
feat(sub2api): 详情页新增「按 Key」tab;面板管理按钮间距收紧
详情页「按模型」分区改为 tab 切换:按模型 / 按 Key。
按 Key tab 调 GET /api/v1/usage/stats?api_key_id=N 逐个查询,并行拉取;
未使用的 Key(404)显示为 0 而非报错。
面板管理「复制/分组/删除」三个操作从 TextButton 改为可点击 Text,
去掉 58dp 最小宽度带来的过大间隔(用户反馈「间隔有点宽」)。
补齐三语言缺失字符串(sub2_home_spend / sub2_panel_delete_confirm_*
/ sub2_trend_account_scope / sub2_tab_by_* / sub2_no_key_data /
sub2_key_unused)。
|
2026-09-13 11:44:00 +08:00 |
|
|
|
100b698f38
|
feat(sub2api): 面板管理支持删除 Key;用量明细修柱状图与按小时趋势
|
2026-09-13 00:46:04 +08:00 |
|
|
|
bc862df226
|
fix(sub2api): 余额标签与数字同行;请求次数改为「消耗 N 次」
|
2026-09-13 00:02:16 +08:00 |
|
|
|
62ddf50638
|
fix(sub2api): 面板管理按钮贴右边缘;补齐审查发现的登录安全与死代码问题
面板管理按钮(用户反馈「没有放到最右边」):
- 根因:底部 Row 里同时给左侧文案 weight(1f, fill=false) 和中间 Spacer weight(1f),
两个 weight 平分剩余空间,按钮只被推到一半。改为只让文案 weight(1f) 吃掉全部剩余宽度。
- 同时清零 TextButton 的 contentPadding,并去掉无效的 defaultMinSize(0)
(Material3 的最小尺寸挂在按钮内层节点,外层 modifier 压不下去,实测为 no-op)。
- 去掉箭头 Icon 的 offset 微调:offset 只改放置不改测量,右移的像素会落在按钮命中区之外造成误触。
独立复审发现并修复:
- 【安全】线上真正使用的面板登录弹窗 PanelLoginDialog 轮询 localStorage.auth_token 时
完全没有来源校验——登录容器会跳转到第三方页(OAuth/CDN),它们可伪造 token 覆盖用户凭据。
现要求 token 必须来自配置的面板域名(比较 hostname),并回传 host 一并校验。
- 【阻塞】saveFromCookieManager 仍在主线程 runBlocking 做 Keystore 加解密 + DataStore 写盘,
改 suspend 并在 viewModelScope 中调用。
- 【死代码】移除已无调用点的 balanceTrailing 插槽(余额行入口已改到底部)。
说明:WebViewLoginScreen 那套 JS 桥(LoginProbeBridge/nonce/trustedHosts)经查其路由
Routes.WEBVIEW_LOGIN 没有任何 UI 入口(onStartWebViewLogin 只声明未调用),实际不可达,
故本次把安全校验补到了真正在跑的 PanelLoginDialog 上,避免两套并行实现语义分叉。
验证:compileDebugKotlin 与 lintDebug 通过;真机实测按钮与「刚刚更新」同行(y1492-1555)
且可点击区域右边缘到达卡片内容区右缘,点按正常打开弹窗。
|
2026-09-12 11:31:15 +08:00 |
|
|
|
8592f15663
|
feat(sub2api): 未配置服务不再占位;面板管理入口改到卡片右下角;网页登录自动抓取凭据
1) 未配置的用量卡不再显示
OpenCode/CommandCode 用量卡与 Token 热力图卡此前是无条件加入首页列表的,
即使对应服务未配置凭据也会占位显示。现改为按 cards 里是否包含该服务来判断,
热力图卡跟随 OCGO。
2) 面板管理入口位置:卡片底部右下角,与「刚刚更新」同一行右对齐
(此前放在余额右侧,用户反馈位置不对)
底部 Row:左 footerText(weight(1f, fill=false)) + 中间弹性 Spacer + 右按钮。
3) 网页登录后自动获取凭据
- WebViewLoginScreen 注入 JS 桥(@JavascriptInterface LoginProbeBridge),
页面加载完成后读取 localStorage.auth_token / auth_user / favicon / origin 回传。
- WebViewSessionSaver.saveSub2ApiPanelSession 落库面板凭据,保留已有 email/password/apiKey。
- 安全:每次会话随机 nonce(回传必须匹配)+ origin host 白名单(trustedHosts
来自用户配置的面板基址),防止登录过程中跳转的第三方页面伪造 payload 投毒凭据。
- 自托管实例的 baseUrl 由 ViewModel 自行从凭据仓库读取,避免每个导航调用点漏传。
4) 修复(独立审查发现)
- saveSub2ApiPanelSession 去 runBlocking 改 suspend,在 viewModelScope 中调用,
避免 JS 桥线程同步等待 Keystore 加解密 + DataStore 写盘。
- 删除「用 origin 查 Cookie」的旁路:origin 无 path,CookieManager 查不到会误报
「登录完成了吗」,Cookie 抓取统一交回 onPageFinished 的真实 URL。
- normalizeBaseUrl 改用 okhttp3 HttpUrl 解析,垃圾串不再通过校验后落库。
- 撤销给 DeepSeek 加 loginUrl 的改动:其凭据类型是 ApiKeyCredential,
走 Cookie 路径会写成 SessionCredential 并导致 API Key 静默丢失。
真机验证(V2172A / Android 15):
首页只剩 Sub2API 一张卡;面板管理与「刚刚更新」同一行(均 y1492-1555,按钮右对齐 x783-980);
点按钮正常打开弹窗;网页登录容器正常加载面板首页(证明 baseUrl 兜底生效)。
compileDebugKotlin 与 lintDebug 均通过。
|
2026-09-12 10:57:58 +08:00 |
|
|
|
edc2a40dc1
|
fix(sub2api): 面板管理入口与余额齐平;用量磁贴压缩为两行
- 「面板管理」从卡片底部移到余额同一行右侧:给 BalanceMainArea 增加 balanceTrailing 槽,
Sub2ApiBalanceWithUsage 用 Row(verticalAlignment=CenterVertically) 让入口与余额数字齐平,
不再单独占一行并额外撑高卡片。
- 今日/近7天 磁贴由三行(周期名/Token/次数)改为两行:第一行「周期名 … 请求次数」左右分布,
第二行 Token 数。磁贴高度 56dp → 44dp,卡片整体更紧凑。
真机验证(V2172A / Android 15):余额 359.01 位于 y958-1105,面板管理 y956-1037 与之同高;
磁贴两行 y1185-1243 / y1255-1339;点「面板管理」正常打开弹窗(弹窗内标题仍只有一个)。
compileDebugKotlin 与 lintDebug 均通过。
|
2026-09-12 10:18:19 +08:00 |
|
|
|
56f85d296c
|
feat(sub2api): 重做首页卡片布局——余额主视觉 + 今日/近7天等宽磁贴
原布局把余额与周期数据塞在同一行,窄屏(360dp)会换行、数字长短不一还容易错位,
整体观感松散。改为上下分区:
- 余额区:「余额」小标签 + 大号数字 + 单位,单行左对齐,作为卡片主视觉。
- 用量区:「今日 / 近7天」两块等宽磁贴(14dp 圆角 + 半透明底色),
每块固定三行(周期名 / Token 数 / 请求次数),内容垂直居中,
两块结构与内边距一致,数值长短不同也不会错位。
- 卡片正面只保留 余额、Token 用量、请求次数三项;不再显示花费与「本月已用」
(花费与更长周期明细仍可在详情页时间窗口查看)。
副标题改为登录方式:
- Sub2API 卡片副标题由「自托管面板 · 用户级 sk- Key 余额」改为「邮箱登录 / API 登录」,
依据 Repository 新写入的 extras["auth_mode"](panel / apikey)判定,无数据时回退原描述。
真机验证(V2172A / Android 15,360dp 宽):
余额 y887-1105 与两块磁贴 y1185-1405 分区清晰、不换行;磁贴在 x176 与 x788 等宽对齐;
副标题显示「邮箱登录」。compileDebugKotlin 与 lintDebug 均通过。
|
2026-09-12 10:14:15 +08:00 |
|
|
|
ce8a656448
|
fix(sub2api): 刷新按钮与「面板管理」标题同排
- 弹窗标题槽改为 Row:左侧标题 + 右侧刷新图标按钮,刷新与标题处于同一水平线,
且随标题固定不随内容滚动(内容区仍可滚动)。
- showHeader=false 时组件不再渲染内部标题/刷新行,避免多出一条空行把刷新挤到标题下面。
真机验证(V2172A / Android 15):标题 y284..413 与刷新 y300..396 同行居中;
点刷新弹窗保持打开且列表重载;滚动后标题+刷新固定于顶部。
compileDebugKotlin 与 lintDebug 均通过。
|
2026-09-12 09:47:42 +08:00 |
|