@bowmark/web 1.8.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,8 +5,8 @@
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: b71c060db620c119ab92eac724aab2d9670d3d22f342f754075e353929634db2
9
- // 9 capabilities, 121 providers, 380 typed functions, 20 refused.
8
+ // Manifest version: be4cdedcfa4c990cc2208fd7e5f33c2dd386c9c210168b9f2c02f259fbe8fbba
9
+ // 9 capabilities, 141 providers, 422 typed functions, 20 refused.
10
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
@@ -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";
@@ -2460,6 +2534,89 @@ interface Boydsleep6ZoneResult {
2460
2534
  }
2461
2535
  }
2462
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
+
2463
2620
  declare namespace BowmarkProvider_bykoket {
2464
2621
  // ── KOKET — the unit's own declarations, verbatim ──
2465
2622
  interface KoketProductSummary {
@@ -2831,6 +2988,59 @@ interface carsVehicleValue {
2831
2988
  }
2832
2989
  }
2833
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
+
2834
3044
  declare namespace BowmarkProvider_cheapflights {
2835
3045
  // ── Cheapflights — the unit's own declarations, verbatim ──
2836
3046
  interface KayakQuery {
@@ -3509,6 +3719,120 @@ interface CyberpowerpcPriceResult {
3509
3719
  }
3510
3720
  }
3511
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
+
3512
3836
  declare namespace BowmarkProvider_decked {
3513
3837
  // ── DECKED — the unit's own declarations, verbatim ──
3514
3838
  // DECKED's OWN shapes — not a capability contract.
@@ -4288,6 +4612,42 @@ interface EventSourceInquiryContact {
4288
4612
  }
4289
4613
  }
4290
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
+
4291
4651
  declare namespace BowmarkProvider_extraspace {
4292
4652
  // ── Extra Space Storage — the unit's own declarations, verbatim ──
4293
4653
  interface ExtraspaceSearchResult {
@@ -4975,6 +5335,78 @@ interface fordVehicleRecalls {
4975
5335
  }
4976
5336
  }
4977
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
+
4978
5410
  declare namespace BowmarkProvider_framebridge {
4979
5411
  // ── Framebridge — the unit's own declarations, verbatim ──
4980
5412
  // Framebridge's OWN shapes — not a capability contract.
@@ -5902,6 +6334,43 @@ interface HandyproCategorySearch {
5902
6334
  }
5903
6335
  }
5904
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
+
5905
6374
  declare namespace BowmarkProvider_harmar {
5906
6375
  // ── Harmar Mobility — the unit's own declarations, verbatim ──
5907
6376
  interface HarmarVehicleModel {
@@ -6046,6 +6515,67 @@ interface HauslabsShadeMatch {
6046
6515
  }
6047
6516
  }
6048
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
+
6049
6579
  declare namespace BowmarkProvider_healthcare_gov {
6050
6580
  // ── HealthCare.gov — the unit's own declarations, verbatim ──
6051
6581
  interface healthcare_govPlan {
@@ -8415,6 +8945,75 @@ interface JoybirdPriceResult {
8415
8945
  }
8416
8946
  }
8417
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
+
8418
9017
  declare namespace BowmarkProvider_kayak {
8419
9018
  // ── Kayak — the unit's own declarations, verbatim ──
8420
9019
  interface KayakQuery {
@@ -8558,6 +9157,39 @@ interface KayakCar {
8558
9157
  }
8559
9158
  }
8560
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
+
8561
9193
  declare namespace BowmarkProvider_kitchentuneup {
8562
9194
  // ── Kitchen Tune-Up — the unit's own declarations, verbatim ──
8563
9195
  interface KitchentuneupCabinetStyle {
@@ -9141,6 +9773,76 @@ interface FindLocalDealerResult {
9141
9773
  }
9142
9774
  }
9143
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
+
9144
9846
  declare namespace BowmarkProvider_lufthansa {
9145
9847
  // ── Lufthansa — the unit's own declarations, verbatim ──
9146
9848
  interface LufthansaFlightLeg {
@@ -9461,8 +10163,16 @@ interface LululemonRow {
9461
10163
  interface LululemonSearch {
9462
10164
  query: string;
9463
10165
  products: LululemonRow[];
9464
- /** 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. */
9465
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;
9466
10176
  warnings: string[];
9467
10177
  }
9468
10178
  interface LululemonSimilarProducts {
@@ -9483,10 +10193,16 @@ interface LululemonSimilarProducts {
9483
10193
  * first — id, title, URL, price range, how many colours the style comes in, and whether it is
9484
10194
  * in stock. Ranks over the site's own published product index, then reads the price and colour
9485
10195
  * count per row. A match the pricing catalogue does not carry still comes back, with `priced:
9486
- * false` and null prices; `matched` says how many matched before the row cap so a caller can
9487
- * 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.
9488
10204
  */
9489
- search(query: { query: string; limit?: number }): Promise<LululemonSearch>;
10205
+ search(query: { query: string; limit?: number; offset?: number }): Promise<LululemonSearch>;
9490
10206
 
9491
10207
  /**
9492
10208
  * Reads one product's full configurator the way its product page presents it — every colourway
@@ -10983,6 +11699,89 @@ interface KayakCar {
10983
11699
  }
10984
11700
  }
10985
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
+
10986
11785
  declare namespace BowmarkProvider_naic {
10987
11786
  // ── NAIC — the unit's own declarations, verbatim ──
10988
11787
  interface naicCompanyQuery {
@@ -11451,6 +12250,56 @@ interface ottoSearchQuery {
11451
12250
  }
11452
12251
  }
11453
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
+
11454
12303
  declare namespace BowmarkProvider_paypal {
11455
12304
  // ── PayPal — the unit's own declarations, verbatim ──
11456
12305
  interface PaypalEstimateFeeArgs {
@@ -12928,6 +13777,67 @@ interface RedditThread {
12928
13777
  }
12929
13778
  }
12930
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
+
12931
13841
  declare namespace BowmarkProvider_ritani {
12932
13842
  // ── Ritani — the unit's own declarations, verbatim ──
12933
13843
  // Ritani's OWN shapes — not a capability contract.
@@ -13038,6 +13948,68 @@ interface RoofmaxxCostEstimate {
13038
13948
  }
13039
13949
  }
13040
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
+
13041
14013
  declare namespace BowmarkProvider_samsclub {
13042
14014
  // ── Sam's Club — the unit's own declarations, verbatim ──
13043
14015
  interface SamsclubInstantSavingsItem {
@@ -13230,6 +14202,50 @@ interface SamsclubMembershipPlan {
13230
14202
  }
13231
14203
  }
13232
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
+
13233
14249
  declare namespace BowmarkProvider_sears {
13234
14250
  // ── Sears — the unit's own declarations, verbatim ──
13235
14251
  interface SearsSearchPrice {
@@ -14913,6 +15929,108 @@ interface thezebraAutoQuotes {
14913
15929
  }
14914
15930
  }
14915
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
+
14916
16034
  declare namespace BowmarkProvider_topviewtix {
14917
16035
  // ── TopView Sightseeing — the unit's own declarations, verbatim ──
14918
16036
  interface topviewtixPackageDetails {
@@ -15661,6 +16779,64 @@ interface walmartSearchResult {
15661
16779
  }
15662
16780
  }
15663
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
+
15664
16840
  declare namespace BowmarkProvider_wellfound {
15665
16841
  // ── Wellfound — the unit's own declarations, verbatim ──
15666
16842
  interface wellfoundRow {
@@ -16692,6 +17868,7 @@ interface BowmarkProviders {
16692
17868
  aiper: BowmarkProvider_aiper.Unit;
16693
17869
  ajmadison: BowmarkProvider_ajmadison.Unit;
16694
17870
  ashleyfurniture: BowmarkProvider_ashleyfurniture.Unit;
17871
+ atlasoceanvoyages: BowmarkProvider_atlasoceanvoyages.Unit;
16695
17872
  atlasseniorliving: BowmarkProvider_atlasseniorliving.Unit;
16696
17873
  avis: BowmarkProvider_avis.Unit;
16697
17874
  azure: BowmarkProvider_azure.Unit;
@@ -16702,16 +17879,19 @@ interface BowmarkProviders {
16702
17879
  bluehaven: BowmarkProvider_bluehaven.Unit;
16703
17880
  bmwusa: BowmarkProvider_bmwusa.Unit;
16704
17881
  boydsleep: BowmarkProvider_boydsleep.Unit;
17882
+ brixton: BowmarkProvider_brixton.Unit;
16705
17883
  bykoket: BowmarkProvider_bykoket.Unit;
16706
17884
  cancer: BowmarkProvider_cancer.Unit;
16707
17885
  caraway: BowmarkProvider_caraway.Unit;
16708
17886
  cars: BowmarkProvider_cars.Unit;
17887
+ chantecaille: BowmarkProvider_chantecaille.Unit;
16709
17888
  cheapflights: BowmarkProvider_cheapflights.Unit;
16710
17889
  chriscraft: BowmarkProvider_chriscraft.Unit;
16711
17890
  classichome: BowmarkProvider_classichome.Unit;
16712
17891
  classpass: BowmarkProvider_classpass.Unit;
16713
17892
  cloudflare: BowmarkProvider_cloudflare.Unit;
16714
17893
  cyberpowerpc: BowmarkProvider_cyberpowerpc.Unit;
17894
+ davidsonhomes: BowmarkProvider_davidsonhomes.Unit;
16715
17895
  decked: BowmarkProvider_decked.Unit;
16716
17896
  dice: BowmarkProvider_dice.Unit;
16717
17897
  dickssportinggoods: BowmarkProvider_dickssportinggoods.Unit;
@@ -16720,10 +17900,12 @@ interface BowmarkProviders {
16720
17900
  embroker: BowmarkProvider_embroker.Unit;
16721
17901
  erieinsurance: BowmarkProvider_erieinsurance.Unit;
16722
17902
  eventsource: BowmarkProvider_eventsource.Unit;
17903
+ evolutionofsmooth: BowmarkProvider_evolutionofsmooth.Unit;
16723
17904
  extraspace: BowmarkProvider_extraspace.Unit;
16724
17905
  firstdibs: BowmarkProvider_firstdibs.Unit;
16725
17906
  flightradar24: BowmarkProvider_flightradar24.Unit;
16726
17907
  ford: BowmarkProvider_ford.Unit;
17908
+ fourseasonsyachts: BowmarkProvider_fourseasonsyachts.Unit;
16727
17909
  framebridge: BowmarkProvider_framebridge.Unit;
16728
17910
  fred: BowmarkProvider_fred.Unit;
16729
17911
  geico: BowmarkProvider_geico.Unit;
@@ -16732,8 +17914,10 @@ interface BowmarkProviders {
16732
17914
  grainger: BowmarkProvider_grainger.Unit;
16733
17915
  grandwelcome: BowmarkProvider_grandwelcome.Unit;
16734
17916
  handypro: BowmarkProvider_handypro.Unit;
17917
+ hansons: BowmarkProvider_hansons.Unit;
16735
17918
  harmar: BowmarkProvider_harmar.Unit;
16736
17919
  hauslabs: BowmarkProvider_hauslabs.Unit;
17920
+ haydenhomes: BowmarkProvider_haydenhomes.Unit;
16737
17921
  healthcare_gov: BowmarkProvider_healthcare_gov.Unit;
16738
17922
  hellofresh: BowmarkProvider_hellofresh.Unit;
16739
17923
  hellotend: BowmarkProvider_hellotend.Unit;
@@ -16746,7 +17930,10 @@ interface BowmarkProviders {
16746
17930
  islllc: BowmarkProvider_islllc.Unit;
16747
17931
  jennikayne: BowmarkProvider_jennikayne.Unit;
16748
17932
  joybird: BowmarkProvider_joybird.Unit;
17933
+ joycefactorydirect: BowmarkProvider_joycefactorydirect.Unit;
17934
+ justinwine: BowmarkProvider_justinwine.Unit;
16749
17935
  kayak: BowmarkProvider_kayak.Unit;
17936
+ kingsdown: BowmarkProvider_kingsdown.Unit;
16750
17937
  kitchentuneup: BowmarkProvider_kitchentuneup.Unit;
16751
17938
  kompan: BowmarkProvider_kompan.Unit;
16752
17939
  labcorp: BowmarkProvider_labcorp.Unit;
@@ -16754,6 +17941,7 @@ interface BowmarkProviders {
16754
17941
  liquiddeath: BowmarkProvider_liquiddeath.Unit;
16755
17942
  lonelyplanet: BowmarkProvider_lonelyplanet.Unit;
16756
17943
  louvershop: BowmarkProvider_louvershop.Unit;
17944
+ lovelybride: BowmarkProvider_lovelybride.Unit;
16757
17945
  lufthansa: BowmarkProvider_lufthansa.Unit;
16758
17946
  lululemon: BowmarkProvider_lululemon.Unit;
16759
17947
  maidenhome: BowmarkProvider_maidenhome.Unit;
@@ -16766,11 +17954,13 @@ interface BowmarkProviders {
16766
17954
  mixbook: BowmarkProvider_mixbook.Unit;
16767
17955
  modularclosets: BowmarkProvider_modularclosets.Unit;
16768
17956
  momondo: BowmarkProvider_momondo.Unit;
17957
+ mossyoak: BowmarkProvider_mossyoak.Unit;
16769
17958
  naic: BowmarkProvider_naic.Unit;
16770
17959
  namecheap: BowmarkProvider_namecheap.Unit;
16771
17960
  newegg: BowmarkProvider_newegg.Unit;
16772
17961
  oanda: BowmarkProvider_oanda.Unit;
16773
17962
  otto: BowmarkProvider_otto.Unit;
17963
+ outdoorresearch: BowmarkProvider_outdoorresearch.Unit;
16774
17964
  paypal: BowmarkProvider_paypal.Unit;
16775
17965
  pirateship: BowmarkProvider_pirateship.Unit;
16776
17966
  pizzahut: BowmarkProvider_pizzahut.Unit;
@@ -16778,9 +17968,12 @@ interface BowmarkProviders {
16778
17968
  progressive: BowmarkProvider_progressive.Unit;
16779
17969
  prose: BowmarkProvider_prose.Unit;
16780
17970
  reddit: BowmarkProvider_reddit.Unit;
17971
+ rishitea: BowmarkProvider_rishitea.Unit;
16781
17972
  ritani: BowmarkProvider_ritani.Unit;
16782
17973
  roofmaxx: BowmarkProvider_roofmaxx.Unit;
17974
+ saltandstone: BowmarkProvider_saltandstone.Unit;
16783
17975
  samsclub: BowmarkProvider_samsclub.Unit;
17976
+ seakeeper: BowmarkProvider_seakeeper.Unit;
16784
17977
  sears: BowmarkProvider_sears.Unit;
16785
17978
  seegarsfence: BowmarkProvider_seegarsfence.Unit;
16786
17979
  selectblinds: BowmarkProvider_selectblinds.Unit;
@@ -16795,6 +17988,8 @@ interface BowmarkProviders {
16795
17988
  teladoc: BowmarkProvider_teladoc.Unit;
16796
17989
  therabody: BowmarkProvider_therabody.Unit;
16797
17990
  thezebra: BowmarkProvider_thezebra.Unit;
17991
+ tilsonhomes: BowmarkProvider_tilsonhomes.Unit;
17992
+ titlenine: BowmarkProvider_titlenine.Unit;
16798
17993
  topviewtix: BowmarkProvider_topviewtix.Unit;
16799
17994
  trektravel: BowmarkProvider_trektravel.Unit;
16800
17995
  twiddy: BowmarkProvider_twiddy.Unit;
@@ -16805,6 +18000,7 @@ interface BowmarkProviders {
16805
18000
  visible: BowmarkProvider_visible.Unit;
16806
18001
  voluspa: BowmarkProvider_voluspa.Unit;
16807
18002
  walmart: BowmarkProvider_walmart.Unit;
18003
+ waterfurnace: BowmarkProvider_waterfurnace.Unit;
16808
18004
  wellfound: BowmarkProvider_wellfound.Unit;
16809
18005
  xpresswellnessurgentcare: BowmarkProvider_xpresswellnessurgentcare.Unit;
16810
18006
  yourarborhome: BowmarkProvider_yourarborhome.Unit;