/** QuoteProvider 接口契约(PRD 附录 A / 技术设计 §7.1) */ export type ProviderAddress = { street: string; city: string; state: string; zip: string; placeId: string; formattedAddress: string; selectedFromSuggestions: boolean; mothershipOptionId: string; mothershipDisplayLabel: string; selectedFromMothership: boolean; }; export type QuoteRequest = { cargoHash: string; /** 候选 API 返回的单会话 ID,复用 browser storageState */ quoteSessionId?: string; pickup: ProviderAddress; delivery: ProviderAddress; weightLb: number; dimsIn: { l: number; w: number; h: number }; palletCount: number; cargoType: string; /** MotherShip dashboard 登录态:附加服务 / 可提货时间 */ pickupAccessorials?: string[]; deliveryAccessorials?: string[]; readyDate?: string; readyTime?: string; cargoLines?: Array<{ cargoType: string; quantity: number; weightLb: number; lengthIn: number; widthIn: number; heightIn: number; }>; mothershipDetails?: { pickup?: { company_name?: string; suite?: string; contact_first?: string; contact_last?: string; contact_email?: string; contact_phone?: string; reference?: string; notes?: string; opens_at?: string; closes_at?: string; }; delivery?: { company_name?: string; suite?: string; contact_first?: string; contact_last?: string; contact_email?: string; contact_phone?: string; reference?: string; notes?: string; opens_at?: string; closes_at?: string; }; request_delivery_appointment?: boolean; fba_number?: string; fba_po_number?: string; cargo?: Array<{ piece_count_type?: string; piece_count_qty?: number; description?: string; nmfc?: string; hazmat?: boolean; alcohol?: boolean; tobacco?: boolean; }>; }; }; export type RateOptionKind = "lowest" | "fastest" | "bestValue" | (string & {}); export type QuoteItem = { serviceLevel: string; rateOption: RateOptionKind; carrier: string; transitDays: string; transitDescription: string; rawFreight: number; surcharges: number; rawTotal: number; }; export type QuoteResult = { /** 至少含核心 4 档;MotherShip 有 bestValue 等扩展档时一并返回 */ items: QuoteItem[]; sourceType: "rpa"; confidenceScore: number; }; export interface QuoteProvider { getQuote(req: QuoteRequest): Promise; healthCheck(): Promise; }