-
v1.3.790bbab5f · ·
v1.3.7 修授权回调丢凭据 / 退出登录退不掉 / 说明页入口 1. 生成 Token 没反应 + 闪登出: 回调 fragment 被 App.vue 的 onMounted 无差别 replaceState 抹掉(弹窗是 v-if, 那时还没挂载)。改为优先识别 mcp_refresh_token, 转存 sessionStorage 并自动开弹窗。 2. 「前往生成」改为 /#open=workbuddy, 落地即开弹窗。 3. 退出登录: 原来只清 localStorage, sso_token cookie 还在会被无感登录 立刻登回。改为跳 SSO /oauth/logout 真正结束会话, 并加一次性标记 跳过回跳落地时的那一轮 cookie 自动登录。
-
v1.3.6723f1b0c · ·
v1.3.6 修复生成 Token 没走授权流(v1.3.5 回归) 根因: <button @click="create"> 让 Vue 把 MouseEvent 当第一个实参传入, create(opts) 里 `if (!opts)` 永不成立 → 跳过独立授权 → 拿 undefined 当凭据签发。 结果库里 refresh_token 长度为 0, 用户看到"生成成功"但任何需要身份的工具 (反应检索/逆合成)一律 TOKEN_INVALID。 - 模板改为 @click="startMcpAuthorize()" - create() 显式校验 opts.refreshToken - 后端拒绝空 refresh_token(400), 不再静默签发半残 Token - 更正易反应客户端注释: 已核实它原生接受 SSO token, 无需兑换层
-
v1.3.5cfa38729 · ·
v1.3.5 WorkBuddy 走独立授权链 不再借用浏览器会话的 refresh_token: - GET /api/auth/mcp-authorize 发起 MCP 专用授权 - GET /api/auth/mcp-callback 换取专属 refresh_token - 前端「生成 Token」改为先授权再签发, 回调后清理地址栏凭据 配合 login v1.0.15 的 is_offline 标记: 浏览器续期与登出都不再影响 WorkBuddy。 前置已完成: SSO client redirect_uris 已含 mcp-callback。
-
v1.3.4bc7778fb · ·
v1.3.4 MCP 续期加单飞锁 修"每发一次版就得重新生成 WorkBuddy 连接 Token": SSO 的 refresh_token 是一次性的, 而 _cache 是进程内的(pod 重启即空), 重启后 WorkBuddy 重连的那批并发请求同时拿同一个 refresh_token 去换, 第 1 个成功并使其作废, 其余全部 400 invalid_grant -> 连接被打死。 (线上佐证: /oauth/token 200:22 vs 400:138, 同一秒最多 8 次并发。) - 单飞锁 + 双重检查缓存 + 重读库 - 区分 invalid_grant 与 SSO 抖动, 前者重读后重试一次(自愈) - TOKEN_INVALID 文案改为可操作指引 实测: 并发 8 请求 修前 1/8 成功、7 次被拒 -> 修后 8/8 成功、SSO 只调 1 次、0 被拒。
-
v1.3.38f797473 · ·
v1.3.3 剥掉下游响应外壳 逆合成任务跑完了, fetch_retrosynthesis 却一直返回 status=running, WorkBuddy 无休止轮询 —— items 埋在 data 里, 原代码在最外层找, 永远取空。 同类问题一并修: search_reactions(易反应 {code,data:{list}})、 check_catalog(商城 {isSuccess,data:{skus}}, 之前整个商城侧报价都漏了)。 统一走 _unwrap_envelope() / _rows_of(), 并返回 total 以区分 "还没出结果" 与 "确实是 0 条"。 -
v1.3.1b7a0308d · ·
v1.3.1 修 WorkBuddy 连不上:补 GET /mcp(SSE 流)与 DELETE /mcp Token 本身没问题 —— 库里 14 条 0 过期、全带 refresh_token, 且 last_used_at 晚于 created_at, 证明请求到过服务端且鉴权已通过。真正断点在日志里的固定三段式: POST /mcp -> 200 (initialize) POST /mcp -> 202 (notification) GET /mcp -> 404 ★ MCP Streamable HTTP 要求客户端握手后发 GET /mcp 建立服务端->客户端 SSE 流, 而 server.py 只注册了 POST /mcp 与 GET /mcp/health。模块 docstring 原本就写着 '后续要上 SSE/流式再换' —— 当初有意只做了请求-响应那一半, WorkBuddy 严格实现即暴露。 GET /mcp 复用同一套 Bearer 鉴权; 首版工具均同步返回, 故为'保持打开 + 15s 心跳'的 空闲流, 不伪造事件。心跳必需(链路有 120 nginx 与集群 ingress 两层代理会按空闲超时切断), 并附 X-Accel-Buffering: no 防 nginx 缓冲把心跳攒住。 DELETE /mcp 用于客户端主动结束会话, 本服务无会话状态, 返回 204。 回滚点 v1.3.0。需实连验证:GET /mcp 应由 404 变为 200 并保持连接。