tbphp
|
5f11d8bdd4
|
test(cpa): 修复替换连接测试的时序误报 (#644)
|
2026-09-13 17:41:11 +08:00 |
|
tbphp
|
d01656a1d8
|
perf(ci): 迁移自托管运行器并优化并行验收 (#634)
* perf(ci): 切换现有自托管运行器并复用本机缓存
* perf(ci): 将主要 Linux 任务迁至 Mac ARM64 运行器
* fix(ci): 使用动态端口执行 Windows 安装验收
* test(cpa): 等待异步处理完成后校验 WebSocket 行为
* perf(ci): 并行数据库测试并隔离容器验收端口
* ci: 为数据库合同测试启用内存盘
* test(cpa): 固定断连日志脱敏测试的执行顺序
* fix(ci): 修复自托管验收中断和架构兼容问题
* fix(ci): 原子准备 Windows 安装验收配置
|
2026-09-13 08:31:56 +08:00 |
|
tbphp
|
9d38793dd0
|
fix(affinity): 统一缓存标识亲和并补齐 Codex 缓存分组 (#635)
|
2026-09-13 01:25:45 +08:00 |
|
tbphp
|
5b03d29db9
|
fix(codex): 补齐 WebSocket 额度观测并约束来源匹配 (#632)
* fix(codex): 补齐 WebSocket 被动额度更新
* test(codex): 补充 WS 额度窗口完整性断言
* fix(codex): 保留握手与事件额度的独立观测时间
|
2026-09-12 19:21:35 +08:00 |
|
tbphp
|
b64a389823
|
feat(ultrafast): 支持请求层级转发与独立计价 (#624)
* fix(codex): 统一快速模式出站参数为 fast
* feat(ultrafast): 支持请求层级转发与独立计价
|
2026-09-11 13:10:29 +08:00 |
|
tbphp
|
abc6483d0e
|
fix(codex): 升级 CPA 并固定上游版本声明 (#619)
|
2026-09-11 00:08:04 +08:00 |
|
tbphp
|
f091528bdb
|
feat(gateway): 接入原生 Responses WebSocket 与逐轮治理 (#616)
* feat(gateway): 接入原生 Responses WebSocket 与逐轮治理
* feat(gateway): 增加 WS 分层开关并修复连接治理
* fix(gateway): 关闭停用或删除分组的 WS 连接
|
2026-09-10 21:18:41 +08:00 |
|
tbphp
|
0c9d188892
|
fix(codex): 修正请求身份头覆盖与会话兼容 (#617)
* fix(codex): 修正请求身份头覆盖与会话兼容
* fix(codex): 保留显式空值身份请求头
|
2026-09-10 20:04:23 +08:00 |
|
tbphp
|
7d80a981d1
|
feat(codex): 添加独立上游 WebSocket Session 封装 (#612)
* feat(codex): 添加独立上游 WebSocket 会话封装
* fix(codex): 放开 SOCKS5 代理并修正超时分类
* fix(codex): 修正 WS 终态并脱敏断连日志
* fix(codex): 保留失败终态的上游错误码
* fix(codex): 提前注册 WebSocket 日志脱敏
|
2026-09-10 14:18:36 +08:00 |
|
tbphp
|
d4699dd2b1
|
feat(health): 支持凭据按模型冷却与统一恢复 (#599)
* feat(health): 支持凭据按模型冷却与统一恢复
* fix(health): 修复模型冷却的错误契约与恢复边界
* fix(web): 修复模型冷却展示与重置反馈
* fix(web): 保持分组健康与恢复反馈一致
* fix(health): 修复停用分组的模型冷却身份展示
|
2026-09-09 08:05:43 +08:00 |
|
tbphp
|
96d3e0d5c7
|
feat(subscription): 支持多格式订阅凭据导入 (#596)
* feat(subscription): 支持多格式订阅凭据导入
* fix(subscription): 修复批量导入请求边界
* fix(subscription): 保留批量导入超时语义
|
2026-09-08 20:05:22 +08:00 |
|
 Oandtbphp
|
6da82242d8
|
feat(subscription): support custom upstream URLs (#579)
* feat(codex): support custom base URL
* fix(codex): require HTTPS for custom base URL
* docs: document changed subscription functions
* fix(groups): 展示并区分详情中的默认与自定义地址
* fix(groups): 统一上游地址配置交互与图标位置
* fix(subscription): 绑定额度重置操作的上游地址
* fix(gateway): 隔离旧上游请求的健康状态更新
---------
Co-authored-by: tbphp <tangb7420@gmail.com>
|
2026-09-08 19:44:39 +08:00 |
|
tbphp
|
1c81b69223
|
chore(deps): 更新 CPA 至 v7.2.151 (#569)
|
2026-09-05 09:04:22 +08:00 |
|
tbphp
|
30a1bac965
|
fix(release): 修正 CPA 版本文档漂移与数据库合同测试遗漏 (#514)
* fix(release): 修正 CPA 版本文档漂移与数据库合同测试遗漏
THIRD_PARTY_NOTICES.md 与 cpaembedded/README.md 的 CLIProxyAPI 版本号
未随 #507 依赖升级同步,仍是 v7.2.143(实际 v7.2.144)。
ci.yml 与 release.yml 的数据库合同测试 -run 正则手工维护测试名单,
已产生漂移:ci.yml 含一个不存在的测试名(静默不匹配),两者都缺失
TestExternalDatabaseMySQLRecoversObservationFreshnessCheckDrop,
release.yml 还缺失 TestExternalDatabaseAccessKeyCostLimitPeriodPermutation。
改为按前缀匹配同目录下全部 TestExternal* 测试,避免后续再次漂移。
补上 ja-JP/settings.ts 缺失的 runtime.pendingRestoreSource key,
该 key 在 4 个组件共 8 处引用,此前日文界面回退显示英文文案。
* fix(storage): 修正 0003 迁移恢复对 MySQL 中间态的误判
启用数据库合同测试的完整名单后,
TestExternalDatabaseMySQLRecoversObservationFreshnessCheckDrop
第一次在真实 MySQL 上执行即失败:ValidateCurrent0001 仅凭
fresh_until_ms 列是否存在判断 0003 是否已完成,但 MySQL 上
0003 的 DROP CHECK 与 DropColumn 是两条独立、非事务性 DDL,
崩溃可能停在"约束已删、列还在"的中间态。此时 ValidateCurrent0001
误判为"0003 未开始",转而用要求约束存在的冻结校验器 Validate0001,
导致误报 chk_credential_observation_fresh_until 缺失。
改为以约束是否存在作为判断信号,与同文件 ValidateRecoverable0003
已经正确处理该中间态的逻辑保持一致。已用一次性 MySQL 8.4 与
PostgreSQL 18 容器验证三态恢复路径与完整数据库合同测试套件。
|
2026-08-31 21:10:42 +08:00 |
|
tbphp
|
70fdd862f2
|
fix(security): 收紧 OAuth 与数值边界 (#513)
|
2026-08-31 18:51:59 +08:00 |
|
 dependabot[bot]andtbphp
|
d4b56cbb61
|
chore(deps): bump the cpaembedded-minor-and-patch group across 1 directory with 3 updates (#507)
* chore(deps): bump the cpaembedded-minor-and-patch group across 1 directory with 3 updates
Bumps the cpaembedded-minor-and-patch group with 3 updates in the /third_party/cpaembedded directory: [github.com/andybalholm/brotli](https://github.com/andybalholm/brotli), [github.com/router-for-me/CLIProxyAPI/v7](https://github.com/router-for-me/CLIProxyAPI) and [github.com/tidwall/gjson](https://github.com/tidwall/gjson).
Updates `github.com/andybalholm/brotli` from 1.0.6 to 1.2.3
- [Commits](https://github.com/andybalholm/brotli/compare/v1.0.6...v1.2.3)
Updates `github.com/router-for-me/CLIProxyAPI/v7` from 7.2.143 to 7.2.144
- [Release notes](https://github.com/router-for-me/CLIProxyAPI/releases)
- [Commits](https://github.com/router-for-me/CLIProxyAPI/compare/v7.2.143...v7.2.144)
Updates `github.com/tidwall/gjson` from 1.18.0 to 1.19.0
- [Commits](https://github.com/tidwall/gjson/compare/v1.18.0...v1.19.0)
---
updated-dependencies:
- dependency-name: github.com/andybalholm/brotli
dependency-version: 1.2.3
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: cpaembedded-minor-and-patch
- dependency-name: github.com/router-for-me/CLIProxyAPI/v7
dependency-version: 7.2.144
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: cpaembedded-minor-and-patch
- dependency-name: github.com/tidwall/gjson
dependency-version: 1.19.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: cpaembedded-minor-and-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
* chore(deps): 同步根模块 CPA 依赖图
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: tbphp <tangb7420@gmail.com>
|
2026-08-31 16:37:31 +08:00 |
|
tbphp
|
922c6e055c
|
fix(subscription): 避免临时刷新失败锁死凭据 (#499)
|
2026-08-30 18:20:28 +08:00 |
|
tbphp
|
1a6e454475
|
feat(subscription): 接入 Codex/Claude 被动额度信号观察 (#487)
* feat(subscription): 接入 Codex/Claude 被动额度信号观察
从 Codex/Claude 订阅请求的响应 Header 中安全采集额度信号,归一化为与主动观察一致的账号级窗口,
经内存 pending map 合并后由 RequestLog worker 复用现有 quotaWake 异步落库,
自动刷新账号卡的额度窗口与同步时间;额度仅用于管理面展示,不参与路由、调度或健康判定。
同时修复 recordCredentialObservationFailure / invalidateCredentialObservationAfterReset
整行 Save 覆盖并发写入 snapshot_json 的既有问题,改为按列更新。
* fix(subscription): 修正被动额度合并的两处数据错误
丢弃比已存记录更旧的被动采样:手动刷新在 pending 落库前完成时,
旧采样会让 observed_at_ms 倒退并用旧额度覆盖新值;updated_at_ms
条件更新只能拦截读取之后的写入,拦不住这种时间倒退。
MergeQuotaWindow 不再用空字符串覆盖 Label/LabelKey/Scope/Unit:
这些是快照必填字段,被清空后 ApplyQuotaWindows 会跳过该窗口并
清除管理面低额度提示。
* fix(subscription): 落库确认后清空 pending 窗口缓存
ack 此前只清 dirty 标记,不清 entry.windows;下一次响应即使只带
部分字段,也会把已经落库的陈旧字段当作当前观察重新合并进去,
可能覆盖同一时间发生的主动刷新写入的更新值。
现在版本匹配时一并清空窗口缓存,配合已有的 MergeQuotaWindow
字段级保护,落空字段的响应不会再用零值或陈旧值覆盖数据库现值。
* fix(subscription): 通用化 Codex 被动额度解析并修正三处数据错误
Codex 被动解析改为从 Header 自动发现限额命名空间,不再写死
primary/secondary 两个账号级窗口。带 Limit-Name 的附加限额
(如 GPT 5.3 Codex Spark)现在也能被动更新,且窗口 ID 与主动
JSON 路径一致;将来新增的限额类型无需改代码即可识别。缺少
Limit-Name 的命名空间跳过,因为无法生成可匹配的稳定 ID。
同时修正:
- 越界 used-percent、非正或溢出的 reset/window 一律丢弃,
不再用 0 或回绕值覆盖快照中的有效字段;
- 被动不再输出 Label/LabelKey,避免只带使用率的响应把 7d 窗口
的标签改写成 Session,与 window_seconds 自相矛盾;
- 主动成功的 observed_at_ms/updated_at_ms 改用响应完成时间
(last_attempt_at_ms 仍为尝试开始时间),慢速手动刷新不再被
刷新期间捕获的被动样本反向覆盖,CAS token 也不再可能不变;
- 窗口值未变化但确实观察到时推进 observed_at_ms,低频账号不再
长期显示数小时前同步。
* refactor(subscription): pending 只保留最新一次响应,不再跨响应合并
pending 条目此前会把多次响应的窗口字段按 ID 合并,却只记录一个
观察时间。混在一起的字段因此可能带着较晚的时间戳落库,反过来
盖掉这期间提交的主动刷新结果。上一轮给 ack 加清缓存只堵住了
"已落库后残留"这一半,尚未落库前合并的那一半仍然存在。
改为每次记录整体替换:一个 pending 条目只承载一次响应,窗口与
观察时间始终描述同一时刻,这类时序覆盖从根上不再可能,ack 也
不需要再清缓存。被丢弃的旧响应不构成数据丢失——快照中该窗口
保持原值,下一次带该窗口的响应会刷新它。
生产代码净减 19 行。
* fix(subscription): 用 observation_version 做被动写入的并发令牌
时间戳不能充当 CAS 令牌:两次写入可能落在同一毫秒,updated_at_ms
数值不变会让已过期的被动写入通过条件更新,盖掉刚提交的主动刷新。
改用 observation_version(主动成功本就递增),并保留 updated_at_ms
比对以覆盖主动失败与重置这两条只改元数据、不动版本的路径。
同时收敛三处局部合同:
- 绝对 reset 无效时继续尝试同一响应中的相对 reset,不再因一个坏
Header 丢掉可用值;
- 被动输出不再携带 Scope / Unit / IsPrimary(此前只清了 Label),
贯彻「自动更新只改额度数值与状态」,Codex 与 Claude 两侧一致;
- pending 深拷贝窗口的指针字段,调用方后续修改不会改变待落库内容。
* fix(subscription): ACK 时移除 pending 条目并让同毫秒判给主动结果
ACK 此前只清 dirty 标记,条目连同克隆的窗口一直留在 map 里。凭据
删除后也不会释放,长期运行且凭据有增删的实例会持续增长。改为版本
匹配时直接移除条目——凭据删除本就走「registry 查不到 → ACK」这条
路径,因此不需要再给删除流程挂额外的清理钩子。
被动样本与行内 observed_at_ms 相同时改为丢弃(原为严格小于才丢)。
被动 Header 先捕获、主动刷新稍后完成,两者截断到同一毫秒时,旧的
被动结果会盖掉权威的主动结果,且此时 CAS 不冲突。相同毫秒判给主动
结果即可,不引入更高精度时间戳。该判断收紧后,落库处基于
alreadyObservedAt 的分支成为死代码,一并删除。
顺带移除无生产调用方的 AckPassiveQuotaObservation 导出方法。
|
2026-08-28 18:26:00 +08:00 |
|
tbphp
|
b1a7f373fc
|
fix: 接入首个流错误安全切换 (#486)
* fix(gateway): 接入首个流错误安全切换
* fix(gateway): 保留显式重放安全状态
|
2026-08-28 08:15:13 +08:00 |
|
tbphp
|
d4bbb9193a
|
feat: 升级 Go 与 SDK 版本 (#485)
* feat(gateway): 升级 SDK 并封口兼容合同
* fix: 修正升级后的格式与模型过滤
* fix(ci): 更新 Go 漏洞扫描器
* fix(gateway): 拒绝非标准服务层级字段
|
2026-08-27 22:48:16 +08:00 |
|
tbphp
|
6a71f52f46
|
fix(subscription): 合并 CPA 模型目录到订阅发现 (#482)
|
2026-08-27 16:34:09 +08:00 |
|
tbphp
|
e9e88dce99
|
feat(images): 接入 OpenAI 图片生成与编辑 (#476)
* feat(images): 接入 OpenAI 图片生成与编辑
* fix(images): 补齐响应容量与边界处理
* fix(images): 修正协议观测与响应上限覆盖
* fix(stream): 保证取消优先于流关闭
* fix(images): 修正空 SSE 错误对象判定
* fix(images): 避免媒体数据触发凭据误判
* fix(images): 阻止流式响应泄漏凭据
* fix(images): 校验完整流事件后再转发
* fix(images): 修正响应模型观测
|
2026-08-27 15:11:52 +08:00 |
|
tbphp
|
4f9eba5802
|
feat(proxy): 完成数据面代理与渠道约束 (#459)
* feat(proxy): 实现第一阶段数据面代理
* feat(proxy): 收敛渠道与代理协议支持
* fix(proxy): 修复环境检测与迁移验证
* fix(proxy): 回收旧代理运行时并校验地址
* fix(proxy): 补齐创建链路与前端校验
* fix(proxy): 收口订阅代理与迁移兼容
* fix(proxy): 修复环境代理与运行时回收
* fix(proxy): 为系统外部请求应用全局代理
* docs(config): 精简环境配置说明
* feat(proxy): 重构代理设置的前端交互与样式
设置页与分组设置页:
- 代理设置接入页面统一的草稿态与保存栏,不再独立即时提交
- 计入页面 dirty/valid,参与未保存离开拦截与并发冲突推迟
- 新增 ProxyOverrideRow,用分段控件替代原独立编辑弹层
账号卡片与密钥行:
- ProxyConfigEditor 新增 card 外观:标题在白底面板外,与相邻小节同级
- 修掉按视口宽度判断断点的问题,窄容器内不再挤压错乱
- 编辑态下拉固定宽度,不随所选模式伸缩;整体收进两行
- 新增 ProxyScopeIndicator,凭据配置了独立代理时给出标识与悬停提示
密钥行交互:
- 操作列收成「更多操作」菜单与展开图标,与账号卡片同构
- 折叠区分为权重、出站代理、运行诊断三个带标题小节,设置与诊断不再混放
- 权重编辑从弹层迁入折叠区,权重列的值可点击直达
- 释放的列宽还给凭据、权重与最近调用列
文案精简为继承、直连、自定义,并清理两处无引用的死键
* refactor(proxy): 统一代理设置的覆盖交互并消除样式重复
设置页与分组设置页:
- 代理行改用 RuntimeOverrideRow,与超时等设置项共用同一组件
- inherit 映射为“未覆盖”,direct/custom 映射为“显式覆盖”,因此补齐了
覆盖/恢复默认按钮、覆盖状态徽章、当前有效值与待恢复默认态
- 分段控件只保留直连与自定义,继承由外层覆盖开关表达
- 删除自造的 ProxyOverrideRow,新增只含编辑控件的 ProxyOverrideControl
已保存的自定义地址:
- 输入框不做回填,统一由 placeholder 展示已存地址
- 同模式下留空或与已存地址逐字相同均视为未改动,顺带挡住掩码被当作
新密码存回;无改动时保存按钮禁用
- 重新开启覆盖时回到基线已存的覆盖模式,使恢复默认可原路撤销
代码质量:
- 面板外壳(标题 + 白底面板 + 标签/值/编辑图标/操作)抽为全局
.setting-panel,代理、权重、诊断三处共用,不再各写一份
- 删除 ProxyConfigEditor 已无调用方的 row 外观及随之失效的 props、
徽章分支与始终隐藏的文案
- 占位地址推导与覆盖开关规则收敛为 proxy.ts 中的共享函数
- 移除代理输入提示文案及其失去引用的 i18n 键
密钥行折叠区诊断值字号对齐上方面板。重构以构建产物 CSS 逐条比对验证,
差异均为已论证的等价改写。
* fix(proxy): 修复代理传输与校验边界
|
2026-08-24 11:11:22 +08:00 |
|
tbphp
|
a117249b46
|
fix(subscription): 修复 Grok 请求与额度展示
|
2026-08-19 09:02:14 +08:00 |
|
tbphp
|
25a3612c3c
|
fix(subscription): 补全 Grok 套餐与额度观察
|
2026-08-18 23:02:58 +08:00 |
|
tbphp
|
d1fd07ce3e
|
feat(subscription): 接入 xAI OAuth 订阅渠道
|
2026-08-18 21:22:13 +08:00 |
|
tbphp
|
8b4cd3dd3e
|
fix(subscription): 修复 Antigravity 连接与观察边界
|
2026-08-18 14:28:45 +08:00 |
|
tbphp
|
af7a7fed02
|
fix(subscription): 兼容CPA认证文件元数据
|
2026-08-18 12:42:15 +08:00 |
|
tbphp
|
4ed7e007d3
|
fix(subscription): 完善订阅发现与额度边界
|
2026-08-18 10:07:39 +08:00 |
|
tbphp
|
c9bb0d29cf
|
fix(antigravity): 补齐订阅额度窗口观察
|
2026-08-18 09:22:07 +08:00 |
|
tbphp
|
c3b132daf3
|
fix(antigravity): 完善订阅渠道故障转移与导入
|
2026-08-18 08:08:44 +08:00 |
|
tbphp
|
ef0459c347
|
feat(subscription): 接入 Antigravity 订阅渠道
|
2026-08-17 20:25:57 +08:00 |
|
tbphp
|
fd7b87827a
|
fix(subscription): 收口观察与本地计数边界
|
2026-08-17 13:25:01 +08:00 |
|
tbphp
|
86dc86985e
|
fix(subscription): 修复账户观察软失败与授权重试
|
2026-08-17 12:07:47 +08:00 |
|
tbphp
|
fb63141d9a
|
feat(codex): 接入订阅 Token 计数
|
2026-08-17 11:39:46 +08:00 |
|
tbphp
|
1c00680484
|
fix(subscription): 修复观察失败与401刷新
|
2026-08-17 11:13:04 +08:00 |
|
tbphp
|
3333f49f36
|
fix(claude): 补全订阅渠道能力
|
2026-08-17 09:38:45 +08:00 |
|
tbphp
|
a36cf1be53
|
feat(claude): 补齐订阅渠道能力
|
2026-08-16 18:52:45 +08:00 |
|
tbphp
|
f5fe38ac4d
|
feat(claude): 接入 OAuth 订阅渠道
|
2026-08-16 17:21:50 +08:00 |
|
tbphp
|
25424d61c4
|
feat(codex): 完善订阅额度与调度体验
|
2026-08-14 23:16:21 +08:00 |
|
tbphp
|
2c4e4e1652
|
fix(codex): 完善订阅协议与认证流程
|
2026-08-14 14:45:51 +08:00 |
|
tbphp
|
d623459b83
|
feat(codex): 增加订阅渠道与认证流程
|
2026-08-14 12:36:49 +08:00 |
|
tbphp
|
21082ac739
|
feat(subscription): 接入 Codex 订阅账号
|
2026-08-14 08:41:02 +08:00 |
|