feat(admin): Flow 页时间轴视图(W2)
- 视图切换:最近一轮(既有 DOM 逐字节未变,7/7 SSR 对照 IDENTICAL)| 时间轴(新) - 时间轴:竖轴=时间(默认最新在上)、每回合一个可折叠块、块内复用 LaneTracks 泳道、 块间不画任何连线(不臆造因果);before 游标分页;truncated ⇒ 显式「更早的轮次已过保留期」 - 降级诚实:只拿到最近一轮(老后端)⇒ 明确提示「当前只支持最近一轮」 - 4 个变异自检(排序方向/块间插线/truncated 静默/游标方向);老视图等价性实测
This commit is contained in:
1 parent
1efe3a6a79
commit
5ee5f9126f
10 files changed
+1831
-127
No files matched your search
@@ -100,6 +100,57 @@ export function adminFlowGraph(sessionId: string, turnId?: string): Promise<Admi
|
||||
return request<AdminFlowGraphResponse>(`/admin/flow/graph${q ? `?${q}` : ""}`);
|
||||
}
|
||||
|
||||
/** 时间轴里的**一个回合**(`design/19 §7`;形状取自设计规格 —— W1 的出口)。 */
|
||||
export interface AdminFlowTimelineRound {
|
||||
/** 该回合的权威标识。🔴 **一律用后端给的值**:面板既不自己拼 `{会话}-{序号}`,
|
||||
* 也不从 `graph.id` 反解(契约 v0.79 起 `graph.id` 含 `#` 且单路也有后缀)。 */
|
||||
turnId: string;
|
||||
/** 会话轮次号。**可能缺席 / `null`**(旧行、或后端尚未落这一列)⇒ 面板显示
|
||||
* 「轮次未知」,**绝不用 0 冒充**。 */
|
||||
round?: number | null;
|
||||
/** 该回合的开始时间(RFC3339)。它是**时间轴排序与 `before` 游标的唯一依据**。 */
|
||||
startedAt: string;
|
||||
/** 收尾时间。缺席 / `null` = 该回合**未收尾**(不许读成「已完成」)。 */
|
||||
endedAt?: string | null;
|
||||
/** 该回合**每一路**的图(真并行时不止一条;`graph` 为 `null` = 那一路没有留下图)。 */
|
||||
lanes: AdminFlowLane[];
|
||||
}
|
||||
|
||||
/** 链路**时间轴**端点的响应(`design/19 §7.1`;W1 新增的只读出口)。 */
|
||||
export interface AdminFlowTimelineResponse {
|
||||
/** 解析后的会话(回显)。取数只认调用时给的 `sessionId`,不依赖这一键。 */
|
||||
sessionId?: string;
|
||||
/** 保留期内的回合。后端按**时间正序**(最旧在前)返回;面板渲染前自己归一排序。 */
|
||||
rounds: AdminFlowTimelineRound[];
|
||||
/** `flow_graphs` 的保留期(小时)。`≤0` = 后端配置为不回收(见 `FLOW_GRAPH_RETENTION`)。 */
|
||||
retentionHours: number;
|
||||
/** **更早的回合已过保留期**(`design/19 §7.1`)⇒ 面板必须**如实标注**,不许静默少块。 */
|
||||
truncated: boolean;
|
||||
}
|
||||
|
||||
/** GET /api/v1/admin/flow/timeline?sessionId=&limit=&before= — **多轮时间轴**(`design/19 §7`;
|
||||
* 只读、不审计,owner/admin 档)。它是老出口 `adminFlowGraph`(最近一轮 + 历史轮列表)的
|
||||
* **增量兄弟**:一次给**多轮**,每轮连同它**每一路**的图,供面板画「所有消息按时间顺序串
|
||||
* 起来」的时间轴。
|
||||
*
|
||||
* 分页:`limit` 缺省 50(后端硬上限 200);`before` 是**开始时间游标** —— 传「当前手上
|
||||
* 最旧那一回合的 `startedAt`(原样回传后端给的值)」即继续取更早的。⚠️ 本函数**不解释**
|
||||
* `before`(不做字符串/毫秒换算),只原样转交:面板的游标就是后端给的时间字符串。
|
||||
*
|
||||
* 老后端(该出口未接线)⇒ `404`;调用方按「当前只支持最近一轮」诚实降级,别把 404 读成
|
||||
* 「这段时间没有回合」。 */
|
||||
export function adminFlowTimeline(
|
||||
sessionId: string,
|
||||
opts: { limit?: number; before?: string } = {}
|
||||
): Promise<AdminFlowTimelineResponse> {
|
||||
const qs = new URLSearchParams();
|
||||
if (sessionId) qs.set("sessionId", sessionId);
|
||||
if (opts.limit && opts.limit > 0) qs.set("limit", String(opts.limit));
|
||||
if (opts.before) qs.set("before", opts.before);
|
||||
const q = qs.toString();
|
||||
return request<AdminFlowTimelineResponse>(`/admin/flow/timeline${q ? `?${q}` : ""}`);
|
||||
}
|
||||
|
||||
/** GET /api/v1/admin/config-facts — **只读**配置事实面(契约 v0.68 §4.10(a)):
|
||||
* 记忆整理 7 键 + 安静时段两键的**进程生效值** + 声明默认值,外加安静时段窗口的
|
||||
* 解释(跨午夜 / 已关闭)。owner/admin 档;**不含任何凭据值**(后端有哨兵测试钉死),
|
||||
|
||||
Reference in new issue
Block a user