diff --git a/CHANGELOG.md b/CHANGELOG.md index a7df773..e1bcfab 100644 Binary files a/CHANGELOG.md and b/CHANGELOG.md differ diff --git a/web/src/lib/mock/handler.ts b/web/src/lib/mock/handler.ts index 9d6ea1b..1bb585b 100644 --- a/web/src/lib/mock/handler.ts +++ b/web/src/lib/mock/handler.ts @@ -2092,6 +2092,13 @@ function route(m: string, path: string, seg: string[], q: URLSearchParams, b: Re }; if (path === "/intercept/judge" && m === "PUT") return { ok: true }; + // ── 旁路提问(/btw):demo 无旁路会话 ── + // 必须显式命中:路径以 s 结尾会被下面的读兜底判成集合返回 [],items 就成了 undefined。 + if (seg.at(-1) === "side-questions") { + if (m === "GET") return { items: [], current: null, next_cursor: 0, snapshot: null }; + if (m === "POST") throw new Error("演示模式不支持旁路提问"); + } + // ── 写操作兜底:成功但不落库 ── if (["POST", "PUT", "PATCH", "DELETE"].includes(m)) return { ok: true }; diff --git a/web/src/lib/side-questions.ts b/web/src/lib/side-questions.ts index 531b364..9f52e42 100644 --- a/web/src/lib/side-questions.ts +++ b/web/src/lib/side-questions.ts @@ -41,7 +41,18 @@ async function request(path: string, method = "GET", body?: unknown): Promise } export const sideAPI = { - history: (parent: string, before = 0) => request(`${parent}/side-questions?before=${before}`), + // 历史必须归一化后再交给调用方:items 一旦不是数组,消费端的 setState updater 会抛, + // 而 React 会把 updater 的异常推迟到 render 阶段重抛 —— 那时调用方的 catch 已经够不着, + // 整页直接被错误边界接管。 + history: async (parent: string, before = 0) => { + const data = await request>(`${parent}/side-questions?before=${before}`); + return { + items: Array.isArray(data?.items) ? data.items : [], + current: data?.current ?? null, + next_cursor: Number(data?.next_cursor) || 0, + snapshot: data?.snapshot ?? null, + } satisfies SideHistory; + }, ask: (parent: string, question: string, client_request_id: string) => request(`${parent}/side-questions`, "POST", { question, client_request_id }), clear: (parent: string) => request(`${parent}/side-questions`, "DELETE"),