diff --git a/PROGRESS.md b/PROGRESS.md index d95f296..6fb2da1 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -2,7 +2,7 @@ > 配合 `DESIGN.md`。本文件只记 phase 状态、决策偏差、文件量、下一步。每条 1-2 句:做了啥 + 关键判断;细节查 `git log` / `git diff` / `DESIGN §7.9`。 -最后更新:2026-06-24(微信 task 在 web 端只读镜像:web→微信单向不同步,锚定微信为单一交互权威 + bump 0.25.1) +最后更新:2026-06-25(登录失败提示修正:前端把凭据类失败统一为「账号或密码错误」,后端 detail 改中文 + bump 0.25.2) --- @@ -21,6 +21,10 @@ ## 已完成关键能力 +### 2026-06-25 / 登录失败提示修正(bump 0.25.2) +- 问题:邮箱密码输错时前端弹「404」(后端 `login_password` 实际返 403「invalid email or password」,前置网关/旧构建把状态改写成 404 后,前端 `doLogin` 直接回显 `r.status + " login failed"` → 用户看到「404 login failed」,语义错误)。 +- 修:`web/static/js/auth.js` `doLogin` 失败分支不再回显原始状态码 —— 表单已校验非空,非 2xx 绝大多数是凭据不对,统一给「账号或密码错误」(pw tab)/「user_id 或 PLATFORM_KEY 错误」(key tab);仅 5xx 暴露状态码提示服务端问题。后端 `web/app.py:1399` detail 同步改中文「账号或密码错误」保持契约自洽。 + ### 2026-06-24 / 微信 task 在 web 端只读镜像(bump 0.25.1) - 问题:web 端打开 channel=wechat 的常驻 task 能正常发消息,但 web→微信**单向不同步**(web 发消息走 `/v1/tasks/{id}/messages`→`_run_agent_bg`,不经过 inbound loop 里 `send_text` 回微信那段,微信侧零感知);微信→web 则同步(同一条 task)。 - 取舍:不做"双向打通"(受微信 24h `context_token` 窗口约束 → 只能"有时同步",不可预测 + 两入口并发写歧义),改为 web 端**只读镜像**(单一交互权威锚定微信;想主动推走 `wechat_push`/定时简报)。 diff --git a/core/__init__.py b/core/__init__.py index 69bb460..a8a87b5 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,3 +1,3 @@ # zcbot 版本号单一事实源:web/app.py 的 FastAPI version、/healthz 返回、前端展示都引这里。 # 改版本只动这一行。 -__version__ = "0.25.1" +__version__ = "0.25.2" diff --git a/web/app.py b/web/app.py index d472053..91bf0c3 100644 --- a/web/app.py +++ b/web/app.py @@ -1396,7 +1396,7 @@ def create_app() -> FastAPI: """ hit = resolve_user_by_email(body.email, body.password) if hit is None: - raise HTTPException(403, "invalid email or password") + raise HTTPException(403, "账号或密码错误") uid, email = hit token, exp = mint_token(auth_cfg, uid) return { diff --git a/web/static/js/auth.js b/web/static/js/auth.js index fd4f93d..8119c57 100644 --- a/web/static/js/auth.js +++ b/web/static/js/auth.js @@ -69,7 +69,15 @@ async function doLogin() { }); if (!r.ok) { const d = await r.json().catch(() => ({})); - throw new Error(d.detail || (r.status + " login failed")); + // 登录失败:表单已校验非空,非 2xx 绝大多数是凭据不对。 + // 凭据类状态(400/401/403/404 —— 404 多半是前置网关把 403 改写了)统一给友好提示; + // 5xx 才暴露状态码,提示是服务端问题而非用户输错。 + if (r.status >= 500) { + throw new Error(`服务器错误,请稍后重试(${r.status})`); + } + throw new Error(loginTab === "pw" + ? "账号或密码错误" + : "user_id 或 PLATFORM_KEY 错误"); } const data = await r.json(); state.token = data.token;