Repository navigation
Releases: NextAgentX/qoder-trae-workbuddy-switch
Release list
v2026.10.201902
🖥 服务器 / 容器部署:没装客户端也能登录、也能开网关(issue #62)
- 症状:在服务器上部署、本机没装任何平台的客户端时,账号页只给「重新检测 / 从本机导入」两条死路 —— 登录不了,网关也就没有上游账号可用。
- 定位:这不是「缺一个入口」,而是把「没装客户端」当成了异常。账号与网关只依赖凭据本身,客户端只负责「现成的登录态来源」与「程序位切换」。
- 现在「无客户端」是一等形态:账号页给引导卡(浏览器授权 / 粘贴凭据 / 导入备份 + 可用与需客户端两列清单),已有账号时只留一行说明。
- 授权弹窗改成「链接 + 二维码 + 倒计时 + 轮询」:容器里没有系统浏览器也能完成,手机扫码或复制链接到任意设备即可;自动开浏览器降级为尽力而为,失败不再算登录失败。
- 新增「粘贴授权凭据」(WorkBuddy):把另一台机器上
auth/workbuddy-desktop-ai.info的内容整段粘进来即可入库,与「从本机导入」走同一条解析 / 解锁链。 - Trae 例外已如实说明:换 token 与续期都要客户端
storage.json里的 icube 设备私钥,且授权页会探127.0.0.1:17388;弹窗给出可复制的ssh -L命令,并支持把回调链接粘回来由服务端补完兑换。 - 网关页在无客户端时明确写「网关照常可用」—— 它只依赖账号池里的凭据,与客户端是否同机无关。
🧹 设置页新增「清除缓存」
- 只读扫描四类缓存(会话备份 / 登录态快照 / 缓存目录 / 日志)的体积,勾选后按类别清除,返回实际释放的字节数与逐项失败原因。
- 部分失败会如实报「清了但有 N 项失败」,不会一律显示成功;清除前有确认弹窗,属不可逆操作。
🛠 其他
- 版本号统一为 2026.10.201902(14 处载体校验通过)。
- 原型同步更新:
docs/prototype/verify-clientless.cjs作为无客户端形态的门禁(18 条断言 + 3 个变异)。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.201725
🔐 修复:Trae 授权页走错产品线(auth_from=solo)
- 症状:国际版点「OAuth 网页登录」,浏览器打开的是 TraeWork 的授权页(
auth_from=solo&client_id=en1oxy7wnw8j9n…),部分地区直接提示「TraeWork 在所在地区不可用」。 - 原因:前端只传区域(
cn/global),旧的变体解析把global认成了国际版 TraeWork,而它属于 SOLO 产品线。 - 现在
global落到本区域的合并版 Trae(TRAE_I18N⇒auth_from=trae&client_id=ono9krqynydwx5),cn同理。 - 附带一条真机探针测试:两个区域的授权 URL 都必须带
auth_from=trae,防回归。
🛠 其他
- 版本号统一为 2026.10.201725(19 处载体校验通过)。
- 本次只修授权入口,其余功能与 v2026.10.201625 一致。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.201625
✨ 上下文开关现在「点了立刻变」
- 三平台模型页顶部统一一个开关(Trae 叫 Max Mode,WB / Qoder 叫上下文上限),默认开启。
- 点击即时切换:开关秒变、下方「上下文」列同步在
1M↔300k/200k之间切换,不再等请求返回。 - 修掉了三个真问题:保存响应没解包导致开关被重置回默认;保存时重启监听在端口被占时失败并回滚;清单只在进页面时抓一次、不会重取。
🧭 默认使用上限
- WorkBuddy:目录里的
300k 默认 / 1M 上限现在按开关选,默认 1M。 - Qoder:
200K 默认 / 400K / 1M多窗口,默认最大档;请求里的上下文元数据跟着走。 - Trae:仍由
is_max_mode控制,关闭后回到__dev的实际窗口。 /v1/models同时给出当前档与两档原值(context_length/context_length_default/context_length_max),客户端与界面各自取用。
🐛 演示站(GitHub Pages)恢复部署
- 15:03 起 Pages 连续失败:
api.ts里混入了未落地的缓存扫描接口,build:demo的 tsc 报 TS2305。 - 已移除该残留,演示站重新可访问。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.201130
✨ WorkBuddy / Qoder 也支持「使用最大上下文」开关(默认开启)
上一版清单里的 300k 其实是默认档而不是上限 —— 上游一直给两档,我们只读了默认值。现在补上开关:
- WorkBuddy:
300k 默认 / 1M 上限这类模型,开启开关后清单声明 1M,关闭回到 300k。 - Qoder:
200K 默认 / 400K / 1M多窗口模型,开启后清单声明最大档,并把它写进请求的上下文元数据;关闭回到默认档。 - 两处开关都在「模型」页顶部,默认开启,保存即生效。
🚦 Trae 仍然是唯一的「请求级 Max Mode」
- Trae 的开关对应上游
is_max_mode布尔字段;WB / Qoder 没有这个字段,开关只决定声明 / 使用哪一档窗口。 - 三家清单现在都带
context_length,数值随开关变化,客户端读同一个字段即可。
🛠 内部
- WB 目录解析:
contextWindow.defaultLength记为默认档,maxInputTokens/maxAllowedSize记为上限档(修复国际版一直只显示默认档的问题)。 - Qoder:解析
context_config的多窗口与is_default标记。 - 版本号统一为 2026.10.201130(19 处载体校验通过)。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.200958
✨ 三个平台的模型清单都声明上下文大小
/v1/models现在统一带context_length:WorkBuddy 取目录的context_window、Qoder 取模型元数据的max_input_tokens、Trae 取官方目录的逐模型上限。OpenAI 兼容客户端读这一个字段就能知道每个模型能装多少。- 原字段(
context_window/max_input_tokens)保留,老客户端与管理面不受影响。
🚦 为什么只有 Trae 有 Max Mode 开关
- Max Mode 是 Trae 上游的请求级布尔字段:同一个模型有
dev(__dev通道实际窗口)与max(上限)两个值,才需要「开 / 关」。 - WorkBuddy 与 Qoder 的目录只有一个上限值,没有第二个模式可切 —— 所以模型页给的是「上下文上限 · 按目录声明」只读说明卡,而不是一个点了没反应的开关。
- 模型页的「上下文」列三家都有:
200k / 400k / 1M / 982k直接可见;Trae 关闭 Max Mode 后回到dev。
🛠 内部
- WB 模型条目抽成
routes::models::model_entry,独立网关与统一网关共用一份(避免两处 JSON 漂移)。 - 版本号统一为 2026.10.200958(19 处载体校验通过)。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.200904
✨ Max Mode 开关:现在真的能关(接前端 + 后端)
上一版把「按各模型上限」做成了数据驱动,但开关只存在于原型里 —— 应用内始终开启。本次补齐真实链路:
- 网关页配置卡新增「Max Mode(按各模型上限)」开关,默认开启,保存即生效(无需重启)。
- 开启:对官方目录里
max > dev的模型注入is_max_mode,/v1/models声明它自己的上限(glm-5.3 1M、mimo 982k…)。 - 关闭:清单回到
dev(__dev通道实际窗口),请求不再注入 —— 适合「先按默认窗口用」的场景。 - 三条入口(Trae 独立网关 / 统一网关 trae 命名空间 / web 管理面)读同一份配置,不存在「清单关了、请求还开着」的半截状态。
🛠 内部
TraeGatewayConfig新增max_mode(默认true,兼容 camelCase 别名);读取用同步快照,拿不到锁按开启处理。models_response_for/prepare_llm_chat_body显式接收该开关;check:scope随签名更新,仍钉住「禁用集合是第二个实参」。- 版本号统一为 2026.10.200904(19 处载体校验通过)。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.191907
🐛 修复:统一网关(57892)重启后必须手动「关一下再开」
- 症状:配置里已启用、界面开关也是绿的,但彻底退出再启动后 57892 没有监听,客户端一直「生成中」,网关侧一条日志都没有。
- 根因:
setup()只登记了网关运行时句柄,漏了「按配置拉起监听」那一段 —— 只有「保存配置」这个动作能启动它。 - 修复:启动时补齐
apply(),并新增跨两侧宿主(桌面端 / web 端)的回归护栏,任何一侧漏掉测试即变红。 - 可观测:网关页「启用统一网关」一行现在显示真实监听状态(监听中 / 未监听),开关绿但端口没人 accept 一眼可见。
- 升级后无需操作:配置启用即启动监听。
✨ Trae 上下文与 Max Mode:逐模型从官方目录读取,不再是统一 1M(issue #53)
- 此前清单只声明 200k(取客户端缓存的
context_window_size.default),而 Max Mode 是请求级布尔字段,客户端里无从选起。 - 网关现在重放 Trae 官方模型目录接口,读取每个模型的
dev(__dev通道实际窗口)与max(Max Mode 上限)。 max > dev的模型在请求时注入is_max_mode,/v1/models直接声明它自己的上限:glm-5.31M、mimo-v2.6-pro982k、Doubao-Seed-2.1-Turbo仍是 256k —— 上限各不相同。- 目录缓存 24 小时;拉不到时静默沿用旧缓存,没有缓存就按客户端默认窗口声明,不猜数字。
- 模型名保持不变:基名(
glm-5.3、统一入口trae-cn:glm-5.3)即可,没有-max之类的影子模型。
📊 三个平台的模型表都显示「上下文」
- WorkBuddy:目录 API 的
context_window(同一份目录里 256k / 960k / 1M 都有)。 - Qoder:模型元数据的
max_input_tokens。 - Trae:上面那份
dev/max(开启 Max Mode 后显示该模型自己的上限,并注明默认值)。 - 未知时显示
—,不编造数字;原型(docs/prototype/buddy-switch-prototype.html)同步补齐三平台交互与?max=off对照。
🔧 健康检查统一为 /health(/healthz 保留为别名)
- 四条网关此前 3:1 分裂(WB / Qoder / 统一入口用
/healthz,Trae 用/health),现在统一为GET /health。 /healthz作为兼容别名继续可用:同一处理器、返回体逐字相同,已写死它的探活脚本不用改。
📦 Docker:预构建多架构镜像(GHCR)
- 推
v*tag 时发布ghcr.io/nextagentx/buddy-switch(amd64 / arm64 多架构 manifest),不必先本地全量构建。 docker-compose.yml默认引用预构建镜像,保留build:作为回落;README 形态表补 Docker 入口。- 边界不变:容器里运行的是 headless 服务端(webui + 网关),不是桌面切换器。
🛠 内部
- 新增
trae/catalog.rs(目录重放 + 解析 + 24h 缓存 + 单飞同步),三个入口列清单前触发。 - 删除写死的
MAX_MODE_MODELS常量表与「统一 1M」假设。 - 版本号统一为 2026.10.191907(19 处载体,
stamp-version --check通过)。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.181354
🔄 「更多」菜单按原型重做,表格视图也补上了
账号卡片右上角那个「⋯」此前与设计原型差了不止一处:没有账号名抬头、点一下就关菜单、
签到只有「能点」一种形态、导出入口藏在抽屉里、备注和分组编辑与抽屉重复。
- 抬头 + 结尾提示:菜单顶部显示账号名,底部提示「备注与登录态在账号详情里(点卡片打开)」——
备注 / 分组编辑因此从菜单移出(它们在详情抽屉里),提示指路,不再两处重复。 - 点刷新不关菜单:刷完一项常常紧接着刷下一项;而且「刷新中 / 已更新」这两个状态
只有菜单里看得见。现在刷新项保持菜单打开,成功后亮 900ms「已更新」。 - 签到改成三态:已签到 → 灰字「今日已签到」;凭据失效 → 灰字「手动签到 · 需先登录」;
其余才给可点入口。此前只有「可点」一种,凭据失效的账号点下去必然失败。 - 导出账号回到菜单;去掉「查看详情」(点卡片 / 点行就是打开详情,两个入口做同一件事没必要)。
- 表格视图每一行也有了同一个菜单:此前只有卡片有,表格里只能点行进详情再找动作。
🧾 Trae / Qoder 的刷新项补齐
「刷新」拆成四类后(积分 / 今日 Token / 签到状态 / 凭据状态),Trae、Qoder 此前只有两项。
本期后端补上了按账号、今日口径的只读命令(get_trae_account_token_today、
get_trae_checkin_status_map、qoder_checkin_status_map),并把它们接到界面上:
- Trae 四项齐全,卡片新增「今日 Token」指标:此前菜单里有这个刷新项,卡片上却没有这个数字,
刷完只弹一句提示,等于那条入口是假的。现在缺席就显示「—」,网关日志被裁时显示「≥N」。 - Qoder 三项(积分 / 签到状态 / 凭据):刷新签到状态后,卡片上的签到态立刻更新。
- Qoder 刻意没有「今日 Token」:它的计量单位是积分(credits)、没有 token 概念,
摆一个点了只能重读缓存的入口,比不摆更坏。
三条诚实边界仍然成立:读不到 ≠ 没签到、缺席 ≠ 0、被裁的值只是下界。
🐛 修复:详情抽屉的页签被压成一条缝
抽屉滚动区是纵向 flex 容器,内容一高,内层的页签容器会被压扁,页签只剩一条 8px 的细缝
(程序位那行下面夹着被切掉的一排)。已修复并复验。
🛠 内部
pr-check增加 macOS runner,让只在 macOS 上复现的失败(issue #37)能在 CI 里复跑。- 门禁随之更新:签到三态的断言改为守「顺序 + 门控」,菜单组件搬家不会再让守门变摆设。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.181245
🧭 账号详情抽屉:从「七段长滚动」改成「指标 + 页签」
同一个账号的动作此前散在三处:刷新在菜单、刷新 Token 在抽屉、手动签到两边都能点,删除还埋在抽屉最底部。这一版按一条判据收敛 —— 能一步做完的进菜单;要看数据才敢决定的留在抽屉。
- 顶部四个指标块(积分 / 今日 Token / 签到 / 凭据),一打开就知道这个账号现在什么状态,不用往下滚。每块右上角一枚 ⟳,就地刷新这一项(与菜单里的四项同一个回调,不是第二套实现)。
- 正文改成页签:概览 / 积分 / 签到 / 凭据 / 快照(按有无内容出现)。备注、分组、程序位切换留在页签之上 —— 它们是身份与操作,藏进页签会让「改个备注」变成「先猜在哪个页签里」。
- 「用向导切换」挪到固定底栏:长列表滚到底才找得到的问题消失。
- 抽屉里的「操作」区只剩三枚抽屉独有的按钮(刷新 Token / 导出 / 权限诊断);手动签到、编辑备注、编辑分组、删除只在卡片「更多」里,删除不再埋在抽屉底部被顺手点到。
🔄 卡片「更多」:四类数据各自刷新
四类数据来自不同层,快慢与失败原因都不同,合成一个「刷新」时慢的拖住快的、失败也分不清是哪一层:
- WorkBuddy:积分 / 今日 Token / 签到状态 / 凭据状态,四项齐全。
- Trae / Qoder:只有「积分 / 凭据状态」两项 —— 它们没有「今日 Token」「签到状态」的按账号·今日只读接口。摆一个点了只会重读缓存的菜单项,比不摆更坏。
- 进行中态按「账号 + 项」记:点一项不会四项一起转,多个账号同时刷新也不会互相吞掉。
🏷 分组可以新建了
分组在后端是自由文本,之前只有一个输入框 —— 用户看不见「已经有哪些组」,同一个组很容易被打成「客户A / 客户 A / 客户a」三份。现在改成「既有分组列表 + 就地新建」:点开先看到这个作用域里已有的组(含「未分组」),最后一枚是「新建分组」,重名会提示将直接归入。
💰 积分 / 资源包明细
抽屉的「积分」页按资源包逐条列出:包名 · 到期时刻 · 剩余/总量 · 已用 · 剩余占比条。三处刻意做对的地方:
- 进度条画的是剩余占比(画成已用就成了「条越长越穷」);
- 颜色按到期紧迫度(7 天内橙、否则绿),与卡片徽章同一口径 —— 没动过的包也可能下周就过期,那才是要提醒的事;
- 到期显示到分钟(只写「3 天后过期」时,用户判断不了赶不赶上)。
同时修掉两处数据自相矛盾:临期积分改为从资源包派生(此前出现过「指标块说无临期积分、积分页却摆着一个快到期的包」);资源包剩余合计与账号积分精确相等。
🗂 快照页签
Trae 的登录态快照进了抽屉(最近修改 / 文件数 / 大小)。打开抽屉时才按账号拉取,不在列表页为一个可能不打开的抽屉预扫全部槽位。
⚠️ 已知限制
- Trae / Qoder 的「今日 Token」「签到状态」两项刷新需要后端新增按账号、今日口径的只读接口,已写成约定(
docs/specs/api-trae-qoder-per-account-refresh.md)并单独跟踪;接口到位后前端只需打开两个开关。 - Qoder 的「今日 Token」不会做:它的计量单位是 credits,没有 token 概念。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。
v2026.10.172351
🔗 改名收尾:自动更新与下载地址全部指向新仓库
仓库已迁到 NextAgentX/qoder-trae-workbuddy-switch。上一版只修了 CI 与在线演示,客户端里写死的旧地址还在 —— 检查更新、下载安装包、README 的下载与 Issue 入口,全都指回改名前的仓库。旧地址目前靠 GitHub 的重定向还能打开,但这条兜底不属于我们的可控项:一旦重定向策略变化,用户看到的就是「已是最新」或是 404。
- 自动更新地址(本次唯一的功能性改动):客户端与服务端的仓库坐标、Tauri updater 的三个端点、更新清单生成脚本的默认坐标,全部改为新仓库。改名后没跟着改,自更新会在无人察觉的情况下静默失效。
- 下载与反馈入口:8 个语种 README 的版本/Stars 徽章、Releases 链接、新建 Issue 链接、Star 历史曲线,以及 CONTRIBUTING、LICENSE 版权声明行、npm 包说明、许可说明,统一换到新地址。
- 保留旧名的地方:几处代码注释与历史文档记的是「改名前的演示 base 路径」这一事实(
vite.config.ts、check-pages-base.cjs、docs/history/),按原文保留,避免把事故复盘改歪。
♻️ 质量与内部
cargo fmt --check、clippy与更新模块 8 项单测(含两条 updater URL 断言)全过;前端tsc+ 7 项构建门禁(check:scope全绿)与vite build全过,产物嵌入护栏测试通过。
安装包:Windows(NSIS)· macOS(DMG,Apple Silicon / Intel)· Linux(deb / AppImage);桌面端可直接在应用内更新。
许可:PolyForm Noncommercial 1.0.0 —— 源码公开(source-available)· 非商业使用。