## MODIFIED Requirements ### Requirement: 新增共享类型 系统 SHALL 在 `src/shared/api.ts` 中定义 Dashboard 和 Metrics 相关共享类型。CheckResult SHALL 包含 durationMs(null | number)、failure(CheckFailure | null)、matched(boolean)、detail(null | string)、observation(Record | null)、timestamp(string)。其中 detail 替代原 statusDetail 字段名。 #### Scenario: DashboardResponse 类型 - **WHEN** 前后端共享 `DashboardResponse` 类型 - **THEN** 该类型 SHALL 包含 summary 和 targets 字段 #### Scenario: TargetStatus 类型 - **WHEN** 前后端共享 `TargetStatus` 类型 - **THEN** 该类型 SHALL 包含目标基本信息字段(id、name、description、group、type、target、interval)、stats(totalChecks、upChecks、downChecks、availability)、currentStreak 和 recentSamples 字段,其中 name 和 description 类型均为 null 或字符串 #### Scenario: TargetMetricsResponse 类型 - **WHEN** 前后端共享 `TargetMetricsResponse` 类型 - **THEN** 该类型 SHALL 包含 targetId、window、stats 和 trend 字段 #### Scenario: TrendPoint 类型 - **WHEN** 前后端共享 `TrendPoint` 类型 - **THEN** 该类型 SHALL 包含 bucketStart、avgDurationMs、minDurationMs、maxDurationMs、availability、totalChecks、upChecks、downChecks 字段 #### Scenario: CheckResult 类型变更 - **WHEN** 前端或后端引用 CheckResult 类型 - **THEN** 该类型 SHALL 包含 `timestamp: string`、`matched: boolean`、`durationMs: number | null`、`detail: string | null`、`observation: Record | null`、`failure` 字段,不包含 statusDetail 字段,不包含 success 字段 #### Scenario: RecentSample 类型 - **WHEN** 前后端共享 `RecentSample` 类型 - **THEN** 该类型 SHALL 包含 `timestamp: string`、`durationMs: number | null`、`up: boolean` 字段,其中 up 为 boolean 且等于 matched #### Scenario: HistoryResponse 类型 - **WHEN** 前后端共享 `HistoryResponse` 类型 - **THEN** 该类型 SHALL 包含 `items: CheckResult[]`、`total: number`、`page: number`、`pageSize: number` 字段 #### Scenario: API 序列化构造 detail - **WHEN** API 路由序列化 StoredCheckResult 为 API 响应 - **THEN** 系统 SHALL 从 StoredCheckResult 中反序列化 observation,根据 target type 通过 checkerRegistry 获取对应 checker 并调用 buildDetail(observation) 动态生成 detail 字段 #### Scenario: mapCheckResult 接收 type 参数 - **WHEN** 序列化辅助函数 mapCheckResult 被调用 - **THEN** 函数 SHALL 接收 target type 参数,用于从 registry 获取对应 checker 调用 buildDetail #### Scenario: Dashboard API 传递 type - **WHEN** Dashboard 路由序列化 latestCheck - **THEN** 路由 SHALL 将 target.type 传递给 mapCheckResult #### Scenario: History API 传递 type - **WHEN** History 路由序列化历史记录列表 - **THEN** 路由 SHALL 将已查询的 target.type 传递给 mapCheckResult