fix(admin): 时间轴分页与保留期文案按契约收紧(V2)
- 类型补上后端真在返回的 source/nextBefore/hasMore/retentionEnabled(此前类型里没有) - 新增纯函数 pageHasOlder(hasMore 权威,老后端退满页启发式)/timelineCursorOf/retentionClaimable/ timelineHints;取数体抽成可执行导出函数 ⇒ effect 本体首次被真跑(真 fetch + 真状态机 + 真 SSR) - 🔴 修一处成对契约缺陷:后端 truncated = hasMore || !storeWired,而契约/设计要求 truncated ⇒ 「已过保留期」⇒ 旧前端会对主人说假话。现改为:只有「已翻到底 + 保留期启用 + 非 live-only」 才说「已过保留期」,其余说「更早的轮次未显示」 - 3 个变异自检(去掉 canLoadMore 短路/恒可翻页/忽略 hasMore) ⚠️ 未验(如实):鉴权后的真机 HTTP 往返拿不到 owner 凭据;前端产物未部署(面板仍是旧文案)
This commit is contained in:
1 parent
ed5005307a
commit
745365c7df
8 files changed
+1047
-99
No files matched your search
@@ -116,16 +116,33 @@ export interface AdminFlowTimelineRound {
|
||||
lanes: AdminFlowLane[];
|
||||
}
|
||||
|
||||
/** 链路**时间轴**端点的响应(`design/19 §7.1`;W1 新增的只读出口)。 */
|
||||
/** 链路**时间轴**端点的响应(契约 v0.80 §4.11.1;W1 的新出口)。
|
||||
*
|
||||
* 🔴 **`truncated` 不等于「已过保留期」**(契约 §4.11.1(b).3 的原话):它的含义是
|
||||
* **「本次不是全部」** = `hasMore`(分页未到底)**或** 落盘源未接线(只剩内存最近一轮)。
|
||||
* 「更早的回合已过保留期」这句话的判据只能是 `retentionEnabled` + `retentionHours` +
|
||||
* `truncated` **三者一起读**,**不得**因为「返回的回合比想象中少」就断言被清扫了
|
||||
* —— 否则面板会对着一页**仍然可翻**的历史说「已过保留期」(本切片核出的成对契约缺陷)。 */
|
||||
export interface AdminFlowTimelineResponse {
|
||||
/** 解析后的会话(回显)。取数只认调用时给的 `sessionId`,不依赖这一键。 */
|
||||
sessionId?: string;
|
||||
/** 本页**至少一轮**来自落盘 `persisted` / 本页**全部**来自内存 `live`(落盘源未接线,
|
||||
* 或该会话还没有落盘轮)/ `none`(没有任何回合)。 */
|
||||
source?: "persisted" | "live" | "none";
|
||||
/** 保留期内的回合。后端按**时间正序**(最旧在前)返回;面板渲染前自己归一排序。 */
|
||||
rounds: AdminFlowTimelineRound[];
|
||||
/** `flow_graphs` 的保留期(小时)。`≤0` = 后端配置为不回收(见 `FLOW_GRAPH_RETENTION`)。 */
|
||||
retentionHours: number;
|
||||
/** **更早的回合已过保留期**(`design/19 §7.1`)⇒ 面板必须**如实标注**,不许静默少块。 */
|
||||
/** 本页**最早一轮**的开始时刻;`hasMore` 为真时**原样回带**成下一次请求的 `before`
|
||||
* 即可连续向更早翻页(游标精度到毫秒)。没有回合时是空串。 */
|
||||
nextBefore?: string;
|
||||
/** 库里**还有更早的回合**没被本次返回(= 还能继续翻页)。**这是唯一权威的翻页判据**;
|
||||
* 面板不要用「本页是否满页」去猜(满页的最后一页会被猜成「还有更早」,白打一次请求)。 */
|
||||
hasMore?: boolean;
|
||||
/** 本次**不是全部**:`hasMore`(分页未到底)或落盘源未接线。**不是**「已过保留期」。 */
|
||||
truncated: boolean;
|
||||
/** `flow_graphs` 的保留期(小时,**下取整**)。`≤0` = 后端配置为不回收。 */
|
||||
retentionHours: number;
|
||||
/** 保留期清扫**是否启用**。`false` ⇒ 「更早的回合」**不是**被清扫掉的,别说成过期。 */
|
||||
retentionEnabled?: boolean;
|
||||
}
|
||||
|
||||
/** GET /api/v1/admin/flow/timeline?sessionId=&limit=&before= — **多轮时间轴**(`design/19 §7`;
|
||||
@@ -133,9 +150,12 @@ export interface AdminFlowTimelineResponse {
|
||||
* **增量兄弟**:一次给**多轮**,每轮连同它**每一路**的图,供面板画「所有消息按时间顺序串
|
||||
* 起来」的时间轴。
|
||||
*
|
||||
* 分页:`limit` 缺省 50(后端硬上限 200);`before` 是**开始时间游标** —— 传「当前手上
|
||||
* 最旧那一回合的 `startedAt`(原样回传后端给的值)」即继续取更早的。⚠️ 本函数**不解释**
|
||||
* `before`(不做字符串/毫秒换算),只原样转交:面板的游标就是后端给的时间字符串。
|
||||
* 分页(契约 §4.11.1(a)):`limit` 缺省 50(后端硬上限 200);`before` 是**开始时间游标**
|
||||
* —— 「开始时刻**严格早于**它」的回合才返回(省略 = 最新那一页)。游标取响应里的
|
||||
* `nextBefore`(= 本页最早一轮的开始时刻)**原样回带**即可连续翻页,**不重不漏**。
|
||||
* ⚠️ 本函数**不解释** `before`(不做字符串/毫秒换算),只原样转交:面板的游标就是后端
|
||||
* 给的时间字符串。⚠️ **也不要**用「本页是否满页」代替 `hasMore`:满页的最后一页会被误
|
||||
* 判成「还有更早的」,白打一次请求(`hasMore` 才是权威判据)。
|
||||
*
|
||||
* 老后端(该出口未接线)⇒ `404`;调用方按「当前只支持最近一轮」诚实降级,别把 404 读成
|
||||
* 「这段时间没有回合」。 */
|
||||
|
||||
Reference in new issue
Block a user