Wesley Liddick
34c8dbd604
Merge pull request #4618 from superman2003/fix/system-update-detach-request-ctx
...
fix(update): detach in-place update from the HTTP request lifetime
2026-07-20 10:26:47 +08:00
Wesley Liddick
e311d368d3
Merge pull request #4611 from superman2003/fix/codex-models-manifest-401-unschedulable
...
fix(openai): mark OAuth accounts unschedulable on Codex models manifest 401
2026-07-20 10:26:39 +08:00
Wesley Liddick
f133fde643
Merge pull request #4602 from jianjianai/new/perf-responses-image-intent
...
perf(openai): 复用 Responses 生图意图判定
2026-07-20 10:26:31 +08:00
Wesley Liddick
c0b8f6b0a8
Merge pull request #4601 from jianjianai/new/perf-responses-sse-type
...
perf(openai): 复用 Responses SSE 事件类型解析
2026-07-20 10:26:23 +08:00
Wesley Liddick
9ccc9077cc
Merge pull request #4581 from wucm667/feat/issue-4375-github-release-token
...
feat: support GitHub token for update checks
2026-07-20 10:26:15 +08:00
Wesley Liddick
f5e484aa70
Merge pull request #4625 from wucm667/fix/issue-4624-sticky-force-cache-billing
...
fix(handler): avoid cache billing on same-account retry
2026-07-20 10:24:38 +08:00
Wesley Liddick
aa615c2677
Merge pull request #4620 from cugxuan/codex/show-subscription-expiry-minute
...
feat(subscription): show expiry times to minute
2026-07-20 10:24:30 +08:00
Wesley Liddick
032001598a
Merge pull request #4617 from wucm667/fix/issue-4610-anthropic-json-content-type
...
fix(openai): correct buffered messages content type
2026-07-20 10:24:22 +08:00
Wesley Liddick
6def36a171
Merge pull request #4614 from cugxuan/codex/fix-subscription-expiry-days
...
fix(subscription): round remaining days up
2026-07-20 10:24:14 +08:00
Wesley Liddick
d2ef0cb151
Merge pull request #4587 from coo1white/fix-compose-redis-dev-local
...
fix(deploy): make the redis command flags take effect in dev and local compose
2026-07-20 10:24:07 +08:00
Wesley Liddick
25bd4956f0
Merge pull request #4588 from coo1white/wire-postgres-tuning-vars
...
fix(deploy): pass the documented postgres tuning values to postgres
2026-07-20 10:23:59 +08:00
shaw
2518691dbc
fix(config): 为 trusted_proxies 与 forwarded_client_ip_headers 注册 BindEnv,修复 env 可达性守卫测试
...
#4593 引入的 TestConfigKeysAreEnvReachable 与 #4604 新增的两个配置键语义相撞:
两键在 setDefaults 中无注册,守卫测试判定其环境变量不可达。
不能按守卫注释直接 SetDefault:viper 的 IsSet 会连同 defaults 一起上报,
任何已注册默认值都会让 load() 中 trustedProxiesConfigured 的显式配置探测
永远为真,摧毁 #4600 的 absent/empty 区分。改用 BindEnv 注册——绑定键同样
进入 AllKeys()(守卫测试与 Unmarshal 均可见),而变量缺席时不影响 IsSet。
两个环境变量本就由 load() 中 os.LookupEnv 手工解析,行为不变。
2026-07-20 09:41:02 +08:00
Wesley Liddick
bfabfe60c8
Merge pull request #4593 from StarryKira/fix/image-storage-env-unreachable
...
fix: 异步生图开关配了却不生效(环境变量被静默丢弃 + 迁移到后台开关)
2026-07-20 09:20:15 +08:00
Wesley Liddick
f3312cf7d9
Merge pull request #4604 from BenjaminAaron196/codex/fix-issue-4600-client-ip
...
fix: 修复客户端 IP 回退并支持自定义 CDN 请求头
2026-07-20 09:20:02 +08:00
shaw
30202f8266
chore: update sponsors
2026-07-20 08:55:15 +08:00
wucm667
a2acbf553b
fix(handler): avoid cache billing on same-account retry
2026-07-20 02:20:58 +08:00
Jlypx and Sisyphus
dd0cbe91c9
fix: 避免复制客户端 IP 原子状态
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:22:45 +08:00
Jlypx and Sisyphus
0cc382e331
docs: 补充客户端 IP 请求头配置说明
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:10:41 +08:00
Jlypx and Sisyphus
6becd11e39
docs: 更新客户端 IP 边缘安全配置
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:10:32 +08:00
Jlypx and Sisyphus
80dd2929a3
docs: 本地化客户端 IP 请求头设置
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:10:18 +08:00
Jlypx and Sisyphus
4990ca0b2c
feat: 添加客户端 IP 请求头设置界面
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:10:05 +08:00
Jlypx and Sisyphus
344f303919
feat: 扩展前端客户端 IP 设置类型
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:09:57 +08:00
Jlypx and Sisyphus
ff5b0e6254
test: 更新客户端 IP 设置响应契约
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:09:47 +08:00
Jlypx and Sisyphus
fedeba2568
feat: 审计客户端 IP 请求头变更
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:09:37 +08:00
Jlypx and Sisyphus
3c86e249f4
feat: 接入客户端 IP 请求头管理接口
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:09:21 +08:00
Jlypx and Sisyphus
f72958d530
feat: 持久化客户端 IP 请求头设置
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:09:11 +08:00
Jlypx and Sisyphus
8b8b6b3132
feat: 定义客户端 IP 请求头系统设置
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:09:00 +08:00
Jlypx and Sisyphus
9bc7d10c08
fix: 快照自定义客户端 IP 请求头
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:08:48 +08:00
Jlypx and Sisyphus
496005d688
fix: 按自定义请求头解析客户端 IP
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:08:36 +08:00
Jlypx and Sisyphus
041db5d824
feat: 支持自定义客户端 IP 请求头配置
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-20 00:08:26 +08:00
cugxuan
3379603022
feat(subscription): show expiry times to minute
2026-07-19 22:43:35 +08:00
superman2003
35b5edb24c
fix(update): detach in-place update from the HTTP request lifetime
...
The in-place update ran entirely inside c.Request.Context(). Browsers and
reverse proxies commonly abort long-idle requests (axios global timeout
30s, nginx proxy_read_timeout 60s by default), which canceled the request
context mid-download and killed every slow update with
'download failed: context canceled' while the version stayed unchanged.
Users behind slow GitHub links saw the update button fail at a wall-clock
ceiling (~60s) on every attempt (#4504 ).
- Run PerformUpdate and RollbackToVersion on a context detached from the
request (context.WithoutCancel) and bounded by a 15-minute deadline so
the 10-minute GitHub download client owns its own timeout. A client
disconnect no longer aborts the binary swap; retries then hit the
system operation lock or report 'Already up to date'.
- Raise the frontend timeout for the update/rollback calls from the
global 30s axios default to 15 minutes so the browser can actually
wait for the result.
Fixes #4504
2026-07-19 22:40:44 +08:00
wucm667
01062c3244
fix(openai): correct buffered messages content type
2026-07-19 22:28:49 +08:00
Jlypx and Sisyphus
f69042ca6e
docs: 更新客户端 IP 配置索引
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:42:54 +08:00
Jlypx and Sisyphus
41b58b640a
docs: 更新可信代理部署说明
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:42:33 +08:00
Jlypx and Sisyphus
5da3325a30
feat: 在安全设置中配置客户端 IP 模式
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:42:12 +08:00
Jlypx and Sisyphus
93717394b2
fix: 迁移客户端 IP 兼容开关
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:41:45 +08:00
Jlypx and Sisyphus
6aa6b3a968
fix: 将客户端 IP 模式注入请求上下文
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:41:12 +08:00
Jlypx and Sisyphus
39107ca457
fix: 安全初始化 Gin 可信代理
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:40:32 +08:00
Jlypx and Sisyphus
6e2ba0e4cd
fix: 统一请求级客户端 IP 模式
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:39:49 +08:00
Jlypx and Sisyphus
8a147fcc51
fix: 解析显式可信代理配置
...
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent )
Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai >
2026-07-19 21:39:24 +08:00
cugxuan
d0fa8c63f1
fix(subscription): round remaining days up
2026-07-19 21:37:26 +08:00
superman2003 and Cursor
3ed2873f14
fix(openai): mark OAuth accounts unschedulable on Codex models manifest 401
...
The Codex models manifest path returned upstream 401s straight to the
client without feeding them into the account state machinery. A revoked
or invalidated OAuth account therefore stayed active and schedulable,
kept being selected for subsequent /models requests, and produced
repeated 502s until an admin ran a manual connection test (#4544 ).
- Route ChatGPT-backend manifest 401s through the shared upstream-error
handling: token cache invalidation, temp-unschedulable cooldown for
refreshable OAuth accounts, permanent disable for
token_revoked/token_invalidated, plus the runtime scheduling block.
- Treat ChatGPT-backend manifest 401s as failover-eligible so the
current /models request can switch to a healthy account instead of
returning 502. Custom API key upstream 401s keep the existing
no-failover, no-disable behavior since their /models auth is not
authoritative for the account.
- Skip Agent Identity accounts: their 401s can be task-scoped and have
a dedicated recovery flow.
- Attach the selected account to the ops error-log context so /models
failures record the account_id.
Fixes #4544
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-07-19 21:13:27 +08:00
Jlypx
732aeef880
fix: 兼容反代和 Docker 客户端 IP 解析
2026-07-19 19:41:01 +08:00
jjaw
f7979ae8ff
优化 Responses SSE 事件类型解析
2026-07-19 18:50:33 +08:00
jjaw
8fd6f91b7e
优化 Responses 生图意图复用
2026-07-19 18:49:08 +08:00
haruka and Claude Opus 4.8
6102d64274
fix(wire): 补上 PromptAdminService 的绑定,恢复 wire 代码生成
...
ProviderSet 提供了 NewPromptAdminHandler,也绑定了 PromptEngine,却没有为
PromptAdminService 绑定实现,导致 go generate ./cmd/server 直接失败:
no provider found for securityaudit.PromptAdminService
needed by *securityaudit.PromptAdminHandler
*PromptService 本就实现了该接口的全部方法,wire_gen.go 也一直是手工维护到位的
(补上绑定后重新生成的结果与现有文件逐字节一致),只是生成这条路被堵死了,
后续任何依赖改动都无法再靠 go generate 同步。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHreE5pzCkSYz7J45fmd2Y
2026-07-19 01:03:41 -07:00
haruka and Claude Opus 4.8
0343dba916
feat(admin): 备份页新增异步生图对象存储配置卡片
...
对应后端 /admin/backups/image-storage。放在备份页而非系统设置页,是因为它与
数据库备份共用同一套 S3 客户端与凭证——用户的心智就是"在备份的 S3 上加个开关"。
- 默认勾选"复用备份 S3",此时隐藏端点/密钥字段,只留 bucket 与 prefix,
bucket 留空则沿用备份桶。
- 保存走 useStepUp,与备份 S3 配置的保存路径一致。
- 补中英文案。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHreE5pzCkSYz7J45fmd2Y
2026-07-19 00:56:33 -07:00
haruka and Claude Opus 4.8
b08cab91a9
feat(image-storage): 异步生图对象存储改为后台配置,保存即生效
...
此前开启异步生图必须改服务器上的 config.yaml 并重启容器(#4542),且若想
复用已配置的备份 S3,还得把同一套凭证再填一遍(#4458)。
- 新增 ImageStorageSettingService:配置存 settings 表,SecretAccessKey 经
SecretEncryptor 加密落库、读回脱敏、留空表示沿用旧值,与备份 S3 配置同一套做法。
- reuse_backup_s3(默认开)直接借用 backup_s3_config 的端点与密钥,只用自己的
bucket/prefix 区分对象,因此备份走 backups/、图片走 images/,且密钥不会在库里存两份。
- ImageTaskService 的启用状态改由 ImageStorageResolver 在运行时解析并缓存,
保存设置后 Invalidate 使下次请求重建客户端——不再需要重启。
- repository 侧由提供实例改为提供工厂,客户端才可能在运行期重建。
- 轮询接口的门控从 enabled() 放宽为 Pollable():关掉开关只拒绝新提交,
已受理的任务仍可取回结果,不再被中途吞掉。
- config.yaml 的 image_storage 保留为回落,后台从未保存过时沿用,
升级前已用配置文件开启的部署不受影响。
- 管理端 GET/PUT/POST /admin/backups/image-storage,PUT 与备份 S3 配置一样要求
step-up 2FA:改写存储目标同样能把生成内容导向外部账号。
注:go generate ./cmd/server 在当前 upstream 基线上即失败(securityaudit.
PromptAdminService 缺 provider),故 wire_gen.go 为手工同步。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01VHreE5pzCkSYz7J45fmd2Y
2026-07-19 00:56:21 -07:00
Nick and Claude Fable 5
340dc99e02
fix(deploy): pass the documented postgres tuning values to postgres
...
deploy/.env.example documents POSTGRES_MAX_CONNECTIONS,
POSTGRES_SHARED_BUFFERS, POSTGRES_EFFECTIVE_CACHE_SIZE and
POSTGRES_MAINTENANCE_WORK_MEM, with notes on how to size them — but no
compose file ever passes them to the postgres container. A user who sets
them in .env gets nothing, silently.
Wire them into the postgres command in deploy/docker-compose.yml. The
fallbacks are the postgres:18 stock defaults (100 / 128MB / 4GB / 64MB),
so a deploy that does not set the variables behaves exactly as before.
Checked with postgres:18-alpine: with the variables unset, SHOW gives
the stock values; with them set (1024 / 1GB / 6GB / 128MB), SHOW gives
the set values.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-19 12:17:31 +07:00