@bowmark/web 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,9 +5,9 @@
5
5
  // rather than imported. An `import` or `export` at the top level of this file would
6
6
  // turn it into a module and every declaration below would stop being global.
7
7
  //
8
- // Manifest version: a400421498212bf60bfaab4808ff698bd8edb4febae1ba86fda5cb9ebc232c1b
9
- // 9 capabilities, 109 providers, 356 typed functions, 20 refused.
10
- // 51,714 family members, sharing 2 interface(s) — declared once and pointed at, never repeated per member.
8
+ // Manifest version: be4cdedcfa4c990cc2208fd7e5f33c2dd386c9c210168b9f2c02f259fbe8fbba
9
+ // 9 capabilities, 141 providers, 422 typed functions, 20 refused.
10
+ // 51,715 family members, sharing 2 interface(s) — declared once and pointed at, never repeated per member.
11
11
  //
12
12
  // REFUSED — these functions are real and callable, and their declared arguments
13
13
  // carry no types, so no honest signature exists. Each one is commented in place
@@ -1646,6 +1646,80 @@ interface AshleyFurnitureStore {
1646
1646
  }
1647
1647
  }
1648
1648
 
1649
+ declare namespace BowmarkProvider_atlasoceanvoyages {
1650
+ // ── Atlas Ocean Voyages — the unit's own declarations, verbatim ──
1651
+ // Atlas Ocean Voyages' OWN shapes — not a capability contract.
1652
+
1653
+ interface AtlasVoyageSummary {
1654
+ code: string; // the site's own itinerary code, e.g. "WVO260815"
1655
+ slug: string; // the key getVoyage takes
1656
+ title: string;
1657
+ destinations: string[];
1658
+ ship: string;
1659
+ durationNights: number;
1660
+ departDate: string; // "2026-08-15"
1661
+ endDate: string;
1662
+ startingPrice: number | null; // null = call-for-fares, not a read failure
1663
+ startingPriceFormatted: string | null;
1664
+ detailUrl: string;
1665
+ }
1666
+
1667
+ interface AtlasVoyageSearchResult { voyages: AtlasVoyageSummary[]; totalMatched: number }
1668
+
1669
+ interface AtlasPortStop { name: string; code: string; arriving: string | null; departing: string | null; atSea: boolean }
1670
+
1671
+ interface AtlasCabinPrice { code: string; name: string; totalPrice: number; totalPriceFormatted: string }
1672
+
1673
+ interface AtlasVoyageDetail {
1674
+ code: string;
1675
+ slug: string;
1676
+ title: string;
1677
+ heroTitle: string | null;
1678
+ summary: string | null;
1679
+ ship: string;
1680
+ durationNights: number;
1681
+ departDate: string;
1682
+ endDate: string;
1683
+ ports: AtlasPortStop[];
1684
+ cabinPrices: AtlasCabinPrice[]; // only the categories THIS sailing has live pricing for
1685
+ startingPrice: number | null;
1686
+ startingPriceFormatted: string | null;
1687
+ bookingUrl: string; // bookings.atlasoceanvoyages.com — the real handoff
1688
+ detailUrl: string;
1689
+ }
1690
+
1691
+ /**
1692
+ * Luxury expedition cruise voyage search from Atlas Ocean Voyages — filter the site's own 180
1693
+ * live itineraries by destination, ship, duration and departure date with real starting
1694
+ * prices, then read one voyage's full port-by-port day itinerary, every cabin category the
1695
+ * site has actually priced for that sailing, and the itinerary-code-keyed handoff URL into the
1696
+ * real booking engine.
1697
+ */
1698
+ interface Unit {
1699
+ /**
1700
+ * Runs the /search voyage finder over all 180 currently-published itineraries, filtered by
1701
+ * destination (substring, e.g. "Antarctica"), ship (substring, e.g. "World Voyager"), duration
1702
+ * bounds, departure-date bounds and a free-text title match, sorted by departure date. Takes
1703
+ * no argument for the full unfiltered list (capped at `limit`, default 20, max 50).
1704
+ * `totalMatched` is the count BEFORE the cap, so a caller can tell "20 of 20" from "20 of 61".
1705
+ * `startingPrice` is null on a genuine call-for-fares sailing, never omitted — filter on it
1706
+ * explicitly rather than assuming presence.
1707
+ */
1708
+ searchVoyages(args?: { destination?: string; ship?: string; minDurationNights?: number; maxDurationNights?: number; departAfter?: string; departBefore?: string; query?: string; limit?: number }): Promise<AtlasVoyageSearchResult>;
1709
+
1710
+ /**
1711
+ * Reads one voyage's full detail page: the port-by-port day-by-day schedule (arrival/departure
1712
+ * times, or `atSea: true` for a scenic-cruising leg with no landing), every cabin category the
1713
+ * site has ACTUALLY priced for this specific sailing — never the ship's full rate card, since
1714
+ * a sailing sells out of most categories long before departure — and `bookingUrl`, the
1715
+ * itinerary-code-keyed handoff into bookings.atlasoceanvoyages.com where a caller actually
1716
+ * holds or pays for a cabin. `slug` comes from searchVoyages(). THROWS on an unknown slug,
1717
+ * naming searchVoyages() as the way to find current ones.
1718
+ */
1719
+ getVoyage(slug: string): Promise<AtlasVoyageDetail>;
1720
+ }
1721
+ }
1722
+
1649
1723
  declare namespace BowmarkProvider_atlasseniorliving {
1650
1724
  // ── Atlas Senior Living — the unit's own declarations, verbatim ──
1651
1725
  type AtlasCareType = "assisted_living" | "independent_living" | "memory_care" | "respite_care";
@@ -2029,6 +2103,58 @@ interface StoreStock {
2029
2103
  }
2030
2104
  }
2031
2105
 
2106
+ declare namespace BowmarkProvider_bigrentz {
2107
+ // ── BigRentz — the unit's own declarations, verbatim ──
2108
+ interface BigrentzEquipmentRow {
2109
+ id: number;
2110
+ name: string;
2111
+ slug: string;
2112
+ permalink: string;
2113
+ categories: { id: number; name: string; slug: string }[];
2114
+ images: { src: string; alt: string }[];
2115
+ inStock: boolean;
2116
+ priced: false;
2117
+ priceNote: string;
2118
+ }
2119
+ interface BigrentzEquipmentDetail extends BigrentzEquipmentRow {
2120
+ description: string;
2121
+ specSheetUrls: string[];
2122
+ }
2123
+ interface BigrentzCategoryRow {
2124
+ id: number;
2125
+ name: string;
2126
+ slug: string;
2127
+ count: number;
2128
+ permalink: string;
2129
+ }
2130
+
2131
+ /**
2132
+ * BigRentz's own equipment catalog — search, category browse and per-item detail, real data
2133
+ * from their WooCommerce Store API. Live rental pricing is not yet built (site gates it behind
2134
+ * a location + date picker); see getRentalPricing.
2135
+ */
2136
+ interface Unit {
2137
+ /**
2138
+ * Searches BigRentz's equipment catalog by free text (e.g. "boom lift", "40 ft boom lift") and
2139
+ * returns matching rows. Real catalog data — id, name, slug, permalink, category, stock flag,
2140
+ * images — but NOT a real price (see `priceNote` on each row).
2141
+ */
2142
+ search(query: string): Promise<BigrentzEquipmentRow[]>;
2143
+
2144
+ /**
2145
+ * Reads one piece of equipment in full by the slug `search` or `listCategories` returned —
2146
+ * description, spec-sheet PDF links, category and stock flag.
2147
+ */
2148
+ getEquipment(slug: string): Promise<BigrentzEquipmentDetail>;
2149
+
2150
+ /**
2151
+ * Lists BigRentz's equipment categories — id, name, slug, live listing count, category page
2152
+ * URL. Pass `parentSlug` to list a category's children.
2153
+ */
2154
+ listCategories(options?: { parentSlug?: string }): Promise<BigrentzCategoryRow[]>;
2155
+ }
2156
+ }
2157
+
2032
2158
  declare namespace BowmarkProvider_blenderseyewear {
2033
2159
  // ── Blenders Eyewear — the unit's own declarations, verbatim ──
2034
2160
  // Blenders Eyewear's OWN shapes — not a capability contract.
@@ -2352,6 +2478,145 @@ interface BmwusaModelListing {
2352
2478
  }
2353
2479
  }
2354
2480
 
2481
+ declare namespace BowmarkProvider_boydsleep {
2482
+ // ── Boyd Sleep — the unit's own declarations, verbatim ──
2483
+ // Boyd Sleep's OWN shapes — not a capability contract.
2484
+
2485
+ type BoydsleepGender = "Male" | "Female" | "Non Binary";
2486
+ type BoydsleepSleepPosition = "Side" | "Back" | "Stomach" | "Multi";
2487
+
2488
+ interface BoydsleepCalibrationInput {
2489
+ gender: BoydsleepGender;
2490
+ heightInches: number; // snapped to the site's own height band
2491
+ weightLbs: number; // snapped to the site's own weight band
2492
+ sleepPosition: BoydsleepSleepPosition;
2493
+ }
2494
+
2495
+ interface Boydsleep2ZoneResult {
2496
+ supportIndex: number; // 0-100
2497
+ heightBandInches: number;
2498
+ weightBandLbs: number;
2499
+ setupGuideUrl: string; // the real next step — no checkout exists on this domain
2500
+ calibratorUrl: string;
2501
+ }
2502
+
2503
+ interface Boydsleep6ZoneResult {
2504
+ headFoot: number;
2505
+ center: number;
2506
+ heightBandInches: number;
2507
+ weightBandLbs: number;
2508
+ setupGuideUrl: string;
2509
+ calibratorUrl: string;
2510
+ }
2511
+
2512
+ /**
2513
+ * Boyd Sleep's own 'Smart Support Number' calibrator for a Nautica Home Smart Zone air bed —
2514
+ * the real personalized 0-100 Support Index (2-zone) or Head/Foot + Center numbers (6-zone),
2515
+ * computed exactly as the site computes them, plus the site's own setup guide as the real next
2516
+ * step (Boyd sells through retail/franchise partners, so there is no DTC checkout on this
2517
+ * domain to route to).
2518
+ */
2519
+ interface Unit {
2520
+ /**
2521
+ * Runs Boyd's own 2-zone Smart Support Number calculation for a Nautica Home Smart Zone air
2522
+ * bed — a real, personalized 0-100 Support Index computed exactly as the site's own calculator
2523
+ * computes it, no estimate. `setupGuideUrl` is the real next step; Boyd sells through
2524
+ * retail/franchise partners, so there is no cart to route to on this domain.
2525
+ */
2526
+ calibrateSupportNumber(input: BoydsleepCalibrationInput): Promise<Boydsleep2ZoneResult>;
2527
+
2528
+ /**
2529
+ * Runs Boyd's own 6-zone Smart Support Number calculation — same inputs as the 2-zone tool,
2530
+ * returns a separate Head/Foot number and a Center (lumbar) number for the 6-zone Nautica Home
2531
+ * Smart Zone bed.
2532
+ */
2533
+ calibrateSixZoneSupportNumber(input: BoydsleepCalibrationInput): Promise<Boydsleep6ZoneResult>;
2534
+ }
2535
+ }
2536
+
2537
+ declare namespace BowmarkProvider_brixton {
2538
+ // ── Brixton — the unit's own declarations, verbatim ──
2539
+ interface BrixtonVariant {
2540
+ /** Shopify's numeric variant id as a string. */
2541
+ id: string;
2542
+ /** The variant's own label, e.g. "M" or "Black / M" on multi-option products. */
2543
+ title: string;
2544
+ /** String verbatim from the storefront — "30.00" (dollars) on /products.json, "10900" (cents) on /products/<h>.js. */
2545
+ price: string;
2546
+ /** Same scale as price. Null when the variant is not on sale. */
2547
+ compareAtPrice: string | null;
2548
+ /** The store's own SKU. Null on a variant without one. */
2549
+ sku: string | null;
2550
+ /** Whether the variant is purchasable right now. */
2551
+ available: boolean;
2552
+ /** e.g. ["M"] or ["Black", "M"]. */
2553
+ options: string[];
2554
+ }
2555
+ interface BrixtonProduct {
2556
+ /** The handle is the only stable identifier across the catalogue. */
2557
+ handle: string;
2558
+ title: string;
2559
+ vendor: string;
2560
+ productType: string;
2561
+ url: string;
2562
+ descriptionHtml: string | null;
2563
+ optionNames: string[];
2564
+ variants: BrixtonVariant[];
2565
+ /** Same scale as variants — see BrixtonVariant.price. */
2566
+ priceRange: { min: string; max: string } | null;
2567
+ /** True if ANY variant is purchasable. */
2568
+ inStock: boolean;
2569
+ tags: string[];
2570
+ /** Brixton's own images, in the order the storefront publishes them. */
2571
+ images: string[];
2572
+ }
2573
+ interface BrixtonCatalogue {
2574
+ /** All matching products, in-stock first, then by handle. */
2575
+ products: BrixtonProduct[];
2576
+ /** What the filter DROPPED, in the same register the rest of the library uses. */
2577
+ warnings: string[];
2578
+ }
2579
+ interface BrixtonCheckoutLink {
2580
+ /** Shopify's own cart-permalink URL — a GET that adds the line item and redirects into the cart. */
2581
+ url: string;
2582
+ /** The exact variant the link resolved to, read live off the storefront. */
2583
+ variant: BrixtonVariant;
2584
+ /** The product the variant belongs to. */
2585
+ product: BrixtonProduct;
2586
+ }
2587
+
2588
+ /**
2589
+ * Brixton apparel and headwear catalogue — every product, its size/color variants, real prices
2590
+ * and stock — read off the live Shopify storefront, plus a live-validated checkout handoff
2591
+ * link.
2592
+ */
2593
+ interface Unit {
2594
+ /**
2595
+ * Reads the live Brixton catalogue as the storefront publishes it — every product, its handle,
2596
+ * title, vendor, description, tags, images and the per-variant price the storefront is quoting
2597
+ * right now. Returns [] on a transport failure. The catalog page is the line and the parse is
2598
+ * the unit of work.
2599
+ */
2600
+ listBrixtonProducts(opts?: { limit?: number }): Promise<BrixtonProduct[]>;
2601
+
2602
+ /**
2603
+ * Reads one product by its handle — every size/color variant, its exact price and whether that
2604
+ * specific variant is purchasable right now. Takes the handle listBrixtonProducts returns.
2605
+ * THROWS on an unknown handle (the store answers a real 404).
2606
+ */
2607
+ getBrixtonProduct(handle: string): Promise<BrixtonProduct>;
2608
+
2609
+ /**
2610
+ * Resolves a product handle + a variant match (either the exact variant title like "M", or a
2611
+ * substring of it) to a real Shopify cart-permalink URL, validated live against the
2612
+ * storefront. THROWS if the handle is unknown, if no variant matches, if the match is
2613
+ * ambiguous (matches more than one variant), or if the matched variant is not currently
2614
+ * available — the error names the candidate or in-stock options so the caller can retry.
2615
+ */
2616
+ getBrixtonCheckoutLink(handle: string, variantTitleOrOptions: string, opts?: { quantity?: number }): Promise<BrixtonCheckoutLink>;
2617
+ }
2618
+ }
2619
+
2355
2620
  declare namespace BowmarkProvider_bykoket {
2356
2621
  // ── KOKET — the unit's own declarations, verbatim ──
2357
2622
  interface KoketProductSummary {
@@ -2723,6 +2988,59 @@ interface carsVehicleValue {
2723
2988
  }
2724
2989
  }
2725
2990
 
2991
+ declare namespace BowmarkProvider_chantecaille {
2992
+ // ── Chantecaille — the unit's own declarations, verbatim ──
2993
+ // Chantecaille's OWN shapes — not a capability contract.
2994
+
2995
+ interface QuizQuestion {
2996
+ id: string;
2997
+ code: string; // e.g. "undertone", "tone", "look", "benefits", "coverage"
2998
+ name: string; // e.g. "Undertone"
2999
+ question: string; // the site's own prompt text
3000
+ answers: { id: string; code: string; name: string }[];
3001
+ }
3002
+
3003
+ interface FoundationSelections {
3004
+ undertone: string; // e.g. "Cool" — code or name, from getFoundationQuizTaxonomy()
3005
+ skinTone: string; // e.g. "Medium Deep"
3006
+ skinLook: string; // e.g. "Smooth and flawless"
3007
+ benefits: string[]; // e.g. ["Hydration"] — [] answers the site's own "Skip"
3008
+ coverage: string; // e.g. "Light" | "Medium" | "Full"
3009
+ }
3010
+
3011
+ interface FoundationMatch {
3012
+ name: string; // e.g. "Future Skin - Maple"
3013
+ score: number; // the site's own computed match score
3014
+ price: string;
3015
+ displayPrice: string; // e.g. "$95.00"
3016
+ productUrl: string; // real product page, this exact shade preselected
3017
+ productImageUrl: string;
3018
+ description: string;
3019
+ }
3020
+
3021
+ /**
3022
+ * Chantecaille's own Foundation Shade Match Quiz, reimplemented over its real Cartful
3023
+ * Solutions scoring engine: read the real live question taxonomy, and get real ranked
3024
+ * foundation matches — name, price, product page — computed by the site's own engine for a
3025
+ * stated undertone, skin tone, finish, skincare benefits and coverage.
3026
+ */
3027
+ interface Unit {
3028
+ /**
3029
+ * Reads Chantecaille's real, live Foundation Shade Match Quiz question and answer taxonomy off
3030
+ * its own Cartful Solutions bundle — the real option names to pass to matchFoundation.
3031
+ */
3032
+ getFoundationQuizTaxonomy(): Promise<QuizQuestion[]>;
3033
+
3034
+ /**
3035
+ * Chantecaille's own Foundation Shade Match Quiz, run for real: posts the caller's selections
3036
+ * to the site's own scoring engine and returns the real ranked foundation matches, highest
3037
+ * score first. THROWS naming the real options when a selection does not match the live
3038
+ * taxonomy.
3039
+ */
3040
+ matchFoundation(selections: FoundationSelections): Promise<FoundationMatch[]>;
3041
+ }
3042
+ }
3043
+
2726
3044
  declare namespace BowmarkProvider_cheapflights {
2727
3045
  // ── Cheapflights — the unit's own declarations, verbatim ──
2728
3046
  interface KayakQuery {
@@ -3401,6 +3719,120 @@ interface CyberpowerpcPriceResult {
3401
3719
  }
3402
3720
  }
3403
3721
 
3722
+ declare namespace BowmarkProvider_davidsonhomes {
3723
+ // ── Davidson Homes — the unit's own declarations, verbatim ──
3724
+ // Davidson Homes' OWN shapes — not a capability contract.
3725
+
3726
+ interface DavidsonhomesRange { lowest: number | null; highest: number | null }
3727
+
3728
+ interface DavidsonhomesRegionSummary {
3729
+ id: string;
3730
+ title: string;
3731
+ path: string; // the key getRegion takes
3732
+ state: string;
3733
+ homesCount: number;
3734
+ communitiesCount: number;
3735
+ priceRange: DavidsonhomesRange;
3736
+ }
3737
+
3738
+ interface DavidsonhomesCommunitySummary {
3739
+ id: string;
3740
+ title: string;
3741
+ path: string; // the key getCommunity takes
3742
+ city: string;
3743
+ state: string;
3744
+ status: string; // e.g. "Move-In Ready Homes", "Now Selling"
3745
+ bedRange: DavidsonhomesRange;
3746
+ priceRange: DavidsonhomesRange;
3747
+ sqftRange: DavidsonhomesRange;
3748
+ homesCount: number;
3749
+ plansCount: number;
3750
+ }
3751
+
3752
+ interface DavidsonhomesRegionDetail {
3753
+ title: string;
3754
+ path: string;
3755
+ state: string; // this region's URL grouping, per the site's own nav
3756
+ stateAbbreviation: string;
3757
+ communities: DavidsonhomesCommunitySummary[];
3758
+ }
3759
+
3760
+ interface DavidsonhomesHomeSummary {
3761
+ id: string;
3762
+ title: string; // real street address, e.g. "28 Aurora Circle"
3763
+ path: string; // the key getHome takes
3764
+ price: number;
3765
+ oldPrice: number | null;
3766
+ sqft: number;
3767
+ beds: number;
3768
+ baths: number;
3769
+ halfBaths: number;
3770
+ status: string; // e.g. "Active", "Pending"
3771
+ estCompletionMonth: string | null;
3772
+ floorPlanName: string | null;
3773
+ }
3774
+
3775
+ interface DavidsonhomesCommunityDetail {
3776
+ title: string;
3777
+ path: string;
3778
+ status: string;
3779
+ priceRange: DavidsonhomesRange;
3780
+ sqftRange: DavidsonhomesRange;
3781
+ phone: string | null;
3782
+ plansCount: number;
3783
+ availableHomes: DavidsonhomesHomeSummary[];
3784
+ }
3785
+
3786
+ interface DavidsonhomesHomeDetail extends DavidsonhomesHomeSummary {
3787
+ description: string | null;
3788
+ garage: number | null;
3789
+ coordinates: { lat: number; lng: number } | null;
3790
+ communityTitle: string;
3791
+ communityPath: string; // the key getCommunity takes
3792
+ }
3793
+
3794
+ /**
3795
+ * Reads Davidson Homes' own 'Find Your Home' search — all live market regions, one region's
3796
+ * communities with real price/bed/sqft ranges and availability status, one community's actual
3797
+ * move-in-ready homes with real street addresses and prices, and one home's full listing
3798
+ * detail — the way the live site's own search would show it.
3799
+ */
3800
+ interface Unit {
3801
+ /**
3802
+ * Lists every market region Davidson Homes currently builds in (state/metro area), each with
3803
+ * its own live homes count, communities count and starting price. The entry point: every
3804
+ * region's `path` is what `getRegion` takes.
3805
+ */
3806
+ listRegions(): Promise<DavidsonhomesRegionSummary[]>;
3807
+
3808
+ /**
3809
+ * Reads one region's own page: every community in it with a real live price/bed/sqft range and
3810
+ * status ("Move-In Ready Homes", "Now Selling", etc). `path` comes from `listRegions()`, e.g.
3811
+ * "states/alabama/huntsville-market-area". THROWS on an unknown path, naming `listRegions()`
3812
+ * as the way to find current ones.
3813
+ */
3814
+ getRegion(path: string): Promise<DavidsonhomesRegionDetail>;
3815
+
3816
+ /**
3817
+ * Reads one community's own page: its ACTUAL available homes right now, each with a real
3818
+ * street address, real price, real sqft/bed/bath count and per-home status ("Active",
3819
+ * "Pending") — never a floor-plan brochure. `path` comes from `getRegion()`, e.g.
3820
+ * "states/alabama/huntsville-market-area/fayetteville/bailey-park". THROWS on an unknown path,
3821
+ * naming `getRegion()` as the way to find current ones.
3822
+ */
3823
+ getCommunity(path: string): Promise<DavidsonhomesCommunityDetail>;
3824
+
3825
+ /**
3826
+ * Reads one specific home's own listing page: address, price, sqft, bed/bath count, status,
3827
+ * garage, coordinates and the site's own listing description. `path` comes from
3828
+ * `getCommunity()` or `getRegion()`'s community list, e.g.
3829
+ * "…/bailey-park/available-homes/28-aurora-circle". THROWS on an unknown path, naming
3830
+ * `getCommunity()` as the way to find current ones.
3831
+ */
3832
+ getHome(path: string): Promise<DavidsonhomesHomeDetail>;
3833
+ }
3834
+ }
3835
+
3404
3836
  declare namespace BowmarkProvider_decked {
3405
3837
  // ── DECKED — the unit's own declarations, verbatim ──
3406
3838
  // DECKED's OWN shapes — not a capability contract.
@@ -4122,6 +4554,100 @@ interface ErieAgent {
4122
4554
  }
4123
4555
  }
4124
4556
 
4557
+ declare namespace BowmarkProvider_eventsource {
4558
+ // ── Event Source — the unit's own declarations, verbatim ──
4559
+ interface EventSourceDesign {
4560
+ designId: number;
4561
+ visionBoardId: number;
4562
+ roomId: number;
4563
+ designName: string;
4564
+ roomName: string;
4565
+ venueName: string;
4566
+ hasLayouts: boolean;
4567
+ hasTemplates: boolean;
4568
+ }
4569
+ interface EventSourceShowroom {
4570
+ accessCode: string;
4571
+ showroomName: string;
4572
+ ownerName: string;
4573
+ branded: boolean;
4574
+ underConstruction: boolean;
4575
+ logoUrl: string;
4576
+ eventId: number;
4577
+ venueIds: number[];
4578
+ designs: EventSourceDesign[];
4579
+ }
4580
+ interface EventSourceVenue {
4581
+ venueId: number;
4582
+ businessName: string;
4583
+ city: string;
4584
+ state: string;
4585
+ zipCode: string;
4586
+ market: string;
4587
+ primaryImageUrl: string;
4588
+ rooms: Array<{ roomId: number; roomName: string; primaryImageUrl: string; active: boolean }>;
4589
+ }
4590
+ interface EventSourceInquiryContact {
4591
+ inquiryRequestEmail: string;
4592
+ ownerName: string;
4593
+ ownerLogoUrl: string;
4594
+ }
4595
+
4596
+ /**
4597
+ * Reads a public Event Source Virtual Design Center showroom (design, venue, inquiry contact)
4598
+ * by its access code — no login.
4599
+ */
4600
+ interface Unit {
4601
+ /**
4602
+ * Reads a public Virtual Design Center showroom by its access code — its design(s), venue and
4603
+ * branding.
4604
+ */
4605
+ getShowroom(code: string): Promise<EventSourceShowroom>;
4606
+
4607
+ /** Reads the real venue/room a showroom's design is staged in. */
4608
+ getShowroomVenue(eventId: number, venueId: number, code: string): Promise<EventSourceVenue>;
4609
+
4610
+ /** Reads who a showroom's Send Inquiry button emails, without submitting anything. */
4611
+ getShowroomInquiryContact(code: string): Promise<EventSourceInquiryContact>;
4612
+ }
4613
+ }
4614
+
4615
+ declare namespace BowmarkProvider_evolutionofsmooth {
4616
+ // ── eos Products — the unit's own declarations, verbatim ──
4617
+ interface ShadeQuizOption { optionId: string; text: string }
4618
+ interface ShadeQuizQuestion { questionPageId: string; questionId: string; title: string; options: ShadeQuizOption[] }
4619
+ interface ShadeResult {
4620
+ shadeName: string; price: number; priceFormatted: string;
4621
+ productUrl: string; productId: string; variantId: string; description: string;
4622
+ }
4623
+ type ShadeQuizAnswerResult =
4624
+ | { done: false; question: ShadeQuizQuestion }
4625
+ | { done: true; result: ShadeResult };
4626
+
4627
+ /**
4628
+ * eos's Dewy Lip Shine Shade Finder quiz (Octane AI) — walks the site's real 5-question quiz
4629
+ * and returns the personalized shade result: name, Shopify product/variant id, price and
4630
+ * product URL, ready for a cart handoff.
4631
+ */
4632
+ interface Unit {
4633
+ /**
4634
+ * Starts eos's Dewy Lip Shine Shade Finder quiz (walking past the site's own unanswerable
4635
+ * intro page automatically) and returns the first real question, with the `quizResponseId`
4636
+ * every following `answerShadeQuizQuestion` call takes.
4637
+ */
4638
+ startShadeQuiz(): Promise<{ quizResponseId: string; question: ShadeQuizQuestion }>;
4639
+
4640
+ /**
4641
+ * Submits one answer (the `questionPageId`/`questionId` from the question just answered, and
4642
+ * the `optionId` of the chosen option) and returns either the next question, or — once all 5
4643
+ * real questions are answered — `{ done: true, result }` with the personalized Dewy Lip Shine
4644
+ * shade: name, Shopify product/variant id, price and product URL. The site's own email-capture
4645
+ * page is skipped automatically.
4646
+ */
4647
+ answerShadeQuizQuestion(quizResponseId: string, questionPageId: string, questionId: string, optionId: string): Promise<ShadeQuizAnswerResult>;
4648
+ }
4649
+ }
4650
+
4125
4651
  declare namespace BowmarkProvider_extraspace {
4126
4652
  // ── Extra Space Storage — the unit's own declarations, verbatim ──
4127
4653
  interface ExtraspaceSearchResult {
@@ -4809,6 +5335,78 @@ interface fordVehicleRecalls {
4809
5335
  }
4810
5336
  }
4811
5337
 
5338
+ declare namespace BowmarkProvider_fourseasonsyachts {
5339
+ // ── Four Seasons Yachts — the unit's own declarations, verbatim ──
5340
+ interface FourseasonsyachtsVoyage {
5341
+ /** The site's own stable identifier for a sailing — what getVoyageSailing takes. */
5342
+ voyageCode: string;
5343
+ title: string;
5344
+ /** The path segment on fourseasonsyachts.com/voyages/<slug>. */
5345
+ slug: string;
5346
+ /** The site's own free-text category label, e.g. "Grand Mediterranean". */
5347
+ category: string;
5348
+ /** The resolved destination entry's title, when the link resolved; falls back to category. */
5349
+ destination: string;
5350
+ vessel: string;
5351
+ body: string;
5352
+ images: string[];
5353
+ url: string;
5354
+ }
5355
+ interface FourseasonsyachtsSuite {
5356
+ description: string;
5357
+ totalCabins: number;
5358
+ availableCabins: number;
5359
+ price: number;
5360
+ currency: string;
5361
+ }
5362
+ interface FourseasonsyachtsSailing {
5363
+ voyageCode: string;
5364
+ sailDays: number;
5365
+ fromPort: string;
5366
+ fromDateTime: string;
5367
+ toPort: string;
5368
+ toDateTime: string;
5369
+ ship: string;
5370
+ suites: FourseasonsyachtsSuite[];
5371
+ }
5372
+ interface FourseasonsyachtsSearchResult {
5373
+ voyages: FourseasonsyachtsVoyage[];
5374
+ /** What the filter DROPPED, in the same register the rest of the library uses. */
5375
+ warnings: string[];
5376
+ }
5377
+
5378
+ /**
5379
+ * Four Seasons Yachts' live Voyage Finder — every published sailing, its region and vessel,
5380
+ * plus the real scheduled departure with per-suite pricing and cabin availability, read off
5381
+ * the site's own booking-engine endpoints.
5382
+ */
5383
+ interface Unit {
5384
+ /**
5385
+ * Reads the live Voyage Finder inventory (50 published itineraries) and filters locally by
5386
+ * region, vessel and/or a free-text keyword against the title/body. Returns real voyageCodes
5387
+ * and slugs — the entry point every other function takes its identifier from. The site
5388
+ * publishes no query/filter endpoint of its own, so the divide is what this function does with
5389
+ * the listing, not how it gets there.
5390
+ */
5391
+ searchVoyages(filters?: { region?: string; vessel?: string; keyword?: string }): Promise<FourseasonsyachtsSearchResult>;
5392
+
5393
+ /**
5394
+ * Reads one voyage's itinerary — its day-by-day description, region, vessel and images — by
5395
+ * voyageCode (server-side filtered, cheap) or by slug (matched locally against the full
5396
+ * listing). THROWS when neither matches.
5397
+ */
5398
+ getVoyage(voyageCodeOrSlug: string): Promise<FourseasonsyachtsVoyage>;
5399
+
5400
+ /**
5401
+ * Reads the REAL scheduled departure for one voyageCode — exact embark/disembark ports and
5402
+ * dates, the ship, and every suite category's live price and cabin availability, straight off
5403
+ * the site's own booking engine. Returns null when the site currently has no scheduled
5404
+ * departure for that voyageCode (an honest empty answer, not a failure).
5405
+ */
5406
+ getVoyageSailing(voyageCode: string): Promise<FourseasonsyachtsSailing | null>;
5407
+ }
5408
+ }
5409
+
4812
5410
  declare namespace BowmarkProvider_framebridge {
4813
5411
  // ── Framebridge — the unit's own declarations, verbatim ──
4814
5412
  // Framebridge's OWN shapes — not a capability contract.
@@ -5614,6 +6212,72 @@ interface graingerStockRow {
5614
6212
  }
5615
6213
  }
5616
6214
 
6215
+ declare namespace BowmarkProvider_grandwelcome {
6216
+ // ── Grand Welcome — the unit's own declarations, verbatim ──
6217
+ interface GrandwelcomeRentalRow {
6218
+ rentalId: string;
6219
+ name: string;
6220
+ url: string;
6221
+ location: string;
6222
+ propertyType: string;
6223
+ petFriendly: boolean;
6224
+ priceFromUsd: number | null;
6225
+ priceFromFormatted: string | null;
6226
+ bedrooms: number | null;
6227
+ bathrooms: number | null;
6228
+ guests: number | null;
6229
+ ratingValue: number | null;
6230
+ ratingCount: number | null;
6231
+ }
6232
+ interface GrandwelcomeRentalDetail {
6233
+ rentalId: string;
6234
+ propertyId: string;
6235
+ name: string;
6236
+ description: string;
6237
+ images: string[];
6238
+ url: string;
6239
+ }
6240
+ interface GrandwelcomeQuoteFee {
6241
+ label: string;
6242
+ amountUsd: number;
6243
+ }
6244
+ type GrandwelcomeQuote =
6245
+ | { available: true; propertyId: string; checkin: string; checkout: string; currency: "USD";
6246
+ rentUsd: number; fees: GrandwelcomeQuoteFee[]; feesTotalUsd: number; taxUsd: number;
6247
+ totalUsd: number; bookNowUrl: string }
6248
+ | { available: false; propertyId: string; checkin: string; checkout: string };
6249
+
6250
+ /**
6251
+ * Grand Welcome's own vacation rental search, listing detail, and real-time dated
6252
+ * pricing/booking-link engine — a national franchise's own inventory, live availability and
6253
+ * price, not a stale catalog.
6254
+ */
6255
+ interface Unit {
6256
+ /**
6257
+ * Runs Grand Welcome's own destination search (a market slug like "california-sea-ranch", from
6258
+ * a rental's own page or the destination directory), optionally filtered to a bedroom count,
6259
+ * and returns the live matching listings — name, url, location, type, pet-friendly flag,
6260
+ * advertised "as low as" price, bed/bath/guest counts, rating.
6261
+ */
6262
+ searchRentals(destinationSlug: string, options?: { bedrooms?: number }): Promise<GrandwelcomeRentalRow[]>;
6263
+
6264
+ /**
6265
+ * Reads one rental in full — name, description, photos, and the internal numeric propertyId
6266
+ * getRentalQuote needs — from the rentalId a search result or a grandwelcome.com/rentals/<id>
6267
+ * URL carries.
6268
+ */
6269
+ getRentalDetail(rentalId: string): Promise<GrandwelcomeRentalDetail>;
6270
+
6271
+ /**
6272
+ * Runs the site's own real-time pricing engine for one property and a date range
6273
+ * ("YYYY-MM-DD") — rent, fees, tax, total — and returns the exact Book Now checkout URL for
6274
+ * those dates. `available: false` means the site checked and the property is not free for
6275
+ * those dates, an ordinary answer.
6276
+ */
6277
+ getRentalQuote(propertyId: string, options: { checkin: string; checkout: string }): Promise<GrandwelcomeQuote>;
6278
+ }
6279
+ }
6280
+
5617
6281
  declare namespace BowmarkProvider_handypro {
5618
6282
  // ── HandyPro — the unit's own declarations, verbatim ──
5619
6283
  // HandyPro's OWN shapes — not a capability contract.
@@ -5670,6 +6334,43 @@ interface HandyproCategorySearch {
5670
6334
  }
5671
6335
  }
5672
6336
 
6337
+ declare namespace BowmarkProvider_hansons {
6338
+ // ── Hansons — the unit's own declarations, verbatim ──
6339
+ interface HansonsSlot {
6340
+ timeSlotID: number;
6341
+ appointmentDate: string;
6342
+ timeSlot: string;
6343
+ virtual: boolean;
6344
+ }
6345
+
6346
+ interface CheckAvailabilityResult {
6347
+ inServiceArea: boolean;
6348
+ showInHomeFlow: boolean;
6349
+ showVirtualFlow: boolean;
6350
+ message: string;
6351
+ slots: HansonsSlot[];
6352
+ }
6353
+
6354
+ /**
6355
+ * Regional home-exterior remodeler (windows/roofing/siding/gutters/bath). checkAvailability is
6356
+ * live — checks a ZIP against Hansons' real Free Estimate scheduler and returns the actual
6357
+ * bookable at-home/virtual slots. bookEstimate (the final booking submit) is a stub — see its
6358
+ * notImplemented reason.
6359
+ */
6360
+ interface Unit {
6361
+ /**
6362
+ * Checks a 5-digit US ZIP (`zipcode`, e.g. "48104") against Hansons' real Free Estimate
6363
+ * scheduler and returns the actual open appointment slots for an at-home or virtual
6364
+ * consultation — the same ZIP-gated availability check the site's own scheduler performs
6365
+ * before it will show a single bookable date. Pass `virtual: true`/`false` to filter to one
6366
+ * consultation type; omit it to get both. Returns whether the ZIP is even in Hansons' service
6367
+ * area, whether each consultation type is currently offered, the site's own status message,
6368
+ * and the slot list (date, display time, and the site's own slot id).
6369
+ */
6370
+ checkAvailability(args: object): Promise<CheckAvailabilityResult>;
6371
+ }
6372
+ }
6373
+
5673
6374
  declare namespace BowmarkProvider_harmar {
5674
6375
  // ── Harmar Mobility — the unit's own declarations, verbatim ──
5675
6376
  interface HarmarVehicleModel {
@@ -5814,6 +6515,67 @@ interface HauslabsShadeMatch {
5814
6515
  }
5815
6516
  }
5816
6517
 
6518
+ declare namespace BowmarkProvider_haydenhomes {
6519
+ // ── Hayden Homes — the unit's own declarations, verbatim ──
6520
+ // Hayden Homes' OWN shapes — not a capability contract.
6521
+
6522
+ interface HaydenhomesQuickMoveIn {
6523
+ id: number;
6524
+ planName: string;
6525
+ address: string;
6526
+ city: string;
6527
+ state: string;
6528
+ communityName: string;
6529
+ communityUrl: string;
6530
+ price: number;
6531
+ priceFormatted: string;
6532
+ monthlyPayment: string | null;
6533
+ beds: number | null;
6534
+ baths: number | null;
6535
+ sqft: number | null;
6536
+ stories: number | null;
6537
+ garage: string | null;
6538
+ lot: string | null;
6539
+ status: string; // "available" | "reserved", the site's own value
6540
+ availabilityLabel: string; // e.g. "Move-in Now", "Move-in Fall"
6541
+ availabilityDate: string | null;
6542
+ incentive: string | null;
6543
+ imageUrl: string | null;
6544
+ url: string; // the listing page — the real next step (tour / contact) lives here
6545
+ canScheduleAppointment: boolean;
6546
+ latitude: number | null;
6547
+ longitude: number | null;
6548
+ }
6549
+
6550
+ interface HaydenhomesSearchFilters {
6551
+ state?: string; // two-letter code, e.g. "OR"
6552
+ city?: string; // fuzzy substring match
6553
+ community?: string; // fuzzy substring match
6554
+ minBeds?: number;
6555
+ minBaths?: number;
6556
+ minSqft?: number;
6557
+ minPrice?: number;
6558
+ maxPrice?: number;
6559
+ availableOnly?: boolean; // default true
6560
+ }
6561
+
6562
+ /**
6563
+ * Hayden Homes' live quick move-in inventory search across Oregon, Washington, Idaho and
6564
+ * Montana — filterable by state, city, community, beds/baths/sqft and price, off the search
6565
+ * page's own server-rendered listing rather than a third-party aggregator's stale mirror.
6566
+ */
6567
+ interface Unit {
6568
+ /**
6569
+ * Runs Hayden Homes' quick move-in search against the site's own live inventory — every home
6570
+ * currently listed across OR/WA/ID/MT, with real address, price, beds/baths/sqft, community
6571
+ * and a listing URL to schedule a tour or contact a sales team. `filters` (all optional):
6572
+ * `state` (e.g. "OR"), `city`, `community`, `minBeds`, `minBaths`, `minSqft`, `minPrice`,
6573
+ * `maxPrice`, `availableOnly` (default true — excludes homes the site has marked reserved).
6574
+ */
6575
+ searchQuickMoveIns(filters?: HaydenhomesSearchFilters): Promise<HaydenhomesQuickMoveIn[]>;
6576
+ }
6577
+ }
6578
+
5817
6579
  declare namespace BowmarkProvider_healthcare_gov {
5818
6580
  // ── HealthCare.gov — the unit's own declarations, verbatim ──
5819
6581
  interface healthcare_govPlan {
@@ -8032,6 +8794,64 @@ interface IsllcSearchCommunitiesResult {
8032
8794
  }
8033
8795
  }
8034
8796
 
8797
+ declare namespace BowmarkProvider_jennikayne {
8798
+ // ── Jenni Kayne — the unit's own declarations, verbatim ──
8799
+ interface GiftCardDenomination {
8800
+ variantId: string;
8801
+ amount: string;
8802
+ available: boolean;
8803
+ }
8804
+ interface GiftCardOptions {
8805
+ productUrl: string;
8806
+ denominations: GiftCardDenomination[];
8807
+ timezones: string[];
8808
+ }
8809
+ interface GiftCardConfig {
8810
+ amount: string;
8811
+ recipientName: string;
8812
+ recipientEmail: string;
8813
+ giftMessage?: string;
8814
+ deliveryDate: string;
8815
+ deliveryTimezone: string;
8816
+ }
8817
+ interface GiftCardLink {
8818
+ amount: string;
8819
+ variantId: string;
8820
+ recipientName: string;
8821
+ recipientEmail: string;
8822
+ giftMessage: string | null;
8823
+ deliveryDate: string;
8824
+ deliveryTimezone: string;
8825
+ available: boolean;
8826
+ cartUrl: string;
8827
+ checkoutUrl: string;
8828
+ deliveryTimeLeftToShopper: true;
8829
+ }
8830
+
8831
+ /**
8832
+ * Jenni Kayne's live gift-card product: read the real denominations and hand the shopper a
8833
+ * checkout link pre-filled with the recipient, message and scheduled delivery date/timezone.
8834
+ */
8835
+ interface Unit {
8836
+ /**
8837
+ * Reads the live Jenni Kayne digital gift-card product — every denomination from $50 to $1,000
8838
+ * with its real variant id and current stock, plus the exact timezone strings the checkout
8839
+ * form accepts. Call this first to know what buildGiftCardLink will accept.
8840
+ */
8841
+ getGiftCardOptions(): Promise<GiftCardOptions>;
8842
+
8843
+ /**
8844
+ * Configures a Jenni Kayne digital gift card — amount, recipient name/email, an optional
8845
+ * message, and a scheduled delivery date + timezone — and returns a checkout link with every
8846
+ * one of those fields already filled in, so the shopper only has to pick a delivery TIME and
8847
+ * pay. THROWS on an unknown amount, an invalid email, a malformed date, or a timezone the
8848
+ * store does not offer — call getGiftCardOptions first to see the live choices. Builds the
8849
+ * link only; nothing is purchased or charged here.
8850
+ */
8851
+ buildGiftCardLink(config: GiftCardConfig): Promise<GiftCardLink>;
8852
+ }
8853
+ }
8854
+
8035
8855
  declare namespace BowmarkProvider_joybird {
8036
8856
  // ── Joybird — the unit's own declarations, verbatim ──
8037
8857
  interface JoybirdConfigurator {
@@ -8125,6 +8945,75 @@ interface JoybirdPriceResult {
8125
8945
  }
8126
8946
  }
8127
8947
 
8948
+ declare namespace BowmarkProvider_joycefactorydirect {
8949
+ // ── Joyce Windows, Sunrooms & Baths — the unit's own declarations, verbatim ──
8950
+ interface JoyceCalculatorOption {
8951
+ label: string;
8952
+ answerId: string;
8953
+ }
8954
+ interface JoyceCalculatorQuestion {
8955
+ page: number;
8956
+ componentId: string;
8957
+ prompt: string;
8958
+ kind: "select" | "quantity";
8959
+ options: JoyceCalculatorOption[] | null;
8960
+ }
8961
+ interface JoyceWindowCalculatorOptions {
8962
+ calculatorUrl: string;
8963
+ questions: JoyceCalculatorQuestion[];
8964
+ }
8965
+
8966
+ /**
8967
+ * Reads the live question/option set behind Joyce Windows' own window-cost calculator (an
8968
+ * involve.me embed) with no browser and no interaction.
8969
+ */
8970
+ interface Unit {
8971
+ /**
8972
+ * Reads the live window-cost calculator's real questions and answer options (styles,
8973
+ * quantities, grade, colors, glass, grids) straight off the page — no interaction needed.
8974
+ */
8975
+ getWindowCalculatorOptions(): Promise<JoyceWindowCalculatorOptions>;
8976
+
8977
+ /**
8978
+ * Reads the live bath-remodel cost calculator's real questions and answer options straight off
8979
+ * the page — no interaction needed. Same involve.me platform and return shape as
8980
+ * getWindowCalculatorOptions.
8981
+ */
8982
+ getBathCalculatorOptions(): Promise<JoyceWindowCalculatorOptions>;
8983
+ }
8984
+ }
8985
+
8986
+ declare namespace BowmarkProvider_justinwine {
8987
+ // ── JUSTIN Vineyards & Winery — the unit's own declarations, verbatim ──
8988
+ interface JustinwineClubPriceRange {
8989
+ quantityLabel: string;
8990
+ bottles: number;
8991
+ min: number;
8992
+ max: number;
8993
+ checkoutUrl: string;
8994
+ }
8995
+
8996
+ interface JustinwineClubTier {
8997
+ category: string;
8998
+ categorySlug: string;
8999
+ description: string;
9000
+ priceRanges: JustinwineClubPriceRange[];
9001
+ }
9002
+
9003
+ /**
9004
+ * JUSTIN Vineyards & Winery's Wine Society club — per-shipment price by tier and quantity,
9005
+ * with the exact join handoff URL, off the club page's own embedded data.
9006
+ */
9007
+ interface Unit {
9008
+ /**
9009
+ * Lists the JUSTIN Wine Society club tiers, each with its per-shipment price range at 4/6/12
9010
+ * bottles and the exact join/checkout URL for that tier+quantity. Pass a category (e.g.
9011
+ * "Isosceles Only") to filter to one tier.
9012
+ */
9013
+ listClubTiers(category?: string): Promise<JustinwineClubTier[]>;
9014
+ }
9015
+ }
9016
+
8128
9017
  declare namespace BowmarkProvider_kayak {
8129
9018
  // ── Kayak — the unit's own declarations, verbatim ──
8130
9019
  interface KayakQuery {
@@ -8268,6 +9157,39 @@ interface KayakCar {
8268
9157
  }
8269
9158
  }
8270
9159
 
9160
+ declare namespace BowmarkProvider_kingsdown {
9161
+ // ── Kingsdown — the unit's own declarations, verbatim ──
9162
+ interface kingsdownBedmatchResult {
9163
+ zoneName: "Gold" | "Green" | "Blue" | "Red";
9164
+ zoneColor: string;
9165
+ scalar: number;
9166
+ findDealerUrl: string;
9167
+ buyUrl: string;
9168
+ }
9169
+
9170
+ /**
9171
+ * Kingsdown's own bedMATCH mattress-fit diagnostic (kingsdown.com/bedmatch/) —
9172
+ * getBedMatchResult runs the real questionnaire and returns the live computed support-color
9173
+ * classification (Gold/Green/Blue/Red) plus find-a-dealer and buy-direct handoff URLs.
9174
+ */
9175
+ interface Unit {
9176
+ /**
9177
+ * Runs Kingsdown's live bedMATCH diagnostic for one sleeper profile and returns the real
9178
+ * computed support-color classification (`zoneName`: "Gold" | "Green" | "Blue" | "Red", with
9179
+ * the raw fit `scalar` behind it), plus Kingsdown's own `findDealerUrl` and `buyUrl` handoffs.
9180
+ * Pass `{ name, ageBand, gender, position, heightBand, weightBand, pantBand, shirtBand,
9181
+ * painAreas? }` — every numeric field is the SITE'S OWN bucket code (its radio-button values),
9182
+ * not a raw age/height/weight, because bedMATCH itself only ever rates a band. `ageBand` ∈
9183
+ * {20, 33, 48, 63, 85}; `gender` ∈ {"F","M","N"}; `position` ∈ {1 Back, 2 Side, 3 Stomach};
9184
+ * `heightBand` ∈ {50, 57.5, 63.5, 69, 75.5, 78}; `weightBand`/`pantBand`/`shirtBand` are small
9185
+ * integer bucket codes (1-8 / 1-6 / 1-6). Read-only and account-free — the site's own quiz
9186
+ * asks for nothing but this questionnaire, and this function submits nothing beyond it (no
9187
+ * email, no purchase).
9188
+ */
9189
+ getBedMatchResult(profile: object): Promise<kingsdownBedmatchResult>;
9190
+ }
9191
+ }
9192
+
8271
9193
  declare namespace BowmarkProvider_kitchentuneup {
8272
9194
  // ── Kitchen Tune-Up — the unit's own declarations, verbatim ──
8273
9195
  interface KitchentuneupCabinetStyle {
@@ -8702,9 +9624,9 @@ interface LiquiddeathCart {
8702
9624
  interface LiquiddeathLiveCartLine {
8703
9625
  lineId: string;
8704
9626
  variantId: string;
8705
- variantTitle: string | null;
8706
- productTitle: string;
9627
+ title: string;
8707
9628
  quantity: number;
9629
+ unitPrice: string;
8708
9630
  lineTotal: string;
8709
9631
  }
8710
9632
  interface LiquiddeathLiveCart {
@@ -8715,9 +9637,7 @@ interface LiquiddeathLiveCart {
8715
9637
  total: string;
8716
9638
  currency: string;
8717
9639
  checkoutUrl: string;
8718
- countryCode: string | null;
8719
- createdAt: string | null;
8720
- updatedAt: string | null;
9640
+ expiresAt: string | null;
8721
9641
  }
8722
9642
 
8723
9643
  /**
@@ -8753,15 +9673,19 @@ interface LiquiddeathLiveCart {
8753
9673
  addToCart(items: LiquiddeathCartItem[]): Promise<LiquiddeathCart>;
8754
9674
 
8755
9675
  /**
8756
- * Reads a cart the shopper already has, by its id — line items, quantities, per-line and order
8757
- * totals, and the real checkout URL to hand back. The id is a bearer credential the SHOPPER
8758
- * holds, and it is the one their cart or checkout LINK carries
8759
- * (liquiddeath.com/cart/c/<token>?key=<key>), NOT the store's `cart` cookie or /cart.js token
8760
- * — those are a separate Ajax id space this endpoint answers 'Cart does not exist' for. There
8761
- * is no way to list or search carts, so a caller without an id cannot get one. Accepts the id
8762
- * with or without the `?key=` suffix. THROWS when the cart does not exist or has expired
8763
- * Shopify drops an unused cart within 30 days and deletes it at checkout because an empty
8764
- * cart and a dead link are opposite answers. Does not return shipping options or discounts:
9676
+ * Reads a cart the shopper already has, by its id — line items, quantities, per-unit and
9677
+ * per-line prices, order subtotal and total, the cart's currency and expiry, and the real
9678
+ * checkout URL to hand back. The id is a bearer credential the SHOPPER holds, and it is the
9679
+ * one their cart or checkout LINK carries (liquiddeath.com/cart/c/<token>?key=<key>), NOT the
9680
+ * store's `cart` cookie or /cart.js token — those are a separate Ajax id space this endpoint
9681
+ * answers 'The requested cart does not exist' for. There is no way to list or search carts, so
9682
+ * a caller without an id cannot get one. THE WHOLE id IS REQUIRED, `?key=` included: the store
9683
+ * checks the key's value, so a bare token comes back as a cart that does not exist rather than
9684
+ * as a missing credential, and this refuses it here instead. THROWS when the cart does not
9685
+ * exist or has expired — Shopify drops an unused cart within 30 days and deletes it at
9686
+ * checkout — because an empty cart and a dead link are opposite answers. Each line carries the
9687
+ * store's own joined product-and-variant `title` ("Death Western Hat - Cream/Green"); this
9688
+ * door publishes no separate product title. Does not return shipping options or discounts:
8765
9689
  * both require setting an address on the cart, which is a write this provider does not
8766
9690
  * perform.
8767
9691
  */
@@ -8849,6 +9773,76 @@ interface FindLocalDealerResult {
8849
9773
  }
8850
9774
  }
8851
9775
 
9776
+ declare namespace BowmarkProvider_lovelybride {
9777
+ // ── Lovely Bride — the unit's own declarations, verbatim ──
9778
+ interface LovelybrideStore {
9779
+ slug: string; // e.g. "houston" — what the other two functions take
9780
+ name: string; // e.g. "Houston"
9781
+ url: string;
9782
+ }
9783
+ interface LovelybrideAppointmentType {
9784
+ id: number; // e.g. 66220 — what getAvailableSlots takes
9785
+ description: string; // e.g. "1. Lovely Bridal Gown Appointment - $50 Fee"
9786
+ durationMinutes: number; // e.g. 90
9787
+ priceUsd: number | null;
9788
+ priceFormatted: string | null; // e.g. "$50.00"
9789
+ requiresPaymentInfo: boolean;
9790
+ }
9791
+ interface LovelybrideStoreInfo {
9792
+ name: string;
9793
+ emailAddress: string | null;
9794
+ phoneNumber: string | null;
9795
+ address: string | null;
9796
+ schedulerUrl: string; // the BridalLive scheduler page — the write handoff
9797
+ }
9798
+ interface LovelybrideTimeSlot {
9799
+ startDateTime: string; // ISO 8601
9800
+ endDateTime: string; // ISO 8601
9801
+ startDateTimeForView: string; // e.g. "10:00AM", store-local time
9802
+ location: string | null; // e.g. "Room 2"
9803
+ }
9804
+ interface LovelybrideAvailability {
9805
+ storeSlug: string;
9806
+ date: string; // echoes the requested "YYYY-MM-DD"
9807
+ slots: LovelybrideTimeSlot[]; // [] is a genuine "fully booked" answer
9808
+ }
9809
+
9810
+ /**
9811
+ * Reads Lovely Bride's real per-store BridalLive appointment scheduler — every store, a
9812
+ * store's real bookable appointment types and prices, and real open time slots — straight off
9813
+ * lovelybride.com and app.bridallive.com's own private JSON API, no key, no browser.
9814
+ */
9815
+ interface Unit {
9816
+ /**
9817
+ * Lists every Lovely Bride store the site's own store locator links — 19 across the US and one
9818
+ * in London, each with the slug the other two functions take. Takes nothing. The entry point:
9819
+ * a caller asking 'where can I book' has nowhere else to start.
9820
+ */
9821
+ listStores(): Promise<LovelybrideStore[]>;
9822
+
9823
+ /**
9824
+ * Reads one store's real, currently-bookable BridalLive appointment types — each with its real
9825
+ * price and duration exactly as the store's own scheduler quotes it — plus the store's contact
9826
+ * info and the live scheduler URL to hand off to. Takes the slug listStores returns. THROWS
9827
+ * LovelybrideNoOnlineBooking (not caller-fixable — no slug fixes it) when the store's own page
9828
+ * carries no online-booking link at all, which is a real answer for some stores (Charlotte,
9829
+ * measured 2026-08-16), not a parse failure.
9830
+ */
9831
+ getStoreAppointmentTypes(storeSlug: string): Promise<{ store: LovelybrideStoreInfo; appointmentTypes: LovelybrideAppointmentType[] }>;
9832
+
9833
+ /**
9834
+ * Reads the real open appointment slots for one store, one appointment type, and one date
9835
+ * ("YYYY-MM-DD") — the exact slots a shopper would see on the store's own scheduler page.
9836
+ * Takes the appointmentTypeId getStoreAppointmentTypes returns. Returns the requested date
9837
+ * alongside the slots; an empty `slots` array is a genuine answer (the date is fully booked),
9838
+ * never an error. This is a READ only: it does not hold or submit anything — a shopper follows
9839
+ * the store's schedulerUrl (from getStoreAppointmentTypes) to actually book the slot this
9840
+ * function found.
9841
+ */
9842
+ getAvailableSlots(storeSlug: string, appointmentTypeId: number, date: string): Promise<LovelybrideAvailability>;
9843
+ }
9844
+ }
9845
+
8852
9846
  declare namespace BowmarkProvider_lufthansa {
8853
9847
  // ── Lufthansa — the unit's own declarations, verbatim ──
8854
9848
  interface LufthansaFlightLeg {
@@ -9169,8 +10163,16 @@ interface LululemonRow {
9169
10163
  interface LululemonSearch {
9170
10164
  query: string;
9171
10165
  products: LululemonRow[];
9172
- /** How many entries matched before the row cap. */
10166
+ /** How many entries matched IN TOTAL, before the row cap — the size of the
10167
+ * thing you are paging through, not of this page. */
9173
10168
  matched: number;
10169
+ /** Where in the ranked match list this page started. */
10170
+ offset: number;
10171
+ /** The offset that reads the NEXT page, or null at the end of the list. Pass
10172
+ * it back verbatim — it is NOT offset + products.length, because a row that
10173
+ * was reached for and lost is dropped from products and named in warnings, so
10174
+ * a page of 24 can hand back 22 rows. */
10175
+ nextOffset: number | null;
9174
10176
  warnings: string[];
9175
10177
  }
9176
10178
  interface LululemonSimilarProducts {
@@ -9191,10 +10193,16 @@ interface LululemonSimilarProducts {
9191
10193
  * first — id, title, URL, price range, how many colours the style comes in, and whether it is
9192
10194
  * in stock. Ranks over the site's own published product index, then reads the price and colour
9193
10195
  * count per row. A match the pricing catalogue does not carry still comes back, with `priced:
9194
- * false` and null prices; `matched` says how many matched before the row cap so a caller can
9195
- * raise `limit` (default 8, max 24).
10196
+ * false` and null prices. PAGED: `matched` is the total match count and `nextOffset` is the
10197
+ * offset that reads the next page, or null at the end — pass it back verbatim rather than
10198
+ * adding `products.length`, since a lost row is dropped from `products` and named in
10199
+ * `warnings`. `limit` is rows per page (default 8, max 24, and each row costs one third-party
10200
+ * read), `offset` where the page starts (default 0). An offset past the end is an empty page,
10201
+ * not an error. A category is just a query — the site's own URL segments (`womens-leggings`,
10202
+ * `men-joggers`) are ranked over, so `{ query: "womens leggings", offset }` walks that
10203
+ * category.
9196
10204
  */
9197
- search(query: { query: string; limit?: number }): Promise<LululemonSearch>;
10205
+ search(query: { query: string; limit?: number; offset?: number }): Promise<LululemonSearch>;
9198
10206
 
9199
10207
  /**
9200
10208
  * Reads one product's full configurator the way its product page presents it — every colourway
@@ -10691,6 +11699,89 @@ interface KayakCar {
10691
11699
  }
10692
11700
  }
10693
11701
 
11702
+ declare namespace BowmarkProvider_mossyoak {
11703
+ // ── Mossy Oak — the unit's own declarations, verbatim ──
11704
+ interface MossyoakVariant {
11705
+ /** Shopify's numeric variant id as a string. */
11706
+ id: string;
11707
+ /** The variant's own label, e.g. "Full Foliage / M/L". */
11708
+ title: string;
11709
+ /** String verbatim from the storefront — "149.99" (dollars) on /products.json, "14999" (cents) on /products/<h>.js. */
11710
+ price: string;
11711
+ /** Same scale as price. Null when the variant is not on sale. */
11712
+ compareAtPrice: string | null;
11713
+ /** The store's own SKU. Null on a variant without one. */
11714
+ sku: string | null;
11715
+ /** Whether the variant is purchasable right now. */
11716
+ available: boolean;
11717
+ /** e.g. ["Full Foliage", "M/L"] — camo pattern + combined size. */
11718
+ options: string[];
11719
+ }
11720
+ interface MossyoakProduct {
11721
+ /** The handle is the only stable identifier across the catalogue. */
11722
+ handle: string;
11723
+ title: string;
11724
+ vendor: string;
11725
+ productType: string;
11726
+ url: string;
11727
+ descriptionHtml: string | null;
11728
+ optionNames: string[];
11729
+ variants: MossyoakVariant[];
11730
+ /** Same scale as variants — see MossyoakVariant.price. */
11731
+ priceRange: { min: string; max: string } | null;
11732
+ /** True if ANY variant is purchasable. */
11733
+ inStock: boolean;
11734
+ tags: string[];
11735
+ /** Mossy Oak's own images, in the order the storefront publishes them. */
11736
+ images: string[];
11737
+ }
11738
+ interface MossyoakCatalogue {
11739
+ /** All matching products, in-stock first, then by handle. */
11740
+ products: MossyoakProduct[];
11741
+ /** What the filter DROPPED, in the same register the rest of the library uses. */
11742
+ warnings: string[];
11743
+ }
11744
+ interface MossyoakCheckoutLink {
11745
+ /** Shopify's own cart-permalink URL — a GET that adds the line item and redirects into the cart. */
11746
+ url: string;
11747
+ /** The exact variant the link resolved to, read live off the storefront. */
11748
+ variant: MossyoakVariant;
11749
+ /** The product the variant belongs to. */
11750
+ product: MossyoakProduct;
11751
+ }
11752
+
11753
+ /**
11754
+ * Mossy Oak camo-apparel and gear catalogue — every product, its camo-pattern and size
11755
+ * variants, real prices and stock — read off the live Shopify storefront, plus a
11756
+ * live-validated checkout handoff link.
11757
+ */
11758
+ interface Unit {
11759
+ /**
11760
+ * Reads the live Mossy Oak catalogue as the storefront publishes it — every product, its
11761
+ * handle, title, vendor, description, tags, images and the per-variant price the storefront is
11762
+ * quoting right now. Returns [] on a transport failure. The catalog page is the line and the
11763
+ * parse is the unit of work.
11764
+ */
11765
+ listMossyoakProducts(opts?: { limit?: number }): Promise<MossyoakProduct[]>;
11766
+
11767
+ /**
11768
+ * Reads one product by its handle — every camo-pattern/size variant, its exact price and
11769
+ * whether that specific variant is purchasable right now. Takes the handle
11770
+ * listMossyoakProducts returns. THROWS on an unknown handle (the store answers a real 404).
11771
+ */
11772
+ getMossyoakProduct(handle: string): Promise<MossyoakProduct>;
11773
+
11774
+ /**
11775
+ * Resolves a product handle + a variant match (either the exact variant title like "Full
11776
+ * Foliage / M/L", or a substring of it) to a real Shopify cart-permalink URL, validated live
11777
+ * against the storefront. THROWS if the handle is unknown, if no variant matches, if the match
11778
+ * is ambiguous (matches more than one variant), or if the matched variant is not currently
11779
+ * available — the error names the candidate or in-stock options so the caller can retry.
11780
+ */
11781
+ getMossyoakCheckoutLink(handle: string, variantTitleOrOptions: string, opts?: { quantity?: number }): Promise<MossyoakCheckoutLink>;
11782
+ }
11783
+ }
11784
+
10694
11785
  declare namespace BowmarkProvider_naic {
10695
11786
  // ── NAIC — the unit's own declarations, verbatim ──
10696
11787
  interface naicCompanyQuery {
@@ -11159,6 +12250,56 @@ interface ottoSearchQuery {
11159
12250
  }
11160
12251
  }
11161
12252
 
12253
+ declare namespace BowmarkProvider_outdoorresearch {
12254
+ // ── Outdoor Research — the unit's own declarations, verbatim ──
12255
+ interface OutdoorResearchWarrantyPolicy {
12256
+ teamId: string;
12257
+ teamName: string; // "Outdoor Research"
12258
+ excludedTags: string[]; // e.g. ["Non-OR","warehouse_sale","POS_only","Nikwax"]
12259
+ thirdPartyPurchasesAccepted: boolean;
12260
+ purchaseLocations: string[]; // e.g. ["www.outdoorresearch.com","Other"]
12261
+ replacesFromFullCatalogWhenInStock: boolean;
12262
+ replacesFromFullCatalogWhenOutOfStock: boolean;
12263
+ receiptRequiredForThirdParty: boolean;
12264
+ productPhotoRequiredForThirdParty: boolean;
12265
+ supportEmail: string | null;
12266
+ notFoundMessage: string | null;
12267
+ expiredMessage: string | null;
12268
+ }
12269
+ interface OutdoorResearchClaimEligibility {
12270
+ eligible: boolean;
12271
+ status: "not_found" | "blocked" | "expired" | "eligible";
12272
+ message: string; // the site's own wording for this outcome
12273
+ continueUrl: string | null; // set only when eligible: true
12274
+ }
12275
+
12276
+ /**
12277
+ * Reads Outdoor Research's Infinite Guarantee warranty program straight from the ReturnLogic
12278
+ * claim portal's own API — the real program rules, and whether a given order/email can open a
12279
+ * claim right now — no key, no browser.
12280
+ */
12281
+ interface Unit {
12282
+ /**
12283
+ * Reads Outdoor Research's Infinite Guarantee program config straight from the ReturnLogic
12284
+ * claim portal — exclusion tags, in-stock/out-of-stock replacement scenarios, third-party
12285
+ * purchase acceptance and its named purchase locations, receipt/photo requirements, and the
12286
+ * site's own not-found/expired copy. Takes nothing. THROWS rather than returning a placeholder
12287
+ * when the settings endpoint answers without teamId/teamName.
12288
+ */
12289
+ getWarrantyPolicy(): Promise<OutdoorResearchWarrantyPolicy>;
12290
+
12291
+ /**
12292
+ * Starts an Infinite Guarantee claim by order number + email — the same lookup 'File a
12293
+ * Warranty Claim' performs. Returns `eligible: false` with a `status` of
12294
+ * not_found/blocked/expired and the site's own message when the pair does not qualify (a real,
12295
+ * expected answer, not an error) — never throws for those. On `eligible: true`, `continueUrl`
12296
+ * is where the customer would pick items and see per-item eligibility. THROWS only on a
12297
+ * transport failure or an unrecognized response.
12298
+ */
12299
+ checkClaimEligibility(orderNumber: string, email: string): Promise<OutdoorResearchClaimEligibility>;
12300
+ }
12301
+ }
12302
+
11162
12303
  declare namespace BowmarkProvider_paypal {
11163
12304
  // ── PayPal — the unit's own declarations, verbatim ──
11164
12305
  interface PaypalEstimateFeeArgs {
@@ -12636,6 +13777,67 @@ interface RedditThread {
12636
13777
  }
12637
13778
  }
12638
13779
 
13780
+ declare namespace BowmarkProvider_rishitea {
13781
+ // ── Rishi Tea & Botanicals — the unit's own declarations, verbatim ──
13782
+ interface TeaFinderQuestion {
13783
+ id: string;
13784
+ profileQuestionId: string;
13785
+ text: string;
13786
+ selectionType: "single" | "multi";
13787
+ options: string[];
13788
+ minSelections?: number;
13789
+ maxSelections?: number;
13790
+ }
13791
+ interface TeaFinderQuiz {
13792
+ quizId: string;
13793
+ channelQuizId: string;
13794
+ questions: TeaFinderQuestion[];
13795
+ }
13796
+ interface TeaFinderAnswerInput {
13797
+ questionId: string; // a TeaFinderQuestion.id
13798
+ answer: string | string[]; // string for selectionType "single", string[] for "multi"
13799
+ }
13800
+ interface TeaFinderProduct {
13801
+ name: string;
13802
+ url: string;
13803
+ description: string;
13804
+ imageUrl: string;
13805
+ averageRating: number | null;
13806
+ approvedReviewsCount: number;
13807
+ price: number | null;
13808
+ currencyCode: string | null;
13809
+ }
13810
+ interface TeaFinderResult {
13811
+ quizResponseId: string;
13812
+ title: string;
13813
+ subtitle: string | null;
13814
+ products: TeaFinderProduct[];
13815
+ runnerUpProducts: TeaFinderProduct[];
13816
+ }
13817
+
13818
+ /**
13819
+ * Rishi Tea's own "Tea Finder" quiz (Okendo Quizzes) — reads the real question set and submits
13820
+ * real answers to get back the site's own personalized tea recommendation.
13821
+ */
13822
+ interface Unit {
13823
+ /**
13824
+ * Reads the live Tea Finder quiz's real question set straight from Okendo's quiz API — every
13825
+ * question's text, whether it takes one answer or several, and its exact option strings. Call
13826
+ * this first: `matchTeaFinderQuiz` needs the caller's answers keyed on each question's own
13827
+ * `id`.
13828
+ */
13829
+ getTeaFinderQuiz(): Promise<TeaFinderQuiz>;
13830
+
13831
+ /**
13832
+ * Submits a full set of answers (one per question `getTeaFinderQuiz` returned) to Okendo's
13833
+ * quiz engine and returns the SAME personalized recommendation the live widget shows — a
13834
+ * title/subtitle and the real recommended products (name, buy link, description, rating,
13835
+ * price) pulled from Rishi's actual catalog, plus a runner-up list.
13836
+ */
13837
+ matchTeaFinderQuiz(quiz: TeaFinderQuiz, answers: TeaFinderAnswerInput[]): Promise<TeaFinderResult>;
13838
+ }
13839
+ }
13840
+
12639
13841
  declare namespace BowmarkProvider_ritani {
12640
13842
  // ── Ritani — the unit's own declarations, verbatim ──
12641
13843
  // Ritani's OWN shapes — not a capability contract.
@@ -12705,6 +13907,109 @@ interface RitaniPriceResult {
12705
13907
  }
12706
13908
  }
12707
13909
 
13910
+ declare namespace BowmarkProvider_roofmaxx {
13911
+ // ── Roof Maxx — the unit's own declarations, verbatim ──
13912
+ interface RoofmaxxCalculatorSettings {
13913
+ title: string;
13914
+ description: string;
13915
+ }
13916
+
13917
+ interface RoofmaxxCostEstimateArgs {
13918
+ squareFootage: number;
13919
+ region: "new-england" | "middle-atlantic" | "east-north-central" | "west-north-central" |
13920
+ "south-atlantic" | "east-south-central" | "west-south-central" | "mountain" | "pacific";
13921
+ roofType: "asphalt" | "metal" | "clay" | "wood";
13922
+ roofSlope: "walkable" | "semiWalkable" | "nonWalkable";
13923
+ numOfLevels: "1" | "2" | "3";
13924
+ garageType: "nogarage" | "1car" | "2car";
13925
+ }
13926
+
13927
+ interface RoofmaxxCostEstimate {
13928
+ low: number;
13929
+ mid: number;
13930
+ high: number;
13931
+ }
13932
+
13933
+ /**
13934
+ * Roof Maxx's own Roof Replacement Cost Calculator (roofmaxx.com/learning-hub) — given a
13935
+ * home's size, location and roof details, returns the site's real server-computed low/mid/high
13936
+ * full-replacement-cost estimate.
13937
+ */
13938
+ interface Unit {
13939
+ /** The Roof Replacement Cost Calculator's own admin-configured title and description. */
13940
+ getCalculatorSettings(): Promise<RoofmaxxCalculatorSettings>;
13941
+
13942
+ /**
13943
+ * Runs the real calculator: given square footage, region, roof type, roof slope, garage size
13944
+ * and building levels, returns Roof Maxx's own server-computed low/mid/high
13945
+ * full-replacement-cost tiers.
13946
+ */
13947
+ estimateRoofReplacementCost(arg: RoofmaxxCostEstimateArgs): Promise<RoofmaxxCostEstimate>;
13948
+ }
13949
+ }
13950
+
13951
+ declare namespace BowmarkProvider_saltandstone {
13952
+ // ── Salt & Stone — the unit's own declarations, verbatim ──
13953
+ // Salt & Stone's OWN shapes — not a capability contract.
13954
+
13955
+ interface ScentFamily {
13956
+ handle: string;
13957
+ name: string; // e.g. "Santal & Vetiver"
13958
+ description: string; // the site's own mood copy
13959
+ notes: { top: string[]; heart: string[]; base: string[] }; // real fragrance notes
13960
+ url: string;
13961
+ }
13962
+
13963
+ interface ScentMatch {
13964
+ handle: string;
13965
+ name: string;
13966
+ score: number; // 0-1 — how much of the caller's preference matched this family's real notes/copy
13967
+ matchedTerms: string[]; // which of the caller's own words matched, and why
13968
+ url: string;
13969
+ }
13970
+
13971
+ interface ScentProduct {
13972
+ handle: string; // "body-wash" | "body-mist" | "body-lotion" | "natural-deodorant" | "hand-cream" | "candle"
13973
+ title: string;
13974
+ productType: string;
13975
+ variantId: string;
13976
+ variantTitle: string;
13977
+ price: number; // dollars, real Shopify variant price
13978
+ compareAtPrice: number | null;
13979
+ available: boolean; // real live stock flag
13980
+ url: string; // real product page, this exact variant preselected
13981
+ }
13982
+
13983
+ /**
13984
+ * Salt & Stone's own Scent Quiz, reimplemented over its real six named scent families: list
13985
+ * every family's real fragrance notes, compute a real ranked match against a free-text
13986
+ * preference, and shop the real core products (body wash, mist, lotion, deodorant, hand cream,
13987
+ * candle) in the matched scent with real price and availability.
13988
+ */
13989
+ interface Unit {
13990
+ /**
13991
+ * Lists Salt & Stone's real six named scent families, each with its own real top/heart/base
13992
+ * fragrance notes and mood description, read off the site's own collection pages.
13993
+ */
13994
+ listScentFamilies(): Promise<ScentFamily[]>;
13995
+
13996
+ /**
13997
+ * Salt & Stone's own Scent Quiz, reimplemented: computes a real ranked match across all six
13998
+ * scent families by scoring the preference's terms against each family's own published
13999
+ * fragrance notes and description.
14000
+ */
14001
+ matchScent(preferences: string): Promise<ScentMatch[]>;
14002
+
14003
+ /**
14004
+ * Lists the real core products (body wash, body mist, body lotion, deodorant, hand cream,
14005
+ * candle) available in one named scent family, with each one's real price, availability and
14006
+ * product page. THROWS on an unknown family name, naming listScentFamilies() as the way to
14007
+ * find current ones.
14008
+ */
14009
+ getScentProducts(familyName: string): Promise<ScentProduct[]>;
14010
+ }
14011
+ }
14012
+
12708
14013
  declare namespace BowmarkProvider_samsclub {
12709
14014
  // ── Sam's Club — the unit's own declarations, verbatim ──
12710
14015
  interface SamsclubInstantSavingsItem {
@@ -12897,6 +14202,50 @@ interface SamsclubMembershipPlan {
12897
14202
  }
12898
14203
  }
12899
14204
 
14205
+ declare namespace BowmarkProvider_seakeeper {
14206
+ // ── Seakeeper — the unit's own declarations, verbatim ──
14207
+ interface SeakeeperDealer {
14208
+ name: string;
14209
+ address: string;
14210
+ contactName: string;
14211
+ phone: string;
14212
+ email: string;
14213
+ website: string;
14214
+ latitude: number;
14215
+ longitude: number;
14216
+ tier: string;
14217
+ tierLabel: string;
14218
+ }
14219
+ interface SeakeeperNearbyDealer extends SeakeeperDealer {
14220
+ distanceMiles: number;
14221
+ }
14222
+ interface SeakeeperNearestDealersResult {
14223
+ zip: string;
14224
+ dealers: SeakeeperNearbyDealer[];
14225
+ }
14226
+
14227
+ /**
14228
+ * Reads Seakeeper's own real-time Dealer / Elite Dealer Locator directly (the same admin-ajax
14229
+ * endpoint the site's map runs) — every real gyro-stabilizer dealer worldwide, or the nearest
14230
+ * ones to a US zip ranked by distance with each dealer's real tier (Elite Dealer / Dealer /
14231
+ * Master Technician).
14232
+ */
14233
+ interface Unit {
14234
+ /**
14235
+ * Every real Seakeeper dealer worldwide (name, address, contact, coordinates, tier), read
14236
+ * straight from the locator's own live data endpoint.
14237
+ */
14238
+ listAllDealers(): Promise<SeakeeperDealer[]>;
14239
+
14240
+ /**
14241
+ * Ranks every real Seakeeper dealer by distance from a US zip and returns the nearest `limit`
14242
+ * (default 20, matching the site's own displayed count), each with its real tier and how far
14243
+ * it is.
14244
+ */
14245
+ findNearestDealers(zip: string, limit?: number): Promise<SeakeeperNearestDealersResult>;
14246
+ }
14247
+ }
14248
+
12900
14249
  declare namespace BowmarkProvider_sears {
12901
14250
  // ── Sears — the unit's own declarations, verbatim ──
12902
14251
  interface SearsSearchPrice {
@@ -13792,6 +15141,52 @@ interface SunHomeSaunasCartResult {
13792
15141
  }
13793
15142
  }
13794
15143
 
15144
+ declare namespace BowmarkProvider_tamarackidaho {
15145
+ // ── Tamarack Resort — the unit's own declarations, verbatim ──
15146
+ interface tamarackidahoSearchArgs {
15147
+ arrivalDate: string;
15148
+ departureDate: string;
15149
+ adultCount: number;
15150
+ childCount?: number;
15151
+ }
15152
+
15153
+ interface tamarackidahoSearchResult {
15154
+ arrivalDate: string;
15155
+ departureDate: string;
15156
+ adultCount: number;
15157
+ childCount: number;
15158
+ units: tamarackidahoUnit[];
15159
+ }
15160
+
15161
+ interface tamarackidahoUnit {
15162
+ supplierId: string;
15163
+ supplierName: string;
15164
+ productId: string;
15165
+ unitName: string;
15166
+ totalPrice: number;
15167
+ }
15168
+
15169
+ /**
15170
+ * Tamarack Resort's own direct-managed lodging booking engine (Inntopia RTP) — real
15171
+ * availability and price per unit type for a date range and party size, straight from the
15172
+ * site's own search widget, browserless.
15173
+ */
15174
+ interface Unit {
15175
+ /**
15176
+ * Searches Tamarack Resort's own direct-managed lodging (the Lodge at Osprey Meadows, the
15177
+ * Village at Tamarack Resort, and Tamarack Homes and Cottages — not the golf tee-time flow, a
15178
+ * different vendor) for a stay and party size. `arrivalDate`/`departureDate` are "MM/DD/YYYY"
15179
+ * strings (the widget's own format), `adultCount` is required and positive, `childCount`
15180
+ * defaults to 0. Returns every unit type Tamarack's own booking engine (Inntopia RTP)
15181
+ * currently prices as AVAILABLE for that exact query — each with its supplier (property), unit
15182
+ * name, and `totalPrice` in USD for the whole queried stay (not nightly) — genuinely computed
15183
+ * per call, not a cached listing. An empty `units` array is a real answer: Tamarack has
15184
+ * nothing available for that stay, not a failure.
15185
+ */
15186
+ searchLodging(args: tamarackidahoSearchArgs): Promise<tamarackidahoSearchResult>;
15187
+ }
15188
+ }
15189
+
13795
15190
  declare namespace BowmarkProvider_target {
13796
15191
  // ── Target — the unit's own declarations, verbatim ──
13797
15192
  interface targetRow {
@@ -13846,6 +15241,55 @@ interface TargetStoreSearch {
13846
15241
  }
13847
15242
  }
13848
15243
 
15244
+ declare namespace BowmarkProvider_tatcha {
15245
+ // ── Tatcha — the unit's own declarations, verbatim ──
15246
+ interface TatchaQuizOption {
15247
+ value: string;
15248
+ label: string;
15249
+ }
15250
+
15251
+ interface TatchaRitualQuizOptions {
15252
+ skinTypes: TatchaQuizOption[];
15253
+ benefits: TatchaQuizOption[];
15254
+ eyeConcerns: TatchaQuizOption[];
15255
+ }
15256
+
15257
+ interface TatchaRitualProduct {
15258
+ step: string;
15259
+ sku: string;
15260
+ name: string;
15261
+ secondaryName: string;
15262
+ price: string;
15263
+ handle: string;
15264
+ url: string;
15265
+ image: string;
15266
+ usageTime: "AM" | "PM" | "both";
15267
+ description: string;
15268
+ inStock: boolean;
15269
+ }
15270
+
15271
+ interface TatchaRitual {
15272
+ summary: string;
15273
+ products: TatchaRitualProduct[];
15274
+ handoffUrl: string;
15275
+ }
15276
+
15277
+ /**
15278
+ * Runs Tatcha's real "Ritual Finder" skincare quiz — the site's own product-matching backend,
15279
+ * not a generic routine.
15280
+ */
15281
+ interface Unit {
15282
+ /** Reads the live Ritual Finder quiz's real skin-type, benefit and eye-concern menus. */
15283
+ getRitualQuizOptions(): Promise<TatchaRitualQuizOptions>;
15284
+
15285
+ /**
15286
+ * Runs real quiz answers through Tatcha's own personalization backend and returns the real
15287
+ * AM/PM product ritual it recommends.
15288
+ */
15289
+ getPersonalizedRitual(skinType: string, benefits: string[], eyeConcerns?: string[], sensitive?: boolean, owned?: string[]): Promise<TatchaRitual>;
15290
+ }
15291
+ }
15292
+
13849
15293
  declare namespace BowmarkProvider_teladoc {
13850
15294
  // ── Teladoc Health — the unit's own declarations, verbatim ──
13851
15295
  interface teladocRow {
@@ -13900,98 +15344,6 @@ interface teladocInsuranceCoverage {
13900
15344
  }
13901
15345
  }
13902
15346
 
13903
- declare namespace BowmarkProvider_tentree {
13904
- // ── tentree — the unit's own declarations, verbatim ──
13905
- interface TentreeVariant {
13906
- /** Shopify's numeric variant id as a string. What addToCart takes. */
13907
- id: string;
13908
- /** The variant's own label, e.g. "ASHWOOD METEORITE BLACK / ONE". */
13909
- title: string;
13910
- /** Decimal string exactly as the store publishes it, e.g. "45.00". */
13911
- price: string;
13912
- compareAtPrice: string | null;
13913
- sku: string | null;
13914
- /** The store's own per-variant stock flag. */
13915
- available: boolean;
13916
- options: string[];
13917
- }
13918
- interface TentreeProduct {
13919
- handle: string;
13920
- title: string;
13921
- productType: string;
13922
- vendor: string;
13923
- url: string;
13924
- optionNames: string[];
13925
- variants: TentreeVariant[];
13926
- priceRange: { min: string; max: string } | null;
13927
- inStock: boolean;
13928
- tags: string[];
13929
- descriptionHtml: string | null;
13930
- }
13931
- interface TentreeCartLine {
13932
- /** Shopify's own line key, which its cart-change endpoints address a line by. */
13933
- lineKey: string;
13934
- variantId: string;
13935
- productTitle: string;
13936
- /** Null on a single-variant product. */
13937
- variantTitle: string | null;
13938
- quantity: number;
13939
- price: string;
13940
- lineTotal: string;
13941
- url: string;
13942
- }
13943
- interface TentreeCart {
13944
- /** The store's own cart token — a bearer credential, so treat it like one. */
13945
- token: string;
13946
- lines: TentreeCartLine[];
13947
- /** Units, NOT lines: two of one variant is one line and two items. */
13948
- itemCount: number;
13949
- subtotal: string;
13950
- currency: string;
13951
- cartUrl: string;
13952
- checkoutUrl: string;
13953
- }
13954
-
13955
- /**
13956
- * Sustainable apparel storefront — hats, tees, hoodies and outerwear — with a real guest cart
13957
- * a caller can fill across several calls.
13958
- */
13959
- interface Unit {
13960
- /**
13961
- * Searches tentree's live catalogue and returns matching products with their real variants,
13962
- * current prices and per-variant stock. Matches whole words, so 'tee' finds tees and not
13963
- * 'steel'. Returns [] when nothing matches, which is an ordinary answer rather than an error.
13964
- */
13965
- searchProducts(query: string, opts?: { productType?: string; inStockOnly?: boolean; limit?: number }): Promise<TentreeProduct[]>;
13966
-
13967
- /**
13968
- * Reads one product by its handle — every variant, its exact price and whether that specific
13969
- * size or colour is purchasable right now. Takes the handle searchProducts returns, and its
13970
- * variants[].id is what addToCart takes. THROWS on an unknown handle (the store answers a real
13971
- * 404).
13972
- */
13973
- getProduct(handle: string): Promise<TentreeProduct>;
13974
-
13975
- /**
13976
- * Puts variants into THIS run's own cart on the store and returns the cart as the store
13977
- * reports it. Really writes — the cart exists on tentree.com from the first call, and it
13978
- * belongs to this run's cookie jar. Call it several times inside one bowmark.session() and the
13979
- * lines accumulate; call it across two separate runs and the second cart does not contain the
13980
- * first's lines. Takes VARIANT ids (getProduct().variants[].id), never handles. Nothing is
13981
- * bought: checkoutUrl is where a shopper would pay.
13982
- */
13983
- addToCart(items: Array<{ variantId: string; quantity?: number }>): Promise<TentreeCart>;
13984
-
13985
- /**
13986
- * Reads THIS run's cart back from the store — lines, quantities, per-line and order totals,
13987
- * and the real cart and checkout URLs. Takes no id: the cart is the one this run's cookie jar
13988
- * holds, so a fresh run reads an empty cart rather than somebody else's. An empty cart is an
13989
- * ordinary answer (itemCount 0), not an error.
13990
- */
13991
- getCart(): Promise<TentreeCart>;
13992
- }
13993
- }
13994
-
13995
15347
  declare namespace BowmarkProvider_therabody {
13996
15348
  // ── Therabody — the unit's own declarations, verbatim ──
13997
15349
  interface TherabodyVariant {
@@ -14577,6 +15929,108 @@ interface thezebraAutoQuotes {
14577
15929
  }
14578
15930
  }
14579
15931
 
15932
+ declare namespace BowmarkProvider_tilsonhomes {
15933
+ // ── Tilson Homes — the unit's own declarations, verbatim ──
15934
+ interface TilsonhomesPlan {
15935
+ id: number;
15936
+ name: string;
15937
+ displayName: string | null;
15938
+ bed: number | null;
15939
+ bath: number | null;
15940
+ size: number | null;
15941
+ cost: number | null;
15942
+ defaultElevationId: number | null;
15943
+ }
15944
+
15945
+ interface TilsonhomesElevationDetails {
15946
+ id: number;
15947
+ planName: string | null;
15948
+ caption: string | null;
15949
+ thumb: string | null;
15950
+ bed: number | null;
15951
+ bedMin: number | null;
15952
+ bedMax: number | null;
15953
+ bath: number | null;
15954
+ bathMin: number | null;
15955
+ bathMax: number | null;
15956
+ size: number | null;
15957
+ sizeMin: number | null;
15958
+ sizeMax: number | null;
15959
+ cost: number | null;
15960
+ costMin: number | null;
15961
+ costMax: number | null;
15962
+ description: string | null;
15963
+ finishes: TilsonhomesFinishOption[];
15964
+ }
15965
+
15966
+ interface TilsonhomesFinishOption {
15967
+ category: string | null;
15968
+ name: string | null;
15969
+ displayName: string | null;
15970
+ swatches: { id: number; name: string | null }[];
15971
+ }
15972
+
15973
+ /**
15974
+ * Reads Tilson Homes' Build-On-Your-Land floor plan catalog and each plan's Anewgo-powered
15975
+ * customizer — bed/bath/size range and exterior finish options — the way the live site's
15976
+ * interactive floorplan tool would show them.
15977
+ */
15978
+ interface Unit {
15979
+ /**
15980
+ * Lists Tilson Homes' Build-On-Your-Land floor plans — model name, bed/bath/size and the
15981
+ * default elevation id `getElevationDetails` reads. The entry point: every plan links to a
15982
+ * customizer instance.
15983
+ */
15984
+ listPlans(activeOnly?: boolean): Promise<TilsonhomesPlan[]>;
15985
+
15986
+ /**
15987
+ * Reads one plan's elevation — the exterior style's customization range (how far bed/bath/size
15988
+ * can be pushed by the site's own add-a-room options) and its exterior finish categories
15989
+ * (roof, trim, body, accent) with the swatch currently assigned to each. The read behind 'add
15990
+ * a covered porch and a 4th bedroom, show me the finishes'.
15991
+ */
15992
+ getElevationDetails(elevationId: number | string): Promise<TilsonhomesElevationDetails>;
15993
+ }
15994
+ }
15995
+
15996
+ declare namespace BowmarkProvider_titlenine {
15997
+ // ── Title Nine — the unit's own declarations, verbatim ──
15998
+ // Title Nine's OWN shapes — not a capability contract.
15999
+
16000
+ interface TitlenineBraMeasurements {
16001
+ chestInches: number; // site's calculatable range: 30-46
16002
+ bustInches: number;
16003
+ belowBustInches: number; // site requires >= 24
16004
+ }
16005
+
16006
+ interface TitlenineBraSizeResult {
16007
+ bandSize: number;
16008
+ cupCode: string; // the site's own raw catalog query param, e.g. "DD%2B"
16009
+ cupLabel: string; // the label shown to the customer, e.g. "M (11D)"
16010
+ sizeLabel: string; // "<bandSize><cupLabel>", e.g. "40M (11D)"
16011
+ inStock: boolean; // false for the extended range (n2 >= 9)
16012
+ shopUrl: string | null; // pre-filtered catalog link, only when inStock
16013
+ unavailableMessage: string | null;
16014
+ calculatorUrl: string;
16015
+ }
16016
+
16017
+ /**
16018
+ * Title Nine's own bra-size calculator — real band + cup math off three measurements, computed
16019
+ * exactly as the site computes it, including the extended cup range (up to "M (11D)") that
16020
+ * generic AI knowledge gets wrong — plus the exact 'Shop <size>' catalog link when the size is
16021
+ * in stock.
16022
+ */
16023
+ interface Unit {
16024
+ /**
16025
+ * Runs Title Nine's own bra-size calculator — chest/bust/under-bust in, a real band + cup size
16026
+ * out computed exactly as the site computes it, including Title Nine's own extended cup
16027
+ * labeling past DDD (up to "M (11D)") that generic AI knowledge gets wrong. Returns the exact
16028
+ * 'Shop <size>' catalog link when the size is currently carried online.
16029
+ */
16030
+ calculateBraSize(input: TitlenineBraMeasurements): Promise<TitlenineBraSizeResult>;
16031
+ }
16032
+ }
16033
+
14580
16034
  declare namespace BowmarkProvider_topviewtix {
14581
16035
  // ── TopView Sightseeing — the unit's own declarations, verbatim ──
14582
16036
  interface topviewtixPackageDetails {
@@ -14687,6 +16141,72 @@ interface TrekTravelSearchFilters {
14687
16141
  }
14688
16142
  }
14689
16143
 
16144
+ declare namespace BowmarkProvider_twiddy {
16145
+ // ── Twiddy & Company Realtors — the unit's own declarations, verbatim ──
16146
+ interface TwiddyRentalRow {
16147
+ propertyId: number;
16148
+ propertyNumber: string;
16149
+ name: string;
16150
+ url: string;
16151
+ town: string;
16152
+ distanceToBeach: string;
16153
+ bedrooms: number | null;
16154
+ priceFromUsd: number | null;
16155
+ priceFromFormatted: string | null;
16156
+ ratingValue: number | null;
16157
+ isAvailable: boolean;
16158
+ }
16159
+ interface TwiddyRentalDetail {
16160
+ propertyId: number;
16161
+ name: string;
16162
+ identifier: string;
16163
+ description: string;
16164
+ streetAddress: string;
16165
+ town: string;
16166
+ petsAllowed: boolean;
16167
+ amenities: string[];
16168
+ numberOfBedrooms: number | null;
16169
+ numberOfBathrooms: number | null;
16170
+ images: string[];
16171
+ url: string;
16172
+ }
16173
+ type TwiddyQuote =
16174
+ | { available: true; propertyId: number; checkin: string; nights: number; currency: "USD";
16175
+ rentalFeeUsd: number; discountUsd: number; taxUsd: number; totalUsd: number; checkoutUrl: string }
16176
+ | { available: false; propertyId: number; checkin: string; nights: number };
16177
+
16178
+ /**
16179
+ * Twiddy & Company's own Outer Banks vacation rental search and real-time weekly
16180
+ * pricing/booking-handoff engine — a regional owner-operator's own 1,000+ property inventory,
16181
+ * live availability and price, not a stale catalog.
16182
+ */
16183
+ interface Unit {
16184
+ /**
16185
+ * Runs Twiddy's own portfolio-wide search (all 1,000+ managed Outer Banks properties in one
16186
+ * call), optionally filtered to one of the six towns ("Corolla", "Duck", "4x4", "Southern
16187
+ * Shores", "Kitty Hawk", "Kill Devil Hills", "Nags Head") and/or a minimum bedroom count, and
16188
+ * returns the live matching listings — name, url, town, distance to beach, bed count, an "as
16189
+ * low as" headline price, rating.
16190
+ */
16191
+ searchRentals(options?: { town?: string; minBedrooms?: number }): Promise<TwiddyRentalRow[]>;
16192
+
16193
+ /**
16194
+ * Reads one rental in full — description, address, pets-allowed flag, amenities, bed/bath
16195
+ * counts, photos, and the internal numeric propertyId getRentalQuote needs — from the
16196
+ * propertyUrl a search result carries (a twiddy.com/outer-banks/... path or full URL).
16197
+ */
16198
+ getRentalDetail(propertyUrl: string): Promise<TwiddyRentalDetail>;
16199
+
16200
+ /**
16201
+ * Runs the site's own real-time weekly pricing engine for one property and a check-in date
16202
+ * ("YYYY-MM-DD", default 7 nights) — rental fee, discount, tax, total — and returns the exact
16203
+ * booking/checkout URL for that week. `available: false` means the site checked and the
16204
+ * property has no live rate for that week, an ordinary answer.
16205
+ */
16206
+ getRentalQuote(propertyId: number, options: { checkin: string; nights?: number }): Promise<TwiddyQuote>;
16207
+ }
16208
+ }
16209
+
14690
16210
  declare namespace BowmarkProvider_ulrichlifestyle {
14691
16211
  // ── Ulrich Lifestyle Structures — the unit's own declarations, verbatim ──
14692
16212
  // Ulrich Lifestyle Structures' OWN shapes — not a capability contract.
@@ -14758,6 +16278,58 @@ interface UlrichPriceResult {
14758
16278
  }
14759
16279
  }
14760
16280
 
16281
+ declare namespace BowmarkProvider_vervecoffee {
16282
+ // ── Verve Coffee Roasters — the unit's own declarations, verbatim ──
16283
+ interface VervecoffeeSubscription {
16284
+ id: string;
16285
+ handle: string;
16286
+ title: string;
16287
+ priceFormatted: string;
16288
+ url: string;
16289
+ }
16290
+ interface VervecoffeeCoffeeMatch {
16291
+ id: string;
16292
+ title: string;
16293
+ descriptionHtml: string;
16294
+ startingPriceFormatted: string;
16295
+ url: string;
16296
+ subscriptionPlans: Array<{ name: string; deliveryInterval: string; priceWithDiscount: string }>;
16297
+ }
16298
+ interface VervecoffeeCoffeeMatchResult {
16299
+ recommendedProducts: VervecoffeeCoffeeMatch[];
16300
+ }
16301
+ interface CoffeeQuizAnswers {
16302
+ journeyStage: "coffee_curious" | "casual_coffee_lover" | "coffee_connoisseur" | "barista";
16303
+ brewMethod: "pourover" | "coffee_maker" | "espresso" | "french_press" | "aeropress";
16304
+ coffeeStyle: "black" | "milk_or_cream" | "sugar_or_sweetener";
16305
+ roastPreference: "light" | "medium" | "dark" | "not_sure";
16306
+ tastingNote: "chocolate" | "citrus" | "fruits" | "sweet" | "floral" | "nuts";
16307
+ }
16308
+
16309
+ /**
16310
+ * Verve Coffee Roasters' Roaster's Choice subscription catalog and its real 'Find Your Coffee
16311
+ * Match' quiz (Octane AI-powered) — drives the same 5 questions the live site asks and returns
16312
+ * the actual subscription it recommends, priced, with a buy link.
16313
+ */
16314
+ interface Unit {
16315
+ /**
16316
+ * Lists Verve's five real Roaster's Choice coffee subscription products (single origin, blend,
16317
+ * espresso, Africa, Latin America) with their live USD price, read off the storefront's own
16318
+ * /products.json catalog.
16319
+ */
16320
+ listRoastersChoiceSubscriptions(): Promise<VervecoffeeSubscription[]>;
16321
+
16322
+ /**
16323
+ * Runs Verve's real 'Find Your Coffee Match' quiz end to end — the same 5 questions the live
16324
+ * Octane AI-powered quiz at /pages/quiz asks every visitor — and returns the actual Roaster's
16325
+ * Choice subscription(s) it recommends, with real USD price and a buy-page link. THROWS if
16326
+ * Verve's quiz has been reconfigured and one of the 5 answer labels no longer matches (see the
16327
+ * error for the live option set).
16328
+ */
16329
+ matchCoffeeSubscription(answers: CoffeeQuizAnswers): Promise<VervecoffeeCoffeeMatchResult>;
16330
+ }
16331
+ }
16332
+
14761
16333
  declare namespace BowmarkProvider_viewrail {
14762
16334
  // ── Viewrail — the unit's own declarations, verbatim ──
14763
16335
  interface ViewrailMaterial {
@@ -14798,6 +16370,62 @@ interface ViewrailMountingStyle {
14798
16370
  }
14799
16371
  }
14800
16372
 
16373
+ declare namespace BowmarkProvider_villagerealtyobx {
16374
+ // ── Village Realty — the unit's own declarations, verbatim ──
16375
+ interface VillagerealtyobxListing {
16376
+ propertyID: string;
16377
+ seoName: string;
16378
+ name: string;
16379
+ town: string;
16380
+ address: string | null;
16381
+ bedrooms: number | null;
16382
+ maxGuests: number | null;
16383
+ photoUrl: string | null;
16384
+ url: string;
16385
+ }
16386
+
16387
+ interface VillagerealtyobxQuote {
16388
+ propertyID: string;
16389
+ checkin: string;
16390
+ checkout: string;
16391
+ available: boolean;
16392
+ rent: number | null;
16393
+ taxes: number | null;
16394
+ total: number | null;
16395
+ currency: string;
16396
+ bookNowURL: string | null;
16397
+ message: string | null;
16398
+ }
16399
+
16400
+ /**
16401
+ * Village Realty's own Outer Banks vacation-rental search and real-time property quote (rent,
16402
+ * taxes, total, book-now link) — the same live pricing their own site computes, no login
16403
+ * required.
16404
+ */
16405
+ interface Unit {
16406
+ /**
16407
+ * Searches Village Realty's own 900+ Outer Banks rental listings the way
16408
+ * villagerealtyobx.com/outer-banks-vacation-rentals does — filter by town (e.g. "Corolla",
16409
+ * "Nags Head"), exact bedroom count, amenities (e.g. "Private Pool", "Elevator"), and
16410
+ * optionally a date range — returning each matching property's id, name, town, address,
16411
+ * bedroom count, max guests and detail-page URL. Call getQuote with a result's propertyID for
16412
+ * a real priced quote.
16413
+ */
16414
+ searchRentals(args?: { town?: string, bedrooms?: number, amenities?: string[], checkin?: string, checkout?: string, page?: number }): Promise<VillagerealtyobxListing[]>;
16415
+
16416
+ /**
16417
+ * Gets a real-time price quote for one Village Realty property and date range — the exact
16418
+ * server-computed rent, taxes and total the rental detail page shows after picking dates, plus
16419
+ * the book-now URL. `checkin`/`checkout` are `MM/DD/YYYY`. `available: false` is a genuine
16420
+ * site answer (e.g. the dates fail the property's minimum-night-stay rule), not an error —
16421
+ * this is the flow ChatGPT itself cannot operate today: asked to price a Village Realty stay
16422
+ * it answers "I can't complete the booking or take payment for you" and recommends competitor
16423
+ * sites instead of quoting Village Realty's own live price.
16424
+ */
16425
+ getQuote(args: { propertyID: string, checkin: string, checkout: string }): Promise<VillagerealtyobxQuote>;
16426
+ }
16427
+ }
16428
+
14801
16429
  declare namespace BowmarkProvider_visible {
14802
16430
  // ── Visible — the unit's own declarations, verbatim ──
14803
16431
  interface VisibleDealOffer {
@@ -15057,6 +16685,33 @@ interface VisibleGetPlansResult {
15057
16685
  }
15058
16686
  }
15059
16687
 
16688
+ declare namespace BowmarkProvider_voluspa {
16689
+ // ── Voluspa — the unit's own declarations, verbatim ──
16690
+ interface VoluspaQuizButton {
16691
+ text: string;
16692
+ action: string;
16693
+ url?: string;
16694
+ selectedValue?: string;
16695
+ }
16696
+ interface VoluspaQuizIntro {
16697
+ paths: VoluspaQuizButton[];
16698
+ firstQuestionOptions: VoluspaQuizButton[];
16699
+ }
16700
+
16701
+ /**
16702
+ * Voluspa's own "Find Your Fragrance" quiz suite — reads the branching quiz's entry paths and
16703
+ * first-question scent-family options straight from the quiz vendor's config.
16704
+ */
16705
+ interface Unit {
16706
+ /**
16707
+ * Reads the fragrance quiz's entry screen — its two branching paths and the FIRST question's
16708
+ * scent-family options for one of them (0 = home fragrance, 1 = personal fragrance/EDP, as the
16709
+ * splash screen lists them; default 0) — decoded from Digioh's own campaign config.
16710
+ */
16711
+ getFragranceQuizIntro(pathIndex?: number): Promise<VoluspaQuizIntro>;
16712
+ }
16713
+ }
16714
+
15060
16715
  declare namespace BowmarkProvider_walmart {
15061
16716
  // ── Walmart — the unit's own declarations, verbatim ──
15062
16717
  interface walmartStore {
@@ -15124,6 +16779,64 @@ interface walmartSearchResult {
15124
16779
  }
15125
16780
  }
15126
16781
 
16782
+ declare namespace BowmarkProvider_waterfurnace {
16783
+ // ── WaterFurnace — the unit's own declarations, verbatim ──
16784
+ type WaterfurnaceFuelSource = "gas" | "propane" | "heatpump" | "resistance" | "oil";
16785
+ type WaterfurnaceSecondaryFuelSource = "gas" | "propane" | "resistance" | "oil" | "none";
16786
+ interface WaterfurnaceHomeDetails {
16787
+ address: string;
16788
+ postalCode: string;
16789
+ homeAgeYears: number;
16790
+ livingSqft: number;
16791
+ basementSqft: number;
16792
+ lotAcreage: number;
16793
+ }
16794
+ interface WaterfurnaceRecommendedSystem {
16795
+ tier: "good" | "better" | "best";
16796
+ title: string;
16797
+ description: string;
16798
+ highlights: string[];
16799
+ }
16800
+ interface WaterfurnaceSavingsEstimate {
16801
+ zipCode: string;
16802
+ lat: number;
16803
+ lng: number;
16804
+ currentAnnualCostUsd: number;
16805
+ geothermalAnnualCostUsd: number;
16806
+ annualSavingsUsd: number;
16807
+ savingsBreakdownUsd: { heating: number; cooling: number; hotWater: number };
16808
+ carbonFootprintLbsPerYear: { current: number; geothermal: number; reduction: number };
16809
+ fuelRates: { gas: number; electric: number; oil: number; propane: number };
16810
+ recommendedSystems: WaterfurnaceRecommendedSystem[];
16811
+ warnings: string[];
16812
+ }
16813
+
16814
+ /**
16815
+ * WaterFurnace's Savings Calculator, run for real — the site's own computed Free Savings
16816
+ * Report (annual dollar savings, energy comparison, carbon footprint, recommended geothermal
16817
+ * systems) for a real address and fuel source, off its undocumented backend API.
16818
+ */
16819
+ interface Unit {
16820
+ /**
16821
+ * Runs the Savings Calculator's own home-details lookup for an address/zip. Returns the site's
16822
+ * real public-data estimate of home age, living sqft and basement sqft — a fixed fallback
16823
+ * estimate (not an error) when the address isn't in its data source, matching what the
16824
+ * wizard's own UI does.
16825
+ */
16826
+ lookupHomeDetails(input: { address: string; city?: string; state?: string; zipCode: string }): Promise<WaterfurnaceHomeDetails>;
16827
+
16828
+ /**
16829
+ * Runs the Savings Calculator's real backend computation for a home and current fuel source
16830
+ * (gas/propane/electric heat pump/electric resistance/oil) and returns the site's own computed
16831
+ * Free Savings Report: current vs. geothermal annual cost, dollar savings, carbon footprint
16832
+ * reduction, and WaterFurnace's recommended systems. Missing home details are filled from
16833
+ * lookupHomeDetails; a missing lat/lng is resolved from the zip via a keyless geocode. THROWS
16834
+ * if the API's response shape has changed.
16835
+ */
16836
+ estimateGeothermalSavings(input: { zipCode: string; state: string; address?: string; city?: string; fuelSource: WaterfurnaceFuelSource; secondaryFuelSource?: WaterfurnaceSecondaryFuelSource; homeAgeYears?: number; livingSqft?: number; basementSqft?: number; numResidents?: number; winterSetpointF?: number; summerSetpointF?: number; lat?: number; lng?: number }): Promise<WaterfurnaceSavingsEstimate>;
16837
+ }
16838
+ }
16839
+
15127
16840
  declare namespace BowmarkProvider_wellfound {
15128
16841
  // ── Wellfound — the unit's own declarations, verbatim ──
15129
16842
  interface wellfoundRow {
@@ -15236,6 +16949,52 @@ interface wellfoundCompanyDetail {
15236
16949
  }
15237
16950
  }
15238
16951
 
16952
+ declare namespace BowmarkProvider_xpresswellnessurgentcare {
16953
+ // ── Xpress Wellness Urgent Care — the unit's own declarations, verbatim ──
16954
+ interface XpressFacility {
16955
+ facilityId: string; // healow facility_id — what checkWaitTime takes
16956
+ name: string; // e.g. "Manhattan, KS"
16957
+ address: string | null;
16958
+ phone: string | null;
16959
+ detailsUrl: string | null; // the clinic's own page on the marketing site
16960
+ checkinUrl: string; // the healow openaccess widget URL
16961
+ }
16962
+ interface XpressWaitTime {
16963
+ facilityId: string;
16964
+ facilityName: string; // confirmed by the widget's own dataLayer, not assumed
16965
+ address: string | null;
16966
+ phone: string | null;
16967
+ waitTimeText: string; // the site's own bucketed phrase, e.g. "Under 30 mins"
16968
+ hoursText: string | null; // e.g. "OPEN - Until 8 PM"
16969
+ url: string;
16970
+ }
16971
+
16972
+ /**
16973
+ * Reads Xpress Wellness Urgent Care's clinic roster and each clinic's live healow wait-time /
16974
+ * check-in widget — no key, no browser.
16975
+ */
16976
+ interface Unit {
16977
+ /**
16978
+ * Lists every Xpress Wellness Urgent Care clinic — 40 locations across Oklahoma, Kansas and
16979
+ * one Texas site — with name, address, phone, the clinic's own detail page and the healow
16980
+ * check-in widget URL + facility_id. Takes nothing. The facilityId it returns is what
16981
+ * checkWaitTime takes. THROWS rather than returning [] when the roster page answers with no
16982
+ * clinics — the roster is never honestly empty.
16983
+ */
16984
+ listFacilities(): Promise<XpressFacility[]>;
16985
+
16986
+ /**
16987
+ * Reads one clinic's live estimated wait time, hours-today status and confirmed identity
16988
+ * straight off its healow openaccess widget. facilityId is the numeric id listFacilities
16989
+ * returns (e.g. "10"). Confirms the facility resolved by cross-checking the widget's own
16990
+ * embedded facility name before returning a reading; THROWS with the caller-facing facility_id
16991
+ * named if the widget carries no name (an unknown id) or no wait-time reading (the widget's
16992
+ * markup changed).
16993
+ */
16994
+ checkWaitTime(facilityId: string): Promise<XpressWaitTime>;
16995
+ }
16996
+ }
16997
+
15239
16998
  declare namespace BowmarkProvider_yourarborhome {
15240
16999
  // ── Arbor Homes — the unit's own declarations, verbatim ──
15241
17000
  interface ArborHome {
@@ -15606,8 +17365,8 @@ interface ShopifyCart {
15606
17365
 
15607
17366
  /**
15608
17367
  * OSMUND OLSEN — Every Shopify storefront, reached by its own name. One engine over the
15609
- * platform's two published surfaces — the store's own MCP server at /api/mcp for search, and
15610
- * the keyless Ajax storefront JSON for products and the cart.
17368
+ * platform's two published surfaces — the store's own UCP MCP server at /api/ucp/mcp for
17369
+ * search, and the keyless Ajax storefront JSON for products and the cart.
15611
17370
  */
15612
17371
  interface Unit {
15613
17372
  /**
@@ -16019,8 +17778,8 @@ interface ShopifyCart {
16019
17778
 
16020
17779
  /**
16021
17780
  * friedrikdev — Every Shopify storefront, reached by its own name. One engine over the
16022
- * platform's two published surfaces — the store's own MCP server at /api/mcp for search, and
16023
- * the keyless Ajax storefront JSON for products and the cart.
17781
+ * platform's two published surfaces — the store's own UCP MCP server at /api/ucp/mcp for
17782
+ * search, and the keyless Ajax storefront JSON for products and the cart.
16024
17783
  */
16025
17784
  interface Unit {
16026
17785
  /**
@@ -16109,24 +17868,30 @@ interface BowmarkProviders {
16109
17868
  aiper: BowmarkProvider_aiper.Unit;
16110
17869
  ajmadison: BowmarkProvider_ajmadison.Unit;
16111
17870
  ashleyfurniture: BowmarkProvider_ashleyfurniture.Unit;
17871
+ atlasoceanvoyages: BowmarkProvider_atlasoceanvoyages.Unit;
16112
17872
  atlasseniorliving: BowmarkProvider_atlasseniorliving.Unit;
16113
17873
  avis: BowmarkProvider_avis.Unit;
16114
17874
  azure: BowmarkProvider_azure.Unit;
16115
17875
  barletta: BowmarkProvider_barletta.Unit;
16116
17876
  bhphoto: BowmarkProvider_bhphoto.Unit;
17877
+ bigrentz: BowmarkProvider_bigrentz.Unit;
16117
17878
  blenderseyewear: BowmarkProvider_blenderseyewear.Unit;
16118
17879
  bluehaven: BowmarkProvider_bluehaven.Unit;
16119
17880
  bmwusa: BowmarkProvider_bmwusa.Unit;
17881
+ boydsleep: BowmarkProvider_boydsleep.Unit;
17882
+ brixton: BowmarkProvider_brixton.Unit;
16120
17883
  bykoket: BowmarkProvider_bykoket.Unit;
16121
17884
  cancer: BowmarkProvider_cancer.Unit;
16122
17885
  caraway: BowmarkProvider_caraway.Unit;
16123
17886
  cars: BowmarkProvider_cars.Unit;
17887
+ chantecaille: BowmarkProvider_chantecaille.Unit;
16124
17888
  cheapflights: BowmarkProvider_cheapflights.Unit;
16125
17889
  chriscraft: BowmarkProvider_chriscraft.Unit;
16126
17890
  classichome: BowmarkProvider_classichome.Unit;
16127
17891
  classpass: BowmarkProvider_classpass.Unit;
16128
17892
  cloudflare: BowmarkProvider_cloudflare.Unit;
16129
17893
  cyberpowerpc: BowmarkProvider_cyberpowerpc.Unit;
17894
+ davidsonhomes: BowmarkProvider_davidsonhomes.Unit;
16130
17895
  decked: BowmarkProvider_decked.Unit;
16131
17896
  dice: BowmarkProvider_dice.Unit;
16132
17897
  dickssportinggoods: BowmarkProvider_dickssportinggoods.Unit;
@@ -16134,19 +17899,25 @@ interface BowmarkProviders {
16134
17899
  discounttire: BowmarkProvider_discounttire.Unit;
16135
17900
  embroker: BowmarkProvider_embroker.Unit;
16136
17901
  erieinsurance: BowmarkProvider_erieinsurance.Unit;
17902
+ eventsource: BowmarkProvider_eventsource.Unit;
17903
+ evolutionofsmooth: BowmarkProvider_evolutionofsmooth.Unit;
16137
17904
  extraspace: BowmarkProvider_extraspace.Unit;
16138
17905
  firstdibs: BowmarkProvider_firstdibs.Unit;
16139
17906
  flightradar24: BowmarkProvider_flightradar24.Unit;
16140
17907
  ford: BowmarkProvider_ford.Unit;
17908
+ fourseasonsyachts: BowmarkProvider_fourseasonsyachts.Unit;
16141
17909
  framebridge: BowmarkProvider_framebridge.Unit;
16142
17910
  fred: BowmarkProvider_fred.Unit;
16143
17911
  geico: BowmarkProvider_geico.Unit;
16144
17912
  google_flights: BowmarkProvider_google_flights.Unit;
16145
17913
  gotchacovered: BowmarkProvider_gotchacovered.Unit;
16146
17914
  grainger: BowmarkProvider_grainger.Unit;
17915
+ grandwelcome: BowmarkProvider_grandwelcome.Unit;
16147
17916
  handypro: BowmarkProvider_handypro.Unit;
17917
+ hansons: BowmarkProvider_hansons.Unit;
16148
17918
  harmar: BowmarkProvider_harmar.Unit;
16149
17919
  hauslabs: BowmarkProvider_hauslabs.Unit;
17920
+ haydenhomes: BowmarkProvider_haydenhomes.Unit;
16150
17921
  healthcare_gov: BowmarkProvider_healthcare_gov.Unit;
16151
17922
  hellofresh: BowmarkProvider_hellofresh.Unit;
16152
17923
  hellotend: BowmarkProvider_hellotend.Unit;
@@ -16157,8 +17928,12 @@ interface BowmarkProviders {
16157
17928
  insurify: BowmarkProvider_insurify.Unit;
16158
17929
  interiordefine: BowmarkProvider_interiordefine.Unit;
16159
17930
  islllc: BowmarkProvider_islllc.Unit;
17931
+ jennikayne: BowmarkProvider_jennikayne.Unit;
16160
17932
  joybird: BowmarkProvider_joybird.Unit;
17933
+ joycefactorydirect: BowmarkProvider_joycefactorydirect.Unit;
17934
+ justinwine: BowmarkProvider_justinwine.Unit;
16161
17935
  kayak: BowmarkProvider_kayak.Unit;
17936
+ kingsdown: BowmarkProvider_kingsdown.Unit;
16162
17937
  kitchentuneup: BowmarkProvider_kitchentuneup.Unit;
16163
17938
  kompan: BowmarkProvider_kompan.Unit;
16164
17939
  labcorp: BowmarkProvider_labcorp.Unit;
@@ -16166,6 +17941,7 @@ interface BowmarkProviders {
16166
17941
  liquiddeath: BowmarkProvider_liquiddeath.Unit;
16167
17942
  lonelyplanet: BowmarkProvider_lonelyplanet.Unit;
16168
17943
  louvershop: BowmarkProvider_louvershop.Unit;
17944
+ lovelybride: BowmarkProvider_lovelybride.Unit;
16169
17945
  lufthansa: BowmarkProvider_lufthansa.Unit;
16170
17946
  lululemon: BowmarkProvider_lululemon.Unit;
16171
17947
  maidenhome: BowmarkProvider_maidenhome.Unit;
@@ -16178,11 +17954,13 @@ interface BowmarkProviders {
16178
17954
  mixbook: BowmarkProvider_mixbook.Unit;
16179
17955
  modularclosets: BowmarkProvider_modularclosets.Unit;
16180
17956
  momondo: BowmarkProvider_momondo.Unit;
17957
+ mossyoak: BowmarkProvider_mossyoak.Unit;
16181
17958
  naic: BowmarkProvider_naic.Unit;
16182
17959
  namecheap: BowmarkProvider_namecheap.Unit;
16183
17960
  newegg: BowmarkProvider_newegg.Unit;
16184
17961
  oanda: BowmarkProvider_oanda.Unit;
16185
17962
  otto: BowmarkProvider_otto.Unit;
17963
+ outdoorresearch: BowmarkProvider_outdoorresearch.Unit;
16186
17964
  paypal: BowmarkProvider_paypal.Unit;
16187
17965
  pirateship: BowmarkProvider_pirateship.Unit;
16188
17966
  pizzahut: BowmarkProvider_pizzahut.Unit;
@@ -16190,8 +17968,12 @@ interface BowmarkProviders {
16190
17968
  progressive: BowmarkProvider_progressive.Unit;
16191
17969
  prose: BowmarkProvider_prose.Unit;
16192
17970
  reddit: BowmarkProvider_reddit.Unit;
17971
+ rishitea: BowmarkProvider_rishitea.Unit;
16193
17972
  ritani: BowmarkProvider_ritani.Unit;
17973
+ roofmaxx: BowmarkProvider_roofmaxx.Unit;
17974
+ saltandstone: BowmarkProvider_saltandstone.Unit;
16194
17975
  samsclub: BowmarkProvider_samsclub.Unit;
17976
+ seakeeper: BowmarkProvider_seakeeper.Unit;
16195
17977
  sears: BowmarkProvider_sears.Unit;
16196
17978
  seegarsfence: BowmarkProvider_seegarsfence.Unit;
16197
17979
  selectblinds: BowmarkProvider_selectblinds.Unit;
@@ -16200,18 +17982,27 @@ interface BowmarkProviders {
16200
17982
  statefarm: BowmarkProvider_statefarm.Unit;
16201
17983
  stickergiant: BowmarkProvider_stickergiant.Unit;
16202
17984
  sunhomesaunas: BowmarkProvider_sunhomesaunas.Unit;
17985
+ tamarackidaho: BowmarkProvider_tamarackidaho.Unit;
16203
17986
  target: BowmarkProvider_target.Unit;
17987
+ tatcha: BowmarkProvider_tatcha.Unit;
16204
17988
  teladoc: BowmarkProvider_teladoc.Unit;
16205
- tentree: BowmarkProvider_tentree.Unit;
16206
17989
  therabody: BowmarkProvider_therabody.Unit;
16207
17990
  thezebra: BowmarkProvider_thezebra.Unit;
17991
+ tilsonhomes: BowmarkProvider_tilsonhomes.Unit;
17992
+ titlenine: BowmarkProvider_titlenine.Unit;
16208
17993
  topviewtix: BowmarkProvider_topviewtix.Unit;
16209
17994
  trektravel: BowmarkProvider_trektravel.Unit;
17995
+ twiddy: BowmarkProvider_twiddy.Unit;
16210
17996
  ulrichlifestyle: BowmarkProvider_ulrichlifestyle.Unit;
17997
+ vervecoffee: BowmarkProvider_vervecoffee.Unit;
16211
17998
  viewrail: BowmarkProvider_viewrail.Unit;
17999
+ villagerealtyobx: BowmarkProvider_villagerealtyobx.Unit;
16212
18000
  visible: BowmarkProvider_visible.Unit;
18001
+ voluspa: BowmarkProvider_voluspa.Unit;
16213
18002
  walmart: BowmarkProvider_walmart.Unit;
18003
+ waterfurnace: BowmarkProvider_waterfurnace.Unit;
16214
18004
  wellfound: BowmarkProvider_wellfound.Unit;
18005
+ xpresswellnessurgentcare: BowmarkProvider_xpresswellnessurgentcare.Unit;
16215
18006
  yourarborhome: BowmarkProvider_yourarborhome.Unit;
16216
18007
  "000de82": BowmarkFamily_shopify_store.Unit;
16217
18008
  "001r3iv0": BowmarkFamily_shopify_store.Unit;
@@ -58133,6 +59924,7 @@ interface BowmarkProviders {
58133
59924
  tentarte: BowmarkFamily_shopify_store.Unit;
58134
59925
  tenthavenuenorthshop: BowmarkFamily_shopify_store.Unit;
58135
59926
  tenthpine: BowmarkFamily_shopify_store.Unit;
59927
+ tentree: BowmarkFamily_shopify_store.Unit;
58136
59928
  teoapparel: BowmarkFamily_shopify_store.Unit;
58137
59929
  teopanzolcobarcelonnette: BowmarkFamily_shopify_store.Unit;
58138
59930
  tepawines: BowmarkFamily_shopify_store.Unit;