4.3 KiB
4.3 KiB
PROGRESS · 历史对话标题、排序、分组与分页(2026-09-06)
工作树:.worktrees/session-list-title-and-order-20260906
分支:codex/session-list-title-and-order-20260906
基线:任务书写 origin/staging @ 985c3258;开工时 origin/staging 已到 d04990fc(含 composer BUG-551/552),以当时远端为准。
page.tsx 收尾 2035 行(上限 2041)。未改迁移、未 bump Skill。5.1 起名走 generateText 可 mock;真实模型调用在本机测试里不打外部 API。客户端只引用 session-title.ts 纯函数,避免把 Mastra 打进 / 包。
| 任务 | 状态 | BUG |
|---|---|---|
5.2 排序与 updated_at |
完成 | BUG-553 |
| 5.6 列表游标分页 | 完成 | — |
| 5.4 侧栏去资料前缀 | 完成 | — |
| 5.3 历史日期分组 | 完成 | — |
| 5.1 首轮模型起名 | 完成 | 不编 BUG |
| 5.5 BUG_HISTORY / CHANGELOG / DESIGN / VOICE | 完成 | — |
实现要点
sortSessions:置顶优先,其次updatedAt倒序,相等保持原序。- 元数据 PATCH 不再写
updated_at;客户端改名 / 收藏 / 归档 / 换模型不再 bump。 GET /api/sessions:limit默认 40(1–100),before游标(updated_at,id)倒序,第一页合并全部置顶,后续页只有非置顶;archived=1独立游标。- 历史按本地午夜分成今天 / 昨天 / 最近 7 天 / 最近 30 天 / 更早;空组不渲染。滚到底哨兵静默续取,无「加载更多 / 没有更多」。
- 侧栏标题只显示会话标题;
chartProfileRole !== "self"时副标题显示资料名(含「资料已删除 · 」)。 - 咨询首轮且标题仍是自动值时,与主回答并行起名(8 秒 ref'd 超时,最多 30 token,不扣点)。合格标题经
session.title事件下发,并按「标题仍等于本轮开始值」守卫写库。流结束前会等该事件,避免客户端完成 PATCH 把模型标题盖回去。
既有断言改动
| 文件 | 原值 | 新值 | 原因 |
|---|---|---|---|
home-profile.ts / chart-library-session |
资料名 · 标题 |
标题单独一行;他人资料走副标题 | 侧栏前缀把主题挤没 |
page.tsx visibleSessions |
只按 pinned 排 |
sortSessions(置顶 + updatedAt 倒序) |
BUG-553:刚聊过的不在最上面 |
metadataUpdateValues |
每次 PATCH 写 updated_at |
返回值不含 updated_at |
改名收藏把旧会话顶上去 |
renameSession |
{ ...session, title, updatedAt: timestamp() } |
{ ...session, title } |
同上 |
GET /api/sessions |
一次返回全部元数据数组 | { sessions, nextCursor },默认 40 |
上千行 DOM;后续页静默续取 |
fetchSessions / hydrate |
readSessions(payload) |
readSessions(page.sessions) + nextCursor |
分页响应形状 |
onToggleArchivedView |
只翻转本地 showArchivedSessions |
重新取第一页(archived=1) |
归档改由服务端过滤 |
app-sidebar 历史区 |
historySessions.map 一根长列表 |
historyGroups.map + 哨兵 |
今天 / 昨天 / 更早;无加载文案 |
use-consultation-run 完成标题 |
reply.title && !isGenericSessionTitle(reply.title) |
streamedTitle ?? reply.title |
首轮模型标题经 session.title 事件到达 |
consult session select |
...,session_type,messages |
另加 title,theme,chart_profile_role |
起名判定需要当前标题与分析对象 |
agent.generate token 上限 |
任务书写 maxTokens |
modelSettings.maxOutputTokens |
当前 Mastra/AI SDK CallSettings 字段名 |
测试
| 命令 | 结果 |
|---|---|
npx tsx --test tests/sidebar-*.test.ts tests/chart-library-session.test.ts tests/chat-session-*.test.ts tests/agent-reply.test.ts tests/consultation-*.test.ts tests/session-*.test.ts tests/application-billing-contract.test.ts |
355 pass / 0 fail |
./node_modules/.bin/tsc --noEmit |
0 错 |
改动文件 eslint --quiet |
0 error |
page.tsx |
2035 行(上限 2041) |
npm run build -- --webpack |
webpack 编译通过;类型检查仍停在既有 dossierResponse 路由导出(api/rectification/cases/[caseId]),与本单无关。本单曾误把 metadataUpdateValues 从 sessions [id] 路由再导出,已撤回。 |
全量 npm test(含 database-*) |
本机 Docker 库测多项 300s 超时 / 权限负例 ERROR,与本单无关;未当作本单回归。 |