Skip to content

v0.1.11

Choose a tag to compare

@github-actions github-actions released this 23 Oct 12:41
· 107 commits to main since this release

通过 CPA 插件商店安装(推荐)

本插件已收录进 CPA 官方插件源,无需额外配置三方源。
在管理面板的插件商店里直接搜 FreeTier 2API 一键安装即可。

手动安装

下载对应平台的 freetier2api_<版本>_<goos>_<goarch>.zip,解压后把其中的
freetier2api 动态库放进 CPA 的 plugins/ 目录。
归档里已经用的是宿主要求的 freetier2api{ext} 文件名,解压后无需改名。

平台 下载归档
Linux x86_64 freetier2api_<版本>_linux_amd64.zip
Linux arm64 freetier2api_<版本>_linux_arm64.zip
macOS Apple Silicon freetier2api_<版本>_darwin_arm64.zip
macOS Intel freetier2api_<版本>_darwin_amd64.zip
Windows x64 freetier2api_<版本>_windows_amd64.zip

checksums.txt 可用于核对归档完整性;配置与账号导入见仓库 README。

本版要点

fix: 整修合并 #14/#15 后的删除、额度与管理接口,修复 Qoder 余额显示 0/0

两个社区 PR(#14 相对路径删除、#15 管理接口与上游响应加固)已合入,但对
合并结果做完整审查后,发现若干处在既有结构上叠补丁而不是修到根因,本次
统一收敛。另修复 #14 引入的 Qoder 剩余/总额恒为 0/0 的回归。

额度折算(用户可见回归)

  • #14 的 presence 标志把「第一个出现的额度族」永久锁定。Qoder 同时输出
    user_quota_(套餐)与 addon_quota_(拓展包),Free 计划的套餐是合法的
    {used:0,total:0,remaining:0},于是拓展包额度永远覆盖不上,页面恒为 0/0。
    改为按族分组、选「真有容量」的族;所有族都无容量时才回落到第一族
    (此时 0/0 是真实语义)。「只报 used」的反推保留,显式 total=0 不反推。
  • 三份必须手工同步的键白名单(remaining/total/used 各一个 switch)合并成
    一张 quotaKeyRoles 表:族与角色收敛成一处知识,避免同类静默 0/0。
  • 新增回归用例:Qoder Free+拓展包让位、全 0/0 保留第一族、显式 total=0
    不反推。

凭证路径与删除(#14 的根因修复)

  • 相对路径归一化上移到宿主边界 hostbridge.ResolveAuthPath,在
    ListAuths / AuthJSONAndPath 出口统一处理;删除、stat 取修改时间、读文件
    兜底、续期写回四条路径共用同一份绝对路径。删除入口不再各自换算。
  • 删除校验收敛为 safeAuthFileForDelete:归属校验 → 运行时凭证 → 必须绝对
    路径 → 必须存在 → .json / 符号链接 / 目录 → 目标文件身份比对。
  • 修掉 #14 的两个行为问题:
    • 文件不存在时原先 Lstat 返回 nil、Remove 命中 IsNotExist 也返回 nil,
      页面会显示「已删除」而账号其实还在;现在如实报错。
    • 路径基准不一致时同名文件可能属于另一个账号;删除前比对目标文件的
      vendor 与 UID(只比身份字段,不涉及 token)。
  • deleteAuthFile 精简为「取凭证 → 校验 → 删除」。

管理接口请求体

  • 泛型 decodeRequest[T] / decodeRequestInto 取代逐 handler 的解码样板,
    覆盖 11 个管理入口;models 两处重复的错误文案统一。
  • /tasks/run 原先在 tasks 包内用 _ = json.Unmarshal 吞掉畸形 JSON,
    #15 声称覆盖任务入口但实际漏掉;解析上移到 admin,tasks 只接收
    QueueRequest,缺省值由 DefaultQueueRequest 提供。
  • login/callback 保留 {ok,status,message} 契约:页面按 AuthLoginStatus
    读字段,#15 改成 {ok,error} 会丢掉「请刷新页面后重试」这句提示。

供应商

  • WorkBuddy 领奖:#15 修好了解析但调用方仍吞错并返回 (0,0),用户看到的
    仍是「任务已达标」。claimGrowthReward 改为返回 error 并上抛到
    AutoTaskResult;parseClaimResult 改用指针字段一次解码(原实现解两遍)。
  • Qoder 短响应上限:三个重复的 1<<20 合并为 shortResponseMaxBytes,并把
    仍在无界读的 FetchUserInfoWithToken 纳入;签到读失败不再静默当成空正文。

宿主流读取

  • 空分片退避去掉 time.NewTimer 与 if !timer.Stop() { <-timer.C } 排空写法
    (Go 1.23+ 的 unbuffered timer 下会阻塞),改用仓库既有的 time.After;
    保留 32 次上限与指数退避。

测试与守卫

  • 删除集成用例改用 t.TempDir 构造 core/oauth 平级布局,真正传
    ../oauth/<name>.json 形态;新增绝对路径(标准 CPI 部署)与文件不存在
    两条用例。
  • 合并重复的 managementCall / managementCallWithBody helper。
  • 架构守卫补反向检查:layerRules 里的非 vendor 包必须同时出现在
    internalPackages。

验证(容器 golang:1.24,与 CI 一致)

gofmt / go vet ./... 通过
go test ./... -count=1 全部包通过
go test -race <core,state,auth,tasks,admin> 通过
go test -tags live ./tests/live -run '^$' 通过
go build -buildmode=c-shared(linux/amd64) 通过

版本保持 0.1.11:本次修复与 Qoder 设备身份改动一起发布。

Co-Authored-By: Claude Code noreply@anthropic.com

What's Changed

  • fix: 宿主返回相对凭证路径时账号删除失效(EasyCLIProxyAPI 默认 ../oauth) by @ArmedHelicopter in #14
  • fix: 加固管理请求与上游响应处理(stacked on #14) by @ArmedHelicopter in #15

New Contributors

Full Changelog: v0.1.10...v0.1.11