/** * Offer Preview V1 — a stateless, non-binding read of what a target would * cost and what booking it would require. * * A storefront detail page has to show a live price and render the right * configuration controls *before* the shopper has done anything that looks * like booking. Moving a pax stepper is not an attempt to book, so it must not * mint a Booking Session: Sessions are persisted, revisioned, * capability-bearing, expiring rows that a sweep has to reap, and one per * keystroke floods `booking_sessions` at real traffic. * * This is deliberately NOT beta's `POST /catalog/quote` under a new name. Four * structural invariants keep it from drifting back into one: * * 1. It mints no identifier — the result carries no `id`, no `quoteId`, no * token of any kind, so there is nothing to present later as authority. * 2. It persists nothing — no Session row, no Quote row, no capability cookie. * 3. It says `binding: false` explicitly rather than leaving it to be inferred. * 4. Because it has no id at all, the result is not assignable anywhere a * `quoteId` is required (`commitBookingSessionV1`, `placeBookingHoldV1`). * `preview-contracts.test.ts` asserts the absence of those keys so a future * field addition cannot quietly undo it. * * A fifth property follows: for a given `(target, scope, selection)` the read * is deterministic and therefore cacheable. */ import { z } from "zod"; /** * What a preview may be taken of. * * Wider than `createBookingSessionTargetV1` on purpose, and the asymmetry is * the decision rather than an oversight. **A preview is a read, so it admits * any bookable target.** Session creation stays deliberately narrower because * creating a Session is a *write*: it allocates capability and capacity, mints * a persisted revisioned row and starts an expiry clock. Reads and writes are * allowed to disagree about their input surface, and the cost of being wrong * differs by orders of magnitude. * * Concretely: accommodations and cruises are `owned_entity` targets, and their * storefront detail pages have to show a price. Restricting the preview to the * Session create union would have left two of the three shipped detail pages * unable to ask what anything costs. * * Members are reused from `bookingSessionTargetV1` rather than redeclared, so * the two unions cannot drift field by field. `trip_snapshot` is left out: it * is composed server-side from an accepted Proposal and is never what a * storefront detail page is pointed at. */ export declare const offerPreviewTargetV1: z.ZodDiscriminatedUnion<[z.ZodObject<{ kind: z.ZodLiteral<"product">; productId: z.ZodString; }, z.core.$strict>, z.ZodObject<{ kind: z.ZodLiteral<"catalog_item">; catalogItemId: z.ZodString; }, z.core.$strict>, z.ZodObject<{ kind: z.ZodLiteral<"owned_entity">; entityModule: z.ZodString; entityId: z.ZodString; }, z.core.$strict>], "kind">; export type OfferPreviewTargetV1 = z.infer; /** * What a detail page asks about. * * The commercial scope and the public selection schema are the same ones the * Session create path takes — a preview whose selection the Session plane * could not accept would be quoting something the shopper can never buy. * * There is no `audience` here for the same reason `bookingSessionScopeV1` has * none: audience selects staff/partner price tiers and staff-visible content, * so it is derived server-side from the caller's `actorKind`. Accepting it on * the wire would let any storefront visitor ask for staff pricing by name. */ export declare const offerPreviewRequestV1: z.ZodObject<{ target: z.ZodDiscriminatedUnion<[z.ZodObject<{ kind: z.ZodLiteral<"product">; productId: z.ZodString; }, z.core.$strict>, z.ZodObject<{ kind: z.ZodLiteral<"catalog_item">; catalogItemId: z.ZodString; }, z.core.$strict>, z.ZodObject<{ kind: z.ZodLiteral<"owned_entity">; entityModule: z.ZodString; entityId: z.ZodString; }, z.core.$strict>], "kind">; scope: z.ZodObject<{ locale: z.ZodString; market: z.ZodString; currency: z.ZodOptional; }, z.core.$strip>; selection: z.ZodOptional; templateId: z.ZodString; templateVersionId: z.ZodString; contentDigest: z.ZodString; }, z.core.$strip>>; configure: z.ZodDefault; departureDate: z.ZodOptional; departureAirportCode: z.ZodOptional; nights: z.ZodOptional; departureTime: z.ZodOptional; pax: z.ZodDefault>; variantId: z.ZodOptional; optionSelections: z.ZodOptional; optionUnitId: z.ZodOptional; optionUnitName: z.ZodOptional; quantity: z.ZodNumber; }, z.core.$strip>>>; cabinCategoryId: z.ZodOptional; sailingId: z.ZodOptional; occupancy: z.ZodOptional; passengerComposition: z.ZodOptional; childAges: z.ZodOptional>; infants: z.ZodOptional; seniors: z.ZodOptional; }, z.core.$strip>>; fareCode: z.ZodNullable>; fareVariant: z.ZodNullable>>; bookingTerms: z.ZodNullable>>; cabinNumberId: z.ZodOptional; roomTypeId: z.ZodOptional; ratePlanId: z.ZodOptional; board: z.ZodOptional; dateRange: z.ZodOptional>; airArrangement: z.ZodOptional>; }, z.core.$strip>>; billing: z.ZodDefault>; organizationId: z.ZodOptional; contact: z.ZodObject<{ firstName: z.ZodDefault; lastName: z.ZodDefault; email: z.ZodDefault, z.ZodEmail]>>; phone: z.ZodOptional; personId: z.ZodOptional; }, z.core.$strip>; address: z.ZodDefault; line2: z.ZodOptional; city: z.ZodOptional; region: z.ZodOptional; postal: z.ZodOptional; country: z.ZodOptional; }, z.core.$strip>>; company: z.ZodOptional; registrationNumber: z.ZodOptional; }, z.core.$strip>>; saveAsDefault: z.ZodOptional; }, z.core.$strip>>; travelers: z.ZodDefault; firstName: z.ZodString; lastName: z.ZodString; email: z.ZodOptional, z.ZodEmail]>>; phone: z.ZodOptional; personId: z.ZodOptional; band: z.ZodDefault; dateOfBirth: z.ZodOptional; documents: z.ZodOptional>; preferredLanguage: z.ZodOptional; specialRequests: z.ZodOptional; isPrimary: z.ZodOptional; }, z.core.$strip>>>; accommodation: z.ZodOptional; occupancy: z.ZodOptional; childrenAges: z.ZodOptional>; infants: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strip>>; travelerAssignments: z.ZodDefault>; sharedRoom: z.ZodOptional; groupId: z.ZodOptional; label: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>>; addons: z.ZodDefault>>; ancillaries: z.ZodDefault; offerId: z.ZodOptional; sourceId: z.ZodOptional; providerId: z.ZodOptional; quoteRef: z.ZodOptional; acceptedPriceMinor: z.ZodOptional; acceptedCurrency: z.ZodOptional; travelers: z.ZodDefault>; }, z.core.$strict>>>; selectedOptionIds: z.ZodDefault>; acceptedDisclosures: z.ZodDefault>>; }, z.core.$strict>>>; payment: z.ZodDefault>; schedule: z.ZodOptional; }, z.core.$strip>>; paymentSchedules: z.ZodOptional; status: z.ZodEnum<{ pending: "pending"; cancelled: "cancelled"; due: "due"; paid: "paid"; waived: "waived"; expired: "expired"; }>; dueDate: z.ZodString; currency: z.ZodString; amountCents: z.ZodNumber; notes: z.ZodOptional>; }, z.core.$strip>>>; promotionCode: z.ZodOptional; customerNotes: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>; export type OfferPreviewRequestV1 = z.input; /** * The non-binding result. * * `requirements` is REQUIRED, and that is the load-bearing part of the shape: * a detail page must be able to draw its pax steppers, date pickers and option * lists even when the target is sold out or unpriced. Requirements that * evaporated with the price would leave the shopper unable to change the very * selection that made it unavailable. * * `pricing` is what is optional. `available: false` plus `unavailableReason` * says why there is no number to show. */ export declare const offerPreviewResultV1: z.ZodObject<{ binding: z.ZodLiteral; available: z.ZodBoolean; requirements: z.ZodObject<{ showsConfigure: z.ZodBoolean; showsBilling: z.ZodBoolean; showsTravelers: z.ZodBoolean; showsAccommodation: z.ZodBoolean; showsAddons: z.ZodBoolean; showsAncillaries: z.ZodDefault; showsPayment: z.ZodBoolean; showsReview: z.ZodLiteral; configureSubSteps: z.ZodOptional; required: z.ZodLiteral; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"product-option">; options: z.ZodArray>; name: z.ZodString; description: z.ZodOptional>; isDefault: z.ZodOptional; units: z.ZodOptional>; unitType: z.ZodOptional>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; }, z.core.$strip>>>; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"option-units">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"cabin-category">; categories: z.ZodArray; name: z.ZodString; type: z.ZodOptional; capacityMin: z.ZodOptional; capacityMax: z.ZodOptional; description: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"cabin-number">; perCategory: z.ZodRecord; label: z.ZodString; capacity: z.ZodOptional; hasAccessibilityFeatures: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"date-range">; minNights: z.ZodNumber; maxNights: z.ZodNumber; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"occupancy">; bands: z.ZodArray; maxAge: z.ZodOptional; minCount: z.ZodNumber; maxCount: z.ZodNumber; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"air-arrangement">; required: z.ZodOptional; }, z.core.$strip>], "kind">>>; paxBands: z.ZodArray; maxAge: z.ZodOptional; minCount: z.ZodNumber; maxCount: z.ZodNumber; }, z.core.$strip>>; paxBandsAllowedTotal: z.ZodObject<{ min: z.ZodNumber; max: z.ZodNumber; }, z.core.$strip>; paxBandDependencies: z.ZodOptional; maxPerMaster: z.ZodOptional; maxDependentSum: z.ZodOptional; }, z.core.$strip>>>; travelerFields: z.ZodArray>>; appliesToBands: z.ZodOptional>; maxLength: z.ZodOptional; }, z.core.$strip>>; bookingFields: z.ZodArray; maxLength: z.ZodOptional; }, z.core.$strip>>; accommodation: z.ZodOptional>; capacity: z.ZodOptional>; baseRateHint: z.ZodOptional>; ratePlans: z.ZodOptional>; chargeFrequency: z.ZodOptional>; cancellationPolicy: z.ZodOptional>; inclusions: z.ZodOptional>; currency: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>>>; sharedRoomAllowed: z.ZodBoolean; subSteps: z.ZodOptional; options: z.ZodArray>; capacity: z.ZodOptional>; baseRateHint: z.ZodOptional>; ratePlans: z.ZodOptional>; chargeFrequency: z.ZodOptional>; cancellationPolicy: z.ZodOptional>; inclusions: z.ZodOptional>; currency: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>>; sharedRoomAllowed: z.ZodBoolean; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"extensions">; options: z.ZodArray>; side: z.ZodEnum<{ pre: "pre"; post: "post"; }>; nights: z.ZodOptional>; pricePerPersonHint: z.ZodOptional>; }, z.core.$strip>>; allowsPre: z.ZodBoolean; allowsPost: z.ZodBoolean; }, z.core.$strip>], "kind">>>; }, z.core.$strip>>; addons: z.ZodOptional>; kind: z.ZodEnum<{ extras: "extras"; excursions: "excursions"; insurance: "insurance"; }>; groupKey: z.ZodOptional>; pricingMode: z.ZodOptional>; unitAmountCents: z.ZodOptional>; currency: z.ZodOptional>; pricedPerPerson: z.ZodOptional>; selectionType: z.ZodOptional>>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; defaultQuantity: z.ZodOptional>; }, z.core.$strip>>>; groups: z.ZodOptional; label: z.ZodString; groupBy: z.ZodOptional>; perGuestSelection: z.ZodBoolean; items: z.ZodArray>; kind: z.ZodEnum<{ extras: "extras"; excursions: "excursions"; insurance: "insurance"; }>; groupKey: z.ZodOptional>; pricingMode: z.ZodOptional>; unitAmountCents: z.ZodOptional>; currency: z.ZodOptional>; pricedPerPerson: z.ZodOptional>; selectionType: z.ZodOptional>>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; defaultQuantity: z.ZodOptional>; }, z.core.$strip>>; }, z.core.$strip>>>; }, z.core.$strip>>; ancillaries: z.ZodOptional>; planLabel: z.ZodOptional>; price: z.ZodObject<{ amountMinor: z.ZodNumber; currency: z.ZodString; }, z.core.$strict>; pricedPerPerson: z.ZodDefault; highlights: z.ZodDefault; }, z.core.$strict>>>; eligibility: z.ZodObject<{ status: z.ZodEnum<{ eligible: "eligible"; ineligible: "ineligible"; referral: "referral"; }>; reasons: z.ZodDefault>>; }, z.core.$strict>; disclosures: z.ZodDefault; required: z.ZodBoolean; }, z.core.$strict>>>; requiredTravelerFields: z.ZodDefault; options: z.ZodOptional>>; helpText: z.ZodOptional; }, z.core.$strict>>>; validUntil: z.ZodString; quoteRef: z.ZodString; metadata: z.ZodOptional>; }, z.core.$strict>>>; diagnostics: z.ZodDefault; status: z.ZodEnum<{ timeout: "timeout"; ok: "ok"; unavailable: "unavailable"; error: "error"; }>; message: z.ZodOptional; latencyMs: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>>; }, z.core.$strip>>; paymentIntents: z.ZodArray>; }, z.core.$strip>; pricing: z.ZodOptional; label: z.ZodString; quantity: z.ZodOptional; unitAmount: z.ZodNumber; totalAmount: z.ZodNumber; taxIncluded: z.ZodOptional; pricingBasis: z.ZodOptional>; componentId: z.ZodOptional; optionId: z.ZodOptional; optionUnitId: z.ZodOptional; authority: z.ZodOptional>; }, z.core.$strip>>; taxes: z.ZodArray; scope: z.ZodOptional>; componentId: z.ZodOptional; }, z.core.$strip>>; subtotal: z.ZodNumber; taxTotal: z.ZodNumber; total: z.ZodNumber; appliedOffers: z.ZodOptional; discountPercent: z.ZodNullable; discountAmountCents: z.ZodNullable; appliedCode: z.ZodNullable; stackable: z.ZodBoolean; }, z.core.$strip>>>; promotionCodeStatus: z.ZodOptional; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_not_found">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_expired">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_not_yet_valid">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_not_applicable">; reason: z.ZodEnum<{ currency: "currency"; scope: "scope"; min_pax: "min_pax"; eligibility: "eligibility"; }>; }, z.core.$strip>], "kind">>; policyEvidence: z.ZodOptional; bookingTerms: z.ZodOptional; }, z.core.$strip>>; componentPolicies: z.ZodOptional; bookingTerms: z.ZodOptional; componentId: z.ZodString; }, z.core.$strip>>>; }, z.core.$strip>>; unavailableReason: z.ZodOptional>; }, z.core.$strip>; export type OfferPreviewResultV1 = z.infer; /** * Preview outcome, shaped like `bookingSessionOutcomeV1`: rejections are * carried in the 200 body rather than as transport errors, so a host reads one * discriminated union instead of branching on status codes. * * Rejections reuse `bookingSessionLifecycleErrorV1` rather than declaring a * parallel error vocabulary — a preview can only fail the ways a Session read * of the same target fails (`not_authorized`, `invalid_selection`, * `quote_unavailable`). */ export declare const offerPreviewOutcomeV1: z.ZodDiscriminatedUnion<[z.ZodObject<{ kind: z.ZodLiteral<"offer_preview">; preview: z.ZodObject<{ binding: z.ZodLiteral; available: z.ZodBoolean; requirements: z.ZodObject<{ showsConfigure: z.ZodBoolean; showsBilling: z.ZodBoolean; showsTravelers: z.ZodBoolean; showsAccommodation: z.ZodBoolean; showsAddons: z.ZodBoolean; showsAncillaries: z.ZodDefault; showsPayment: z.ZodBoolean; showsReview: z.ZodLiteral; configureSubSteps: z.ZodOptional; required: z.ZodLiteral; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"product-option">; options: z.ZodArray>; name: z.ZodString; description: z.ZodOptional>; isDefault: z.ZodOptional; units: z.ZodOptional>; unitType: z.ZodOptional>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; }, z.core.$strip>>>; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"option-units">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"cabin-category">; categories: z.ZodArray; name: z.ZodString; type: z.ZodOptional; capacityMin: z.ZodOptional; capacityMax: z.ZodOptional; description: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"cabin-number">; perCategory: z.ZodRecord; label: z.ZodString; capacity: z.ZodOptional; hasAccessibilityFeatures: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"date-range">; minNights: z.ZodNumber; maxNights: z.ZodNumber; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"occupancy">; bands: z.ZodArray; maxAge: z.ZodOptional; minCount: z.ZodNumber; maxCount: z.ZodNumber; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"air-arrangement">; required: z.ZodOptional; }, z.core.$strip>], "kind">>>; paxBands: z.ZodArray; maxAge: z.ZodOptional; minCount: z.ZodNumber; maxCount: z.ZodNumber; }, z.core.$strip>>; paxBandsAllowedTotal: z.ZodObject<{ min: z.ZodNumber; max: z.ZodNumber; }, z.core.$strip>; paxBandDependencies: z.ZodOptional; maxPerMaster: z.ZodOptional; maxDependentSum: z.ZodOptional; }, z.core.$strip>>>; travelerFields: z.ZodArray>>; appliesToBands: z.ZodOptional>; maxLength: z.ZodOptional; }, z.core.$strip>>; bookingFields: z.ZodArray; maxLength: z.ZodOptional; }, z.core.$strip>>; accommodation: z.ZodOptional>; capacity: z.ZodOptional>; baseRateHint: z.ZodOptional>; ratePlans: z.ZodOptional>; chargeFrequency: z.ZodOptional>; cancellationPolicy: z.ZodOptional>; inclusions: z.ZodOptional>; currency: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>>>; sharedRoomAllowed: z.ZodBoolean; subSteps: z.ZodOptional; options: z.ZodArray>; capacity: z.ZodOptional>; baseRateHint: z.ZodOptional>; ratePlans: z.ZodOptional>; chargeFrequency: z.ZodOptional>; cancellationPolicy: z.ZodOptional>; inclusions: z.ZodOptional>; currency: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>>; sharedRoomAllowed: z.ZodBoolean; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"extensions">; options: z.ZodArray>; side: z.ZodEnum<{ pre: "pre"; post: "post"; }>; nights: z.ZodOptional>; pricePerPersonHint: z.ZodOptional>; }, z.core.$strip>>; allowsPre: z.ZodBoolean; allowsPost: z.ZodBoolean; }, z.core.$strip>], "kind">>>; }, z.core.$strip>>; addons: z.ZodOptional>; kind: z.ZodEnum<{ extras: "extras"; excursions: "excursions"; insurance: "insurance"; }>; groupKey: z.ZodOptional>; pricingMode: z.ZodOptional>; unitAmountCents: z.ZodOptional>; currency: z.ZodOptional>; pricedPerPerson: z.ZodOptional>; selectionType: z.ZodOptional>>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; defaultQuantity: z.ZodOptional>; }, z.core.$strip>>>; groups: z.ZodOptional; label: z.ZodString; groupBy: z.ZodOptional>; perGuestSelection: z.ZodBoolean; items: z.ZodArray>; kind: z.ZodEnum<{ extras: "extras"; excursions: "excursions"; insurance: "insurance"; }>; groupKey: z.ZodOptional>; pricingMode: z.ZodOptional>; unitAmountCents: z.ZodOptional>; currency: z.ZodOptional>; pricedPerPerson: z.ZodOptional>; selectionType: z.ZodOptional>>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; defaultQuantity: z.ZodOptional>; }, z.core.$strip>>; }, z.core.$strip>>>; }, z.core.$strip>>; ancillaries: z.ZodOptional>; planLabel: z.ZodOptional>; price: z.ZodObject<{ amountMinor: z.ZodNumber; currency: z.ZodString; }, z.core.$strict>; pricedPerPerson: z.ZodDefault; highlights: z.ZodDefault; }, z.core.$strict>>>; eligibility: z.ZodObject<{ status: z.ZodEnum<{ eligible: "eligible"; ineligible: "ineligible"; referral: "referral"; }>; reasons: z.ZodDefault>>; }, z.core.$strict>; disclosures: z.ZodDefault; required: z.ZodBoolean; }, z.core.$strict>>>; requiredTravelerFields: z.ZodDefault; options: z.ZodOptional>>; helpText: z.ZodOptional; }, z.core.$strict>>>; validUntil: z.ZodString; quoteRef: z.ZodString; metadata: z.ZodOptional>; }, z.core.$strict>>>; diagnostics: z.ZodDefault; status: z.ZodEnum<{ timeout: "timeout"; ok: "ok"; unavailable: "unavailable"; error: "error"; }>; message: z.ZodOptional; latencyMs: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>>; }, z.core.$strip>>; paymentIntents: z.ZodArray>; }, z.core.$strip>; pricing: z.ZodOptional; label: z.ZodString; quantity: z.ZodOptional; unitAmount: z.ZodNumber; totalAmount: z.ZodNumber; taxIncluded: z.ZodOptional; pricingBasis: z.ZodOptional>; componentId: z.ZodOptional; optionId: z.ZodOptional; optionUnitId: z.ZodOptional; authority: z.ZodOptional>; }, z.core.$strip>>; taxes: z.ZodArray; scope: z.ZodOptional>; componentId: z.ZodOptional; }, z.core.$strip>>; subtotal: z.ZodNumber; taxTotal: z.ZodNumber; total: z.ZodNumber; appliedOffers: z.ZodOptional; discountPercent: z.ZodNullable; discountAmountCents: z.ZodNullable; appliedCode: z.ZodNullable; stackable: z.ZodBoolean; }, z.core.$strip>>>; promotionCodeStatus: z.ZodOptional; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_not_found">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_expired">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_not_yet_valid">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"code_not_applicable">; reason: z.ZodEnum<{ currency: "currency"; scope: "scope"; min_pax: "min_pax"; eligibility: "eligibility"; }>; }, z.core.$strip>], "kind">>; policyEvidence: z.ZodOptional; bookingTerms: z.ZodOptional; }, z.core.$strip>>; componentPolicies: z.ZodOptional; bookingTerms: z.ZodOptional; componentId: z.ZodString; }, z.core.$strip>>>; }, z.core.$strip>>; unavailableReason: z.ZodOptional>; }, z.core.$strip>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"rejected">; error: z.ZodDiscriminatedUnion<[z.ZodObject<{ kind: z.ZodLiteral<"revision_conflict">; expectedRevision: z.ZodNumber; actualRevision: z.ZodNumber; actualState: z.ZodEnum<{ active: "active"; expired: "expired"; consumed: "consumed"; abandoned: "abandoned"; supplier_pending: "supplier_pending"; component_pending: "component_pending"; }>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"session_expired">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"session_consumed">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"capability_required">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"capability_scope_required">; action: z.ZodEnum<{ hold: "hold"; quote: "quote"; read: "read"; update: "update"; commit: "commit"; abandon: "abandon"; adopt: "adopt"; renew: "renew"; }>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"not_authorized">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"idempotency_conflict">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"supplier_operation_active">; nextAction: z.ZodLiteral<"reconcile_supplier_operation">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"payment_in_flight">; nextAction: z.ZodLiteral<"await_payment_outcome">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"quote_unavailable">; requirements: z.ZodOptional; showsPayment: z.ZodBoolean; showsReview: z.ZodLiteral; configureSubSteps: z.ZodOptional; required: z.ZodLiteral; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"product-option">; options: z.ZodArray>; name: z.ZodString; description: z.ZodOptional>; isDefault: z.ZodOptional; units: z.ZodOptional>; unitType: z.ZodOptional>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; }, z.core.$strip>>>; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"option-units">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"cabin-category">; categories: z.ZodArray; name: z.ZodString; type: z.ZodOptional; capacityMin: z.ZodOptional; capacityMax: z.ZodOptional; description: z.ZodOptional; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"cabin-number">; perCategory: z.ZodRecord; label: z.ZodString; capacity: z.ZodOptional; hasAccessibilityFeatures: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"date-range">; minNights: z.ZodNumber; maxNights: z.ZodNumber; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"occupancy">; bands: z.ZodArray; maxAge: z.ZodOptional; minCount: z.ZodNumber; maxCount: z.ZodNumber; }, z.core.$strip>>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"air-arrangement">; required: z.ZodOptional; }, z.core.$strip>], "kind">>>; paxBands: z.ZodArray; maxAge: z.ZodOptional; minCount: z.ZodNumber; maxCount: z.ZodNumber; }, z.core.$strip>>; paxBandsAllowedTotal: z.ZodObject<{ min: z.ZodNumber; max: z.ZodNumber; }, z.core.$strip>; paxBandDependencies: z.ZodOptional; maxPerMaster: z.ZodOptional; maxDependentSum: z.ZodOptional; }, z.core.$strip>>>; travelerFields: z.ZodArray>>; appliesToBands: z.ZodOptional>; maxLength: z.ZodOptional; }, z.core.$strip>>; bookingFields: z.ZodArray; maxLength: z.ZodOptional; }, z.core.$strip>>; accommodation: z.ZodOptional>; capacity: z.ZodOptional>; baseRateHint: z.ZodOptional>; ratePlans: z.ZodOptional>; chargeFrequency: z.ZodOptional>; cancellationPolicy: z.ZodOptional>; inclusions: z.ZodOptional>; currency: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>>>; sharedRoomAllowed: z.ZodBoolean; subSteps: z.ZodOptional; options: z.ZodArray>; capacity: z.ZodOptional>; baseRateHint: z.ZodOptional>; ratePlans: z.ZodOptional>; chargeFrequency: z.ZodOptional>; cancellationPolicy: z.ZodOptional>; inclusions: z.ZodOptional>; currency: z.ZodOptional; }, z.core.$strip>>>; }, z.core.$strip>>; sharedRoomAllowed: z.ZodBoolean; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"extensions">; options: z.ZodArray>; side: z.ZodEnum<{ pre: "pre"; post: "post"; }>; nights: z.ZodOptional>; pricePerPersonHint: z.ZodOptional>; }, z.core.$strip>>; allowsPre: z.ZodBoolean; allowsPost: z.ZodBoolean; }, z.core.$strip>], "kind">>>; }, z.core.$strip>>; addons: z.ZodOptional>; kind: z.ZodEnum<{ extras: "extras"; excursions: "excursions"; insurance: "insurance"; }>; groupKey: z.ZodOptional>; pricingMode: z.ZodOptional>; unitAmountCents: z.ZodOptional>; currency: z.ZodOptional>; pricedPerPerson: z.ZodOptional>; selectionType: z.ZodOptional>>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; defaultQuantity: z.ZodOptional>; }, z.core.$strip>>>; groups: z.ZodOptional; label: z.ZodString; groupBy: z.ZodOptional>; perGuestSelection: z.ZodBoolean; items: z.ZodArray>; kind: z.ZodEnum<{ extras: "extras"; excursions: "excursions"; insurance: "insurance"; }>; groupKey: z.ZodOptional>; pricingMode: z.ZodOptional>; unitAmountCents: z.ZodOptional>; currency: z.ZodOptional>; pricedPerPerson: z.ZodOptional>; selectionType: z.ZodOptional>>; minQuantity: z.ZodOptional>; maxQuantity: z.ZodOptional>; defaultQuantity: z.ZodOptional>; }, z.core.$strip>>; }, z.core.$strip>>>; }, z.core.$strip>>; ancillaries: z.ZodOptional>; planLabel: z.ZodOptional>; price: z.ZodObject<{ amountMinor: z.ZodNumber; currency: z.ZodString; }, z.core.$strict>; pricedPerPerson: z.ZodDefault; highlights: z.ZodDefault; }, z.core.$strict>>>; eligibility: z.ZodObject<{ status: z.ZodEnum<{ eligible: "eligible"; ineligible: "ineligible"; referral: "referral"; }>; reasons: z.ZodDefault>>; }, z.core.$strict>; disclosures: z.ZodDefault; required: z.ZodBoolean; }, z.core.$strict>>>; requiredTravelerFields: z.ZodDefault; options: z.ZodOptional>>; helpText: z.ZodOptional; }, z.core.$strict>>>; validUntil: z.ZodString; quoteRef: z.ZodString; metadata: z.ZodOptional>; }, z.core.$strict>>>; diagnostics: z.ZodDefault; status: z.ZodEnum<{ timeout: "timeout"; ok: "ok"; unavailable: "unavailable"; error: "error"; }>; message: z.ZodOptional; latencyMs: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>>; }, z.core.$strip>>; paymentIntents: z.ZodArray>; }, z.core.$strip>>; reason: z.ZodEnum<{ target_not_found: "target_not_found"; target_not_bookable: "target_not_bookable"; price_unavailable: "price_unavailable"; policy_unavailable: "policy_unavailable"; selection_unavailable: "selection_unavailable"; }>; nextAction: z.ZodEnum<{ select_alternative_inventory: "select_alternative_inventory"; contact_operator: "contact_operator"; update_selection: "update_selection"; }>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"commit_rejected">; reason: z.ZodEnum<{ entity_not_found: "entity_not_found"; entity_not_bookable: "entity_not_bookable"; incomplete_draft: "incomplete_draft"; price_changed: "price_changed"; }>; nextAction: z.ZodEnum<{ request_fresh_quote: "request_fresh_quote"; select_alternative_inventory: "select_alternative_inventory"; update_selection: "update_selection"; }>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"selection_incomplete">; unsatisfied: z.ZodArray; }, z.core.$strip>>; nextAction: z.ZodLiteral<"update_selection">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"requirements_changed">; requirementsFingerprint: z.ZodString; nextAction: z.ZodLiteral<"request_fresh_quote">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"checkout_intent_not_offered">; checkoutIntent: z.ZodEnum<{ hold: "hold"; card: "card"; ticket_on_credit: "ticket_on_credit"; bank_transfer: "bank_transfer"; inquiry: "inquiry"; }>; offeredCheckoutIntents: z.ZodArray>; nextAction: z.ZodLiteral<"select_supported_checkout_intent">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"invalid_selection">; reason: z.ZodEnum<{ unsupported_target: "unsupported_target"; forbidden_field: "forbidden_field"; value_too_long: "value_too_long"; }>; path: z.ZodOptional; maxLength: z.ZodOptional; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"renewal_not_allowed">; reason: z.ZodEnum<{ session_not_active: "session_not_active"; extension_too_large: "extension_too_large"; absolute_lifetime_exceeded: "absolute_lifetime_exceeded"; }>; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"quote_required">; nextAction: z.ZodLiteral<"request_fresh_quote">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodEnum<{ quote_expired: "quote_expired"; quote_superseded: "quote_superseded"; }>; nextAction: z.ZodLiteral<"request_fresh_quote">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodEnum<{ hold_required: "hold_required"; hold_expired: "hold_expired"; availability_changed: "availability_changed"; }>; nextAction: z.ZodLiteral<"request_new_hold">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"hold_quantity_mismatch">; requestedQuantity: z.ZodNumber; expectedQuantity: z.ZodNumber; nextAction: z.ZodLiteral<"request_hold_for_expected_quantity">; }, z.core.$strip>, z.ZodObject<{ kind: z.ZodLiteral<"commit_already_consumed">; nextAction: z.ZodLiteral<"return_idempotent_result">; }, z.core.$strip>], "kind">; }, z.core.$strip>], "kind">; export type OfferPreviewOutcomeV1 = z.infer;