v1.0.46
新增
-
临时停用账号(issue #21):账号页每行新增「停用 / 启用」按钮。停用后该账号
不再被上游加载、不会被选中(复现某个号一直失败或在拖后腿时,先停用它比删掉更
合适 —— 删除会丢凭证、只能重新扫码,停用完全可逆)。实现说明:上游没有禁用/启用的 HTTP 接口(它内部有
Disable/ReviveDisabled,
但只被自身错误处理调用、未对外暴露),state.json又每 5 秒被上位机覆盖,改它
没有意义。所以走的是改文件名:上游用 globworkbuddy*.json收集账号,加
.disabled后缀后就不再匹配、随即从池里消失;启用就是改回原名,凭证一个字节
都不动。上游不监听文件变化,因此改名后会自动触发一次重载使其立即生效。界面区分三种「不可用」:面板停用显示灰字「已停用」(用户自己的选择,不是故障),
上游自动禁用仍是红字「已禁用」,账号文件真有问题才是「未加载」。之前若不加区分,
刚停用的账号会被报成「未加载 / 账号文件可能有问题」,把用户的主动操作说成故障。
修复
-
浏览器自动填充密码后登录必定失败(issue #22):登录页两个输入框是受控组件,
而浏览器自动填充直接改写 DOM 的 value、不派发input事件,于是 React state
始终是空串 —— 界面显示有密码、提交出去的却是
{"username":"","password":""},服务端只能回「用户名或密码错误」。用户会以为
自己记错了密码,反复重试直到触发登录失败锁定(连续 5 次锁 10 分钟)。改法:提交时从表单元素的实际值读取(
form.elements.namedItem),不再只依赖
state —— 手输、自动填充、密码管理器注入三种情况都覆盖。另外真读到空值时给一句
指向原因的提示(「若使用了浏览器自动填充,请手动重新输入」),而不是让它落到
后端报「密码错误」。已按报告者的取证方式复现并验证:修复前请求体是空串、修复后为
{"username":"admin","password":"lgpass"}且成功进入面板。
适配上游
-
prompt.mode新增append取值(上游ff64ecd/51bc469,其 issue #129):
上游把该枚举从两值扩成三值 ——passthrough(透传客户端 system,默认)/custom
(替换为网关提示词)/append(在开头连续的 system/developer 块之后插入网关
system,既有消息逐字不动)。我们的设置页有一份独立于上游的白名单校验,此前只认前两个,于是用户填上游
支持的新值会被面板拒掉(「上游支持、面板说不合法」)。这不是小事:那份校验若与
上游漂移,另一个方向更危险 —— 放行上游不认的值会写进一份让上游启动即失败的
配置(上游normalizePrompt对非法值是 fail fast),表现为「保存成功然后上游
挂了」,比当场报错难查得多。现在三值对齐,并加了断言把两边的取值集钉在一起。上游这次另外两处变化不受影响(已逐项核对):
config.json新增
cost_explore_interval、/status新增cost_explore/events_total/per_model
三个键(上游注释明确「零回归只增键」);internal/upstream/sse.go的多次改动都在
上游自己的 Aggregate(统计与 tool_calls 归并)里,不改变我们代理的 SSE 分帧。
上游核对(截至 5deb3c6,32 个提交)
除上面那项外逐项核对完毕,其余无需适配:
Status结构体、端点注册无变化;任务日志文案无变化(tasklog不受影响)。config.json仅新增一个键(cost_explore_interval);/status仅新增三个
键 —— 均为只增不改,我们按需读取,不读也不受影响。- 其余提交集中在
internal/pool(选号权重、成本台账、竞态修复)、internal/upstream
(Aggregate 边界、models.dev 负缓存)、internal/auth(并行访问 token 的数据竞争)、
internal/session、internal/scheduler及各自测试 —— 都是上游内部实现与其自身
日志/统计口径的修复,不涉及我们的转发路径或直连路径。