/** * 数据源解析与校验 —— 纯函数,不碰网络与文件系统。 * * 数据源:https://offpeakclock.com/pricing.json(schemaVersion 1)。 * 校验失败时返回 undefined,由调用方沿用上一份可用数据(spec §8)。 */ import type { RateProfile } from './matching.js'; /** 本实现支持的 schemaVersion。 */ export declare const SUPPORTED_SCHEMA_VERSION = 1; interface RawPeriod { name?: string; badge?: string; detail?: string; tone?: string; } interface RawOverride { period?: string; startDate?: string; endDate?: string; /** * 时刻粒度的起止(ISO 带时区偏移,如 `2026-09-25T15:00:00+08:00`)。 * * **当前未消费** —— override 的生效区间只按 `startDate`/`endDate`(日粒度、字符串比较)。 * 声明出来是为了不再"静默丢弃未知键":见到这两个字段就跳过该条 override, * 并由 `test/catalog.test.ts` 的形态守卫盯着这个已知未消费清单(spec §11)。 */ startAt?: string; endAt?: string; days?: number[]; windows?: { start?: string; end?: string; /** `true` 表示**全天生效**(数据源用 `start:'00:00', end:'00:00'` 搭配此标记表达)。 */ allDay?: boolean; }[]; } interface RawProfile { id?: string; provider?: string; model?: string; schedule?: { timeZone?: string; peakDays?: number[]; peakWindows?: { start?: string; end?: string; }[]; offDayName?: string; /** * 上游标注的法定节假日日期。**必须声明**:`parseProfile` 是显式挑字段构造 * `RateProfile` 的,未声明的字段会被静默丢弃 —— 2026-09-30 前该字段就是这样 * 丢了整整两周半,导致节假日的**工作日**被误标峰价。 */ publicHolidayDates?: unknown; publicHolidayName?: unknown; /** * 节假日所依据的日历时区(如 `deepseek-v4` 的 tz=UTC 但节假日按 `Asia/Shanghai` 判)。 * * **已声明并消费**(`parseProfile` 会带进 `RateProfile.schedule`):2026-09-30 随快照 * 刷新发现该键存在却未被声明 —— 与 `publicHolidayDates` 当初被丢同一形态。 */ publicHolidayTimeZone?: unknown; overrides?: RawOverride[]; }; /** 各时段态的定义。键名不止 `peak`/`offPeak`/`campaign` —— 促销类名字(promotion 等)也在此。 */ periods?: Record; source?: string; verifiedAt?: string; } export interface RawCatalog { schemaVersion?: number; updatedAt?: string; defaultProfile?: string; profiles?: RawProfile[]; } export interface ParsedCatalog { schemaVersion: number; updatedAt?: string; profiles: RateProfile[]; } /** * 解析并校验整份数据源。 * * @param raw - 已解析的 JSON 对象(来自内置快照、本地缓存或远端)。 * @returns 校验通过的目录;schemaVersion 不支持或 profiles 为空时返回 undefined。 */ export declare function parseCatalog(raw: unknown): ParsedCatalog | undefined; export {};